/ Hex Artifact Content
Login

Artifact 14ae3326af3d8b94bd64a29e0369986f3125cf4c0dcb8f8dc1b8be2cd1bcdbaa:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
0230: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65  * Walk the expre
0240: 73 73 69 6f 6e 20 74 72 65 65 20 70 45 78 70 72  ssion tree pExpr
0250: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 74 68   and increase th
0260: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
0270: 74 69 6f 6e 0a 2a 2a 20 64 65 70 74 68 20 28 74  tion.** depth (t
0280: 68 65 20 45 78 70 72 2e 6f 70 32 20 66 69 65 6c  he Expr.op2 fiel
0290: 64 29 20 62 79 20 4e 20 6f 6e 20 65 76 65 72 79  d) by N on every
02a0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
02b0: 20 6e 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 6e   node..** This n
02c0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 20 77 68  eeds to occur wh
02d0: 65 6e 20 63 6f 70 79 69 6e 67 20 61 20 54 4b 5f  en copying a TK_
02e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
02f0: 65 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 6f 75 74  e from an.** out
0300: 65 72 20 71 75 65 72 79 20 69 6e 74 6f 20 61 6e  er query into an
0310: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 2e   inner subquery.
0320: 0a 2a 2a 0a 2a 2a 20 69 6e 63 72 41 67 67 46 75  .**.** incrAggFu
0330: 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 45 78 70  nctionDepth(pExp
0340: 72 2c 6e 29 20 69 73 20 74 68 65 20 6d 61 69 6e  r,n) is the main
0350: 20 72 6f 75 74 69 6e 65 2e 20 20 69 6e 63 72 41   routine.  incrA
0360: 67 67 44 65 70 74 68 28 2e 2e 29 0a 2a 2a 20 69  ggDepth(..).** i
0370: 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74  s a helper funct
0380: 69 6f 6e 20 2d 20 61 20 63 61 6c 6c 62 61 63 6b  ion - a callback
0390: 20 66 6f 72 20 74 68 65 20 74 72 65 65 20 77 61   for the tree wa
03a0: 6c 6b 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lker..*/.static 
03b0: 69 6e 74 20 69 6e 63 72 41 67 67 44 65 70 74 68  int incrAggDepth
03c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
03d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
03e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
03f0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
0400: 20 29 20 70 45 78 70 72 2d 3e 6f 70 32 20 2b 3d   ) pExpr->op2 +=
0410: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 6e 3b 0a 20   pWalker->u.n;. 
0420: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
0430: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
0440: 6f 69 64 20 69 6e 63 72 41 67 67 46 75 6e 63 74  oid incrAggFunct
0450: 69 6f 6e 44 65 70 74 68 28 45 78 70 72 20 2a 70  ionDepth(Expr *p
0460: 45 78 70 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Expr, int N){.  
0470: 69 66 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 57  if( N>0 ){.    W
0480: 61 6c 6b 65 72 20 77 3b 0a 20 20 20 20 6d 65 6d  alker w;.    mem
0490: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
04a0: 66 28 77 29 29 3b 0a 20 20 20 20 77 2e 78 45 78  f(w));.    w.xEx
04b0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6e 63  prCallback = inc
04c0: 72 41 67 67 44 65 70 74 68 3b 0a 20 20 20 20 77  rAggDepth;.    w
04d0: 2e 75 2e 6e 20 3d 20 4e 3b 0a 20 20 20 20 73 71  .u.n = N;.    sq
04e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
04f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  , pExpr);.  }.}.
0500: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20  ./*.** Turn the 
0510: 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
0520: 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61 73 20 66   into an alias f
0530: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
0540: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  olumn of the.** 
0550: 72 65 73 75 6c 74 20 73 65 74 20 69 6e 20 70 45  result set in pE
0560: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  List..**.** If t
0570: 68 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  he reference is 
0580: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f  followed by a CO
0590: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20  LLATE operator, 
05a0: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a  then make sure.*
05b0: 2a 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  * the COLLATE op
05c0: 65 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72  erator is preser
05d0: 76 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ved.  For exampl
05e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  e:.**.**     SEL
05f0: 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f  ECT a+b, c+d FRO
0600: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20  M t1 ORDER BY 1 
0610: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a  COLLATE nocase;.
0620: 2a 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20  **.** Should be 
0630: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0650: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0660: 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b   t1 ORDER BY (a+
0670: 62 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  b) COLLATE nocas
0680: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75  e;.**.** The nSu
0690: 62 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72  bquery parameter
06a0: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d   specifies how m
06b0: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75  any levels of su
06c0: 62 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c  bquery the.** al
06d0: 69 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66  ias is removed f
06e0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
06f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
0700: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 69 73  e usual value is
0710: 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20  .** zero but it 
0720: 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66  might be more if
0730: 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f   the alias is co
0740: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
0750: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20   subquery.** of 
0760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
0770: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78  ression.  The Ex
0780: 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20  pr.op2 field of 
0790: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a  TK_AGG_FUNCTION.
07a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75  ** structures mu
07b0: 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  st be increased 
07c0: 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79  by the nSubquery
07d0: 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74   amount..*/.stat
07e0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41  ic void resolveA
07f0: 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lias(.  Parse *p
0800: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
0810: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0820: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
0830: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  *pEList,      /*
0840: 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f   A result set */
0850: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
0860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0870: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
0880: 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c  ult set.  0..pEL
0890: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a  ist->nExpr-1 */.
08a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
08c0: 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20  sform this into 
08d0: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
08e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
08f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
0900: 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50  e,     /* "GROUP
0910: 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20  " or "ORDER" or 
0920: 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  "" */.  int nSub
0930: 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  query          /
0940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71  * Number of subq
0950: 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20  ueries that the 
0960: 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20  label is moving 
0970: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f  */.){.  Expr *pO
0980: 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rig;           /
0990: 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  * The iCol-th co
09a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75  lumn of the resu
09b0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
09c0: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
09d0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f     /* Copy of pO
09e0: 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rig */.  sqlite3
09f0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
0a00: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
0a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
0a20: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
0a30: 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d   && iCol<pEList-
0a40: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69  >nExpr );.  pOri
0a50: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43  g = pEList->a[iC
0a60: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  ol].pExpr;.  ass
0a70: 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b  ert( pOrig!=0 );
0a80: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
0a90: 64 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c  db;.  pDup = sql
0aa0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
0ab0: 70 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28  pOrig, 0);.  if(
0ac0: 20 70 44 75 70 21 3d 30 20 29 7b 0a 20 20 20 20   pDup!=0 ){.    
0ad0: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
0ae0: 27 20 29 20 69 6e 63 72 41 67 67 46 75 6e 63 74  ' ) incrAggFunct
0af0: 69 6f 6e 44 65 70 74 68 28 70 44 75 70 2c 20 6e  ionDepth(pDup, n
0b00: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 69  Subquery);.    i
0b10: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
0b20: 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
0b30: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
0b40: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
0b50: 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 44 75  ring(pParse, pDu
0b60: 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  p, pExpr->u.zTok
0b70: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
0b80: 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  /* Before callin
0b90: 67 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  g sqlite3ExprDel
0ba0: 65 74 65 28 29 2c 20 73 65 74 20 74 68 65 20 45  ete(), set the E
0bb0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 2e 20 54  P_Static flag. T
0bc0: 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76  his .    ** prev
0bd0: 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65 28  ents ExprDelete(
0be0: 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20  ) from deleting 
0bf0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
0c00: 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 20 20 2a  re itself,.    *
0c10: 2a 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f  * allowing it to
0c20: 20 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20   be repopulated 
0c30: 62 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20  by the memcpy() 
0c40: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
0c50: 20 6c 69 6e 65 2e 0a 20 20 20 20 2a 2a 20 54 68   line..    ** Th
0c60: 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e pExpr->u.zToke
0c70: 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 69 6e  n might point in
0c80: 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  to memory that w
0c90: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
0ca0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  the.    ** sqlit
0cb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 75  e3DbFree(db, pDu
0cc0: 70 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6c  p) on the last l
0cd0: 69 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63  ine of this bloc
0ce0: 6b 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  k, so be sure to
0cf0: 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63  .    ** make a c
0d00: 6f 70 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  opy of the token
0d10: 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   before doing th
0d20: 65 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  e sqlite3DbFree(
0d30: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 45 78  )..    */.    Ex
0d40: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
0d50: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
0d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0d70: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
0d80: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 45  );.    memcpy(pE
0d90: 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f  xpr, pDup, sizeo
0da0: 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 20 20  f(*pExpr));.    
0db0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
0dc0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0dd0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70  ntValue) && pExp
0de0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
0df0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0e00: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
0e10: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
0e20: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
0e30: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e  .      pExpr->u.
0e40: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
0e50: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 78  DbStrDup(db, pEx
0e60: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
0e70: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
0e80: 73 20 7c 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  s |= EP_MemToken
0e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0ea0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
0eb0: 75 70 29 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53  up);.  }.  ExprS
0ec0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
0ed0: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 7d 0a 0a  , EP_Alias);.}..
0ee0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ef0: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 20 7a  UE if the name z
0f00: 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79 77 68  Col occurs anywh
0f10: 65 72 65 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ere in the USING
0f20: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52   clause..**.** R
0f30: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
0f40: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
0f50: 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74  is NULL or if it
0f60: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
0f70: 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74  n.** zCol..*/.st
0f80: 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55  atic int nameInU
0f90: 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c 69 73  singClause(IdLis
0fa0: 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74  t *pUsing, const
0fb0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
0fc0: 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a 20 20  if( pUsing ){.  
0fd0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72    int k;.    for
0fe0: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
0ff0: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
1000: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1010: 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d  Cmp(pUsing->a[k]
1020: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1030: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1040: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1050: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 71  0;.}../*.** Subq
1060: 75 65 72 69 65 73 20 73 74 6f 72 65 73 20 74 68  ueries stores th
1070: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1080: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
1090: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
10a0: 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c 74 20  their.** result 
10b0: 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69 73 74  sets in ExprList
10c0: 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20 74  .a[].zSpan, in t
10d0: 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42 41 53  he form "DATABAS
10e0: 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22 2e  E.TABLE.COLUMN".
10f0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1100: 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20 67 69   if the zSpan gi
1110: 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ven to this rout
1120: 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68 65 20  ine matches the 
1130: 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61 6e  zDb, zTab,.** an
1140: 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e 79 20  d zCol.  If any 
1150: 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20 61 6e  of zDb, zTab, an
1160: 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c 4c 20  d zCol are NULL 
1170: 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65 6c 64  then those field
1180: 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68 20  s will.** match 
1190: 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  anything..*/.int
11a0: 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
11b0: 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  nName(.  const c
11c0: 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20 63 6f  har *zSpan,.  co
11d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 0a  nst char *zCol,.
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
11f0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
1200: 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74 20 6e   *zDb.){.  int n
1210: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57  ;.  for(n=0; ALW
1220: 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26  AYS(zSpan[n]) &&
1230: 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20   zSpan[n]!='.'; 
1240: 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 44 62  n++){}.  if( zDb
1250: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 4e   && (sqlite3StrN
1260: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44 62 2c  ICmp(zSpan, zDb,
1270: 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e 5d   n)!=0 || zDb[n]
1280: 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1290: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61  rn 0;.  }.  zSpa
12a0: 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72 28  n += n+1;.  for(
12b0: 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70 61  n=0; ALWAYS(zSpa
12c0: 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e  n[n]) && zSpan[n
12d0: 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20  ]!='.'; n++){}. 
12e0: 20 69 66 28 20 7a 54 61 62 20 26 26 20 28 73 71   if( zTab && (sq
12f0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53  lite3StrNICmp(zS
1300: 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21 3d 30  pan, zTab, n)!=0
1310: 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30 29 20   || zTab[n]!=0) 
1320: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1330: 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20  .  }.  zSpan += 
1340: 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20  n+1;.  if( zCol 
1350: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1360: 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29 21 3d  p(zSpan, zCol)!=
1370: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1380: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1390: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  1;.}../*.** Retu
13a0: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 64  rn TRUE if the d
13b0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
13c0: 69 6e 67 20 20 6d 69 73 2d 66 65 61 74 75 72 65  ing  mis-feature
13d0: 20 73 68 6f 75 6c 64 20 62 65 20 73 75 70 70 6f   should be suppo
13e0: 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rted..*/.static 
13f0: 69 6e 74 20 61 72 65 44 6f 75 62 6c 65 51 75 6f  int areDoubleQuo
1400: 74 65 64 53 74 72 69 6e 67 73 45 6e 61 62 6c 65  tedStringsEnable
1410: 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 4e  d(sqlite3 *db, N
1420: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70  ameContext *pTop
1430: 4e 43 29 7b 0a 20 20 69 66 28 20 64 62 2d 3e 69  NC){.  if( db->i
1440: 6e 69 74 2e 62 75 73 79 20 29 20 72 65 74 75 72  nit.busy ) retur
1450: 6e 20 31 3b 20 20 2f 2a 20 41 6c 77 61 79 73 20  n 1;  /* Always 
1460: 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 65 67 61  support for lega
1470: 63 79 20 73 63 68 65 6d 61 73 20 2a 2f 0a 20 20  cy schemas */.  
1480: 69 66 28 20 70 54 6f 70 4e 43 2d 3e 6e 63 46 6c  if( pTopNC->ncFl
1490: 61 67 73 20 26 20 4e 43 5f 49 73 44 44 4c 20 29  ags & NC_IsDDL )
14a0: 7b 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74  {.    /* Current
14b0: 6c 79 20 70 61 72 73 69 6e 67 20 61 20 44 44 4c  ly parsing a DDL
14c0: 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20   statement */.  
14d0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 57 72 69    if( sqlite3Wri
14e0: 74 61 62 6c 65 53 63 68 65 6d 61 28 64 62 29 20  tableSchema(db) 
14f0: 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20 26 20  && (db->flags & 
1500: 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 29 21 3d  SQLITE_DqsDML)!=
1510: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
1520: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72  n 1;.    }.    r
1530: 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61 67 73  eturn (db->flags
1540: 20 26 20 53 51 4c 49 54 45 5f 44 71 73 44 44 4c   & SQLITE_DqsDDL
1550: 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  )!=0;.  }else{. 
1560: 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c 79 20     /* Currently 
1570: 70 61 72 73 69 6e 67 20 61 20 44 4d 4c 20 73 74  parsing a DML st
1580: 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20 20 72  atement */.    r
1590: 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61 67 73  eturn (db->flags
15a0: 20 26 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c   & SQLITE_DqsDML
15b0: 29 21 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  )!=0;.  }.}../*.
15c0: 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
15d0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
15e0: 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20   the form X.Y.Z 
15f0: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a  or Y.Z or just Z
1600: 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61  , look up.** tha
1610: 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65  t name in the se
1620: 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  t of source tabl
1630: 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61  es in pSrcList a
1640: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70  nd make the pExp
1650: 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  r .** expression
1660: 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b   node refer back
1670: 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20   to that source 
1680: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c  column.  The fol
1690: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a  lowing changes.*
16a0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45  * are made to pE
16b0: 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45  xpr:.**.**    pE
16c0: 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20  xpr->iDb        
16d0: 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78     Set the index
16e0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66   in db->aDb[] of
16f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 58 0a   the database X.
1700: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1710: 20 20 20 20 20 20 20 20 20 20 20 28 65 76 65 6e             (even
1720: 20 69 66 20 58 20 69 73 20 69 6d 70 6c 69 65 64   if X is implied
1730: 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  )..**    pExpr->
1740: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
1750: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
1760: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
1770: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
1780: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1790: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
17a0: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
17b0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 20 20 20 20  xpr->y.pTab     
17c0: 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65     Points to the
17d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
17e0: 20 6f 66 20 58 2e 59 20 28 65 76 65 6e 20 69 66   of X.Y (even if
17f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1800: 20 20 20 20 20 20 20 20 20 20 20 20 58 20 61 6e              X an
1810: 64 2f 6f 72 20 59 20 61 72 65 20 69 6d 70 6c 69  d/or Y are impli
1820: 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70 72  ed.).**    pExpr
1830: 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  ->iColumn       
1840: 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  Set to the colum
1850: 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1860: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  the table..**   
1870: 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
1880: 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f        Set to TK_
1890: 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45  COLUMN..**    pE
18a0: 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20  xpr->pLeft      
18b0: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
18c0: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
18d0: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20   is deleted.**  
18e0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
18f0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
1900: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
1910: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e  s to is deleted.
1920: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76  .**.** The zDb v
1930: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1940: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1950: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
1960: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
1970: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
1980: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
1990: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
19a0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
19b0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
19c0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
19d0: 65 20 7a 54 61 62 6c 65 20 76 61 72 69 61 62 6c  e zTable variabl
19e0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
19f0: 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20   the table (the 
1a00: 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76  "Y").  This.** v
1a10: 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c  alue can be NULL
1a20: 20 69 66 20 7a 44 62 20 69 73 20 61 6c 73 6f 20   if zDb is also 
1a30: 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65  NULL.  If zTable
1a40: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
1a50: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
1a60: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
1a70: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
1a80: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
1a90: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
1aa0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
1ab0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
1ac0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
1ad0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
1ae0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
1af0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
1b00: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1b10: 2e 20 20 52 65 74 75 72 6e 20 57 52 43 5f 50 72  .  Return WRC_Pr
1b20: 75 6e 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  une on success..
1b30: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1b40: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
1b50: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1b60: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1b70: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1b80: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
1b90: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1ba0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
1bb0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
1bc0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
1bd0: 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a  har *zTab,    /*
1be0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
1bf0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
1c00: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1c10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1c20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1c30: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
1c40: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1c50: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
1c60: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
1c70: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
1c80: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
1c90: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
1ca0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
1cb0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
1cc0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
1cd0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1ce0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1cf0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1d00: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1d10: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
1d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
1d40: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
1d50: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
1d60: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  tTab = 0;       
1d70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1d80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
1d90: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
1da0: 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 65 72 79  .  int nSubquery
1db0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1dc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79       /* How many
1dd0: 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62 71 75   levels of subqu
1de0: 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1df0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1e00: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b;         /* Th
1e10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1e20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  ction */.  struc
1e30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1e40: 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  pItem;       /* 
1e50: 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  Use for looping 
1e60: 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74  over pSrcList it
1e70: 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ems */.  struct 
1e80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d  SrcList_item *pM
1e90: 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68  atch = 0;  /* Th
1ea0: 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c  e matching pSrcL
1eb0: 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61  ist item */.  Na
1ec0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e  meContext *pTopN
1ed0: 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20  C = pNC;        
1ee0: 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e  /* First namecon
1ef0: 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  text in the list
1f00: 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53   */.  Schema *pS
1f10: 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20  chema = 0;      
1f20: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d          /* Schem
1f30: 61 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  a of the express
1f40: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  ion */.  int eNe
1f50: 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c  wExprOp = TK_COL
1f60: 55 4d 4e 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  UMN;       /* Ne
1f70: 77 20 76 61 6c 75 65 20 66 6f 72 20 70 45 78 70  w value for pExp
1f80: 72 2d 3e 6f 70 20 6f 6e 20 73 75 63 63 65 73 73  r->op on success
1f90: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1fa0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
1fb0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1fc0: 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f   hold the row */
1fd0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
1fe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ff0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
2000: 20 6f 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61   of pTab */..  a
2010: 73 73 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20  ssert( pNC );   
2020: 20 20 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f    /* the name co
2030: 6e 74 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntext cannot be 
2040: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
2050: 74 28 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a  t( zCol );    /*
2060: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
2070: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
2080: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  /.  assert( !Exp
2090: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
20a0: 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
20b0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
20c0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
20d0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d   the node to no-
20e0: 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72  match */.  pExpr
20f0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
2100: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
2110: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
2120: 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54  Reduce);..  /* T
2130: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68  ranslate the sch
2140: 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20  ema name in zDb 
2150: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
2160: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
2170: 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e  ing.  ** schema.
2180: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
2190: 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d  pSchema will rem
21a0: 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74  ain NULL and not
21b0: 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a  hing will match.
21c0: 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69    ** resulting i
21d0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
21e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
21f0: 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66  oward the end of
2200: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
2210: 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  */.  if( zDb ){.
2220: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
2230: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2240: 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74  PartIdx );.    t
2250: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
2260: 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65  Flags & NC_IsChe
2270: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ck );.    if( (p
2280: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e  NC->ncFlags & (N
2290: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43  C_PartIdx|NC_IsC
22a0: 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20  heck))!=0 ){.   
22b0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69     /* Silently i
22c0: 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71  gnore database q
22d0: 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65  ualifiers inside
22e0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
22f0: 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ts and.      ** 
2300: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 2e  partial indices.
2310: 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65    Do not raise e
2320: 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68  rrors because th
2330: 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a 20  at might break. 
2340: 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 61       ** legacy a
2350: 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64 6f  nd because it do
2360: 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74  es not hurt anyt
2370: 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e  hing to just ign
2380: 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ore the.      **
2390: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
23a0: 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 30  */.      zDb = 0
23b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
23c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
23d0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
23e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
23f0: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
2400: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2410: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
2420: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
2430: 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20 20  me,zDb)==0 ){.  
2440: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
2450: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
2460: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
2470: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2480: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2490: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61   }..  /* Start a
24a0: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
24b0: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
24c0: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
24d0: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
24e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e   */.  assert( pN
24f0: 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 3b 0a 20  C && cnt==0 );. 
2500: 20 64 6f 7b 0a 20 20 20 20 45 78 70 72 4c 69 73   do{.    ExprLis
2510: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
2520: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2530: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2540: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
2550: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
2560: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
2570: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
2580: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2590: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
25a0: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
25b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
25c0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26 26  sert( pTab!=0 &&
25d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20   pTab->zName!=0 
25e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
25f0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
2600: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2610: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26  Item->pSelect &&
2620: 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74   (pItem->pSelect
2630: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2640: 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2650: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2660: 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hit = 0;.       
2670: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65     pEList = pIte
2680: 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  m->pSelect->pELi
2690: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
26a0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
26b0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
26c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
26d0: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
26e0: 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  me(pEList->a[j].
26f0: 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61  zSpan, zCol, zTa
2700: 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  b, zDb) ){.     
2710: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
2720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e                cn
2730: 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  tTab = 2;.      
2740: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2750: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
2760: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
2770: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2780: 20 20 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b          hit = 1;
2790: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
27a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
27b0: 20 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20       if( hit || 
27c0: 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zTab==0 ) contin
27d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
27e0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 20 26 26        if( zDb &&
27f0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d   pTab->pSchema!=
2800: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2810: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2820: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2830: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
2840: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2850: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
2860: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
2870: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
2880: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
2890: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
28a0: 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  bName!=0 );.    
28b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
28c0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
28d0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20  e, zTab)!=0 ){. 
28e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
28f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2900: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
2910: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
2920: 26 26 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  && pItem->zAlias
2930: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2940: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
2950: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
2960: 30 2c 20 28 76 6f 69 64 2a 29 26 70 45 78 70 72  0, (void*)&pExpr
2970: 2d 3e 79 2e 70 54 61 62 29 3b 0a 20 20 20 20 20  ->y.pTab);.     
2980: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2990: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
29a0: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
29b0: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
29c0: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
29d0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  }.        for(j=
29e0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
29f0: 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
2a00: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; j++, pCol++){.
2a10: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2a20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2a30: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
2a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2a50: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
2a60: 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f  s been exactly o
2a70: 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61  ne prior match a
2a80: 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20  nd this match.  
2a90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
2aa0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
2ab0: 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41  nd table of a NA
2ac0: 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73  TURAL JOIN or is
2ad0: 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20   in a .         
2ae0: 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75     ** USING clau
2af0: 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  se, then skip th
2b00: 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20  is match..      
2b10: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2b20: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20       if( cnt==1 
2b30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2b40: 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a   if( pItem->fg.j
2b50: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2b60: 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  URAL ) continue;
2b70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2b80: 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  f( nameInUsingCl
2b90: 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  ause(pItem->pUsi
2ba0: 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74  ng, zCol) ) cont
2bb0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2bc0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2bd0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
2be0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
2bf0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;.            /
2c00: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
2c10: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
2c20: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
2c30: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2c40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
2c50: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2c60: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
2c70: 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20  -1 : (i16)j;.   
2c80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2c90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2ca0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2cb0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2cc0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2cd0: 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68  >iTable = pMatch
2ce0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2cf0: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62     pExpr->y.pTab
2d00: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
2d10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49 47 48  .        /* RIGH
2d20: 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65 74 29  T JOIN not (yet)
2d30: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
2d40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2d50: 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Match->fg.jointy
2d60: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d  pe & JT_RIGHT)==
2d70: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2d80: 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69   (pMatch->fg.joi
2d90: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2da0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2db0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2dc0: 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e 42 65  (pExpr, EP_CanBe
2dd0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
2de0: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61  .        pSchema
2df0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
2e00: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
2e10: 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28 20   }.    } /* if( 
2e20: 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a 23  pSrcList ) */..#
2e30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2e40: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
2e50: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2e60: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 29  ITE_OMIT_UPSERT)
2e70: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
2e80: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
2e90: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
2ea0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
2eb0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
2ec0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
2ed0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
2ee0: 65 72 65 6e 63 65 2e 20 20 4f 72 0a 20 20 20 20  erence.  Or.    
2ef0: 2a 2a 20 6d 61 79 62 65 20 69 74 20 69 73 20 61  ** maybe it is a
2f00: 6e 20 65 78 63 6c 75 64 65 64 2e 2a 20 66 72 6f  n excluded.* fro
2f10: 6d 20 61 6e 20 75 70 73 65 72 74 2e 0a 20 20 20  m an upsert..   
2f20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
2f30: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
2f40: 20 63 6e 74 54 61 62 3d 3d 30 20 29 7b 0a 20 20   cntTab==0 ){.  
2f50: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 23 69      pTab = 0;.#i
2f60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2f70: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 20 20  T_TRIGGER.      
2f80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69  if( pParse->pTri
2f90: 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a 20 20  ggerTab!=0 ){.  
2fa0: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
2fb0: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
2fc0: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
2fd0: 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  t( op==TK_DELETE
2fe0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
2ff0: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45  E || op==TK_INSE
3000: 52 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  RT );.        if
3010: 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20  ( op!=TK_DELETE 
3020: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3030: 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d  p("new",zTab) ==
3040: 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   0 ){.          
3050: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
3060: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
3070: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
3080: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 20  ggerTab;.       
3090: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54   }else if( op!=T
30a0: 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69  K_INSERT && sqli
30b0: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
30c0: 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zTab)==0 ){.   
30d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
30e0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
30f0: 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
3100: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a  e->pTriggerTab;.
3110: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
3120: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
3130: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
3140: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
3150: 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a 20 20  E_OMIT_UPSERT.  
3160: 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
3170: 46 6c 61 67 73 20 26 20 4e 43 5f 55 55 70 73 65  Flags & NC_UUpse
3180: 72 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)!=0 ){.      
3190: 20 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72    Upsert *pUpser
31a0: 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70  t = pNC->uNC.pUp
31b0: 73 65 72 74 3b 0a 20 20 20 20 20 20 20 20 69 66  sert;.        if
31c0: 28 20 70 55 70 73 65 72 74 20 26 26 20 73 71 6c  ( pUpsert && sql
31d0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 65 78 63  ite3StrICmp("exc
31e0: 6c 75 64 65 64 22 2c 7a 54 61 62 29 3d 3d 30 20  luded",zTab)==0 
31f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
3200: 62 20 3d 20 70 55 70 73 65 72 74 2d 3e 70 55 70  b = pUpsert->pUp
3210: 73 65 72 74 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  sertSrc->a[0].pT
3220: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  ab;.          pE
3230: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 32 3b  xpr->iTable = 2;
3240: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3250: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
3260: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 20  ITE_OMIT_UPSERT 
3270: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  */..      if( pT
3280: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69  ab ){ .        i
3290: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
32a0: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
32b0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
32c0: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
32d0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20      for(iCol=0, 
32e0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
32f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
3300: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
3310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3320: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3330: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
3340: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
3350: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70       if( iCol==p
3360: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
3370: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
3380: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
3390: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
33a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
33b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
33c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
33d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71  pTab->nCol && sq
33e0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
33f0: 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77  l) && VisibleRow
3400: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
3410: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
3420: 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f 0a 20  51414-32910 */. 
3430: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
3440: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
3450: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
3460: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
3470: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 23 69         cnt++;.#i
3480: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3490: 54 5f 55 50 53 45 52 54 0a 20 20 20 20 20 20 20  T_UPSERT.       
34a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
34b0: 61 62 6c 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20  able==2 ){.     
34c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
34d0: 20 69 43 6f 6c 3d 3d 28 2d 31 29 20 29 3b 0a 20   iCol==(-1) );. 
34e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
34f0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
3500: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3510: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
3520: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
3530: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70        pExpr->y.p
3540: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
3550: 20 20 20 20 20 20 20 20 20 20 65 4e 65 77 45 78            eNewEx
3560: 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  prOp = TK_COLUMN
3570: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3580: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3590: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
35a0: 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70 73   = pNC->uNC.pUps
35b0: 65 72 74 2d 3e 72 65 67 44 61 74 61 20 2b 20 69  ert->regData + i
35c0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
35d0: 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20 3d 20     eNewExprOp = 
35e0: 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
35f0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
3600: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
3610: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 20 20 20  , EP_Alias);.   
3620: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3630: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
3640: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3650: 5f 55 50 53 45 52 54 20 2a 2f 0a 20 20 20 20 20  _UPSERT */.     
3660: 20 20 20 20 20 7b 0a 23 69 66 6e 64 65 66 20 53       {.#ifndef S
3670: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3680: 45 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ER.            i
3690: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
36a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
36b0: 2d 3e 61 66 66 45 78 70 72 20 3d 20 53 51 4c 49  ->affExpr = SQLI
36c0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
36d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
36e0: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61  e if( pExpr->iTa
36f0: 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ble==0 ){.      
3700: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
3710: 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20  ( iCol==31 );.  
3720: 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73 74              test
3730: 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29  case( iCol==32 )
3740: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
3750: 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20  pParse->oldmask 
3760: 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30  |= (iCol>=32 ? 0
3770: 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28 75  xffffffff : (((u
3780: 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20  32)1)<<iCol));. 
3790: 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65             }else
37a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
37b0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
37c0: 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  31 );.          
37d0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
37e0: 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20  ol==32 );.      
37f0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
3800: 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c  newmask |= (iCol
3810: 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66 66  >=32 ? 0xfffffff
3820: 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69  f : (((u32)1)<<i
3830: 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20  Col));.         
3840: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
3850: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d   pExpr->y.pTab =
3860: 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20   pTab;.         
3870: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
3880: 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a 20  n = (i16)iCol;. 
3890: 20 20 20 20 20 20 20 20 20 20 20 65 4e 65 77 45             eNewE
38a0: 78 70 72 4f 70 20 3d 20 54 4b 5f 54 52 49 47 47  xprOp = TK_TRIGG
38b0: 45 52 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  ER;.#endif /* SQ
38c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
38d0: 52 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7d  R */.          }
38e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
38f0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
3900: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
3910: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
3920: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3930: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 29  ITE_OMIT_UPSERT)
3940: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
3950: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
3960: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
3970: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
3980: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
3990: 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 63 6e  nt==0.     && cn
39a0: 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26 26 20  tTab==1.     && 
39b0: 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26 20 28  pMatch.     && (
39c0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
39d0: 43 5f 49 64 78 45 78 70 72 29 3d 3d 30 0a 20 20  C_IdxExpr)==0.  
39e0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73 52     && sqlite3IsR
39f0: 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20  owid(zCol).     
3a00: 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28  && VisibleRowid(
3a10: 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 0a 20 20  pMatch->pTab).  
3a20: 20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d    ){.      cnt =
3a30: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
3a40: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
3a50: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 45       pExpr->affE
3a60: 78 70 72 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  xpr = SQLITE_AFF
3a70: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a  _INTEGER;.    }.
3a80: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49  .    /*.    ** I
3a90: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f  f the input is o
3aa0: 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f  f the form Z (no
3ab0: 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20  t Y.Z or X.Y.Z) 
3ac0: 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a  then the name Z.
3ad0: 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66      ** might ref
3ae0: 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d  er to an result-
3af0: 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73  set alias.  This
3b00: 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78   happens, for ex
3b10: 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20  ample, when.    
3b20: 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76  ** we are resolv
3b30: 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65  ing names in the
3b40: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66   WHERE clause of
3b50: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   the following c
3b60: 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20  ommand:.    **. 
3b70: 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54     **     SELECT
3b80: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
3b90: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
3ba0: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49  .    **.    ** I
3bb0: 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69  n cases like thi
3bc0: 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70 72  s, replace pExpr
3bd0: 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20   with a copy of 
3be0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
3bf0: 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73  hat.    ** forms
3c00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
3c10: 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20  entry ("a+b" in 
3c20: 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64  the example) and
3c30: 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74   return immediat
3c40: 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65  ely..    ** Note
3c50: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
3c60: 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
3c70: 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61  lt set should ha
3c80: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
3c90: 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20      ** resolved 
3ca0: 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65 20  by the time the 
3cb0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73 20  WHERE clause is 
3cc0: 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a  resolved..    **
3cd0: 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c  .    ** The abil
3ce0: 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75  ity to use an ou
3cf0: 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20  tput result-set 
3d00: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48  column in the WH
3d10: 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20  ERE, GROUP BY,. 
3d20: 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20     ** or HAVING 
3d30: 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70  clauses, or as p
3d40: 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20  art of a larger 
3d50: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
3d60: 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a  e ORDER BY.    *
3d70: 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20  * clause is not 
3d80: 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54  standard SQL.  T
3d90: 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29  his is a (goofy)
3da0: 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f   SQLite extensio
3db0: 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69  n, that.    ** i
3dc0: 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20  s supported for 
3dd0: 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74  backwards compat
3de0: 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 48 65  ibility only. He
3df0: 6e 63 65 2c 20 77 65 20 69 73 73 75 65 20 61 20  nce, we issue a 
3e00: 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f  warning.    ** o
3e10: 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20  n sqlite3_log() 
3e20: 77 68 65 6e 65 76 65 72 20 74 68 65 20 63 61 70  whenever the cap
3e30: 61 62 69 6c 69 74 79 20 69 73 20 75 73 65 64 2e  ability is used.
3e40: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3e50: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
3e60: 4e 43 5f 55 45 4c 69 73 74 29 21 3d 30 0a 20 20  NC_UEList)!=0.  
3e70: 20 20 20 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20     && cnt==0.   
3e80: 20 20 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20    && zTab==0.   
3e90: 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69 73 74   ){.      pEList
3ea0: 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 45 4c 69   = pNC->uNC.pELi
3eb0: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
3ec0: 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20  ( pEList!=0 );. 
3ed0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
3ee0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
3ef0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  ++){.        cha
3f00: 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d  r *zAs = pEList-
3f10: 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20  >a[j].zName;.   
3f20: 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20       if( zAs!=0 
3f30: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
3f40: 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20  p(zAs, zCol)==0 
3f50: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
3f60: 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20  r *pOrig;.      
3f70: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3f80: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
3f90: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
3fa0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  );.          ass
3fb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c  ert( pExpr->x.pL
3fc0: 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist==0 );.      
3fd0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
3fe0: 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20  r->x.pSelect==0 
3ff0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72  );.          pOr
4000: 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  ig = pEList->a[j
4010: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
4020: 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
4030: 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67  lags&NC_AllowAgg
4040: 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61 73 50  )==0 && ExprHasP
4050: 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45  roperty(pOrig, E
4060: 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20  P_Agg) ){.      
4070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4080: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
4090: 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64  isuse of aliased
40a0: 20 61 67 67 72 65 67 61 74 65 20 25 73 22 2c 20   aggregate %s", 
40b0: 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zAs);.          
40c0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
40d0: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rt;.          }.
40e0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70            if( (p
40f0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 26 4e 43 5f 41  NC->ncFlags&NC_A
4100: 6c 6c 6f 77 57 69 6e 29 3d 3d 30 20 26 26 20 45  llowWin)==0 && E
4110: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4120: 4f 72 69 67 2c 20 45 50 5f 57 69 6e 29 20 29 7b  Orig, EP_Win) ){
4130: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4140: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4150: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
4160: 61 6c 69 61 73 65 64 20 77 69 6e 64 6f 77 20 66  aliased window f
4170: 75 6e 63 74 69 6f 6e 20 25 73 22 2c 7a 41 73 29  unction %s",zAs)
4180: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
4190: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
41a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
41b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
41c0: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
41d0: 70 4f 72 69 67 29 21 3d 31 20 29 7b 0a 20 20 20  pOrig)!=1 ){.   
41e0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
41f0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
4200: 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75   "row value misu
4210: 73 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20  sed");.         
4220: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
4230: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ort;.          }
4240: 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c  .          resol
4250: 76 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20  veAlias(pParse, 
4260: 70 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72  pEList, j, pExpr
4270: 2c 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29  , "", nSubquery)
4280: 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20  ;.          cnt 
4290: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
42a0: 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20  Match = 0;.     
42b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
42c0: 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29  b==0 && zDb==0 )
42d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
42e0: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
42f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
4300: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
4310: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
4320: 30 2c 20 28 76 6f 69 64 2a 29 70 45 78 70 72 29  0, (void*)pExpr)
4330: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
4340: 20 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f          goto loo
4350: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20  kupname_end;.   
4360: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a       }.      } .
4370: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64      }..    /* Ad
4380: 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78  vance to the nex
4390: 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20  t name context. 
43a0: 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65   The loop will e
43b0: 78 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a  xit when either.
43c0: 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61      ** we have a
43d0: 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f   match (cnt>0) o
43e0: 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75  r when we run ou
43f0: 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78  t of name contex
4400: 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ts..    */.    i
4410: 66 28 20 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a  f( cnt ) break;.
4420: 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70      pNC = pNC->p
4430: 4e 65 78 74 3b 0a 20 20 20 20 6e 53 75 62 71 75  Next;.    nSubqu
4440: 65 72 79 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28  ery++;.  }while(
4450: 20 70 4e 43 20 29 3b 0a 0a 0a 20 20 2f 2a 0a 20   pNC );...  /*. 
4460: 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61   ** If X and Y a
4470: 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65  re NULL (in othe
4480: 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20  r words if only 
4490: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20  the column name 
44a0: 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69  Z is.  ** suppli
44b0: 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75  ed) and the valu
44c0: 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73  e of Z is enclos
44d0: 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f  ed in double-quo
44e0: 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a  tes, then.  ** Z
44f0: 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74   is a string lit
4500: 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e  eral if it doesn
4510: 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c  't match any col
4520: 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74  umn names.  In t
4530: 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77  hat.  ** case, w
4540: 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e  e need to return
4550: 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20   right away and 
4560: 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61  not make any cha
4570: 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78  nges to.  ** pEx
4580: 70 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65  pr..  **.  ** Be
4590: 63 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e  cause no referen
45a0: 63 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f  ce was made to o
45b0: 75 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74  uter contexts, t
45c0: 68 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a  he pNC->nRef.  *
45d0: 2a 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74  * fields are not
45e0: 20 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20   changed in any 
45f0: 63 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20  context..  */.  
4600: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
4610: 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73  ab==0 ){.    ass
4620: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
4630: 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 69 66 28  TK_ID );.    if(
4640: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
4650: 28 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f  (pExpr,EP_DblQuo
4660: 74 65 64 29 0a 20 20 20 20 20 26 26 20 61 72 65  ted).     && are
4670: 44 6f 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69  DoubleQuotedStri
4680: 6e 67 73 45 6e 61 62 6c 65 64 28 64 62 2c 20 70  ngsEnabled(db, p
4690: 54 6f 70 4e 43 29 0a 20 20 20 20 29 7b 0a 20 20  TopNC).    ){.  
46a0: 20 20 20 20 2f 2a 20 49 66 20 61 20 64 6f 75 62      /* If a doub
46b0: 6c 65 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69  le-quoted identi
46c0: 66 69 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61  fier does not ma
46d0: 74 63 68 20 61 6e 79 20 6b 6e 6f 77 6e 20 63 6f  tch any known co
46e0: 6c 75 6d 6e 20 6e 61 6d 65 2c 0a 20 20 20 20 20  lumn name,.     
46f0: 20 2a 2a 20 74 68 65 6e 20 74 72 65 61 74 20 69   ** then treat i
4700: 74 20 61 73 20 61 20 73 74 72 69 6e 67 2e 0a 20  t as a string.. 
4710: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
4720: 20 54 68 69 73 20 68 61 63 6b 20 77 61 73 20 61   This hack was a
4730: 64 64 65 64 20 69 6e 20 74 68 65 20 65 61 72 6c  dded in the earl
4740: 79 20 64 61 79 73 20 6f 66 20 53 51 4c 69 74 65  y days of SQLite
4750: 20 69 6e 20 61 20 6d 69 73 67 75 69 64 65 64 20   in a misguided 
4760: 61 74 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a  attempt.      **
4770: 20 74 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c   to be compatibl
4780: 65 20 77 69 74 68 20 4d 79 53 51 4c 20 33 2e 78  e with MySQL 3.x
4790: 2c 20 77 68 69 63 68 20 75 73 65 64 20 64 6f 75  , which used dou
47a0: 62 6c 65 2d 71 75 6f 74 65 73 20 66 6f 72 20 73  ble-quotes for s
47b0: 74 72 69 6e 67 73 2e 0a 20 20 20 20 20 20 2a 2a  trings..      **
47c0: 20 49 20 6e 6f 77 20 73 6f 72 65 6c 79 20 72 65   I now sorely re
47d0: 67 72 65 74 20 70 75 74 74 69 6e 67 20 69 6e 20  gret putting in 
47e0: 74 68 69 73 20 68 61 63 6b 2e 20 54 68 65 20 65  this hack. The e
47f0: 66 66 65 63 74 20 6f 66 20 74 68 69 73 20 68 61  ffect of this ha
4800: 63 6b 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74  ck is.      ** t
4810: 68 61 74 20 6d 69 73 73 70 65 6c 6c 65 64 20 69  hat misspelled i
4820: 64 65 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20  dentifier names 
4830: 61 72 65 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e  are silently con
4840: 76 65 72 74 65 64 20 69 6e 74 6f 20 73 74 72 69  verted into stri
4850: 6e 67 73 0a 20 20 20 20 20 20 2a 2a 20 72 61 74  ngs.      ** rat
4860: 68 65 72 20 74 68 61 6e 20 63 61 75 73 69 6e 67  her than causing
4870: 20 61 6e 20 65 72 72 6f 72 2c 20 74 6f 20 74 68   an error, to th
4880: 65 20 66 72 75 73 74 72 61 74 69 6f 6e 20 6f 66  e frustration of
4890: 20 63 6f 75 6e 74 6c 65 73 73 0a 20 20 20 20 20   countless.     
48a0: 20 2a 2a 20 70 72 6f 67 72 61 6d 6d 65 72 73 2e   ** programmers.
48b0: 20 54 6f 20 61 6c 6c 20 74 68 6f 73 65 20 66 72   To all those fr
48c0: 75 73 74 72 61 74 65 64 20 70 72 6f 67 72 61 6d  ustrated program
48d0: 6d 65 72 73 2c 20 6d 79 20 61 70 6f 6c 6f 67 69  mers, my apologi
48e0: 65 73 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  es..      **.   
48f0: 20 20 20 2a 2a 20 53 6f 6d 65 64 61 79 2c 20 49     ** Someday, I
4900: 20 68 6f 70 65 20 74 6f 20 67 65 74 20 72 69 64   hope to get rid
4910: 20 6f 66 20 74 68 69 73 20 68 61 63 6b 2e 20 55   of this hack. U
4920: 6e 66 6f 72 74 75 6e 61 74 65 6c 79 20 74 68 65  nfortunately the
4930: 72 65 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61  re is.      ** a
4940: 20 68 75 67 65 20 61 6d 6f 75 6e 74 20 6f 66 20   huge amount of 
4950: 6c 65 67 61 63 79 20 53 51 4c 20 74 68 61 74 20  legacy SQL that 
4960: 75 73 65 73 20 69 74 2e 20 53 6f 20 66 6f 72 20  uses it. So for 
4970: 6e 6f 77 2c 20 77 65 20 6a 75 73 74 0a 20 20 20  now, we just.   
4980: 20 20 20 2a 2a 20 69 73 73 75 65 20 61 20 77 61     ** issue a wa
4990: 72 6e 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a  rning..      */.
49a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f        sqlite3_lo
49b0: 67 28 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47  g(SQLITE_WARNING
49c0: 2c 0a 20 20 20 20 20 20 20 20 22 64 6f 75 62 6c  ,.        "doubl
49d0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
49e0: 6c 69 74 65 72 61 6c 3a 20 5c 22 25 77 5c 22 22  literal: \"%w\""
49f0: 2c 20 7a 43 6f 6c 29 3b 0a 23 69 66 64 65 66 20  , zCol);.#ifdef 
4a00: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f  SQLITE_ENABLE_NO
4a10: 52 4d 41 4c 49 5a 45 0a 20 20 20 20 20 20 73 71  RMALIZE.      sq
4a20: 6c 69 74 65 33 56 64 62 65 41 64 64 44 62 6c 71  lite3VdbeAddDblq
4a30: 75 6f 74 65 53 74 72 28 64 62 2c 20 70 50 61 72  uoteStr(db, pPar
4a40: 73 65 2d 3e 70 56 64 62 65 2c 20 7a 43 6f 6c 29  se->pVdbe, zCol)
4a50: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70  ;.#endif.      p
4a60: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54  Expr->op = TK_ST
4a70: 52 49 4e 47 3b 0a 20 20 20 20 20 20 70 45 78 70  RING;.      pExp
4a80: 72 2d 3e 79 2e 70 54 61 62 20 3d 20 30 3b 0a 20  r->y.pTab = 0;. 
4a90: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
4aa0: 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20  Prune;.    }.   
4ab0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
4ac0: 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45  IdToTrueFalse(pE
4ad0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65  xpr) ){.      re
4ae0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
4af0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
4b00: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
4b10: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
4b20: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
4b30: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
4b40: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
4b50: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
4b60: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
4b70: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
4b80: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
4b90: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72   const char *zEr
4ba0: 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e  r;.    zErr = cn
4bb0: 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20  t==0 ? "no such 
4bc0: 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67  column" : "ambig
4bd0: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
4be0: 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29  ";.    if( zDb )
4bf0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
4c00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
4c10: 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20  "%s: %s.%s.%s", 
4c20: 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c  zErr, zDb, zTab,
4c30: 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73   zCol);.    }els
4c40: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
4c50: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4c60: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a  Msg(pParse, "%s:
4c70: 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a   %s.%s", zErr, z
4c80: 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Tab, zCol);.    
4c90: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c  }else{.      sql
4ca0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4cb0: 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a  rse, "%s: %s", z
4cc0: 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20  Err, zCol);.    
4cd0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68  }.    pParse->ch
4ce0: 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20  eckSchema = 1;. 
4cf0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
4d00: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
4d10: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
4d20: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
4d30: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
4d40: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
4d50: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
4d60: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
4d70: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
4d80: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
4d90: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
4da0: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
4db0: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
4dc0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
4dd0: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
4de0: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
4df0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
4e00: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
4e10: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
4e20: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
4e30: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
4e40: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
4e50: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
4e60: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
4e70: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
4e80: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
4e90: 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65  mn;.    testcase
4ea0: 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20  ( n==BMS-1 );.  
4eb0: 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a    if( n>=BMS ){.
4ec0: 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b        n = BMS-1;
4ed0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4ee0: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
4ef0: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
4f00: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
4f10: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69  >colUsed |= ((Bi
4f20: 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d  tmask)1)<<n;.  }
4f30: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
4f40: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
4f50: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4f60: 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ete(db, pExpr->p
4f70: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
4f80: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
4f90: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
4fa0: 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  b, pExpr->pRight
4fb0: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
4fc0: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
4fd0: 3e 6f 70 20 3d 20 65 4e 65 77 45 78 70 72 4f 70  >op = eNewExprOp
4fe0: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
4ff0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65  rty(pExpr, EP_Le
5000: 61 66 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  af);.lookupname_
5010: 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d  end:.  if( cnt==
5020: 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  1 ){.    assert(
5030: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69   pNC!=0 );.    i
5040: 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  f( !ExprHasPrope
5050: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c  rty(pExpr, EP_Al
5060: 69 61 73 29 20 29 7b 0a 20 20 20 20 20 20 73 71  ias) ){.      sq
5070: 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70 50  lite3AuthRead(pP
5080: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63  arse, pExpr, pSc
5090: 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c  hema, pNC->pSrcL
50a0: 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  ist);.    }.    
50b0: 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65  /* Increment the
50c0: 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61   nRef value on a
50d0: 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  ll name contexts
50e0: 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74   from TopNC up t
50f0: 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69  o.    ** the poi
5100: 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d  nt where the nam
5110: 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20  e matched. */.  
5120: 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20    for(;;){.     
5130: 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21   assert( pTopNC!
5140: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70  =0 );.      pTop
5150: 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20  NC->nRef++;.    
5160: 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e    if( pTopNC==pN
5170: 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  C ) break;.     
5180: 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43   pTopNC = pTopNC
5190: 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20  ->pNext;.    }. 
51a0: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
51b0: 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a  une;.  } else {.
51c0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
51d0: 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  bort;.  }.}../*.
51e0: 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20  ** Allocate and 
51f0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
5200: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
5210: 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f  n to load the co
5220: 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f  lumn iCol.** fro
5230: 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69 53 72  m datasource iSr
5240: 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72  c in SrcList pSr
5250: 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  c..*/.Expr *sqli
5260: 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45  te3CreateColumnE
5270: 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  xpr(sqlite3 *db,
5280: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20   SrcList *pSrc, 
5290: 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43  int iSrc, int iC
52a0: 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d  ol){.  Expr *p =
52b0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
52c0: 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c  c(db, TK_COLUMN,
52d0: 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20   0, 0);.  if( p 
52e0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
52f0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
5300: 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72  m = &pSrc->a[iSr
5310: 63 5d 3b 0a 20 20 20 20 70 2d 3e 79 2e 70 54 61  c];.    p->y.pTa
5320: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
5330: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
5340: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
5350: 0a 20 20 20 20 69 66 28 20 70 2d 3e 79 2e 70 54  .    if( p->y.pT
5360: 61 62 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20  ab->iPKey==iCol 
5370: 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  ){.      p->iCol
5380: 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65  umn = -1;.    }e
5390: 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43  lse{.      p->iC
53a0: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69  olumn = (ynVar)i
53b0: 43 6f 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63  Col;.      testc
53c0: 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29  ase( iCol==BMS )
53d0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
53e0: 28 20 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b  ( iCol==BMS-1 );
53f0: 0a 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f  .      pItem->co
5400: 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61  lUsed |= ((Bitma
5410: 73 6b 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d  sk)1)<<(iCol>=BM
5420: 53 20 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c  S ? BMS-1 : iCol
5430: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
5440: 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn p;.}../*.*
5450: 2a 20 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f  * Report an erro
5460: 72 20 74 68 61 74 20 61 6e 20 65 78 70 72 65 73  r that an expres
5470: 73 69 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69  sion is not vali
5480: 64 20 66 6f 72 20 73 6f 6d 65 20 73 65 74 20 6f  d for some set o
5490: 66 0a 2a 2a 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  f.** pNC->ncFlag
54a0: 73 20 76 61 6c 75 65 73 20 64 65 74 65 72 6d 69  s values determi
54b0: 6e 65 64 20 62 79 20 76 61 6c 69 64 4d 61 73 6b  ned by validMask
54c0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
54d0: 20 6e 6f 74 56 61 6c 69 64 28 0a 20 20 50 61 72   notValid(.  Par
54e0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
54f0: 20 20 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72    /* Leave error
5500: 20 6d 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f   message here */
5510: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
5520: 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e  pNC,    /* The n
5530: 61 6d 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ame context */. 
5540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73   const char *zMs
5550: 67 2c 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66  g,    /* Type of
5560: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20   error */.  int 
5570: 76 61 6c 69 64 4d 61 73 6b 20 20 20 20 20 20 20  validMask       
5580: 20 2f 2a 20 53 65 74 20 6f 66 20 63 6f 6e 74 65   /* Set of conte
5590: 78 74 73 20 66 6f 72 20 77 68 69 63 68 20 70 72  xts for which pr
55a0: 6f 68 69 62 69 74 65 64 20 2a 2f 0a 29 7b 0a 20  ohibited */.){. 
55b0: 20 61 73 73 65 72 74 28 20 28 76 61 6c 69 64 4d   assert( (validM
55c0: 61 73 6b 26 7e 28 4e 43 5f 49 73 43 68 65 63 6b  ask&~(NC_IsCheck
55d0: 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49  |NC_PartIdx|NC_I
55e0: 64 78 45 78 70 72 29 29 3d 3d 30 20 29 3b 0a 20  dxExpr))==0 );. 
55f0: 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
5600: 67 73 20 26 20 76 61 6c 69 64 4d 61 73 6b 29 21  gs & validMask)!
5610: 3d 30 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =0 ){.    const 
5620: 63 68 61 72 20 2a 7a 49 6e 20 3d 20 22 70 61 72  char *zIn = "par
5630: 74 69 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45  tial index WHERE
5640: 20 63 6c 61 75 73 65 73 22 3b 0a 20 20 20 20 69   clauses";.    i
5650: 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  f( pNC->ncFlags 
5660: 26 20 4e 43 5f 49 64 78 45 78 70 72 20 29 20 20  & NC_IdxExpr )  
5670: 20 20 20 20 7a 49 6e 20 3d 20 22 69 6e 64 65 78      zIn = "index
5680: 20 65 78 70 72 65 73 73 69 6f 6e 73 22 3b 0a 23   expressions";.#
5690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
56a0: 49 54 5f 43 48 45 43 4b 0a 20 20 20 20 65 6c 73  IT_CHECK.    els
56b0: 65 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61  e if( pNC->ncFla
56c0: 67 73 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20  gs & NC_IsCheck 
56d0: 29 20 7a 49 6e 20 3d 20 22 43 48 45 43 4b 20 63  ) zIn = "CHECK c
56e0: 6f 6e 73 74 72 61 69 6e 74 73 22 3b 0a 23 65 6e  onstraints";.#en
56f0: 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65 33 45  dif.    sqlite3E
5700: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5710: 22 25 73 20 70 72 6f 68 69 62 69 74 65 64 20 69  "%s prohibited i
5720: 6e 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 49 6e  n %s", zMsg, zIn
5730: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
5740: 45 78 70 72 65 73 73 69 6f 6e 20 70 20 73 68 6f  Expression p sho
5750: 75 6c 64 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f  uld encode a flo
5760: 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75  ating point valu
5770: 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e  e between 1.0 an
5780: 64 20 30 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e  d 0.0..** Return
5790: 20 31 30 32 34 20 74 69 6d 65 73 20 74 68 69 73   1024 times this
57a0: 20 76 61 6c 75 65 2e 20 20 4f 72 20 72 65 74 75   value.  Or retu
57b0: 72 6e 20 2d 31 20 69 66 20 70 20 69 73 20 6e 6f  rn -1 if p is no
57c0: 74 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69  t a floating poi
57d0: 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65 74 77  nt.** value betw
57e0: 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e  een 1.0 and 0.0.
57f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
5800: 78 70 72 50 72 6f 62 61 62 69 6c 69 74 79 28 45  xprProbability(E
5810: 78 70 72 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c  xpr *p){.  doubl
5820: 65 20 72 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66  e r = -1.0;.  if
5830: 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41  ( p->op!=TK_FLOA
5840: 54 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  T ) return -1;. 
5850: 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e   sqlite3AtoF(p->
5860: 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71  u.zToken, &r, sq
5870: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d  lite3Strlen30(p-
5880: 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49  >u.zToken), SQLI
5890: 54 45 5f 55 54 46 38 29 3b 0a 20 20 61 73 73 65  TE_UTF8);.  asse
58a0: 72 74 28 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20  rt( r>=0.0 );.  
58b0: 69 66 28 20 72 3e 31 2e 30 20 29 20 72 65 74 75  if( r>1.0 ) retu
58c0: 72 6e 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20  rn -1;.  return 
58d0: 28 69 6e 74 29 28 72 2a 31 33 34 32 31 37 37 32  (int)(r*13421772
58e0: 38 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  8.0);.}../*.** T
58f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63  his routine is c
5900: 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69  allback for sqli
5910: 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e 0a 2a  te3WalkExpr()..*
5920: 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d  *.** Resolve sym
5930: 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f  bolic names into
5940: 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61   TK_COLUMN opera
5950: 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75 72  tors for the cur
5960: 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20  rent.** node in 
5970: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
5980: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74  ree.  Return 0 t
5990: 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73  o continue the s
59a0: 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68  earch down.** th
59b0: 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61  e tree or 2 to a
59c0: 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77 61  bort the tree wa
59d0: 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  lk..**.** This r
59e0: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73  outine also does
59f0: 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20   error checking 
5a00: 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74  and name resolut
5a10: 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74  ion for.** funct
5a20: 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20  ion names.  The 
5a30: 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67  operator for agg
5a40: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
5a50: 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74   is changed.** t
5a60: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
5a70: 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  N..*/.static int
5a80: 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70   resolveExprStep
5a90: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
5aa0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
5ab0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
5ac0: 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  NC;.  Parse *pPa
5ad0: 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20 70 57  rse;..  pNC = pW
5ae0: 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20  alker->u.pNC;.  
5af0: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
5b00: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
5b10: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73 73 65  ->pParse;.  asse
5b20: 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57 61 6c  rt( pParse==pWal
5b30: 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b 0a 0a  ker->pParse );..
5b40: 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20  #ifndef NDEBUG. 
5b50: 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69   if( pNC->pSrcLi
5b60: 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c  st && pNC->pSrcL
5b70: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b  ist->nAlloc>0 ){
5b80: 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53  .    SrcList *pS
5b90: 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53  rcList = pNC->pS
5ba0: 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20  rcList;.    int 
5bb0: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
5bc0: 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d  i<pNC->pSrcList-
5bd0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
5be0: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c     assert( pSrcL
5bf0: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
5c00: 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74  r>=0 && pSrcList
5c10: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70  ->a[i].iCursor<p
5c20: 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20  Parse->nTab);.  
5c30: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
5c40: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
5c50: 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e  op ){..#if defin
5c60: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5c70: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
5c80: 49 4d 49 54 29 20 26 26 20 21 64 65 66 69 6e 65  IMIT) && !define
5c90: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
5ca0: 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54  BQUERY).    /* T
5cb0: 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61  he special opera
5cc0: 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73  tor TK_ROW means
5cd0: 20 75 73 65 20 74 68 65 20 72 6f 77 69 64 20 66   use the rowid f
5ce0: 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20 20 20  or the first.   
5cf0: 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68   ** column in th
5d00: 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20  e FROM clause.  
5d10: 54 68 69 73 20 69 73 20 75 73 65 64 20 62 79 20  This is used by 
5d20: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52  the LIMIT and OR
5d30: 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c  DER BY.    ** cl
5d40: 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20  ause processing 
5d50: 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20 44 45  on UPDATE and DE
5d60: 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e  LETE statements.
5d70: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
5d80: 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20   TK_ROW: {.     
5d90: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
5da0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
5db0: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
5dc0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
5dd0: 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65  Item;.      asse
5de0: 72 74 28 20 70 53 72 63 4c 69 73 74 20 26 26 20  rt( pSrcList && 
5df0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d  pSrcList->nSrc==
5e00: 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d  1 );.      pItem
5e10: 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a   = pSrcList->a;.
5e20: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 48 61        assert( Ha
5e30: 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54  sRowid(pItem->pT
5e40: 61 62 29 20 26 26 20 70 49 74 65 6d 2d 3e 70 54  ab) && pItem->pT
5e50: 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29  ab->pSelect==0 )
5e60: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  ;.      pExpr->o
5e70: 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20  p = TK_COLUMN;. 
5e80: 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54       pExpr->y.pT
5e90: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
5ea0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
5eb0: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
5ec0: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
5ed0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
5ee0: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
5ef0: 61 66 66 45 78 70 72 20 3d 20 53 51 4c 49 54 45  affExpr = SQLITE
5f00: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
5f10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5f20: 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e  .#endif /* defin
5f30: 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45  ed(SQLITE_ENABLE
5f40: 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c  _UPDATE_DELETE_L
5f50: 49 4d 49 54 29 0a 20 20 20 20 20 20 20 20 20 20  IMIT).          
5f60: 26 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  && !defined(SQLI
5f70: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
5f80: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 63  ) */..    /* A c
5f90: 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20  olumn name:     
5fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 49                 I
5fb0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 74 61 62 6c  D.    ** Or tabl
5fc0: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
5fd0: 6e 20 6e 61 6d 65 3a 20 20 20 20 49 44 2e 49 44  n name:    ID.ID
5fe0: 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61 74  .    ** Or a dat
5ff0: 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64  abase, table and
6000: 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e   column:  ID.ID.
6010: 49 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  ID.    **.    **
6020: 20 54 68 65 20 54 4b 5f 49 44 20 61 6e 64 20 54   The TK_ID and T
6030: 4b 5f 4f 55 54 20 63 61 73 65 73 20 61 72 65 20  K_OUT cases are 
6040: 63 6f 6d 62 69 6e 65 64 20 73 6f 20 74 68 61 74  combined so that
6050: 20 74 68 65 72 65 20 77 69 6c 6c 20 6f 6e 6c 79   there will only
6060: 0a 20 20 20 20 2a 2a 20 62 65 20 6f 6e 65 20 63  .    ** be one c
6070: 61 6c 6c 20 74 6f 20 6c 6f 6f 6b 75 70 4e 61 6d  all to lookupNam
6080: 65 28 29 2e 20 20 54 68 65 6e 20 74 68 65 20 63  e().  Then the c
6090: 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 69 6e 2d  ompiler will in-
60a0: 6c 69 6e 65 20 0a 20 20 20 20 2a 2a 20 6c 6f 6f  line .    ** loo
60b0: 6b 75 70 4e 61 6d 65 28 29 20 66 6f 72 20 61 20  kupName() for a 
60c0: 73 69 7a 65 20 72 65 64 75 63 74 69 6f 6e 20 61  size reduction a
60d0: 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65 20 69  nd performance i
60e0: 6e 63 72 65 61 73 65 2e 0a 20 20 20 20 2a 2f 0a  ncrease..    */.
60f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a      case TK_ID:.
6100: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
6110: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63   {.      const c
6120: 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20  har *zColumn;.  
6130: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
6140: 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 63 6f  zTable;.      co
6150: 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20  nst char *zDb;. 
6160: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
6170: 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45  t;..      if( pE
6180: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  xpr->op==TK_ID )
6190: 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20  {.        zDb = 
61a0: 30 3b 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c  0;.        zTabl
61b0: 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a  e = 0;.        z
61c0: 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e  Column = pExpr->
61d0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
61e0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 45  }else{.        E
61f0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
6200: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
6210: 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72     notValid(pPar
6220: 73 65 2c 20 70 4e 43 2c 20 22 74 68 65 20 5c 22  se, pNC, "the \"
6230: 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c 20 4e  .\" operator", N
6240: 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20  C_IdxExpr);.    
6250: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
6260: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
6270: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
6280: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
6290: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a         zDb = 0;.
62a0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
62b0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
62c0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
62d0: 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20  DOT );.         
62e0: 20 7a 44 62 20 3d 20 70 4c 65 66 74 2d 3e 75 2e   zDb = pLeft->u.
62f0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
6300: 20 20 70 4c 65 66 74 20 3d 20 70 52 69 67 68 74    pLeft = pRight
6310: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20  ->pLeft;.       
6320: 20 20 20 70 52 69 67 68 74 20 3d 20 70 52 69 67     pRight = pRig
6330: 68 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  ht->pRight;.    
6340: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7a 54      }.        zT
6350: 61 62 6c 65 20 3d 20 70 4c 65 66 74 2d 3e 75 2e  able = pLeft->u.
6360: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
6370: 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74  zColumn = pRight
6380: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
6390: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
63a0: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
63b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
63c0: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
63d0: 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70 45 78  arse, (void*)pEx
63e0: 70 72 2c 20 28 76 6f 69 64 2a 29 70 52 69 67 68  pr, (void*)pRigh
63f0: 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  t);.          sq
6400: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
6410: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 28 76  Remap(pParse, (v
6420: 6f 69 64 2a 29 26 70 45 78 70 72 2d 3e 79 2e 70  oid*)&pExpr->y.p
6430: 54 61 62 2c 20 28 76 6f 69 64 2a 29 70 4c 65 66  Tab, (void*)pLef
6440: 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  t);.        }.  
6450: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
6460: 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50  rn lookupName(pP
6470: 61 72 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62 6c  arse, zDb, zTabl
6480: 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c  e, zColumn, pNC,
6490: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a   pExpr);.    }..
64a0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66      /* Resolve f
64b0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20  unction names.  
64c0: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
64d0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
64e0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
64f0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c  st = pExpr->x.pL
6500: 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61  ist;    /* The a
6510: 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a  rgument list */.
6520: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c        int n = pL
6530: 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78  ist ? pList->nEx
6540: 70 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75  pr : 0;    /* Nu
6550: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
6560: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
6570: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b  o_such_func = 0;
6580: 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69         /* True i
6590: 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69  f no such functi
65a0: 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20  on exists */.   
65b0: 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d     int wrong_num
65c0: 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f  _args = 0;     /
65d0: 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20  * True if wrong 
65e0: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
65f0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
6600: 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20   is_agg = 0;    
6610: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65           /* True
6620: 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67   if is an aggreg
6630: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  ate function */.
6640: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
6650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6660: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
6670: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
6680: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
6690: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
66a0: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
66b0: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
66c0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
66d0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20  uncDef *pDef;   
66e0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e             /* In
66f0: 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20  formation about 
6700: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a  the function */.
6710: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45        u8 enc = E
6720: 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20  NC(pParse->db); 
6730: 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73    /* The databas
6740: 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  e encoding */.  
6750: 20 20 20 20 69 6e 74 20 73 61 76 65 64 41 6c 6c      int savedAll
6760: 6f 77 46 6c 61 67 73 20 3d 20 28 70 4e 43 2d 3e  owFlags = (pNC->
6770: 6e 63 46 6c 61 67 73 20 26 20 28 4e 43 5f 41 6c  ncFlags & (NC_Al
6780: 6c 6f 77 41 67 67 20 7c 20 4e 43 5f 41 6c 6c 6f  lowAgg | NC_Allo
6790: 77 57 69 6e 29 29 3b 0a 23 69 66 6e 64 65 66 20  wWin));.#ifndef 
67a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
67b0: 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 57 69 6e  OWFUNC.      Win
67c0: 64 6f 77 20 2a 70 57 69 6e 20 3d 20 28 49 73 57  dow *pWin = (IsW
67d0: 69 6e 64 6f 77 46 75 6e 63 28 70 45 78 70 72 29  indowFunc(pExpr)
67e0: 20 3f 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e   ? pExpr->y.pWin
67f0: 20 3a 20 30 29 3b 0a 23 65 6e 64 69 66 0a 20 20   : 0);.#endif.  
6800: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
6810: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
6820: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
6830: 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
6840: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
6850: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
6860: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
6870: 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
6880: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
6890: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
68a0: 20 7a 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   zId, n, enc, 0)
68b0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
68c0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
68d0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
68e0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
68f0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 2d 32 2c 20 65  ->db, zId, -2, e
6900: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
6910: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
6920: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
6930: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
6940: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6950: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
6960: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
6970: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
6980: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
6990: 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
69a0: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
69b0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
69c0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
69d0: 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
69e0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
69f0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
6a00: 6c 69 6b 65 6c 79 29 3b 0a 20 20 20 20 20 20 20  likely);.       
6a10: 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a 20     if( n==2 ){. 
6a20: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6a30: 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78 70 72 50  ->iTable = exprP
6a40: 72 6f 62 61 62 69 6c 69 74 79 28 70 4c 69 73 74  robability(pList
6a50: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
6a60: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70             if( p
6a70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29  Expr->iTable<0 )
6a80: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6a90: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6aa0: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
6ab0: 20 20 20 20 20 20 20 20 22 73 65 63 6f 6e 64 20          "second 
6ac0: 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65  argument to like
6ad0: 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62 65  lihood() must be
6ae0: 20 61 20 22 0a 20 20 20 20 20 20 20 20 20 20 20   a ".           
6af0: 20 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62       "constant b
6b00: 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31  etween 0.0 and 1
6b10: 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  .0");.          
6b20: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
6b30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6b40: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45              /* E
6b60: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31  VIDENCE-OF: R-61
6b70: 33 30 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e  304-29449 The un
6b80: 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69  likely(X) functi
6b90: 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20 20  on is.          
6ba0: 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20    ** equivalent 
6bb0: 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c  to likelihood(X,
6bc0: 20 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20   0.0625)..      
6bd0: 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43        ** EVIDENC
6be0: 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31  E-OF: R-01283-11
6bf0: 36 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79  636 The unlikely
6c00: 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a  (X) function is.
6c10: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73              ** s
6c20: 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c 69  hort-hand for li
6c30: 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32  kelihood(X,0.062
6c40: 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  5)..            
6c50: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
6c60: 52 2d 33 36 38 35 30 2d 33 34 31 32 37 20 54 68  R-36850-34127 Th
6c70: 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63  e likely(X) func
6c80: 74 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68 61  tion is short-ha
6c90: 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nd.            *
6ca0: 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64  * for likelihood
6cb0: 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20 20  (X,0.9375)..    
6cc0: 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45          ** EVIDE
6cd0: 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36 2d  NCE-OF: R-53436-
6ce0: 34 30 39 37 33 20 54 68 65 20 6c 69 6b 65 6c 79  40973 The likely
6cf0: 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  (X) function is 
6d00: 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20  equivalent.     
6d10: 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69 6b         ** to lik
6d20: 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35  elihood(X,0.9375
6d30: 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ). */.          
6d40: 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e 6c    /* TUNING: unl
6d50: 69 6b 65 6c 79 28 29 20 70 72 6f 62 61 62 69 6c  ikely() probabil
6d60: 69 74 79 20 69 73 20 30 2e 30 36 32 35 2e 20 20  ity is 0.0625.  
6d70: 6c 69 6b 65 6c 79 28 29 20 69 73 20 30 2e 39 33  likely() is 0.93
6d80: 37 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  75 */.          
6d90: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6da0: 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30 5d  = pDef->zName[0]
6db0: 3d 3d 27 75 27 20 3f 20 38 33 38 38 36 30 38 20  =='u' ? 8388608 
6dc0: 3a 20 31 32 35 38 32 39 31 32 30 3b 0a 20 20 20  : 125829120;.   
6dd0: 20 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20         }        
6de0: 20 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a       .        }.
6df0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
6e00: 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f  MIT_AUTHORIZATIO
6e10: 4e 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20  N.        {.    
6e20: 20 20 20 20 20 20 69 6e 74 20 61 75 74 68 20 3d        int auth =
6e30: 20 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63   sqlite3AuthChec
6e40: 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45  k(pParse, SQLITE
6e50: 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 70 44 65  _FUNCTION, 0,pDe
6e60: 66 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20 20  f->zName,0);.   
6e70: 20 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21         if( auth!
6e80: 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20  =SQLITE_OK ){.  
6e90: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75            if( au
6ea0: 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20  th==SQLITE_DENY 
6eb0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6ec0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
6ed0: 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75  (pParse, "not au
6ee0: 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20  thorized to use 
6ef0: 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20  function: %s",. 
6f00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6f20: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
6f30: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
6f40: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
6f50: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6f60: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
6f70: 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20  p = TK_NULL;.   
6f80: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
6f90: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20  WRC_Prune;.     
6fa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
6fb0: 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20  .#endif.        
6fc0: 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c  if( pDef->funcFl
6fd0: 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55  ags & (SQLITE_FU
6fe0: 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c 49  NC_CONSTANT|SQLI
6ff0: 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47 29  TE_FUNC_SLOCHNG)
7000: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
7010: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
7020: 73 20 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e 73  s of the EP_Cons
7030: 74 46 75 6e 63 20 66 6c 61 67 2c 20 64 61 74 65  tFunc flag, date
7040: 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20   and time.      
7050: 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73      ** functions
7060: 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74   and other funct
7070: 69 6f 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65  ions that change
7080: 20 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e 73   slowly are cons
7090: 69 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20  idered.         
70a0: 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65 63   ** constant bec
70b0: 61 75 73 65 20 74 68 65 79 20 61 72 65 20 63 6f  ause they are co
70c0: 6e 73 74 61 6e 74 20 66 6f 72 20 74 68 65 20 64  nstant for the d
70d0: 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20 71  uration of one q
70e0: 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20  uery */.        
70f0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
7100: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
7110: 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 7d  Func);.        }
7120: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
7130: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
7140: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53  SQLITE_FUNC_CONS
7150: 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20  TANT)==0 ){.    
7160: 20 20 20 20 20 20 2f 2a 20 44 61 74 65 2f 74 69        /* Date/ti
7170: 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  me functions tha
7180: 74 20 75 73 65 20 27 6e 6f 77 27 2c 20 61 6e 64  t use 'now', and
7190: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73   other functions
71a0: 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 20 20   like.          
71b0: 2a 2a 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f  ** sqlite_versio
71c0: 6e 28 29 20 74 68 61 74 20 6d 69 67 68 74 20 63  n() that might c
71d0: 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 20  hange over time 
71e0: 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 0a 20  cannot be used. 
71f0: 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61           ** in a
7200: 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20  n index. */.    
7210: 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70        notValid(p
7220: 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e 6f 6e  Parse, pNC, "non
7230: 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66  -deterministic f
7240: 75 6e 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20 20  unctions",.     
7250: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 43                NC
7260: 5f 49 64 78 45 78 70 72 7c 4e 43 5f 50 61 72 74  _IdxExpr|NC_Part
7270: 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  Idx);.        }.
7280: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
7290: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
72a0: 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52  QLITE_FUNC_INTER
72b0: 4e 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20  NAL)!=0.        
72c0: 20 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74   && pParse->nest
72d0: 65 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26  ed==0.         &
72e0: 26 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e  & sqlite3Config.
72f0: 62 49 6e 74 65 72 6e 61 6c 46 75 6e 63 74 69 6f  bInternalFunctio
7300: 6e 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b  ns==0.        ){
7310: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e  .          /* In
7320: 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20  ternal-use-only 
7330: 66 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 64 69  functions are di
7340: 73 61 6c 6c 6f 77 65 64 20 75 6e 6c 65 73 73 20  sallowed unless 
7350: 74 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  the.          **
7360: 20 53 51 4c 20 69 73 20 62 65 69 6e 67 20 63 6f   SQL is being co
7370: 6d 70 69 6c 65 64 20 75 73 69 6e 67 20 73 71 6c  mpiled using sql
7380: 69 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28  ite3NestedParse(
7390: 29 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e  ) */.          n
73a0: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
73b0: 0a 20 20 20 20 20 20 20 20 20 20 70 44 65 66 20  .          pDef 
73c0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  = 0;.        }. 
73d0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66       }..      if
73e0: 28 20 30 3d 3d 49 4e 5f 52 45 4e 41 4d 45 5f 4f  ( 0==IN_RENAME_O
73f0: 42 4a 45 43 54 20 29 7b 0a 23 69 66 6e 64 65 66  BJECT ){.#ifndef
7400: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
7410: 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20  DOWFUNC.        
7420: 61 73 73 65 72 74 28 20 69 73 5f 61 67 67 3d 3d  assert( is_agg==
7430: 30 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63  0 || (pDef->func
7440: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7450: 55 4e 43 5f 4d 49 4e 4d 41 58 29 0a 20 20 20 20  UNC_MINMAX).    
7460: 20 20 20 20 20 20 7c 7c 20 28 70 44 65 66 2d 3e        || (pDef->
7470: 78 56 61 6c 75 65 3d 3d 30 20 26 26 20 70 44 65  xValue==0 && pDe
7480: 66 2d 3e 78 49 6e 76 65 72 73 65 3d 3d 30 29 0a  f->xInverse==0).
7490: 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44            || (pD
74a0: 65 66 2d 3e 78 56 61 6c 75 65 20 26 26 20 70 44  ef->xValue && pD
74b0: 65 66 2d 3e 78 49 6e 76 65 72 73 65 20 26 26 20  ef->xInverse && 
74c0: 70 44 65 66 2d 3e 78 53 46 75 6e 63 20 26 26 20  pDef->xSFunc && 
74d0: 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 29  pDef->xFinalize)
74e0: 0a 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20  .        );.    
74f0: 20 20 20 20 69 66 28 20 70 44 65 66 20 26 26 20      if( pDef && 
7500: 70 44 65 66 2d 3e 78 56 61 6c 75 65 3d 3d 30 20  pDef->xValue==0 
7510: 26 26 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  && pWin ){.     
7520: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7530: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20  rMsg(pParse, .  
7540: 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a              "%.*
7550: 73 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 75  s() may not be u
7560: 73 65 64 20 61 73 20 61 20 77 69 6e 64 6f 77 20  sed as a window 
7570: 66 75 6e 63 74 69 6f 6e 22 2c 20 6e 49 64 2c 20  function", nId, 
7580: 7a 49 64 0a 20 20 20 20 20 20 20 20 20 20 29 3b  zId.          );
7590: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  .          pNC->
75a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
75b0: 7d 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20  }else if( .     
75c0: 20 20 20 20 20 20 20 20 20 28 69 73 5f 61 67 67           (is_agg
75d0: 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67   && (pNC->ncFlag
75e0: 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29  s & NC_AllowAgg)
75f0: 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20 20  ==0).           
7600: 7c 7c 20 28 69 73 5f 61 67 67 20 26 26 20 28 70  || (is_agg && (p
7610: 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53  Def->funcFlags&S
7620: 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f  QLITE_FUNC_WINDO
7630: 57 29 20 26 26 20 21 70 57 69 6e 29 0a 20 20 20  W) && !pWin).   
7640: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 5f 61          || (is_a
7650: 67 67 20 26 26 20 70 57 69 6e 20 26 26 20 28 70  gg && pWin && (p
7660: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
7670: 5f 41 6c 6c 6f 77 57 69 6e 29 3d 3d 30 29 0a 20  _AllowWin)==0). 
7680: 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20         ){.      
7690: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
76a0: 7a 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20  zType;.         
76b0: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
76c0: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
76d0: 55 4e 43 5f 57 49 4e 44 4f 57 29 20 7c 7c 20 70  UNC_WINDOW) || p
76e0: 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Win ){.         
76f0: 20 20 20 7a 54 79 70 65 20 3d 20 22 77 69 6e 64     zType = "wind
7700: 6f 77 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  ow";.          }
7710: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
7720: 20 20 7a 54 79 70 65 20 3d 20 22 61 67 67 72 65    zType = "aggre
7730: 67 61 74 65 22 3b 0a 20 20 20 20 20 20 20 20 20  gate";.         
7740: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c   }.          sql
7750: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7760: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
7770: 25 73 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  %s function %.*s
7780: 28 29 22 2c 7a 54 79 70 65 2c 6e 49 64 2c 7a 49  ()",zType,nId,zI
7790: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  d);.          pN
77a0: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
77b0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b       is_agg = 0;
77c0: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65  .        }.#else
77d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 69 73  .        if( (is
77e0: 5f 61 67 67 20 26 26 20 28 70 4e 43 2d 3e 6e 63  _agg && (pNC->nc
77f0: 46 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77  Flags & NC_Allow
7800: 41 67 67 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20  Agg)==0) ){.    
7810: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7820: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 22 6d 69  orMsg(pParse,"mi
7830: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
7840: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
7850: 29 22 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20  )",nId,zId);.   
7860: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
7870: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73  ++;.          is
7880: 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  _agg = 0;.      
7890: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
78a0: 20 20 20 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73     else if( no_s
78b0: 75 63 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72  uch_func && pPar
78c0: 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73  se->db->init.bus
78d0: 79 3d 3d 30 0a 23 69 66 64 65 66 20 53 51 4c 49  y==0.#ifdef SQLI
78e0: 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57  TE_ENABLE_UNKNOW
78f0: 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20  N_SQL_FUNCTION. 
7900: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7910: 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
7920: 61 69 6e 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  ain==0.#endif.  
7930: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
7940: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7950: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
7960: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
7970: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
7980: 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e            pNC->n
7990: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d  Err++;.        }
79a0: 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e  else if( wrong_n
79b0: 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20  um_args ){.     
79c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
79d0: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f  rMsg(pParse,"wro
79e0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
79f0: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
7a00: 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20  on %.*s()",.    
7a10: 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20             nId, 
7a20: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20  zId);.          
7a30: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
7a40: 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53       }.#ifndef S
7a50: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
7a60: 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20 65 6c  WFUNC.        el
7a70: 73 65 20 69 66 28 20 69 73 5f 61 67 67 3d 3d 30  se if( is_agg==0
7a80: 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65   && ExprHasPrope
7a90: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
7aa0: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
7ab0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7ac0: 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20  Msg(pParse, .   
7ad0: 20 20 20 20 20 20 20 20 20 20 20 22 46 49 4c 54             "FILT
7ae0: 45 52 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  ER may not be us
7af0: 65 64 20 77 69 74 68 20 6e 6f 6e 2d 61 67 67 72  ed with non-aggr
7b00: 65 67 61 74 65 20 25 2e 2a 73 28 29 22 2c 20 0a  egate %.*s()", .
7b10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49                nI
7b20: 64 2c 20 7a 49 64 0a 20 20 20 20 20 20 20 20 20  d, zId.         
7b30: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   );.          pN
7b40: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
7b50: 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20     }.#endif.    
7b60: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
7b70: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57  {.          /* W
7b80: 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20  indow functions 
7b90: 6d 61 79 20 6e 6f 74 20 62 65 20 61 72 67 75 6d  may not be argum
7ba0: 65 6e 74 73 20 6f 66 20 61 67 67 72 65 67 61 74  ents of aggregat
7bb0: 65 20 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20  e functions..   
7bc0: 20 20 20 20 20 20 20 2a 2a 20 4f 72 20 61 72 67         ** Or arg
7bd0: 75 6d 65 6e 74 73 20 6f 66 20 6f 74 68 65 72 20  uments of other 
7be0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73  window functions
7bf0: 2e 20 42 75 74 20 61 67 67 72 65 67 61 74 65 20  . But aggregate 
7c00: 66 75 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20  functions.      
7c10: 20 20 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 72      ** may be ar
7c20: 67 75 6d 65 6e 74 73 20 66 6f 72 20 77 69 6e 64  guments for wind
7c30: 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a  ow functions.  *
7c40: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
7c50: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
7c60: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  .          pNC->
7c70: 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e 43 5f  ncFlags &= ~(NC_
7c80: 41 6c 6c 6f 77 57 69 6e 20 7c 20 28 21 70 57 69  AllowWin | (!pWi
7c90: 6e 20 3f 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 20  n ? NC_AllowAgg 
7ca0: 3a 20 30 29 29 3b 0a 23 65 6c 73 65 0a 20 20 20  : 0));.#else.   
7cb0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c         pNC->ncFl
7cc0: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
7cd0: 41 67 67 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  Agg;.#endif.    
7ce0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69      }.      }.#i
7cf0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
7d00: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
7d10: 20 20 20 65 6c 73 65 20 69 66 28 20 45 78 70 72     else if( Expr
7d20: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7d30: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
7d40: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
7d50: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65   = 1;.      }.#e
7d60: 6e 64 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74  ndif.      sqlit
7d70: 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70  e3WalkExprList(p
7d80: 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a  Walker, pList);.
7d90: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
7da0: 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   ){.#ifndef SQLI
7db0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
7dc0: 4e 43 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  NC.        if( p
7dd0: 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Win ){.         
7de0: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20   Select *pSel = 
7df0: 70 4e 43 2d 3e 70 57 69 6e 53 65 6c 65 63 74 3b  pNC->pWinSelect;
7e00: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
7e10: 74 28 20 70 57 69 6e 3d 3d 70 45 78 70 72 2d 3e  t( pWin==pExpr->
7e20: 79 2e 70 57 69 6e 20 29 3b 0a 20 20 20 20 20 20  y.pWin );.      
7e30: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
7e40: 45 5f 4f 42 4a 45 43 54 3d 3d 30 20 29 7b 0a 20  E_OBJECT==0 ){. 
7e50: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
7e60: 65 33 57 69 6e 64 6f 77 55 70 64 61 74 65 28 70  e3WindowUpdate(p
7e70: 50 61 72 73 65 2c 20 70 53 65 6c 2d 3e 70 57 69  Parse, pSel->pWi
7e80: 6e 44 65 66 6e 2c 20 70 57 69 6e 2c 20 70 44 65  nDefn, pWin, pDe
7e90: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  f);.          }.
7ea0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7eb0: 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57  3WalkExprList(pW
7ec0: 61 6c 6b 65 72 2c 20 70 57 69 6e 2d 3e 70 50 61  alker, pWin->pPa
7ed0: 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20  rtition);.      
7ee0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
7ef0: 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c  xprList(pWalker,
7f00: 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29   pWin->pOrderBy)
7f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7f20: 74 65 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c  te3WalkExpr(pWal
7f30: 6b 65 72 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74  ker, pWin->pFilt
7f40: 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  er);.          s
7f50: 71 6c 69 74 65 33 57 69 6e 64 6f 77 4c 69 6e 6b  qlite3WindowLink
7f60: 28 70 53 65 6c 2c 20 70 57 69 6e 29 3b 0a 20 20  (pSel, pWin);.  
7f70: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46          pNC->ncF
7f80: 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61 73 57 69  lags |= NC_HasWi
7f90: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  n;.        }else
7fa0: 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
7fb0: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
7fc0: 43 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20  C */.        {. 
7fd0: 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e           NameCon
7fe0: 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70 4e 43  text *pNC2 = pNC
7ff0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
8000: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
8010: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
8020: 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20     pExpr->op2 = 
8030: 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  0;.#ifndef SQLIT
8040: 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e  E_OMIT_WINDOWFUN
8050: 43 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  C.          if( 
8060: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
8070: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
8080: 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  c) ){.          
8090: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
80a0: 72 28 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72  r(pWalker, pExpr
80b0: 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65  ->y.pWin->pFilte
80c0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  r);.          }.
80d0: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20  #endif.         
80e0: 20 77 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20   while( pNC2 && 
80f0: 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e  !sqlite3Function
8100: 55 73 65 73 54 68 69 73 53 72 63 28 70 45 78 70  UsesThisSrc(pExp
8110: 72 2c 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73  r, pNC2->pSrcLis
8120: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
8130: 20 20 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a    pExpr->op2++;.
8140: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 32              pNC2
8150: 20 3d 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a   = pNC2->pNext;.
8160: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8170: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44        assert( pD
8180: 65 66 21 3d 30 20 7c 7c 20 49 4e 5f 52 45 4e 41  ef!=0 || IN_RENA
8190: 4d 45 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20 20  ME_OBJECT );.   
81a0: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20         if( pNC2 
81b0: 26 26 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20  && pDef ){.     
81c0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 53         assert( S
81d0: 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41  QLITE_FUNC_MINMA
81e0: 58 3d 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20  X==NC_MinMaxAgg 
81f0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74  );.            t
8200: 65 73 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e  estcase( (pDef->
8210: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
8220: 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21  TE_FUNC_MINMAX)!
8230: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
8240: 20 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20    pNC2->ncFlags 
8250: 7c 3d 20 4e 43 5f 48 61 73 41 67 67 20 7c 20 28  |= NC_HasAgg | (
8260: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
8270: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
8280: 4e 4d 41 58 29 3b 0a 0a 20 20 20 20 20 20 20 20  NMAX);..        
8290: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
82a0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
82b0: 67 73 20 7c 3d 20 73 61 76 65 64 41 6c 6c 6f 77  gs |= savedAllow
82c0: 46 6c 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20  Flags;.      }. 
82d0: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
82e0: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
82f0: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
8300: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
8310: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
8320: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
8330: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
8340: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
8350: 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rune;.    }.#ifn
8360: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8370: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
8380: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
8390: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
83a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
83b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
83c0: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63   );.#endif.    c
83d0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
83e0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
83f0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
8400: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
8410: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
8420: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
8430: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
8440: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
8450: 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69  .        notVali
8460: 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  d(pParse, pNC, "
8470: 73 75 62 71 75 65 72 69 65 73 22 2c 20 4e 43 5f  subqueries", NC_
8480: 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49  IsCheck|NC_PartI
8490: 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a  dx|NC_IdxExpr);.
84a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
84b0: 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
84c0: 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  r, pExpr->x.pSel
84d0: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ect);.        as
84e0: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
84f0: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
8500: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
8510: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
8520: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
8530: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
8540: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
8550: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c    pNC->ncFlags |
8560: 3d 20 4e 43 5f 56 61 72 53 65 6c 65 63 74 3b 0a  = NC_VarSelect;.
8570: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8580: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
8590: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
85a0: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
85b0: 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72     notValid(pPar
85c0: 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65  se, pNC, "parame
85d0: 74 65 72 73 22 2c 20 4e 43 5f 49 73 43 68 65 63  ters", NC_IsChec
85e0: 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f  k|NC_PartIdx|NC_
85f0: 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20 20  IdxExpr);.      
8600: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8610: 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
8620: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
8630: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
8640: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
8650: 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45  prSkipCollate(pE
8660: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
8670: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
8680: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
8690: 70 72 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20  pr, EP_Reduced) 
86a0: 29 3b 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64  );.      /* Hand
86b0: 6c 65 20 73 70 65 63 69 61 6c 20 63 61 73 65 73  le special cases
86c0: 20 6f 66 20 22 78 20 49 53 20 54 52 55 45 22 2c   of "x IS TRUE",
86d0: 20 22 78 20 49 53 20 46 41 4c 53 45 22 2c 20 22   "x IS FALSE", "
86e0: 78 20 49 53 20 4e 4f 54 20 54 52 55 45 22 2c 0a  x IS NOT TRUE",.
86f0: 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 22 78 20        ** and "x 
8700: 49 53 20 4e 4f 54 20 46 41 4c 53 45 22 2e 20 2a  IS NOT FALSE". *
8710: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67  /.      if( pRig
8720: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  ht->op==TK_ID ){
8730: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
8740: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  = resolveExprSte
8750: 70 28 70 57 61 6c 6b 65 72 2c 20 70 52 69 67 68  p(pWalker, pRigh
8760: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
8770: 72 63 3d 3d 57 52 43 5f 41 62 6f 72 74 20 29 20  rc==WRC_Abort ) 
8780: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
8790: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
87a0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  ight->op==TK_TRU
87b0: 45 46 41 4c 53 45 20 29 7b 0a 20 20 20 20 20 20  EFALSE ){.      
87c0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
87d0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
87e0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
87f0: 3d 20 54 4b 5f 54 52 55 54 48 3b 0a 20 20 20 20  = TK_TRUTH;.    
8800: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
8810: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
8820: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8830: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
8840: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
8850: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20  e TK_BETWEEN:.  
8860: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
8870: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
8880: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
8890: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
88a0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
88b0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 7b 0a    case TK_GE: {.
88c0: 20 20 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 2c        int nLeft,
88d0: 20 6e 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69   nRight;.      i
88e0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
88f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
8900: 65 61 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eak;.      asser
8910: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 21  t( pExpr->pLeft!
8920: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 4c 65 66  =0 );.      nLef
8930: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
8940: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
8950: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69  >pLeft);.      i
8960: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
8970: 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20  _BETWEEN ){.    
8980: 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c      nRight = sql
8990: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
89a0: 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  ze(pExpr->x.pLis
89b0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
89c0: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 69 67          if( nRig
89d0: 68 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a 20 20 20  ht==nLeft ){.   
89e0: 20 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20         nRight = 
89f0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
8a00: 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70  rSize(pExpr->x.p
8a10: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
8a20: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8a30: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a40: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
8a50: 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
8a60: 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73        nRight = s
8a70: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
8a80: 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Size(pExpr->pRig
8a90: 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ht);.      }.   
8aa0: 20 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52     if( nLeft!=nR
8ab0: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
8ac0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8ad0: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
8ae0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8af0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
8b00: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
8b10: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8b20: 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
8b30: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8b40: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
8b50: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8b60: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8b70: 47 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  GT );.        te
8b80: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8b90: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
8ba0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8bb0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
8bc0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
8bd0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8be0: 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
8bf0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
8c00: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
8c10: 45 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EN );.        sq
8c20: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8c30: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
8c40: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
8c50: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8c60: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
8c70: 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45  turn (pParse->nE
8c80: 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
8c90: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
8ca0: 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52  ? WRC_Abort : WR
8cb0: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
8cc0: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61  *.** pEList is a
8cd0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
8ce0: 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 72  ions which are r
8cf0: 65 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74  eally the result
8d00: 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61   set of the.** a
8d10: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
8d20: 74 2e 20 20 70 45 20 69 73 20 61 20 74 65 72 6d  t.  pE is a term
8d30: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
8d40: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
8d50: 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  se..** This rout
8d60: 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ine checks to se
8d70: 65 20 69 66 20 70 45 20 69 73 20 61 20 73 69 6d  e if pE is a sim
8d80: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  ple identifier w
8d90: 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73  hich corresponds
8da0: 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61  .** to the AS-na
8db0: 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  me of one of the
8dc0: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78   terms of the ex
8dd0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
8de0: 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69  If it is,.** thi
8df0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
8e00: 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
8e10: 65 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72  een 1 and N wher
8e20: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
8e30: 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73  r of.** elements
8e40: 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72   in pEList, corr
8e50: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
8e60: 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e   matching entry.
8e70: 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a    If there is.**
8e80: 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66   no match, or if
8e90: 20 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   pE is not a sim
8ea0: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20  ple identifier, 
8eb0: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
8ec0: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a  e.** return 0..*
8ed0: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20  *.** pEList has 
8ee0: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
8ef0: 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73  pE has not..*/.s
8f00: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
8f10: 65 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  eAsName(.  Parse
8f20: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
8f30: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8f40: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8f50: 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ges */.  ExprLis
8f60: 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c  t *pEList,  /* L
8f70: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
8f80: 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  ns to scan */.  
8f90: 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20  Expr *pE        
8fa0: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8fb0: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
8fc0: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
8fd0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
8fe0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
8ff0: 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  er */..  UNUSED_
9000: 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
9010: 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70  );..  if( pE->op
9020: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63  ==TK_ID ){.    c
9030: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e  har *zCol = pE->
9040: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f  u.zToken;.    fo
9050: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
9060: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
9070: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
9080: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
9090: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
90a0: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
90b0: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
90c0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
90d0: 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20  return i+1;.    
90e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
90f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9100: 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74  ** pE is a point
9110: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
9120: 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73  ion which is a s
9130: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
9140: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66  e.** ORDER BY of
9150: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
9160: 43 54 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  CT.  The express
9170: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
9180: 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65  .** name resolve
9190: 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20  d..**.** At the 
91a0: 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
91b0: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
91c0: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
91d0: 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  at the.** ORDER 
91e0: 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  BY term is not a
91f0: 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20  n integer index 
9200: 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  into the result 
9210: 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61  set.  That.** ca
9220: 73 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  se is handled by
9230: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
9240: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65  tine..**.** Atte
9250: 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20  mpt to match pE 
9260: 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73  against result s
9270: 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  et columns in th
9280: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53  e left-most.** S
9290: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
92a0: 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
92b0: 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63  ex i of the matc
92c0: 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20  hing column,.** 
92d0: 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  as an indication
92e0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74   to the caller t
92f0: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
9300: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
9310: 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65  olumn..** The le
9320: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69  ft-most column i
9330: 73 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s 1.  In other w
9340: 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20  ords, the value 
9350: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
9360: 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  ** same integer 
9370: 76 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64  value that would
9380: 20 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20   be used in the 
9390: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
93a0: 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65   indicate.** the
93b0: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
93c0: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
93d0: 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  tch, return 0.  
93e0: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20  Return -1 if an 
93f0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
9400: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
9410: 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  lveOrderByTermTo
9420: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
9430: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
9440: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
9450: 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
9460: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
9470: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
9480: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9490: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52  ment with the OR
94a0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
94b0: 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20  .  Expr *pE     
94c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
94d0: 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74  cific ORDER BY t
94e0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  erm */.){.  int 
94f0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
9500: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
9510: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
9520: 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  List;  /* The co
9530: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73  lumns of the res
9540: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d  ult set */.  Nam
9550: 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20  eContext nc;    
9560: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
9570: 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45  for resolving pE
9580: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
9590: 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
95a0: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
95b0: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
95c0: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
95d0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
95e0: 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75  rocedures */.  u
95f0: 38 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 20  8 savedSuppErr; 
9600: 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
9610: 20 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73   of db->suppress
9620: 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Err */..  assert
9630: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
9640: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d  nteger(pE, &i)==
9650: 30 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  0 );.  pEList = 
9660: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
9670: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61  ..  /* Resolve a
9680: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ll names in the 
9690: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78  ORDER BY term ex
96a0: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20  pression.  */.  
96b0: 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73  memset(&nc, 0, s
96c0: 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63  izeof(nc));.  nc
96d0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
96e0: 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20  ;.  nc.pSrcList 
96f0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
9700: 0a 20 20 6e 63 2e 75 4e 43 2e 70 45 4c 69 73 74  .  nc.uNC.pEList
9710: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e   = pEList;.  nc.
9720: 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c  ncFlags = NC_All
9730: 6f 77 41 67 67 7c 4e 43 5f 55 45 4c 69 73 74 3b  owAgg|NC_UEList;
9740: 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a  .  nc.nErr = 0;.
9750: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
9760: 62 3b 0a 20 20 73 61 76 65 64 53 75 70 70 45 72  b;.  savedSuppEr
9770: 72 20 3d 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r = db->suppress
9780: 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72  Err;.  db->suppr
9790: 65 73 73 45 72 72 20 3d 20 31 3b 0a 20 20 72 63  essErr = 1;.  rc
97a0: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76   = sqlite3Resolv
97b0: 65 45 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c 20  eExprNames(&nc, 
97c0: 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72  pE);.  db->suppr
97d0: 65 73 73 45 72 72 20 3d 20 73 61 76 65 64 53 75  essErr = savedSu
97e0: 70 70 45 72 72 3b 0a 20 20 69 66 28 20 72 63 20  ppErr;.  if( rc 
97f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
9800: 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 74  * Try to match t
9810: 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
9820: 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61  ession against a
9830: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  n expression.  *
9840: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
9850: 73 65 74 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  set.  Return an 
9860: 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f 66  1-based index of
9870: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20   the matching.  
9880: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 6e  ** result-set en
9890: 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  try..  */.  for(
98a0: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
98b0: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
98c0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
98d0: 6f 6d 70 61 72 65 28 30 2c 20 70 45 4c 69 73 74  ompare(0, pEList
98e0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
98f0: 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20  , -1)<2 ){.     
9900: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
9910: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
9920: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
9930: 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20   0. */.  return 
9940: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
9950: 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59  rate an ORDER BY
9960: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74 65 72   or GROUP BY ter
9970: 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65  m out-of-range e
9980: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
9990: 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f  void resolveOutO
99a0: 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50  fRangeError(.  P
99b0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
99c0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72        /* The err
99d0: 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20  or context into 
99e0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 74  which to write t
99f0: 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  he error */.  co
9a00: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
9a10: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
9a20: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20  or "GROUP" */.  
9a30: 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
9a40: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
9a50: 64 65 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66  dex (1-based) of
9a60: 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66   the term out of
9a70: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
9a80: 6d 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mx              
9a90: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65     /* Largest pe
9aa0: 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20  rmissible value 
9ab0: 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  of i */.){.  sql
9ac0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9ad0: 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73  rse, .    "%r %s
9ae0: 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20   BY term out of 
9af0: 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
9b00: 65 20 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e  e ".    "between
9b10: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a   1 and %d", i, z
9b20: 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a  Type, mx);.}../*
9b30: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
9b40: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
9b50: 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  in a compound SE
9b60: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
9b70: 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68    Modify.** each
9b80: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
9b90: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
9ba0: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
9bb0: 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20  er between 1.** 
9bc0: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
9bd0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
9be0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
9bf0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a  mpound SELECT..*
9c00: 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65  *.** ORDER BY te
9c10: 72 6d 73 20 74 68 61 74 20 61 72 65 20 61 6c 72  rms that are alr
9c20: 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20  eady an integer 
9c30: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
9c40: 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  are.** unmodifie
9c50: 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 72  d.  ORDER BY ter
9c60: 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ms that are inte
9c70: 67 65 72 73 20 6f 75 74 73 69 64 65 20 74 68 65  gers outside the
9c80: 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74   range of.** 1 t
9c90: 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74  hrough N generat
9ca0: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44  e an error.  ORD
9cb0: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
9cc0: 20 61 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73   are expressions
9cd0: 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20  .** are matched 
9ce0: 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73  against result s
9cf0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  et expressions o
9d00: 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  f compound SELEC
9d10: 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77  T.** beginning w
9d20: 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  ith the left-mos
9d30: 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72  t SELECT and wor
9d40: 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20  king toward the 
9d50: 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65  right..** At the
9d60: 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68   first match, th
9d70: 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  e ORDER BY expre
9d80: 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f  ssion is transfo
9d90: 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  rmed into.** the
9da0: 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20   integer column 
9db0: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
9dc0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
9dd0: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
9de0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
9df0: 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64  solveCompoundOrd
9e00: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
9e10: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
9e20: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9e30: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
9e40: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
9e50: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
9e60: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t       /* The S
9e70: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9e80: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f  containing the O
9e90: 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20  RDER BY */.){.  
9ea0: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
9eb0: 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45  t *pOrderBy;.  E
9ec0: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
9ed0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
9ee0: 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d    int moreToDo =
9ef0: 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20   1;..  pOrderBy 
9f00: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  = pSelect->pOrde
9f10: 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  rBy;.  if( pOrde
9f20: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
9f30: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
9f40: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4f 72 64  ->db;.  if( pOrd
9f50: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
9f60: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9f70: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
9f80: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9f90: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
9fa0: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52  many terms in OR
9fb0: 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b  DER BY clause");
9fc0: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
9fd0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
9fe0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
9ff0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65   i++){.    pOrde
a000: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
a010: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63   0;.  }.  pSelec
a020: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
a030: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
a040: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53  pPrior ){.    pS
a050: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70  elect->pPrior->p
a060: 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  Next = pSelect;.
a070: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
a080: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
a090: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
a0a0: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
a0b0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
a0c0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
a0d0: 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f  em;.    moreToDo
a0e0: 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74   = 0;.    pEList
a0f0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
a100: 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
a110: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
a120: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
a130: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
a140: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
a150: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
a160: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
a170: 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  -1;.      Expr *
a180: 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  pE, *pDup;.     
a190: 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65   if( pItem->done
a1a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
a1b0: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
a1c0: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
a1d0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
a1e0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
a1f0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
a200: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
a210: 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c     if( iCol<=0 |
a220: 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
a230: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
a240: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
a250: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
a260: 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70   "ORDER", i+1, p
a270: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
a280: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
a290: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
a2a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a2b0: 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65    iCol = resolve
a2c0: 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  AsName(pParse, p
a2d0: 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20  EList, pE);.    
a2e0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20      if( iCol==0 
a2f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
a300: 4e 6f 77 20 74 65 73 74 20 69 66 20 65 78 70 72  Now test if expr
a310: 65 73 73 69 6f 6e 20 70 45 20 6d 61 74 63 68 65  ession pE matche
a320: 73 20 6f 6e 65 20 6f 66 20 74 68 65 20 76 61 6c  s one of the val
a330: 75 65 73 20 72 65 74 75 72 6e 65 64 0a 20 20 20  ues returned.   
a340: 20 20 20 20 20 20 20 2a 2a 20 62 79 20 70 53 65         ** by pSe
a350: 6c 65 63 74 2e 20 49 6e 20 74 68 65 20 75 73 75  lect. In the usu
a360: 61 6c 20 63 61 73 65 20 74 68 69 73 20 69 73 20  al case this is 
a370: 64 6f 6e 65 20 62 79 20 64 75 70 6c 69 63 61 74  done by duplicat
a380: 69 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20  ing the .       
a390: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
a3a0: 2c 20 72 65 73 6f 6c 76 69 6e 67 20 61 6e 79 20  , resolving any 
a3b0: 73 79 6d 62 6f 6c 73 20 69 6e 20 69 74 2c 20 61  symbols in it, a
a3c0: 6e 64 20 74 68 65 6e 20 63 6f 6d 70 61 72 69 6e  nd then comparin
a3d0: 67 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  g.          ** i
a3e0: 74 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 65  t against each e
a3f0: 78 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e  xpression return
a400: 65 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54  ed by the SELECT
a410: 20 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20   statement..    
a420: 20 20 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68        ** Once th
a430: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72  e comparisons ar
a440: 65 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 20  e finished, the 
a450: 64 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73  duplicate expres
a460: 73 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  sion.          *
a470: 2a 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20  * is deleted..  
a480: 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20          **.     
a490: 20 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74       ** Or, if t
a4a0: 68 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61  his is running a
a4b0: 73 20 70 61 72 74 20 6f 66 20 61 6e 20 41 4c 54  s part of an ALT
a4c0: 45 52 20 54 41 42 4c 45 20 6f 70 65 72 61 74 69  ER TABLE operati
a4d0: 6f 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  on,.          **
a4e0: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 73 79 6d   resolve the sym
a4f0: 62 6f 6c 73 20 69 6e 20 74 68 65 20 61 63 74 75  bols in the actu
a500: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6e  al expression, n
a510: 6f 74 20 61 20 64 75 70 6c 69 63 61 74 65 2e 0a  ot a duplicate..
a520: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 41 6e 64            ** And
a530: 2c 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20  , if one of the 
a540: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 69 73 20 73  comparisons is s
a550: 75 63 63 65 73 73 66 75 6c 2c 20 6c 65 61 76 65  uccessful, leave
a560: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a   the expression.
a570: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20            ** as 
a580: 69 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 72  is instead of tr
a590: 61 6e 73 66 6f 72 6d 69 6e 67 20 69 74 20 74 6f  ansforming it to
a5a0: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 73 20 69   an integer as i
a5b0: 6e 20 74 68 65 20 75 73 75 61 6c 0a 20 20 20 20  n the usual.    
a5c0: 20 20 20 20 20 20 2a 2a 20 63 61 73 65 2e 20 54        ** case. T
a5d0: 68 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63  his allows the c
a5e0: 6f 64 65 20 69 6e 20 61 6c 74 65 72 2e 63 20 74  ode in alter.c t
a5f0: 6f 20 6d 6f 64 69 66 79 20 63 6f 6c 75 6d 6e 0a  o modify column.
a600: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66            ** ref
a610: 65 72 65 72 65 6e 63 65 73 20 77 69 74 68 69 6e  ererences within
a620: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78   the ORDER BY ex
a630: 70 72 65 73 73 69 6f 6e 20 61 73 20 72 65 71 75  pression as requ
a640: 69 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20  ired.  */.      
a650: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
a660: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
a670: 20 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70          pDup = p
a680: 45 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  E;.          }el
a690: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
a6a0: 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78  pDup = sqlite3Ex
a6b0: 70 72 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29  prDup(db, pE, 0)
a6c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
a6d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d          if( !db-
a6e0: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b  >mallocFailed ){
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
a700: 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20  ert(pDup);.     
a710: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65         iCol = re
a720: 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d  solveOrderByTerm
a730: 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  ToExprList(pPars
a740: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70  e, pSelect, pDup
a750: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  );.          }. 
a760: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 49 4e           if( !IN
a770: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
a780: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
a790: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
a7a0: 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20  db, pDup);.     
a7b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
a7c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a7d0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
a7e0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
a7f0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
a800: 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  m into an intege
a810: 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  r column number 
a820: 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a  iCol,.        **
a830: 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
a840: 70 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c  preserve the COL
a850: 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69  LATE clause if i
a860: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  t exists */.    
a870: 20 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41      if( !IN_RENA
a880: 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20  ME_OBJECT ){.   
a890: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65         Expr *pNe
a8a0: 77 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28  w = sqlite3Expr(
a8b0: 64 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20  db, TK_INTEGER, 
a8c0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  0);.          if
a8d0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
a8e0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
a8f0: 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45  pNew->flags |= E
a900: 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20  P_IntValue;.    
a910: 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56        pNew->u.iV
a920: 61 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20  alue = iCol;.   
a930: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
a940: 2d 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20  ->pExpr==pE ){. 
a950: 20 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d             pItem
a960: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a  ->pExpr = pNew;.
a970: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
a980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70  .            Exp
a990: 72 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74  r *pParent = pIt
a9a0: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20  em->pExpr;.     
a9b0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
a9c0: 50 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  Parent->op==TK_C
a9d0: 4f 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20  OLLATE );.      
a9e0: 20 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 61        while( pPa
a9f0: 72 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d  rent->pLeft->op=
aa00: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50  =TK_COLLATE ) pP
aa10: 61 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d  arent = pParent-
aa20: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20  >pLeft;.        
aa30: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
aa40: 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29  ent->pLeft==pE )
aa50: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50  ;.            pP
aa60: 61 72 65 6e 74 2d 3e 70 4c 65 66 74 20 3d 20 70  arent->pLeft = p
aa70: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  New;.          }
aa80: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
aa90: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
aaa0: 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20   pE);.          
aab0: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
aac0: 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43  rByCol = (u16)iC
aad0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ol;.        }.  
aae0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e        pItem->don
aaf0: 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  e = 1;.      }el
ab00: 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65  se{.        more
ab10: 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20  ToDo = 1;.      
ab20: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c  }.    }.    pSel
ab30: 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ect = pSelect->p
ab40: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28  Next;.  }.  for(
ab50: 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  i=0; i<pOrderBy-
ab60: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
ab70: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
ab80: 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a  a[i].done==0 ){.
ab90: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
aba0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
abb0: 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  r ORDER BY term 
abc0: 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61  does not match a
abd0: 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  ny ".           
abe0: 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20   "column in the 
abf0: 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31  result set", i+1
ac00: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
ac10: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  1;.    }.  }.  r
ac20: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
ac30: 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20 74 65  * Check every te
ac40: 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  rm in the ORDER 
ac50: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
ac60: 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f  lause pOrderBy o
ac70: 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20  f.** the SELECT 
ac80: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63  statement pSelec
ac90: 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20  t.  If any term 
aca0: 69 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  is reference to 
acb0: 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20  a.** result set 
acc0: 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64  expression (as d
acd0: 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65  etermined by the
ace0: 20 45 78 70 72 4c 69 73 74 2e 61 2e 75 2e 78 2e   ExprList.a.u.x.
acf0: 69 4f 72 64 65 72 42 79 43 6f 6c 0a 2a 2a 20 66  iOrderByCol.** f
ad00: 69 65 6c 64 29 20 74 68 65 6e 20 63 6f 6e 76 65  ield) then conve
ad10: 72 74 20 74 68 61 74 20 74 65 72 6d 20 69 6e 74  rt that term int
ad20: 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  o a copy of the 
ad30: 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65  corresponding re
ad40: 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c 75  sult set.** colu
ad50: 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79  mn..**.** If any
ad60: 20 65 72 72 6f 72 73 20 61 72 65 20 64 65 74 65   errors are dete
ad70: 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65 72 72  cted, add an err
ad80: 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50  or message to pP
ad90: 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75  arse and.** retu
ada0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
adb0: 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f 20  turn zero if no 
adc0: 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2e  errors are seen.
add0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52  .*/.int sqlite3R
ade0: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
adf0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
ae00: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
ae10: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
ae20: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
ae30: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
ae40: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
ae50: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
ae60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
ae70: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61  ntaining the cla
ae80: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  use */.  ExprLis
ae90: 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f  t *pOrderBy,   /
aea0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f  * The ORDER BY o
aeb0: 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  r GROUP BY claus
aec0: 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65  e to be processe
aed0: 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  d */.  const cha
aee0: 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20  r *zType     /* 
aef0: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
af00: 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69  P" */.){.  int i
af10: 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  ;.  sqlite3 *db 
af20: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
af30: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
af40: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
af50: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
af60: 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ..  if( pOrderBy
af70: 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64  ==0 || pParse->d
af80: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
af90: 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  || IN_RENAME_OBJ
afa0: 45 43 54 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ECT ) return 0;.
afb0: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
afc0: 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
afd0: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
afe0: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
aff0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
b000: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
b010: 65 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c  erms in %s BY cl
b020: 61 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20  ause", zType);. 
b030: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
b040: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
b050: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61  ect->pEList;.  a
b060: 73 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30  ssert( pEList!=0
b070: 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53   );  /* sqlite3S
b080: 65 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72 61  electNew() guara
b090: 6e 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20  ntees this */.  
b0a0: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
b0b0: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
b0c0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
b0d0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
b0e0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78    if( pItem->u.x
b0f0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a  .iOrderByCol ){.
b100: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
b110: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
b120: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
b130: 7b 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76  {.        resolv
b140: 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72  eOutOfRangeError
b150: 28 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20  (pParse, zType, 
b160: 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78  i+1, pEList->nEx
b170: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  pr);.        ret
b180: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
b190: 20 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61       resolveAlia
b1a0: 73 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74  s(pParse, pEList
b1b0: 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72  , pItem->u.x.iOr
b1c0: 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65  derByCol-1, pIte
b1d0: 6d 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  m->pExpr,.      
b1e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79               zTy
b1f0: 70 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pe,0);.    }.  }
b200: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
b210: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
b220: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f  MIT_WINDOWFUNC./
b230: 2a 0a 2a 2a 20 57 61 6c 6b 65 72 20 63 61 6c 6c  *.** Walker call
b240: 62 61 63 6b 20 66 6f 72 20 77 69 6e 64 6f 77 52  back for windowR
b250: 65 6d 6f 76 65 45 78 70 72 46 72 6f 6d 53 65 6c  emoveExprFromSel
b260: 65 63 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63  ect()..*/.static
b270: 20 69 6e 74 20 72 65 73 6f 6c 76 65 52 65 6d 6f   int resolveRemo
b280: 76 65 57 69 6e 64 6f 77 73 43 62 28 57 61 6c 6b  veWindowsCb(Walk
b290: 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
b2a0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 55 4e 55  r *pExpr){.  UNU
b2b0: 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57  SED_PARAMETER(pW
b2c0: 61 6c 6b 65 72 29 3b 0a 20 20 69 66 28 20 45 78  alker);.  if( Ex
b2d0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
b2e0: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
b2f0: 20 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a   ){.    Window *
b300: 70 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e  pWin = pExpr->y.
b310: 70 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65  pWin;.    sqlite
b320: 33 57 69 6e 64 6f 77 55 6e 6c 69 6e 6b 46 72 6f  3WindowUnlinkFro
b330: 6d 53 65 6c 65 63 74 28 70 57 69 6e 29 3b 0a 20  mSelect(pWin);. 
b340: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
b350: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
b360: 2a 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 57 69  ** Remove any Wi
b370: 6e 64 6f 77 20 6f 62 6a 65 63 74 73 20 6f 77 6e  ndow objects own
b380: 65 64 20 62 79 20 74 68 65 20 65 78 70 72 65 73  ed by the expres
b390: 73 69 6f 6e 20 70 45 78 70 72 20 66 72 6f 6d 20  sion pExpr from 
b3a0: 74 68 65 0a 2a 2a 20 53 65 6c 65 63 74 2e 70 57  the.** Select.pW
b3b0: 69 6e 20 6c 69 73 74 20 6f 66 20 53 65 6c 65 63  in list of Selec
b3c0: 74 20 6f 62 6a 65 63 74 20 70 53 65 6c 65 63 74  t object pSelect
b3d0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
b3e0: 20 77 69 6e 64 6f 77 52 65 6d 6f 76 65 45 78 70   windowRemoveExp
b3f0: 72 46 72 6f 6d 53 65 6c 65 63 74 28 53 65 6c 65  rFromSelect(Sele
b400: 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 45 78 70  ct *pSelect, Exp
b410: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28  r *pExpr){.  if(
b420: 20 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 20 29   pSelect->pWin )
b430: 7b 0a 20 20 20 20 57 61 6c 6b 65 72 20 73 57 61  {.    Walker sWa
b440: 6c 6b 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74  lker;.    memset
b450: 28 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69  (&sWalker, 0, si
b460: 7a 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20  zeof(Walker));. 
b470: 20 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72     sWalker.xExpr
b480: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
b490: 76 65 52 65 6d 6f 76 65 57 69 6e 64 6f 77 73 43  veRemoveWindowsC
b4a0: 62 3b 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e 75  b;.    sWalker.u
b4b0: 2e 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65  .pSelect = pSele
b4c0: 63 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57  ct;.    sqlite3W
b4d0: 61 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72  alkExpr(&sWalker
b4e0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  , pExpr);.  }.}.
b4f0: 23 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77  #else.# define w
b500: 69 6e 64 6f 77 52 65 6d 6f 76 65 45 78 70 72 46  indowRemoveExprF
b510: 72 6f 6d 53 65 6c 65 63 74 28 61 2c 20 62 29 0a  romSelect(a, b).
b520: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
b530: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
b540: 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65   */../*.** pOrde
b550: 72 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20  rBy is an ORDER 
b560: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
b570: 6c 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20  lause in SELECT 
b580: 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63  statement pSelec
b590: 74 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63  t..** The Name c
b5a0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45  ontext of the SE
b5b0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69  LECT statement i
b5c0: 73 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73  s pNC.  zType is
b5d0: 20 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45   either.** "ORDE
b5e0: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65  R" or "GROUP" de
b5f0: 70 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68  pending on which
b600: 20 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20   type of clause 
b610: 70 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a  pOrderBy is..**.
b620: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
b630: 72 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65  resolves each te
b640: 72 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65  rm of the clause
b650: 20 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73   into an express
b660: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f  ion..** If the o
b670: 72 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20  rder-by term is 
b680: 61 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65 74  an integer I bet
b690: 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68  ween 1 and N (wh
b6a0: 65 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20  ere N is the.** 
b6b0: 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e  number of column
b6c0: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  s in the result 
b6d0: 73 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43  set of the SELEC
b6e0: 54 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  T) then the expr
b6f0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65  ession.** in the
b700: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61   resolution is a
b710: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74   copy of the I-t
b720: 68 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  h result-set exp
b730: 72 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20  ression.  If.** 
b740: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72  the order-by ter
b750: 6d 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69  m is an identifi
b760: 65 72 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f  er that correspo
b770: 6e 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61  nds to the AS-na
b780: 6d 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c  me of.** a resul
b790: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
b7a0: 2c 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20  , then the term 
b7b0: 72 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f  resolves to a co
b7c0: 70 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73  py of the.** res
b7d0: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
b7e0: 6f 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20  on.  Otherwise, 
b7f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b800: 73 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a  s resolved in.**
b810: 20 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d   the usual way -
b820: 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65   using sqlite3Re
b830: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
b840: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b850: 74 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65  tine returns the
b860: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
b870: 73 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63  s.  If errors oc
b880: 63 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20  cur, then.** an 
b890: 61 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f  appropriate erro
b8a0: 72 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20  r message might 
b8b0: 62 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73  be left in pPars
b8c0: 65 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a  e.  (OOM errors.
b8d0: 2a 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f  ** excepted.).*/
b8e0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
b8f0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
b900: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
b910: 70 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20  pNC,     /* The 
b920: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20  name context of 
b930: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
b940: 6d 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ment */.  Select
b950: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20   *pSelect,      
b960: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
b970: 61 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20  atement holding 
b980: 70 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78  pOrderBy */.  Ex
b990: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
b9a0: 2c 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20  ,   /* An ORDER 
b9b0: 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63  BY or GROUP BY c
b9c0: 6c 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65  lause to resolve
b9d0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b9e0: 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45   *zType     /* E
b9f0: 69 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72  ither "ORDER" or
ba00: 20 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70   "GROUP", as app
ba10: 72 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20  ropriate */.){. 
ba20: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
ba30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba40: 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73  /* Loop counters
ba50: 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20   */.  int iCol; 
ba60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ba70: 20 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e       /* Column n
ba80: 75 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63  umber */.  struc
ba90: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
baa0: 2a 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74  *pItem;   /* A t
bab0: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
bac0: 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20   BY clause */.  
bad0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20  Parse *pParse;  
bae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
baf0: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
bb00: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75  t */.  int nResu
bb10: 6c 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  lt;             
bb20: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
bb30: 6f 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20  of terms in the 
bb40: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20  result set */.. 
bb50: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
bb60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
bb70: 52 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74  Result = pSelect
bb80: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  ->pEList->nExpr;
bb90: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
bba0: 3e 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69  >pParse;.  for(i
bbb0: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
bbc0: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
bbd0: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
bbe0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
bbf0: 72 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70  r *pE = pItem->p
bc00: 45 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a  Expr;.    Expr *
bc10: 70 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pE2 = sqlite3Exp
bc20: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 29  rSkipCollate(pE)
bc30: 3b 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b  ;.    if( zType[
bc40: 30 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20  0]!='G' ){.     
bc50: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41   iCol = resolveA
bc60: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53  sName(pParse, pS
bc70: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70  elect->pEList, p
bc80: 45 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69  E2);.      if( i
bc90: 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  Col>0 ){.       
bca0: 20 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d   /* If an AS-nam
bcb0: 65 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  e match is found
bcc0: 2c 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45  , mark this ORDE
bcd0: 52 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62  R BY column as b
bce0: 65 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20  eing.        ** 
bcf0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43  a copy of the iC
bd00: 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74  ol-th result-set
bd10: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75   column.  The su
bd20: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f  bsequent call to
bd30: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69  .        ** sqli
bd40: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
bd50: 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f  roupBy() will co
bd60: 6e 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73  nvert the expres
bd70: 73 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20  sion to a.      
bd80: 20 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65    ** copy of the
bd90: 20 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d   iCol-th result-
bda0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20  set expression. 
bdb0: 2a 2f 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  */.        pItem
bdc0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
bdd0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
bde0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
bdf0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
be00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
be10: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c  prIsInteger(pE2,
be20: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
be30: 20 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59   /* The ORDER BY
be40: 20 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65   term is an inte
be50: 67 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41  ger constant.  A
be60: 67 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f  gain, set the co
be70: 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75  lumn.      ** nu
be80: 6d 62 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c  mber so that sql
be90: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
bea0: 47 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63  GroupBy() will c
beb0: 6f 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20 20  onvert the.     
bec0: 20 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72   ** order-by ter
bed0: 6d 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74  m to a copy of t
bee0: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  he result-set ex
bef0: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
bf00: 20 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20    if( iCol<1 || 
bf10: 69 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20  iCol>0xffff ){. 
bf20: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
bf30: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
bf40: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31  arse, zType, i+1
bf50: 2c 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20  , nResult);.    
bf60: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
bf70: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65      }.      pIte
bf80: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
bf90: 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a  ol = (u16)iCol;.
bfa0: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
bfb0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74      }..    /* Ot
bfc0: 68 65 72 77 69 73 65 2c 20 74 72 65 61 74 20 74  herwise, treat t
bfd0: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
bfe0: 20 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20   as an ordinary 
bff0: 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20  expression */.  
c000: 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72    pItem->u.x.iOr
c010: 64 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20  derByCol = 0;.  
c020: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
c030: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e  olveExprNames(pN
c040: 43 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20  C, pE) ){.      
c050: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
c060: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
c070: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
c080: 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20  nExpr; j++){.   
c090: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
c0a0: 70 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 2c  prCompare(0, pE,
c0b0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
c0c0: 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31  ->a[j].pExpr, -1
c0d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
c0e0: 2f 2a 20 53 69 6e 63 65 20 74 68 69 73 20 65 78  /* Since this ex
c0f0: 70 72 65 73 69 6f 6e 20 69 73 20 62 65 69 6e 67  presion is being
c100: 20 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 61 20   changed into a 
c110: 72 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20  reference.      
c120: 20 20 2a 2a 20 74 6f 20 61 6e 20 69 64 65 6e 74    ** to an ident
c130: 69 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20  ical expression 
c140: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
c150: 74 2c 20 72 65 6d 6f 76 65 20 61 6c 6c 20 57 69  t, remove all Wi
c160: 6e 64 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20  ndow.        ** 
c170: 6f 62 6a 65 63 74 73 20 62 65 6c 6f 6e 67 69 6e  objects belongin
c180: 67 20 74 6f 20 74 68 65 20 65 78 70 72 65 73 73  g to the express
c190: 69 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 65 6c  ion from the Sel
c1a0: 65 63 74 2e 70 57 69 6e 20 6c 69 73 74 2e 20 2a  ect.pWin list. *
c1b0: 2f 0a 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77  /.        window
c1c0: 52 65 6d 6f 76 65 45 78 70 72 46 72 6f 6d 53 65  RemoveExprFromSe
c1d0: 6c 65 63 74 28 70 53 65 6c 65 63 74 2c 20 70 45  lect(pSelect, pE
c1e0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  );.        pItem
c1f0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
c200: 6c 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7d  l = j+1;.      }
c210: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
c220: 75 72 6e 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  urn sqlite3Resol
c230: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70  veOrderGroupBy(p
c240: 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20  Parse, pSelect, 
c250: 70 4f 72 64 65 72 42 79 2c 20 7a 54 79 70 65 29  pOrderBy, zType)
c260: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
c270: 76 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ve names in the 
c280: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
c290: 20 70 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74   p and all of it
c2a0: 73 20 64 65 73 63 65 6e 64 61 6e 74 73 2e 0a 2a  s descendants..*
c2b0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73  /.static int res
c2c0: 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 28 57  olveSelectStep(W
c2d0: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
c2e0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 4e 61  Select *p){.  Na
c2f0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65  meContext *pOute
c300: 72 4e 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 78 74  rNC;  /* Context
c310: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74   that contains t
c320: 68 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20  his SELECT */.  
c330: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b  NameContext sNC;
c340: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
c350: 63 6f 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20  context of this 
c360: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20  SELECT */.  int 
c370: 69 73 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20  isCompound;     
c380: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70      /* True if p
c390: 20 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73   is a compound s
c3a0: 65 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e  elect */.  int n
c3b0: 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20  Compound;       
c3c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
c3d0: 63 6f 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 70  compound terms p
c3e0: 72 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 20  rocessed so far 
c3f0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
c400: 73 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20  se;          /* 
c410: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
c420: 2a 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20  */.  int i;     
c430: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c440: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
c450: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f    ExprList *pGro
c460: 75 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65  upBy;     /* The
c470: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
c480: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c   */.  Select *pL
c490: 65 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a  eftmost;      /*
c4a0: 20 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45   Left-most of SE
c4b0: 4c 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75  LECT of a compou
c4c0: 6e 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20  nd */.  sqlite3 
c4d0: 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20  *db;            
c4e0: 2f 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e  /* Database conn
c4f0: 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20  ection */.  ..  
c500: 61 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a  assert( p!=0 );.
c510: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
c520: 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20  s & SF_Resolved 
c530: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52  ){.    return WR
c540: 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70  C_Prune;.  }.  p
c550: 4f 75 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65  OuterNC = pWalke
c560: 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72  r->u.pNC;.  pPar
c570: 73 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50  se = pWalker->pP
c580: 61 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61  arse;.  db = pPa
c590: 72 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e  rse->db;..  /* N
c5a0: 6f 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53  ormally sqlite3S
c5b0: 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 69  electExpand() wi
c5c0: 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72  ll be called fir
c5d0: 73 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65  st and will have
c5e0: 0a 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78  .  ** already ex
c5f0: 70 61 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45  panded this SELE
c600: 43 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66  CT.  However, if
c610: 20 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75   this is a subqu
c620: 65 72 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20  ery within.  ** 
c630: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73  an expression, s
c640: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c650: 72 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65  rNames() will be
c660: 20 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20   called without 
c670: 61 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c  a.  ** prior cal
c680: 6c 20 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65  l to sqlite3Sele
c690: 63 74 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65  ctExpand().  Whe
c6a0: 6e 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20  n that happens, 
c6b0: 6c 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33  let.  ** sqlite3
c6c0: 53 65 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20  SelectPrep() do 
c6d0: 61 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65  all of the proce
c6e0: 73 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53  ssing for this S
c6f0: 45 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69  ELECT..  ** sqli
c700: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20  te3SelectPrep() 
c710: 77 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68  will invoke both
c720: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
c730: 70 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20  pand() and.  ** 
c740: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20  this routine in 
c750: 74 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65  the correct orde
c760: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70  r..  */.  if( (p
c770: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
c780: 45 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a  Expanded)==0 ){.
c790: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
c7a0: 74 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c  tPrep(pParse, p,
c7b0: 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20   pOuterNC);.    
c7c0: 72 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e  return (pParse->
c7d0: 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  nErr || db->mall
c7e0: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
c7f0: 41 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e  Abort : WRC_Prun
c800: 65 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70  e;.  }..  isComp
c810: 6f 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72  ound = p->pPrior
c820: 21 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64  !=0;.  nCompound
c830: 20 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73   = 0;.  pLeftmos
c840: 74 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20  t = p;.  while( 
c850: 70 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  p ){.    assert(
c860: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
c870: 53 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20  SF_Expanded)!=0 
c880: 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  );.    assert( (
c890: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
c8a0: 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b  _Resolved)==0 );
c8b0: 0a 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73  .    p->selFlags
c8c0: 20 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b   |= SF_Resolved;
c8d0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
c8e0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73   the expressions
c8f0: 20 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e   in the LIMIT an
c900: 64 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73  d OFFSET clauses
c910: 2e 20 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61  . These.    ** a
c920: 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74  re not allowed t
c930: 6f 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e  o refer to any n
c940: 61 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e  ames, so pass an
c950: 20 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65   empty NameConte
c960: 78 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d  xt..    */.    m
c970: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
c980: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20  izeof(sNC));.   
c990: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
c9a0: 61 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 57  arse;.    sNC.pW
c9b0: 69 6e 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20  inSelect = p;.  
c9c0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73    if( sqlite3Res
c9d0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73  olveExprNames(&s
c9e0: 4e 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29  NC, p->pLimit) )
c9f0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
ca00: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
ca10: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53  .    /* If the S
ca20: 46 5f 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67  F_Converted flag
ca30: 73 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74  s is set, then t
ca40: 68 69 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63  his Select objec
ca50: 74 20 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73  t was.    ** was
ca60: 20 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20   created by the 
ca70: 63 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53  convertCompoundS
ca80: 65 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28  electToSubquery(
ca90: 29 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20  ) function..    
caa0: 2a 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20  ** In this case 
cab0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
cac0: 75 73 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79  use (p->pOrderBy
cad0: 29 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f  ) should be reso
cae0: 6c 76 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69  lved.    ** as i
caf0: 66 20 69 74 20 77 65 72 65 20 70 61 72 74 20 6f  f it were part o
cb00: 66 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c  f the sub-query,
cb10: 20 6e 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e   not the parent.
cb20: 20 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20   This block.    
cb30: 2a 2a 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72  ** moves the pOr
cb40: 64 65 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68  derBy down to th
cb50: 65 20 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20  e sub-query. It 
cb60: 77 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61  will be moved ba
cb70: 63 6b 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20  ck.    ** after 
cb80: 74 68 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62  the names have b
cb90: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a  een resolved.  *
cba0: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c  /.    if( p->sel
cbb0: 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65  Flags & SF_Conve
cbc0: 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65  rted ){.      Se
cbd0: 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e  lect *pSub = p->
cbe0: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65  pSrc->a[0].pSele
cbf0: 63 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ct;.      assert
cc00: 28 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d  ( p->pSrc->nSrc=
cc10: 3d 31 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42  =1 && p->pOrderB
cc20: 79 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  y );.      asser
cc30: 74 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20  t( pSub->pPrior 
cc40: 26 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42  && pSub->pOrderB
cc50: 79 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53  y==0 );.      pS
cc60: 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70  ub->pOrderBy = p
cc70: 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20  ->pOrderBy;.    
cc80: 20 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20    p->pOrderBy = 
cc90: 30 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  0;.    }.  .    
cca0: 2f 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 72  /* Recursively r
ccb0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
ccc0: 61 6c 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20  all subqueries. 
ccd0: 20 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d     */.    for(i=
cce0: 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53  0; i<p->pSrc->nS
ccf0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
cd00: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
cd10: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d  tem *pItem = &p-
cd20: 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20  >pSrc->a[i];.   
cd30: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53     if( pItem->pS
cd40: 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d 2d  elect && (pItem-
cd50: 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61  >pSelect->selFla
cd60: 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64  gs & SF_Resolved
cd70: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
cd80: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
cd90: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  ;         /* Use
cda0: 64 20 74 6f 20 69 74 65 72 61 74 65 20 6e 61 6d  d to iterate nam
cdb0: 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  e contexts */.  
cdc0: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
cdd0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
cde0: 2f 2a 20 52 65 66 63 6f 75 6e 74 20 66 6f 72 20  /* Refcount for 
cdf0: 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 6f 75 74  pOuterNC and out
ce00: 65 72 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  er contexts */. 
ce10: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
ce20: 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74  r *zSavedContext
ce30: 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
ce40: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20  Context;..      
ce50: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 74    /* Count the t
ce60: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  otal number of r
ce70: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 4f 75  eferences to pOu
ce80: 74 65 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66  terNC and all of
ce90: 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
cea0: 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e  parent contexts.
ceb0: 20 41 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   After resolving
cec0: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 65   references to e
ced0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20  xpressions in.  
cee0: 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e        ** pItem->
cef0: 70 53 65 6c 65 63 74 2c 20 63 68 65 63 6b 20 69  pSelect, check i
cf00: 66 20 74 68 69 73 20 76 61 6c 75 65 20 68 61 73  f this value has
cf10: 20 63 68 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c   changed. If so,
cf20: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
cf30: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
cf40: 74 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t pItem->pSelect
cf50: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 65 6c 61   must be correla
cf60: 74 65 64 2e 20 53 65 74 20 74 68 65 0a 20 20 20  ted. Set the.   
cf70: 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66       ** pItem->f
cf80: 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 66  g.isCorrelated f
cf90: 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20 74  lag if this is t
cfa0: 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  he case. */.    
cfb0: 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74      for(pNC=pOut
cfc0: 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70  erNC; pNC; pNC=p
cfd0: 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20  NC->pNext) nRef 
cfe0: 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20  += pNC->nRef;.. 
cff0: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
d000: 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73 65  ->zName ) pParse
d010: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
d020: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
d030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
d040: 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
d050: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
d060: 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e  pSelect, pOuterN
d070: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  C);.        pPar
d080: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
d090: 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78 74   = zSavedContext
d0a0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
d0b0: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
d0c0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
d0d0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
d0e0: 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t;..        for(
d0f0: 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e  pNC=pOuterNC; pN
d100: 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78  C; pNC=pNC->pNex
d110: 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e  t) nRef -= pNC->
d120: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61 73  nRef;.        as
d130: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
d140: 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
d150: 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20  && nRef<=0 );.  
d160: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
d170: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28  isCorrelated = (
d180: 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20  nRef!=0);.      
d190: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
d1a0: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
d1b0: 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
d1c0: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74  to pass to sqlit
d1d0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
d1e0: 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  es() to.    ** r
d1f0: 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c  esolve the resul
d200: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
d210: 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20   list..    */.  
d220: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20    sNC.ncFlags = 
d230: 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 41  NC_AllowAgg|NC_A
d240: 6c 6c 6f 77 57 69 6e 3b 0a 20 20 20 20 73 4e 43  llowWin;.    sNC
d250: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
d260: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65  Src;.    sNC.pNe
d270: 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  xt = pOuterNC;. 
d280: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
d290: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
d2a0: 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20  sult set. */.   
d2b0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
d2c0: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
d2d0: 28 26 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74  (&sNC, p->pEList
d2e0: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
d2f0: 62 6f 72 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63  bort;.    sNC.nc
d300: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c  Flags &= ~NC_All
d310: 6f 77 57 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a  owWin;.  .    /*
d320: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
d330: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
d340: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
d350: 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
d360: 52 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20  ROUP BY .    ** 
d370: 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
d380: 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
d390: 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
d3a0: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
d3b0: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
d3c0: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
d3d0: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
d3e0: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ate)==0 );.    p
d3f0: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
d400: 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70  oupBy;.    if( p
d410: 47 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e  GroupBy || (sNC.
d420: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
d430: 41 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Agg)!=0 ){.     
d440: 20 61 73 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d   assert( NC_MinM
d450: 61 78 41 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78  axAgg==SF_MinMax
d460: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Agg );.      p->
d470: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
d480: 67 67 72 65 67 61 74 65 20 7c 20 28 73 4e 43 2e  ggregate | (sNC.
d490: 6e 63 46 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61  ncFlags&NC_MinMa
d4a0: 78 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xAgg);.    }else
d4b0: 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  {.      sNC.ncFl
d4c0: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
d4d0: 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Agg;.    }.  .  
d4e0: 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47    /* If a HAVING
d4f0: 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
d500: 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  nt, then there m
d510: 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42  ust be a GROUP B
d520: 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
d530: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76  .    if( p->pHav
d540: 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
d550: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
d560: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
d570: 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
d580: 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
d590: 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
d5a0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
d5b0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
d5c0: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
d5d0: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20  e output column 
d5e0: 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
d5f0: 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
d600: 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20  parsing the.    
d610: 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ** other express
d620: 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ions in the SELE
d630: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
d640: 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20  is is so that.  
d650: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
d660: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
d670: 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
d680: 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
d690: 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61  ions by.    ** a
d6a0: 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
d6b0: 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a  sult set..    **
d6c0: 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  .    ** Minor po
d6d0: 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
d6e0: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
d6f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
d700: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d  ll be.    ** re-
d710: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
d720: 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ch reference to 
d730: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  it..    */.    a
d740: 73 73 65 72 74 28 20 28 73 4e 43 2e 6e 63 46 6c  ssert( (sNC.ncFl
d750: 61 67 73 20 26 20 28 4e 43 5f 55 41 67 67 49 6e  ags & (NC_UAggIn
d760: 66 6f 7c 4e 43 5f 55 55 70 73 65 72 74 29 29 3d  fo|NC_UUpsert))=
d770: 3d 30 20 29 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  =0 );.    sNC.uN
d780: 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
d790: 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63  List;.    sNC.nc
d7a0: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 55 45 4c 69  Flags |= NC_UELi
d7b0: 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  st;.    if( sqli
d7c0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
d7d0: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
d7e0: 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57  ving) ) return W
d7f0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
d800: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
d810: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
d820: 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65 74  p->pWhere) ) ret
d830: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
d840: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e      /* Resolve n
d850: 61 6d 65 73 20 69 6e 20 74 61 62 6c 65 2d 76 61  ames in table-va
d860: 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 20 61 72  lued-function ar
d870: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66  guments */.    f
d880: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
d890: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
d8a0: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
d8b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
d8c0: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
d8d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
d8e0: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 0a  m->fg.isTabFunc.
d8f0: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
d900: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
d910: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 49 74 65  Names(&sNC, pIte
d920: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 20  m->u1.pFuncArg) 
d930: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
d940: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
d950: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
d960: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  }..    /* The OR
d970: 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
d980: 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20   BY clauses may 
d990: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74 65 72  not refer to ter
d9a0: 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  ms in.    ** out
d9b0: 65 72 20 71 75 65 72 69 65 73 20 0a 20 20 20 20  er queries .    
d9c0: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  */.    sNC.pNext
d9d0: 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63   = 0;.    sNC.nc
d9e0: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
d9f0: 77 41 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e  wAgg|NC_AllowWin
da00: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
da10: 73 20 69 73 20 61 20 63 6f 6e 76 65 72 74 65 64  s is a converted
da20: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2c   compound query,
da30: 20 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20   move the ORDER 
da40: 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 0a  BY clause from .
da50: 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 71      ** the sub-q
da60: 75 65 72 79 20 62 61 63 6b 20 74 6f 20 74 68 65  uery back to the
da70: 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e 20 41   parent query. A
da80: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 65 61 63  t this point eac
da90: 68 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 77 69  h term.    ** wi
daa0: 74 68 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  thin the ORDER B
dab0: 59 20 63 6c 61 75 73 65 20 68 61 73 20 62 65 65  Y clause has bee
dac0: 6e 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  n transformed to
dad0: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
dae0: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 73 65 20  e..    ** These 
daf0: 69 6e 74 65 67 65 72 73 20 77 69 6c 6c 20 62 65  integers will be
db00: 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 70   replaced by cop
db10: 69 65 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ies of the corre
db20: 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74 0a  sponding result.
db30: 20 20 20 20 2a 2a 20 73 65 74 20 65 78 70 72 65      ** set expre
db40: 73 73 69 6f 6e 73 20 62 79 20 74 68 65 20 63 61  ssions by the ca
db50: 6c 6c 20 74 6f 20 72 65 73 6f 6c 76 65 4f 72 64  ll to resolveOrd
db60: 65 72 47 72 6f 75 70 42 79 28 29 20 62 65 6c 6f  erGroupBy() belo
db70: 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
db80: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
db90: 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
dba0: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
dbb0: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
dbc0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70  pSelect;.      p
dbd0: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
dbe0: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
dbf0: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
dc00: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 0;.    }..  
dc10: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
dc20: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
dc30: 20 66 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53   for singleton S
dc40: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
dc50: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44  ..    ** The ORD
dc60: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
dc70: 20 63 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43   compounds SELEC
dc80: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
dc90: 68 61 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62  handled.    ** b
dca0: 65 6c 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20  elow, after all 
dcb0: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
dcc0: 74 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  ts for all of th
dcd0: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20  e elements of.  
dce0: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e    ** the compoun
dcf0: 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  d have been reso
dd00: 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lved..    **.   
dd10: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
dd20: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
dd30: 73 65 20 6f 6e 20 61 20 74 65 72 6d 20 6f 66 20  se on a term of 
dd40: 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
dd50: 74 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  t other.    ** t
dd60: 68 61 6e 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  han the right-mo
dd70: 73 74 20 74 65 72 6d 2c 20 74 68 65 6e 20 74 68  st term, then th
dd80: 61 74 20 69 73 20 61 20 73 79 6e 74 61 78 20 65  at is a syntax e
dd90: 72 72 6f 72 2e 20 20 42 75 74 20 74 68 65 20 65  rror.  But the e
dda0: 72 72 6f 72 0a 20 20 20 20 2a 2a 20 69 73 20 6e  rror.    ** is n
ddb0: 6f 74 20 64 65 74 65 63 74 65 64 20 75 6e 74 69  ot detected unti
ddc0: 6c 20 6d 75 63 68 20 6c 61 74 65 72 2c 20 61 6e  l much later, an
ddd0: 64 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  d so we need to 
dde0: 67 6f 20 61 68 65 61 64 20 61 6e 64 0a 20 20 20  go ahead and.   
ddf0: 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 6f 73   ** resolve thos
de00: 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65  e symbols on the
de10: 20 69 6e 63 6f 72 72 65 63 74 20 4f 52 44 45 52   incorrect ORDER
de20: 20 42 59 20 66 6f 72 20 63 6f 6e 73 69 73 74 65   BY for consiste
de30: 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ncy..    */.    
de40: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 3c 3d  if( isCompound<=
de50: 6e 43 6f 6d 70 6f 75 6e 64 20 20 2f 2a 20 44 65  nCompound  /* De
de60: 66 65 72 20 72 69 67 68 74 2d 6d 6f 73 74 20 4f  fer right-most O
de70: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
de80: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 26 26  pound */.     &&
de90: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
dea0: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d  upBy(&sNC, p, p-
deb0: 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
dec0: 52 22 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  R").    ){.     
ded0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
dee0: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
def0: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
df00: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
df10: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
df20: 20 7d 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61   }.    sNC.ncFla
df30: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57  gs &= ~NC_AllowW
df40: 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  in;.  .    /* Re
df50: 73 6f 6c 76 65 20 74 68 65 20 47 52 4f 55 50 20  solve the GROUP 
df60: 42 59 20 63 6c 61 75 73 65 2e 20 20 41 74 20 74  BY clause.  At t
df70: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61  he same time, ma
df80: 6b 65 20 73 75 72 65 20 0a 20 20 20 20 2a 2a 20  ke sure .    ** 
df90: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
dfa0: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
dfb0: 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
dfc0: 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f  unctions..    */
dfd0: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
dfe0: 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  y ){.      struc
dff0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
e000: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20  *pItem;.    .   
e010: 20 20 20 69 66 28 20 72 65 73 6f 6c 76 65 4f 72     if( resolveOr
e020: 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
e030: 20 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47   p, pGroupBy, "G
e040: 52 4f 55 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61  ROUP") || db->ma
e050: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
e060: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
e070: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
e080: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
e090: 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
e0a0: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
e0b0: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
e0c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
e0d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
e0e0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pItem->pExpr, EP
e0f0: 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
e100: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
e110: 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72  sg(pParse, "aggr
e120: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
e130: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
e140: 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  in ".           
e150: 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59     "the GROUP BY
e160: 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20   clause");.     
e170: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
e180: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d  Abort;.        }
e190: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
e1a0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
e1b0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
e1c0: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
e1d0: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
e1e0: 20 57 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20   Window *pWin;. 
e1f0: 20 20 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d       for(pWin=p-
e200: 3e 70 57 69 6e 44 65 66 6e 3b 20 70 57 69 6e 3b  >pWinDefn; pWin;
e210: 20 70 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78   pWin=pWin->pNex
e220: 74 57 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 69  tWin){.        i
e230: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
e240: 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26  eExprListNames(&
e250: 73 4e 43 2c 20 70 57 69 6e 2d 3e 70 4f 72 64 65  sNC, pWin->pOrde
e260: 72 42 79 29 0a 20 20 20 20 20 20 20 20 20 7c 7c  rBy).         ||
e270: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
e280: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
e290: 43 2c 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74  C, pWin->pPartit
e2a0: 69 6f 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a  ion).        ){.
e2b0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
e2c0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
e2d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
e2e0: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20    }.#endif..    
e2f0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 70 61  /* If this is pa
e300: 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  rt of a compound
e310: 20 53 45 4c 45 43 54 2c 20 63 68 65 63 6b 20 74   SELECT, check t
e320: 68 61 74 20 69 74 20 68 61 73 20 74 68 65 20 72  hat it has the r
e330: 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62  ight.    ** numb
e340: 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  er of expression
e350: 73 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20  s in the select 
e360: 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28  list. */.    if(
e370: 20 70 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e   p->pNext && p->
e380: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70  pEList->nExpr!=p
e390: 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d  ->pNext->pEList-
e3a0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  >nExpr ){.      
e3b0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f  sqlite3SelectWro
e3c0: 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28  ngNumTermsError(
e3d0: 70 50 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74  pParse, p->pNext
e3e0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
e3f0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
e400: 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  ..    /* Advance
e410: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72   to the next ter
e420: 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e  m of the compoun
e430: 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d  d.    */.    p =
e440: 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20   p->pPrior;.    
e450: 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d  nCompound++;.  }
e460: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74  ..  /* Resolve t
e470: 68 65 20 4f 52 44 45 52 20 42 59 20 6f 6e 20 61  he ORDER BY on a
e480: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
e490: 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73   after all terms
e4a0: 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d   of.  ** the com
e4b0: 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20  pound have been 
e4c0: 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20  resolved..  */. 
e4d0: 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20   if( isCompound 
e4e0: 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75  && resolveCompou
e4f0: 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73 65  ndOrderBy(pParse
e500: 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a  , pLeftmost) ){.
e510: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
e520: 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74  bort;.  }..  ret
e530: 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d  urn WRC_Prune;.}
e540: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
e550: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
e560: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
e570: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
e580: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
e590: 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65  e columns and re
e5a0: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73  sult-set columns
e5b0: 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20 74  .  At the same t
e5c0: 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a  ime, do error.**
e5d0: 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e   checking on fun
e5e0: 63 74 69 6f 6e 20 75 73 61 67 65 20 61 6e 64 20  ction usage and 
e5f0: 73 65 74 20 61 20 66 6c 61 67 20 69 66 20 61 6e  set a flag if an
e600: 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  y aggregate func
e610: 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65  tions.** are see
e620: 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f  n..**.** To reso
e630: 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  lve table column
e640: 73 20 72 65 66 65 72 65 6e 63 65 73 20 77 65 20  s references we 
e650: 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28  look for nodes (
e660: 6f 72 20 73 75 62 74 72 65 65 73 29 20 6f 66 20  or subtrees) of 
e670: 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59  the .** form X.Y
e680: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73  .Z or Y.Z or jus
e690: 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20  t Z where.**.** 
e6a0: 20 20 20 20 20 58 3a 20 20 20 54 68 65 20 6e 61       X:   The na
e6b0: 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73 65  me of a database
e6c0: 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f  .  Ex:  "main" o
e6d0: 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20  r "temp" or.**  
e6e0: 20 20 20 20 20 20 20 20 20 74 68 65 20 73 79 6d           the sym
e6f0: 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73 73 69 67  bolic name assig
e700: 6e 65 64 20 74 6f 20 61 6e 20 41 54 54 41 43 48  ned to an ATTACH
e710: 2d 65 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a  -ed database..**
e720: 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20 20 54 68  .**      Y:   Th
e730: 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c  e name of a tabl
e740: 65 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75  e in a FROM clau
e750: 73 65 2e 20 20 4f 72 20 69 6e 20 61 20 74 72 69  se.  Or in a tri
e760: 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  gger.**         
e770: 20 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65    one of the spe
e780: 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22  cial names "old"
e790: 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a   or "new"..**.**
e7a0: 20 20 20 20 20 20 5a 3a 20 20 20 54 68 65 20 6e        Z:   The n
e7b0: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
e7c0: 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a  in table Y..**.*
e7d0: 2a 20 54 68 65 20 6e 6f 64 65 20 61 74 20 74 68  * The node at th
e7e0: 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 73 75  e root of the su
e7f0: 62 74 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65  btree is modifie
e800: 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a  d as follows:.**
e810: 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f 70 20 20  .**    Expr.op  
e820: 20 20 20 20 20 20 43 68 61 6e 67 65 64 20 74 6f        Changed to
e830: 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20   TK_COLUMN.**   
e840: 20 45 78 70 72 2e 70 54 61 62 20 20 20 20 20 20   Expr.pTab      
e850: 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61  Points to the Ta
e860: 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 58  ble object for X
e870: 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 43  .Y.**    Expr.iC
e880: 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75  olumn   The colu
e890: 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e  mn index in X.Y.
e8a0: 20 20 2d 31 20 66 6f 72 20 74 68 65 20 72 6f 77    -1 for the row
e8b0: 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69  id..**    Expr.i
e8c0: 54 61 62 6c 65 20 20 20 20 54 68 65 20 56 44 42  Table    The VDB
e8d0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
e8e0: 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a  for X.Y.**.**.**
e8f0: 20 54 6f 20 72 65 73 6f 6c 76 65 20 72 65 73 75   To resolve resu
e900: 6c 74 2d 73 65 74 20 72 65 66 65 72 65 6e 63 65  lt-set reference
e910: 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72  s, look for expr
e920: 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20  ession nodes of 
e930: 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77  the.** form Z (w
e940: 69 74 68 20 6e 6f 20 58 20 61 6e 64 20 59 20 70  ith no X and Y p
e950: 72 65 66 69 78 29 20 77 68 65 72 65 20 74 68 65  refix) where the
e960: 20 5a 20 6d 61 74 63 68 65 73 20 74 68 65 20 72   Z matches the r
e970: 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a  ight-hand.** siz
e980: 65 20 6f 66 20 61 6e 20 41 53 20 63 6c 61 75 73  e of an AS claus
e990: 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  e in the result-
e9a0: 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2e  set of a SELECT.
e9b0: 20 20 54 68 65 20 5a 20 65 78 70 72 65 73 73 69    The Z expressi
e9c0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63 65  on.** is replace
e9d0: 64 20 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74  d by a copy of t
e9e0: 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64  he left-hand sid
e9f0: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d  e of the result-
ea00: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  set expression..
ea10: 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e  ** Table-name an
ea20: 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c  d function resol
ea30: 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20  ution occurs on 
ea40: 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64 20  the substituted 
ea50: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72  expression.** tr
ea60: 65 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65  ee.  For example
ea70: 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  , in:.**.**     
ea80: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
ea90: 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20  , c+d AS y FROM 
eaa0: 74 31 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a  t1 ORDER BY x;.*
eab0: 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20 74 65 72  *.** The "x" ter
eac0: 6d 20 6f 66 20 74 68 65 20 6f 72 64 65 72 20 62  m of the order b
ead0: 79 20 69 73 20 72 65 70 6c 61 63 65 64 20 62 79  y is replaced by
eae0: 20 22 61 2b 62 22 20 74 6f 20 72 65 6e 64 65 72   "a+b" to render
eaf0: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c  :.**.**      SEL
eb00: 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b  ECT a+b AS x, c+
eb10: 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f  d AS y FROM t1 O
eb20: 52 44 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a  RDER BY a+b;.**.
eb30: 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c  ** Function call
eb40: 73 20 61 72 65 20 63 68 65 63 6b 65 64 20 74 6f  s are checked to
eb50: 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74 20   make sure that 
eb60: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  the function is 
eb70: 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 6e 64 20  .** defined and 
eb80: 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63 74  that the correct
eb90: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
eba0: 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66 69  ents are specifi
ebb0: 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75  ed..** If the fu
ebc0: 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 61 67 67  nction is an agg
ebd0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c  regate function,
ebe0: 20 74 68 65 6e 20 74 68 65 20 4e 43 5f 48 61 73   then the NC_Has
ebf0: 41 67 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73  Agg flag is.** s
ec00: 65 74 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64  et and the opcod
ec10: 65 20 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f  e is changed fro
ec20: 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f  m TK_FUNCTION to
ec30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
ec40: 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65  ..** If an expre
ec50: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
ec60: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
ec70: 6e 73 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41  ns then the EP_A
ec80: 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f  gg.** property o
ec90: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
eca0: 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41   is set..**.** A
ecb0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
ecc0: 69 73 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73  is left in pPars
ecd0: 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73  e if anything is
ece0: 20 61 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d   amiss.  The num
ecf0: 62 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73  ber.** if errors
ed00: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f   is returned..*/
ed10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f  .int sqlite3Reso
ed20: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20  lveExprNames( . 
ed30: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
ed40: 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  C,       /* Name
ed50: 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  space to resolve
ed60: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e   expressions in.
ed70: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
ed80: 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  r             /*
ed90: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
eda0: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
edb0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65  */.){.  int save
edc0: 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65  dHasAgg;.  Walke
edd0: 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  r w;..  if( pExp
ede0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  r==0 ) return SQ
edf0: 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 61 76 65 64  LITE_OK;.  saved
ee00: 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63  HasAgg = pNC->nc
ee10: 46 6c 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41  Flags & (NC_HasA
ee20: 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 7c  gg|NC_MinMaxAgg|
ee30: 4e 43 5f 48 61 73 57 69 6e 29 3b 0a 20 20 70 4e  NC_HasWin);.  pN
ee40: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28  C->ncFlags &= ~(
ee50: 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e  NC_HasAgg|NC_Min
ee60: 4d 61 78 41 67 67 7c 4e 43 5f 48 61 73 57 69 6e  MaxAgg|NC_HasWin
ee70: 29 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  );.  w.pParse = 
ee80: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77  pNC->pParse;.  w
ee90: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
eea0: 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70   resolveExprStep
eeb0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
eec0: 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53  lback = resolveS
eed0: 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e 78  electStep;.  w.x
eee0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
eef0: 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  = 0;.  w.u.pNC =
ef00: 20 70 4e 43 3b 0a 23 69 66 20 53 51 4c 49 54 45   pNC;.#if SQLITE
ef10: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
ef20: 30 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48  0.  w.pParse->nH
ef30: 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e  eight += pExpr->
ef40: 6e 48 65 69 67 68 74 3b 0a 20 20 69 66 28 20 73  nHeight;.  if( s
ef50: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
ef60: 65 69 67 68 74 28 77 2e 70 50 61 72 73 65 2c 20  eight(w.pParse, 
ef70: 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  w.pParse->nHeigh
ef80: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
ef90: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
efa0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
efb0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
efc0: 70 45 78 70 72 29 3b 0a 23 69 66 20 53 51 4c 49  pExpr);.#if SQLI
efd0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
efe0: 48 3e 30 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e  H>0.  w.pParse->
eff0: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
f000: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
f010: 66 0a 20 20 61 73 73 65 72 74 28 20 45 50 5f 41  f.  assert( EP_A
f020: 67 67 3d 3d 4e 43 5f 48 61 73 41 67 67 20 29 3b  gg==NC_HasAgg );
f030: 0a 20 20 61 73 73 65 72 74 28 20 45 50 5f 57 69  .  assert( EP_Wi
f040: 6e 3d 3d 4e 43 5f 48 61 73 57 69 6e 20 29 3b 0a  n==NC_HasWin );.
f050: 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d    testcase( pNC-
f060: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61  >ncFlags & NC_Ha
f070: 73 41 67 67 20 29 3b 0a 20 20 74 65 73 74 63 61  sAgg );.  testca
f080: 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  se( pNC->ncFlags
f090: 20 26 20 4e 43 5f 48 61 73 57 69 6e 20 29 3b 0a   & NC_HasWin );.
f0a0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
f0b0: 79 28 70 45 78 70 72 2c 20 70 4e 43 2d 3e 6e 63  y(pExpr, pNC->nc
f0c0: 46 6c 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41  Flags & (NC_HasA
f0d0: 67 67 7c 4e 43 5f 48 61 73 57 69 6e 29 20 29 3b  gg|NC_HasWin) );
f0e0: 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  .  pNC->ncFlags 
f0f0: 7c 3d 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  |= savedHasAgg;.
f100: 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 6e 45    return pNC->nE
f110: 72 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65  rr>0 || w.pParse
f120: 2d 3e 6e 45 72 72 3e 30 3b 0a 7d 0a 0a 2f 2a 0a  ->nErr>0;.}../*.
f130: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
f140: 61 6d 65 73 20 66 6f 72 20 61 6c 6c 20 65 78 70  ames for all exp
f150: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 20 65 78  ression in an ex
f160: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
f170: 54 68 69 73 20 69 73 0a 2a 2a 20 6a 75 73 74 20  This is.** just 
f180: 6c 69 6b 65 20 73 71 6c 69 74 65 33 52 65 73 6f  like sqlite3Reso
f190: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 65  lveExprNames() e
f1a0: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 77 6f  xcept that it wo
f1b0: 72 6b 73 20 66 6f 72 20 61 6e 20 65 78 70 72 65  rks for an expre
f1c0: 73 73 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 72 61  ssion.** list ra
f1d0: 74 68 65 72 20 74 68 61 6e 20 61 20 73 69 6e 67  ther than a sing
f1e0: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
f1f0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
f200: 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65  olveExprListName
f210: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
f220: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
f230: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
f240: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
f250: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 4c  s in. */.  ExprL
f260: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20  ist *pList      
f270: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
f280: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
f290: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
f2a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f2b0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
f2c0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
f2d0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
f2e0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
f2f0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43  lveExprNames(pNC
f300: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
f310: 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 57 52  xpr) ) return WR
f320: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
f330: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
f340: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
f350: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
f360: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72  ames in all expr
f370: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c  essions of a SEL
f380: 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a  ECT and in all.*
f390: 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20  * decendents of 
f3a0: 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c  the SELECT, incl
f3b0: 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20  uding compounds 
f3c0: 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72  off of p->pPrior
f3d0: 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  ,.** subqueries 
f3e0: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  in expressions, 
f3f0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 75  and subqueries u
f400: 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75  sed as FROM clau
f410: 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a  se.** terms..**.
f420: 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  ** See sqlite3Re
f430: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
f440: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
f450: 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20  on of the kinds 
f460: 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61  of.** transforma
f470: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
f480: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45  ..**.** All SELE
f490: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  CT statements sh
f4a0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65  ould have been e
f4b0: 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a  xpanded using.**
f4c0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
f4d0: 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20  pand() prior to 
f4e0: 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
f4f0: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
f500: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
f510: 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  ectNames(.  Pars
f520: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
f530: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
f540: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
f550: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
f560: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
f570: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
f580: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
f590: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
f5a0: 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
f5b0: 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74  ntext for parent
f5c0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
f5d0: 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  t */.){.  Walker
f5e0: 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   w;..  assert( p
f5f0: 21 3d 30 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  !=0 );.  w.xExpr
f600: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
f610: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
f620: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
f630: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
f640: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
f650: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
f660: 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
f670: 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  se;.  w.u.pNC = 
f680: 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69  pOuterNC;.  sqli
f690: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
f6a0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
f6b0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
f6c0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
f6d0: 20 63 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65   can only refere
f6e0: 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nce a single tab
f6f0: 6c 65 0a 2a 2a 20 6f 72 20 77 68 69 63 68 20 63  le.** or which c
f700: 61 6e 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  annot reference 
f710: 61 6e 79 20 74 61 62 6c 65 73 20 61 74 20 61 6c  any tables at al
f720: 6c 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  l.  Examples:.**
f730: 0a 2a 2a 20 20 20 20 28 31 29 20 20 20 43 48 45  .**    (1)   CHE
f740: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  CK constraints.*
f750: 2a 20 20 20 20 28 32 29 20 20 20 57 48 45 52 45  *    (2)   WHERE
f760: 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74   clauses on part
f770: 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20  ial indices.**  
f780: 20 20 28 33 29 20 20 20 45 78 70 72 65 73 73 69    (3)   Expressi
f790: 6f 6e 73 20 69 6e 20 69 6e 64 65 78 65 73 20 6f  ons in indexes o
f7a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  n expressions.**
f7b0: 20 20 20 20 28 34 29 20 20 20 45 78 70 72 65 73      (4)   Expres
f7c0: 73 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  sion arguments t
f7d0: 6f 20 56 41 43 55 55 4d 20 49 4e 54 4f 2e 0a 2a  o VACUUM INTO..*
f7e0: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
f7f0: 73 20 65 78 63 65 70 74 20 28 34 29 2c 20 74 68  s except (4), th
f800: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61  e Expr.iTable va
f810: 6c 75 65 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d  lue for Expr.op=
f820: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 6e 6f  =TK_COLUMN.** no
f830: 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  des of the expre
f840: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
f850: 2d 31 20 61 6e 64 20 74 68 65 20 45 78 70 72 2e  -1 and the Expr.
f860: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73  iColumn value is
f870: 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 63  .** set to the c
f880: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 49  olumn number.  I
f890: 6e 20 63 61 73 65 20 28 34 29 2c 20 54 4b 5f 43  n case (4), TK_C
f8a0: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 63 61 75 73  OLUMN nodes caus
f8b0: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e an error..**.*
f8c0: 2a 20 41 6e 79 20 65 72 72 6f 72 73 20 63 61 75  * Any errors cau
f8d0: 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  se an error mess
f8e0: 61 67 65 20 74 6f 20 62 65 20 73 65 74 20 69 6e  age to be set in
f8f0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
f900: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
f910: 6c 66 52 65 66 65 72 65 6e 63 65 28 0a 20 20 50  lfReference(.  P
f920: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f930: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f940: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
f950: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 2f   *pTab,        /
f960: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
f970: 67 20 72 65 66 65 72 65 6e 63 65 64 2c 20 6f 72  g referenced, or
f980: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 74   NULL */.  int t
f990: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ype,           /
f9a0: 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f 72 20  * NC_IsCheck or 
f9b0: 4e 43 5f 50 61 72 74 49 64 78 20 6f 72 20 4e 43  NC_PartIdx or NC
f9c0: 5f 49 64 78 45 78 70 72 2c 20 6f 72 20 30 20 2a  _IdxExpr, or 0 *
f9d0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
f9e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
f9f0: 73 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65  ssion to resolve
fa00: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  .  May be NULL. 
fa10: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
fa20: 4c 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72  List     /* Expr
fa30: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72  ession list to r
fa40: 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20  esolve.  May be 
fa50: 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72  NULL. */.){.  Sr
fa60: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
fa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
fa80: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
fa90: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
faa0: 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ble */.  NameCon
fab0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
fac0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
fad0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
fae0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
faf0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
fb00: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 30 20 7c  ssert( type==0 |
fb10: 7c 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  | pTab!=0 );.  a
fb20: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e 43 5f  ssert( type==NC_
fb30: 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70 65 3d  IsCheck || type=
fb40: 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c 7c 20 74  =NC_PartIdx || t
fb50: 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78 70 72 20  ype==NC_IdxExpr 
fb60: 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
fb70: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
fb80: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
fb90: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
fba0: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
fbb0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
fbc0: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
fbd0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
fbe0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
fbf0: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
fc00: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ].pTab = pTab;. 
fc10: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
fc20: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  rsor = -1;.  }. 
fc30: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
fc40: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63  arse;.  sNC.pSrc
fc50: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
fc60: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79  sNC.ncFlags = ty
fc70: 70 65 20 7c 20 4e 43 5f 49 73 44 44 4c 3b 0a 20  pe | NC_IsDDL;. 
fc80: 20 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74   if( (rc = sqlit
fc90: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
fca0: 65 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 29  es(&sNC, pExpr))
fcb0: 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65  !=SQLITE_OK ) re
fcc0: 74 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70  turn rc;.  if( p
fcd0: 4c 69 73 74 20 29 20 72 63 20 3d 20 73 71 6c 69  List ) rc = sqli
fce0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
fcf0: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c  stNames(&sNC, pL
fd00: 69 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72  ist);.  return r
fd10: 63 3b 0a 7d 0a                                   c;.}.