/ Hex Artifact Content
Login

Artifact 9d6a3bdca1ebc759c4616fee0d7dd4cf62741f53db3a6b0117600f27c5b1406a:


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 69 66 28 20  ;.    }.    if( 
0ea0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
0eb0: 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e  pExpr, EP_WinFun
0ec0: 63 29 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20  c) ){.      if( 
0ed0: 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 21 3d 30  pExpr->y.pWin!=0
0ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
0ef0: 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 4f 77 6e 65  r->y.pWin->pOwne
0f00: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20  r = pExpr;.     
0f10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
0f20: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
0f30: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
0f40: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73 71    }.    }.    sq
0f50: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
0f60: 70 44 75 70 29 3b 0a 20 20 7d 0a 20 20 45 78 70  pDup);.  }.  Exp
0f70: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
0f80: 70 72 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 7d  pr, EP_Alias);.}
0f90: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
0fa0: 54 52 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65  TRUE if the name
0fb0: 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79   zCol occurs any
0fc0: 77 68 65 72 65 20 69 6e 20 74 68 65 20 55 53 49  where in the USI
0fd0: 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a  NG clause..**.**
0fe0: 20 52 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66   Return FALSE if
0ff0: 20 74 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73   the USING claus
1000: 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20  e is NULL or if 
1010: 69 74 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74  it does not cont
1020: 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a  ain.** zCol..*/.
1030: 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49  static int nameI
1040: 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c  nUsingClause(IdL
1050: 69 73 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e  ist *pUsing, con
1060: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a  st char *zCol){.
1070: 20 20 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a    if( pUsing ){.
1080: 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66      int k;.    f
1090: 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67  or(k=0; k<pUsing
10a0: 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20  ->nId; k++){.   
10b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
10c0: 72 49 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b  rICmp(pUsing->a[
10d0: 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  k].zName, zCol)=
10e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
10f0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
1100: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75  n 0;.}../*.** Su
1110: 62 71 75 65 72 69 65 73 20 73 74 6f 72 65 73 20  bqueries stores 
1120: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74  the original dat
1130: 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64  abase, table and
1140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f   column names fo
1150: 72 20 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c  r their.** resul
1160: 74 20 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69  t sets in ExprLi
1170: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e  st.a[].zSpan, in
1180: 20 74 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42   the form "DATAB
1190: 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e  ASE.TABLE.COLUMN
11a0: 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73  "..** Check to s
11b0: 65 65 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20  ee if the zSpan 
11c0: 67 69 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f  given to this ro
11d0: 75 74 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68  utine matches th
11e0: 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20  e zDb, zTab,.** 
11f0: 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e  and zCol.  If an
1200: 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20  y of zDb, zTab, 
1210: 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c  and zCol are NUL
1220: 4c 20 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65  L then those fie
1230: 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63  lds will.** matc
1240: 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69  h anything..*/.i
1250: 6e 74 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53  nt sqlite3MatchS
1260: 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74  panName(.  const
1270: 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20   char *zSpan,.  
1280: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
1290: 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  ,.  const char *
12a0: 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68  zTab,.  const ch
12b0: 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74  ar *zDb.){.  int
12c0: 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41   n;.  for(n=0; A
12d0: 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20  LWAYS(zSpan[n]) 
12e0: 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27  && zSpan[n]!='.'
12f0: 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a  ; n++){}.  if( z
1300: 44 62 20 26 26 20 28 73 71 6c 69 74 65 33 53 74  Db && (sqlite3St
1310: 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44  rNICmp(zSpan, zD
1320: 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b  b, n)!=0 || zDb[
1330: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  n]!=0) ){.    re
1340: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53  turn 0;.  }.  zS
1350: 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f  pan += n+1;.  fo
1360: 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53  r(n=0; ALWAYS(zS
1370: 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e  pan[n]) && zSpan
1380: 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d  [n]!='.'; n++){}
1390: 0a 20 20 69 66 28 20 7a 54 61 62 20 26 26 20 28  .  if( zTab && (
13a0: 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28  sqlite3StrNICmp(
13b0: 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21  zSpan, zTab, n)!
13c0: 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30  =0 || zTab[n]!=0
13d0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
13e0: 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b  0;.  }.  zSpan +
13f0: 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f  = n+1;.  if( zCo
1400: 6c 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  l && sqlite3StrI
1410: 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29  Cmp(zSpan, zCol)
1420: 21 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  !=0 ){.    retur
1430: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
1440: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 1;.}../*.** Re
1450: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
1460: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
1470: 74 72 69 6e 67 20 20 6d 69 73 2d 66 65 61 74 75  tring  mis-featu
1480: 72 65 20 73 68 6f 75 6c 64 20 62 65 20 73 75 70  re should be sup
1490: 70 6f 72 74 65 64 2e 0a 2a 2f 0a 73 74 61 74 69  ported..*/.stati
14a0: 63 20 69 6e 74 20 61 72 65 44 6f 75 62 6c 65 51  c int areDoubleQ
14b0: 75 6f 74 65 64 53 74 72 69 6e 67 73 45 6e 61 62  uotedStringsEnab
14c0: 6c 65 64 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  led(sqlite3 *db,
14d0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54   NameContext *pT
14e0: 6f 70 4e 43 29 7b 0a 20 20 69 66 28 20 64 62 2d  opNC){.  if( db-
14f0: 3e 69 6e 69 74 2e 62 75 73 79 20 29 20 72 65 74  >init.busy ) ret
1500: 75 72 6e 20 31 3b 20 20 2f 2a 20 41 6c 77 61 79  urn 1;  /* Alway
1510: 73 20 73 75 70 70 6f 72 74 20 66 6f 72 20 6c 65  s support for le
1520: 67 61 63 79 20 73 63 68 65 6d 61 73 20 2a 2f 0a  gacy schemas */.
1530: 20 20 69 66 28 20 70 54 6f 70 4e 43 2d 3e 6e 63    if( pTopNC->nc
1540: 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 44 44 4c  Flags & NC_IsDDL
1550: 20 29 7b 0a 20 20 20 20 2f 2a 20 43 75 72 72 65   ){.    /* Curre
1560: 6e 74 6c 79 20 70 61 72 73 69 6e 67 20 61 20 44  ntly parsing a D
1570: 44 4c 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  DL statement */.
1580: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 57      if( sqlite3W
1590: 72 69 74 61 62 6c 65 53 63 68 65 6d 61 28 64 62  ritableSchema(db
15a0: 29 20 26 26 20 28 64 62 2d 3e 66 6c 61 67 73 20  ) && (db->flags 
15b0: 26 20 53 51 4c 49 54 45 5f 44 71 73 44 4d 4c 29  & SQLITE_DqsDML)
15c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  !=0 ){.      ret
15d0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 1;.    }.   
15e0: 20 72 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61   return (db->fla
15f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 71 73 44  gs & SQLITE_DqsD
1600: 44 4c 29 21 3d 30 3b 0a 20 20 7d 65 6c 73 65 7b  DL)!=0;.  }else{
1610: 0a 20 20 20 20 2f 2a 20 43 75 72 72 65 6e 74 6c  .    /* Currentl
1620: 79 20 70 61 72 73 69 6e 67 20 61 20 44 4d 4c 20  y parsing a DML 
1630: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 20  statement */.   
1640: 20 72 65 74 75 72 6e 20 28 64 62 2d 3e 66 6c 61   return (db->fla
1650: 67 73 20 26 20 53 51 4c 49 54 45 5f 44 71 73 44  gs & SQLITE_DqsD
1660: 4d 4c 29 21 3d 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ML)!=0;.  }.}../
1670: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
1680: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
1690: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
16a0: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
16b0: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
16c0: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
16d0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
16e0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
16f0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
1700: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
1710: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
1720: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
1730: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
1740: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
1750: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
1760: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
1770: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
1780: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
1790: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
17a0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
17b0: 58 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  X.**            
17c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 28 65 76               (ev
17d0: 65 6e 20 69 66 20 58 20 69 73 20 69 6d 70 6c 69  en if X is impli
17e0: 65 64 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ed)..**    pExpr
17f0: 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20  ->iTable        
1800: 53 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f  Set to the curso
1810: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65  r number for the
1820: 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a   table obtained.
1830: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1840: 20 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20             from 
1850: 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20  pSrcList..**    
1860: 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 20 20  pExpr->y.pTab   
1870: 20 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74       Points to t
1880: 68 65 20 54 61 62 6c 65 20 73 74 72 75 63 74 75  he Table structu
1890: 72 65 20 6f 66 20 58 2e 59 20 28 65 76 65 6e 20  re of X.Y (even 
18a0: 69 66 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  if.**           
18b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 58 20                X 
18c0: 61 6e 64 2f 6f 72 20 59 20 61 72 65 20 69 6d 70  and/or Y are imp
18d0: 6c 69 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 78  lied.).**    pEx
18e0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20  pr->iColumn     
18f0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c    Set to the col
1900: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
1910: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
1920: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
1930: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54          Set to T
1940: 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20  K_COLUMN..**    
1950: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20  pExpr->pLeft    
1960: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
1970: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
1980: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  to is deleted.**
1990: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
19a0: 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70  t        Any exp
19b0: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
19c0: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
19d0: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44 62  d..**.** The zDb
19e0: 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68 65   variable is the
19f0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   name of the dat
1a00: 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29 2e  abase (the "X").
1a10: 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79    This value may
1a20: 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e   be.** NULL mean
1a30: 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73  ing that name is
1a40: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a   of the form Y.Z
1a50: 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69   or Z.  Any avai
1a60: 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a  lable database.*
1a70: 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20  * can be used.  
1a80: 54 68 65 20 7a 54 61 62 6c 65 20 76 61 72 69 61  The zTable varia
1a90: 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ble is the name 
1aa0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
1ab0: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
1ac0: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
1ad0: 4c 4c 20 69 66 20 7a 44 62 20 69 73 20 61 6c 73  LL if zDb is als
1ae0: 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61 62  o NULL.  If zTab
1af0: 6c 65 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a  le is NULL it.**
1b00: 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20   means that the 
1b10: 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65  form of the name
1b20: 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63   is Z and that c
1b30: 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20  olumns from any 
1b40: 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20  table.** can be 
1b50: 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  used..**.** If t
1b60: 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62  he name cannot b
1b70: 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62  e resolved unamb
1b80: 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20  iguously, leave 
1b90: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
1ba0: 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e  .** in pParse an
1bb0: 64 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  d return WRC_Abo
1bc0: 72 74 2e 20 20 52 65 74 75 72 6e 20 57 52 43 5f  rt.  Return WRC_
1bd0: 50 72 75 6e 65 20 6f 6e 20 73 75 63 63 65 73 73  Prune on success
1be0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
1bf0: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61  lookupName(.  Pa
1c00: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
1c10: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
1c20: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  g context */.  c
1c30: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20  onst char *zDb, 
1c40: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1c50: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
1c60: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
1c70: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74   NULL */.  const
1c80: 20 63 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20   char *zTab,    
1c90: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
1ca0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
1cb0: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
1cc0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
1cd0: 6c 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  l,    /* Name of
1ce0: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
1cf0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
1d00: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
1d10: 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20  me context used 
1d20: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e  to resolve the n
1d30: 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
1d40: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
1d50: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
1d60: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
1d70: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
1d80: 6e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c  n */.){.  int i,
1d90: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   j;             
1da0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1db0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
1dc0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
1dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1de0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
1df0: 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e   matching column
1e00: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
1e10: 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20  cntTab = 0;     
1e20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1e30: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
1e40: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
1e50: 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 65  */.  int nSubque
1e60: 72 79 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ry = 0;         
1e70: 20 20 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61         /* How ma
1e80: 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62  ny levels of sub
1e90: 71 75 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74  query */.  sqlit
1ea0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
1eb0: 3e 64 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  >db;         /* 
1ec0: 54 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e  The database con
1ed0: 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72  nection */.  str
1ee0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
1ef0: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
1f00: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
1f10: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
1f20: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
1f30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1f40: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
1f50: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
1f60: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
1f70: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
1f80: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
1f90: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
1fa0: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
1fb0: 73 74 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a  st */.  Schema *
1fc0: 70 53 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20  pSchema = 0;    
1fd0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68            /* Sch
1fe0: 65 6d 61 20 6f 66 20 74 68 65 20 65 78 70 72 65  ema of the expre
1ff0: 73 73 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65  ssion */.  int e
2000: 4e 65 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f 43  NewExprOp = TK_C
2010: 4f 4c 55 4d 4e 3b 20 20 20 20 20 20 20 2f 2a 20  OLUMN;       /* 
2020: 4e 65 77 20 76 61 6c 75 65 20 66 6f 72 20 70 45  New value for pE
2030: 78 70 72 2d 3e 6f 70 20 6f 6e 20 73 75 63 63 65  xpr->op on succe
2040: 73 73 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70  ss */.  Table *p
2050: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20  Tab = 0;        
2060: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62            /* Tab
2070: 6c 65 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 20  le hold the row 
2080: 2a 2f 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  */.  Column *pCo
2090: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
20a0: 20 20 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75         /* A colu
20b0: 6d 6e 20 6f 66 20 70 54 61 62 20 2a 2f 0a 0a 20  mn of pTab */.. 
20c0: 20 61 73 73 65 72 74 28 20 70 4e 43 20 29 3b 20   assert( pNC ); 
20d0: 20 20 20 20 2f 2a 20 74 68 65 20 6e 61 6d 65 20      /* the name 
20e0: 63 6f 6e 74 65 78 74 20 63 61 6e 6e 6f 74 20 62  context cannot b
20f0: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73  e NULL. */.  ass
2100: 65 72 74 28 20 7a 43 6f 6c 20 29 3b 20 20 20 20  ert( zCol );    
2110: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
2120: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
2130: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45   */.  assert( !E
2140: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
2150: 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e  Expr, EP_TokenOn
2160: 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29  ly|EP_Reduced) )
2170: 3b 0a 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69  ;..  /* Initiali
2180: 7a 65 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e  ze the node to n
2190: 6f 2d 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78  o-match */.  pEx
21a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
21b0: 0a 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f  .  ExprSetVVAPro
21c0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
21d0: 4e 6f 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a  NoReduce);..  /*
21e0: 20 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73   Translate the s
21f0: 63 68 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44  chema name in zD
2200: 62 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72  b into a pointer
2210: 20 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f   to the correspo
2220: 6e 64 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d  nding.  ** schem
2230: 61 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64  a.  If not found
2240: 2c 20 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72  , pSchema will r
2250: 65 6d 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e  emain NULL and n
2260: 6f 74 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63  othing will matc
2270: 68 0a 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67  h.  ** resulting
2280: 20 69 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61   in an appropria
2290: 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  te error message
22a0: 20 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20   toward the end 
22b0: 6f 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  of this routine.
22c0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29    */.  if( zDb )
22d0: 7b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  {.    testcase( 
22e0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
22f0: 43 5f 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20  C_PartIdx );.   
2300: 20 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e   testcase( pNC->
2310: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43  ncFlags & NC_IsC
2320: 68 65 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20  heck );.    if( 
2330: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
2340: 28 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49  (NC_PartIdx|NC_I
2350: 73 43 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20  sCheck))!=0 ){. 
2360: 20 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79       /* Silently
2370: 20 69 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65   ignore database
2380: 20 71 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69   qualifiers insi
2390: 64 65 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61  de CHECK constra
23a0: 69 6e 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a  ints and.      *
23b0: 2a 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65  * partial indice
23c0: 73 2e 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65  s.  Do not raise
23d0: 20 65 72 72 6f 72 73 20 62 65 63 61 75 73 65 20   errors because 
23e0: 74 68 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b  that might break
23f0: 0a 20 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79  .      ** legacy
2400: 20 61 6e 64 20 62 65 63 61 75 73 65 20 69 74 20   and because it 
2410: 64 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e  does not hurt an
2420: 79 74 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69  ything to just i
2430: 67 6e 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20  gnore the.      
2440: 2a 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65  ** database name
2450: 2e 20 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d  . */.      zDb =
2460: 20 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20   0;.    }else{. 
2470: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
2480: 64 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20  db->nDb; i++){. 
2490: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64         assert( d
24a0: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
24b0: 6d 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  me );.        if
24c0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
24d0: 28 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53  (db->aDb[i].zDbS
24e0: 4e 61 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a  Name,zDb)==0 ){.
24f0: 20 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d            pSchem
2500: 61 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70  a = db->aDb[i].p
2510: 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20  Schema;.        
2520: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2530: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
2540: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74  .  }..  /* Start
2550: 20 61 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f   at the inner-mo
2560: 73 74 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d  st context and m
2570: 6f 76 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69  ove outward unti
2580: 6c 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75  l a match is fou
2590: 6e 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  nd */.  assert( 
25a0: 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 3b  pNC && cnt==0 );
25b0: 0a 20 20 64 6f 7b 0a 20 20 20 20 45 78 70 72 4c  .  do{.    ExprL
25c0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20  ist *pEList;.   
25d0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
25e0: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
25f0: 73 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72  st;..    if( pSr
2600: 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66  cList ){.      f
2610: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53  or(i=0, pItem=pS
2620: 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72  rcList->a; i<pSr
2630: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
2640: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
2650: 20 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d      pTab = pItem
2660: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->pTab;.        
2670: 61 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20  assert( pTab!=0 
2680: 26 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d  && pTab->zName!=
2690: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73  0 );.        ass
26a0: 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e  ert( pTab->nCol>
26b0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
26c0: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20   pItem->pSelect 
26d0: 26 26 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65  && (pItem->pSele
26e0: 63 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  ct->selFlags & S
26f0: 46 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30  F_NestedFrom)!=0
2700: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e   ){.          in
2710: 74 20 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20  t hit = 0;.     
2720: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49       pEList = pI
2730: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  tem->pSelect->pE
2740: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20  List;.          
2750: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
2760: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
2770: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
2780: 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e  sqlite3MatchSpan
2790: 4e 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a  Name(pEList->a[j
27a0: 5d 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a  ].zSpan, zCol, z
27b0: 54 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20  Tab, zDb) ){.   
27c0: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
27d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
27e0: 63 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20  cntTab = 2;.    
27f0: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
2800: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
2810: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
2820: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
2830: 20 20 20 20 20 20 20 20 20 20 68 69 74 20 3d 20            hit = 
2840: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  1;.            }
2850: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2860: 20 20 20 20 20 20 20 69 66 28 20 68 69 74 20 7c         if( hit |
2870: 7c 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74  | zTab==0 ) cont
2880: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
2890: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 20          if( zDb 
28a0: 26 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  && pTab->pSchema
28b0: 21 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20  !=pSchema ){.   
28c0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
28d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
28e0: 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20     if( zTab ){. 
28f0: 20 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63           const c
2900: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
2910: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20  pItem->zAlias ? 
2920: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20  pItem->zAlias : 
2930: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
2940: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
2950: 54 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20  TabName!=0 );.  
2960: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
2970: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
2980: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b  ame, zTab)!=0 ){
2990: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e  .            con
29a0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
29b0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
29c0: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
29d0: 54 20 26 26 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  T && pItem->zAli
29e0: 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  as ){.          
29f0: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
2a00: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
2a10: 2c 20 30 2c 20 28 76 6f 69 64 2a 29 26 70 45 78  , 0, (void*)&pEx
2a20: 70 72 2d 3e 79 2e 70 54 61 62 29 3b 0a 20 20 20  pr->y.pTab);.   
2a30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2a40: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 30   }.        if( 0
2a50: 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a  ==(cntTab++) ){.
2a60: 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68            pMatch
2a70: 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20   = pItem;.      
2a80: 20 20 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28    }.        for(
2a90: 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e  j=0, pCol=pTab->
2aa0: 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  aCol; j<pTab->nC
2ab0: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
2ac0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
2ad0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
2ae0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
2af0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
2b00: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20      /* If there 
2b10: 68 61 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79  has been exactly
2b20: 20 6f 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68   one prior match
2b30: 20 61 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a   and this match.
2b40: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69              ** i
2b50: 73 20 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d  s for the right-
2b60: 68 61 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20  hand table of a 
2b70: 4e 41 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20  NATURAL JOIN or 
2b80: 69 73 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20  is in a .       
2b90: 20 20 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c       ** USING cl
2ba0: 61 75 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20  ause, then skip 
2bb0: 74 68 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20  this match..    
2bc0: 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
2bd0: 20 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d         if( cnt==
2be0: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  1 ){.           
2bf0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67     if( pItem->fg
2c00: 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e  .jointype & JT_N
2c10: 41 54 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75  ATURAL ) continu
2c20: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e;.             
2c30: 20 69 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67   if( nameInUsing
2c40: 43 6c 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55  Clause(pItem->pU
2c50: 73 69 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f  sing, zCol) ) co
2c60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2c70: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2c80: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
2c90: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49       pMatch = pI
2ca0: 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20  tem;.           
2cb0: 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20 74   /* Substitute t
2cc0: 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e  he rowid (column
2cd0: 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54   -1) for the INT
2ce0: 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59  EGER PRIMARY KEY
2cf0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
2d00: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
2d10: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
2d20: 3f 20 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20  ? -1 : (i16)j;. 
2d30: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
2d40: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
2d50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
2d60: 20 20 20 20 20 20 69 66 28 20 70 4d 61 74 63 68        if( pMatch
2d70: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
2d80: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74  r->iTable = pMat
2d90: 63 68 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  ch->iCursor;.   
2da0: 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54       pExpr->y.pT
2db0: 61 62 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61  ab = pMatch->pTa
2dc0: 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49  b;.        /* RI
2dd0: 47 48 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65  GHT JOIN not (ye
2de0: 74 29 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a  t) supported */.
2df0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
2e00: 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e  (pMatch->fg.join
2e10: 74 79 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29  type & JT_RIGHT)
2e20: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69  ==0 );.        i
2e30: 66 28 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a  f( (pMatch->fg.j
2e40: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46  ointype & JT_LEF
2e50: 54 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  T)!=0 ){.       
2e60: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
2e70: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e  ty(pExpr, EP_Can
2e80: 42 65 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20  BeNull);.       
2e90: 20 7d 0a 20 20 20 20 20 20 20 20 70 53 63 68 65   }.        pSche
2ea0: 6d 61 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54  ma = pExpr->y.pT
2eb0: 61 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20  ab->pSchema;.   
2ec0: 20 20 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66     }.    } /* if
2ed0: 28 20 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a  ( pSrcList ) */.
2ee0: 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53 51  .#if !defined(SQ
2ef0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
2f00: 52 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  R) || !defined(S
2f10: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52  QLITE_OMIT_UPSER
2f20: 54 29 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20  T).    /* If we 
2f30: 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
2f40: 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61   resolved the na
2f50: 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a  me, then maybe .
2f60: 20 20 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e      ** it is a n
2f70: 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72  ew.* or old.* tr
2f80: 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72  igger argument r
2f90: 65 66 65 72 65 6e 63 65 2e 20 20 4f 72 0a 20 20  eference.  Or.  
2fa0: 20 20 2a 2a 20 6d 61 79 62 65 20 69 74 20 69 73    ** maybe it is
2fb0: 20 61 6e 20 65 78 63 6c 75 64 65 64 2e 2a 20 66   an excluded.* f
2fc0: 72 6f 6d 20 61 6e 20 75 70 73 65 72 74 2e 0a 20  rom an upsert.. 
2fd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44     */.    if( zD
2fe0: 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20  b==0 && zTab!=0 
2ff0: 26 26 20 63 6e 74 54 61 62 3d 3d 30 20 29 7b 0a  && cntTab==0 ){.
3000: 20 20 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a        pTab = 0;.
3010: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3020: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
3030: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54    if( pParse->pT
3040: 72 69 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a  riggerTab!=0 ){.
3050: 20 20 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d          int op =
3060: 20 70 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65   pParse->eTrigge
3070: 72 4f 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73  rOp;.        ass
3080: 65 72 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45  ert( op==TK_DELE
3090: 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44  TE || op==TK_UPD
30a0: 41 54 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e  ATE || op==TK_IN
30b0: 53 45 52 54 20 29 3b 0a 20 20 20 20 20 20 20 20  SERT );.        
30c0: 69 66 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54  if( op!=TK_DELET
30d0: 45 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  E && sqlite3StrI
30e0: 43 6d 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20  Cmp("new",zTab) 
30f0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
3100: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3110: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  = 1;.          p
3120: 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54  Tab = pParse->pT
3130: 72 69 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20  riggerTab;.     
3140: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21     }else if( op!
3150: 3d 54 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71  =TK_INSERT && sq
3160: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c  lite3StrICmp("ol
3170: 64 22 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20  d",zTab)==0 ){. 
3180: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
3190: 69 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20  iTable = 0;.    
31a0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 50 61        pTab = pPa
31b0: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
31c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
31d0: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51    }.#endif /* SQ
31e0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
31f0: 52 20 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c  R */.#ifndef SQL
3200: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a  ITE_OMIT_UPSERT.
3210: 20 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e        if( (pNC->
3220: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 55 70  ncFlags & NC_UUp
3230: 73 65 72 74 29 21 3d 30 20 29 7b 0a 20 20 20 20  sert)!=0 ){.    
3240: 20 20 20 20 55 70 73 65 72 74 20 2a 70 55 70 73      Upsert *pUps
3250: 65 72 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70  ert = pNC->uNC.p
3260: 55 70 73 65 72 74 3b 0a 20 20 20 20 20 20 20 20  Upsert;.        
3270: 69 66 28 20 70 55 70 73 65 72 74 20 26 26 20 73  if( pUpsert && s
3280: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 65  qlite3StrICmp("e
3290: 78 63 6c 75 64 65 64 22 2c 7a 54 61 62 29 3d 3d  xcluded",zTab)==
32a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70  0 ){.          p
32b0: 54 61 62 20 3d 20 70 55 70 73 65 72 74 2d 3e 70  Tab = pUpsert->p
32c0: 55 70 73 65 72 74 53 72 63 2d 3e 61 5b 30 5d 2e  UpsertSrc->a[0].
32d0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20  pTab;.          
32e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
32f0: 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  2;.        }.   
3300: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53     }.#endif /* S
3310: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52  QLITE_OMIT_UPSER
3320: 54 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20  T */..      if( 
3330: 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20  pTab ){ .       
3340: 20 69 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20   int iCol;.     
3350: 20 20 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61     pSchema = pTa
3360: 62 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20  b->pSchema;.    
3370: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
3380: 20 20 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30        for(iCol=0
3390: 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f  , pCol=pTab->aCo
33a0: 6c 3b 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  l; iCol<pTab->nC
33b0: 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c  ol; iCol++, pCol
33c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
33d0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
33e0: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
33f0: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
3400: 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d         if( iCol=
3410: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a  =pTab->iPKey ){.
3420: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 43                iC
3430: 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ol = -1;.       
3440: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3450: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
3460: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
3470: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
3480: 3e 3d 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20  >=pTab->nCol && 
3490: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
34a0: 43 6f 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52  Col) && VisibleR
34b0: 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
34c0: 20 20 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20          /* IMP: 
34d0: 52 2d 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f  R-51414-32910 */
34e0: 0a 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20  .          iCol 
34f0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a  = -1;.        }.
3500: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
3510: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20  <pTab->nCol ){. 
3520: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
3530: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3540: 4d 49 54 5f 55 50 53 45 52 54 0a 20 20 20 20 20  MIT_UPSERT.     
3550: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
3560: 69 54 61 62 6c 65 3d 3d 32 20 29 7b 0a 20 20 20  iTable==2 ){.   
3570: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
3580: 65 28 20 69 43 6f 6c 3d 3d 28 2d 31 29 20 29 3b  e( iCol==(-1) );
3590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
35a0: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
35b0: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  T ){.           
35c0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
35d0: 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20  n = iCol;.      
35e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79          pExpr->y
35f0: 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  .pTab = pTab;.  
3600: 20 20 20 20 20 20 20 20 20 20 20 20 65 4e 65 77              eNew
3610: 45 78 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c 55  ExprOp = TK_COLU
3620: 4d 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  MN;.            
3630: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
3640: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
3650: 6c 65 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55  le = pNC->uNC.pU
3660: 70 73 65 72 74 2d 3e 72 65 67 44 61 74 61 20 2b  psert->regData +
3670: 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20   iCol;.         
3680: 20 20 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20       eNewExprOp 
3690: 3d 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20  = TK_REGISTER;. 
36a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70               Exp
36b0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
36c0: 70 72 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 20  pr, EP_Alias);. 
36d0: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
36e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e         }else.#en
36f0: 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
3700: 49 54 5f 55 50 53 45 52 54 20 2a 2f 0a 20 20 20  IT_UPSERT */.   
3710: 20 20 20 20 20 20 20 7b 0a 23 69 66 6e 64 65 66         {.#ifndef
3720: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49   SQLITE_OMIT_TRI
3730: 47 47 45 52 0a 20 20 20 20 20 20 20 20 20 20 20  GGER.           
3740: 20 69 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20   if( iCol<0 ){. 
3750: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
3760: 70 72 2d 3e 61 66 66 45 78 70 72 20 3d 20 53 51  pr->affExpr = SQ
3770: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
3780: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3790: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
37a0: 54 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20  Table==0 ){.    
37b0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
37c0: 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a  se( iCol==31 );.
37d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
37e0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32  stcase( iCol==32
37f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
3800: 20 20 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73    pParse->oldmas
3810: 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f  k |= (iCol>=32 ?
3820: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28   0xffffffff : ((
3830: 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b  (u32)1)<<iCol));
3840: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
3850: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
3860: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
3870: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
3880: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3890: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
38a0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
38b0: 2d 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43  ->newmask |= (iC
38c0: 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66  ol>=32 ? 0xfffff
38d0: 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c  fff : (((u32)1)<
38e0: 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  <iCol));.       
38f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3900: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62     pExpr->y.pTab
3910: 20 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20   = pTab;.       
3920: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
3930: 75 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b  umn = (i16)iCol;
3940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 65 4e 65  .            eNe
3950: 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f 54 52 49  wExprOp = TK_TRI
3960: 47 47 45 52 3b 0a 23 65 6e 64 69 66 20 2f 2a 20  GGER;.#endif /* 
3970: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47  SQLITE_OMIT_TRIG
3980: 47 45 52 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  GER */.         
3990: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
39a0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
39b0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
39c0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
39d0: 52 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53  R) || !defined(S
39e0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52  QLITE_OMIT_UPSER
39f0: 54 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20  T) */..    /*.  
3a00: 20 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65    ** Perhaps the
3a10: 20 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72   name is a refer
3a20: 65 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49  ence to the ROWI
3a30: 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  D.    */.    if(
3a40: 20 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20   cnt==0.     && 
3a50: 63 6e 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26  cntTab==1.     &
3a60: 26 20 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26  & pMatch.     &&
3a70: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
3a80: 20 28 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f   (NC_IdxExpr|NC_
3a90: 47 65 6e 43 6f 6c 29 29 3d 3d 30 0a 20 20 20 20  GenCol))==0.    
3aa0: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
3ab0: 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20 20 26 26  id(zCol).     &&
3ac0: 20 56 69 73 69 62 6c 65 52 6f 77 69 64 28 70 4d   VisibleRowid(pM
3ad0: 61 74 63 68 2d 3e 70 54 61 62 29 0a 20 20 20 20  atch->pTab).    
3ae0: 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31  ){.      cnt = 1
3af0: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  ;.      pExpr->i
3b00: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
3b10: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70     pExpr->affExp
3b20: 72 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  r = SQLITE_AFF_I
3b30: 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20  NTEGER;.    }.. 
3b40: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20     /*.    ** If 
3b50: 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20  the input is of 
3b60: 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20  the form Z (not 
3b70: 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68  Y.Z or X.Y.Z) th
3b80: 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20  en the name Z.  
3b90: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
3ba0: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
3bb0: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
3bc0: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
3bd0: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a  ple, when.    **
3be0: 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e   we are resolvin
3bf0: 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57  g names in the W
3c00: 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74  HERE clause of t
3c10: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d  he following com
3c20: 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20  mand:.    **.   
3c30: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
3c40: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
3c50: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
3c60: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20     **.    ** In 
3c70: 63 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c  cases like this,
3c80: 20 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77   replace pExpr w
3c90: 69 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ith a copy of th
3ca0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  e expression tha
3cb0: 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74  t.    ** forms t
3cc0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e  he result set en
3cd0: 74 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68  try ("a+b" in th
3ce0: 65 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72  e example) and r
3cf0: 65 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c  eturn immediatel
3d00: 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74  y..    ** Note t
3d10: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
3d20: 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  on in the result
3d30: 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65   set should have
3d40: 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20   already been.  
3d50: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
3d60: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
3d70: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
3d80: 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20  solved..    **. 
3d90: 20 20 20 2a 2a 20 54 68 65 20 61 62 69 6c 69 74     ** The abilit
3da0: 79 20 74 6f 20 75 73 65 20 61 6e 20 6f 75 74 70  y to use an outp
3db0: 75 74 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f  ut result-set co
3dc0: 6c 75 6d 6e 20 69 6e 20 74 68 65 20 57 48 45 52  lumn in the WHER
3dd0: 45 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20 20 20  E, GROUP BY,.   
3de0: 20 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20 63 6c   ** or HAVING cl
3df0: 61 75 73 65 73 2c 20 6f 72 20 61 73 20 70 61 72  auses, or as par
3e00: 74 20 6f 66 20 61 20 6c 61 72 67 65 72 20 65 78  t of a larger ex
3e10: 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20  pression in the 
3e20: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
3e30: 63 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73 74  clause is not st
3e40: 61 6e 64 61 72 64 20 53 51 4c 2e 20 20 54 68 69  andard SQL.  Thi
3e50: 73 20 69 73 20 61 20 28 67 6f 6f 66 79 29 20 53  s is a (goofy) S
3e60: 51 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c  QLite extension,
3e70: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20   that.    ** is 
3e80: 73 75 70 70 6f 72 74 65 64 20 66 6f 72 20 62 61  supported for ba
3e90: 63 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62  ckwards compatib
3ea0: 69 6c 69 74 79 20 6f 6e 6c 79 2e 20 48 65 6e 63  ility only. Henc
3eb0: 65 2c 20 77 65 20 69 73 73 75 65 20 61 20 77 61  e, we issue a wa
3ec0: 72 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20  rning.    ** on 
3ed0: 73 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68  sqlite3_log() wh
3ee0: 65 6e 65 76 65 72 20 74 68 65 20 63 61 70 61 62  enever the capab
3ef0: 69 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20  ility is used.. 
3f00: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70     */.    if( (p
3f10: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
3f20: 5f 55 45 4c 69 73 74 29 21 3d 30 0a 20 20 20 20  _UEList)!=0.    
3f30: 20 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20 20 20   && cnt==0.     
3f40: 26 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20 20 29  && zTab==0.    )
3f50: 7b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  {.      pEList =
3f60: 20 70 4e 43 2d 3e 75 4e 43 2e 70 45 4c 69 73 74   pNC->uNC.pEList
3f70: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
3f80: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
3f90: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
3fa0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
3fb0: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
3fc0: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
3fd0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
3fe0: 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26     if( zAs!=0 &&
3ff0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
4000: 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  zAs, zCol)==0 ){
4010: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
4020: 2a 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20  *pOrig;.        
4030: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4040: 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78  >pLeft==0 && pEx
4050: 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b  pr->pRight==0 );
4060: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
4070: 74 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  t( pExpr->x.pLis
4080: 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t==0 );.        
4090: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
40a0: 3e 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b  >x.pSelect==0 );
40b0: 0a 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67  .          pOrig
40c0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
40d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
40e0: 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61   if( (pNC->ncFla
40f0: 67 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d  gs&NC_AllowAgg)=
4100: 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =0 && ExprHasPro
4110: 70 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f  perty(pOrig, EP_
4120: 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Agg) ){.        
4130: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
4140: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
4150: 75 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61  use of aliased a
4160: 67 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41  ggregate %s", zA
4170: 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  s);.            
4180: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
4190: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
41a0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 4e 43          if( (pNC
41b0: 2d 3e 6e 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c  ->ncFlags&NC_All
41c0: 6f 77 57 69 6e 29 3d 3d 30 20 26 26 20 45 78 70  owWin)==0 && Exp
41d0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 4f 72  rHasProperty(pOr
41e0: 69 67 2c 20 45 50 5f 57 69 6e 29 20 29 7b 0a 20  ig, EP_Win) ){. 
41f0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
4200: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4210: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 6c  e, "misuse of al
4220: 69 61 73 65 64 20 77 69 6e 64 6f 77 20 66 75 6e  iased window fun
4230: 63 74 69 6f 6e 20 25 73 22 2c 7a 41 73 29 3b 0a  ction %s",zAs);.
4240: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
4250: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
4260: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4270: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
4280: 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 4f  xprVectorSize(pO
4290: 72 69 67 29 21 3d 31 20 29 7b 0a 20 20 20 20 20  rig)!=1 ){.     
42a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
42b0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
42c0: 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73 65  row value misuse
42d0: 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  d");.           
42e0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
42f0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  t;.          }. 
4300: 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65           resolve
4310: 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45  Alias(pParse, pE
4320: 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c 20  List, j, pExpr, 
4330: 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b 0a  "", nSubquery);.
4340: 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d 20            cnt = 
4350: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  1;.          pMa
4360: 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  tch = 0;.       
4370: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
4380: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
4390: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49 4e            if( IN
43a0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
43b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
43c0: 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e  lite3RenameToken
43d0: 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 30 2c  Remap(pParse, 0,
43e0: 20 28 76 6f 69 64 2a 29 70 45 78 70 72 29 3b 0a   (void*)pExpr);.
43f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
4400: 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b 75        goto looku
4410: 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20 20  pname_end;.     
4420: 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20     }.      } .  
4430: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61    }..    /* Adva
4440: 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20  nce to the next 
4450: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20 54  name context.  T
4460: 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69  he loop will exi
4470: 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20 20  t when either.  
4480: 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20 6d    ** we have a m
4490: 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72 20  atch (cnt>0) or 
44a0: 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74 20  when we run out 
44b0: 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73  of name contexts
44c0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
44d0: 20 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20 20   cnt ) break;.  
44e0: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
44f0: 78 74 3b 0a 20 20 20 20 6e 53 75 62 71 75 65 72  xt;.    nSubquer
4500: 79 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20 70  y++;.  }while( p
4510: 4e 43 20 29 3b 0a 0a 0a 20 20 2f 2a 0a 20 20 2a  NC );...  /*.  *
4520: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
4530: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
4540: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
4550: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
4560: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
4570: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
4580: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
4590: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
45a0: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
45b0: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
45c0: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
45d0: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
45e0: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
45f0: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
4600: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
4610: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
4620: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
4630: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
4640: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61  ..  **.  ** Beca
4650: 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65  use no reference
4660: 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74   was made to out
4670: 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65  er contexts, the
4680: 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20   pNC->nRef.  ** 
4690: 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63  fields are not c
46a0: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f  hanged in any co
46b0: 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntext..  */.  if
46c0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
46d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==0 ){.    asser
46e0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  t( pExpr->op==TK
46f0: 5f 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20 45  _ID );.    if( E
4700: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4710: 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f 74 65  Expr,EP_DblQuote
4720: 64 29 0a 20 20 20 20 20 26 26 20 61 72 65 44 6f  d).     && areDo
4730: 75 62 6c 65 51 75 6f 74 65 64 53 74 72 69 6e 67  ubleQuotedString
4740: 73 45 6e 61 62 6c 65 64 28 64 62 2c 20 70 54 6f  sEnabled(db, pTo
4750: 70 4e 43 29 0a 20 20 20 20 29 7b 0a 20 20 20 20  pNC).    ){.    
4760: 20 20 2f 2a 20 49 66 20 61 20 64 6f 75 62 6c 65    /* If a double
4770: 2d 71 75 6f 74 65 64 20 69 64 65 6e 74 69 66 69  -quoted identifi
4780: 65 72 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63  er does not matc
4790: 68 20 61 6e 79 20 6b 6e 6f 77 6e 20 63 6f 6c 75  h any known colu
47a0: 6d 6e 20 6e 61 6d 65 2c 0a 20 20 20 20 20 20 2a  mn name,.      *
47b0: 2a 20 74 68 65 6e 20 74 72 65 61 74 20 69 74 20  * then treat it 
47c0: 61 73 20 61 20 73 74 72 69 6e 67 2e 0a 20 20 20  as a string..   
47d0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
47e0: 68 69 73 20 68 61 63 6b 20 77 61 73 20 61 64 64  his hack was add
47f0: 65 64 20 69 6e 20 74 68 65 20 65 61 72 6c 79 20  ed in the early 
4800: 64 61 79 73 20 6f 66 20 53 51 4c 69 74 65 20 69  days of SQLite i
4810: 6e 20 61 20 6d 69 73 67 75 69 64 65 64 20 61 74  n a misguided at
4820: 74 65 6d 70 74 0a 20 20 20 20 20 20 2a 2a 20 74  tempt.      ** t
4830: 6f 20 62 65 20 63 6f 6d 70 61 74 69 62 6c 65 20  o be compatible 
4840: 77 69 74 68 20 4d 79 53 51 4c 20 33 2e 78 2c 20  with MySQL 3.x, 
4850: 77 68 69 63 68 20 75 73 65 64 20 64 6f 75 62 6c  which used doubl
4860: 65 2d 71 75 6f 74 65 73 20 66 6f 72 20 73 74 72  e-quotes for str
4870: 69 6e 67 73 2e 0a 20 20 20 20 20 20 2a 2a 20 49  ings..      ** I
4880: 20 6e 6f 77 20 73 6f 72 65 6c 79 20 72 65 67 72   now sorely regr
4890: 65 74 20 70 75 74 74 69 6e 67 20 69 6e 20 74 68  et putting in th
48a0: 69 73 20 68 61 63 6b 2e 20 54 68 65 20 65 66 66  is hack. The eff
48b0: 65 63 74 20 6f 66 20 74 68 69 73 20 68 61 63 6b  ect of this hack
48c0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 61   is.      ** tha
48d0: 74 20 6d 69 73 73 70 65 6c 6c 65 64 20 69 64 65  t misspelled ide
48e0: 6e 74 69 66 69 65 72 20 6e 61 6d 65 73 20 61 72  ntifier names ar
48f0: 65 20 73 69 6c 65 6e 74 6c 79 20 63 6f 6e 76 65  e silently conve
4900: 72 74 65 64 20 69 6e 74 6f 20 73 74 72 69 6e 67  rted into string
4910: 73 0a 20 20 20 20 20 20 2a 2a 20 72 61 74 68 65  s.      ** rathe
4920: 72 20 74 68 61 6e 20 63 61 75 73 69 6e 67 20 61  r than causing a
4930: 6e 20 65 72 72 6f 72 2c 20 74 6f 20 74 68 65 20  n error, to the 
4940: 66 72 75 73 74 72 61 74 69 6f 6e 20 6f 66 20 63  frustration of c
4950: 6f 75 6e 74 6c 65 73 73 0a 20 20 20 20 20 20 2a  ountless.      *
4960: 2a 20 70 72 6f 67 72 61 6d 6d 65 72 73 2e 20 54  * programmers. T
4970: 6f 20 61 6c 6c 20 74 68 6f 73 65 20 66 72 75 73  o all those frus
4980: 74 72 61 74 65 64 20 70 72 6f 67 72 61 6d 6d 65  trated programme
4990: 72 73 2c 20 6d 79 20 61 70 6f 6c 6f 67 69 65 73  rs, my apologies
49a0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
49b0: 20 2a 2a 20 53 6f 6d 65 64 61 79 2c 20 49 20 68   ** Someday, I h
49c0: 6f 70 65 20 74 6f 20 67 65 74 20 72 69 64 20 6f  ope to get rid o
49d0: 66 20 74 68 69 73 20 68 61 63 6b 2e 20 55 6e 66  f this hack. Unf
49e0: 6f 72 74 75 6e 61 74 65 6c 79 20 74 68 65 72 65  ortunately there
49f0: 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 61 20 68   is.      ** a h
4a00: 75 67 65 20 61 6d 6f 75 6e 74 20 6f 66 20 6c 65  uge amount of le
4a10: 67 61 63 79 20 53 51 4c 20 74 68 61 74 20 75 73  gacy SQL that us
4a20: 65 73 20 69 74 2e 20 53 6f 20 66 6f 72 20 6e 6f  es it. So for no
4a30: 77 2c 20 77 65 20 6a 75 73 74 0a 20 20 20 20 20  w, we just.     
4a40: 20 2a 2a 20 69 73 73 75 65 20 61 20 77 61 72 6e   ** issue a warn
4a50: 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ing..      */.  
4a60: 20 20 20 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28      sqlite3_log(
4a70: 53 51 4c 49 54 45 5f 57 41 52 4e 49 4e 47 2c 0a  SQLITE_WARNING,.
4a80: 20 20 20 20 20 20 20 20 22 64 6f 75 62 6c 65 2d          "double-
4a90: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 6c 69  quoted string li
4aa0: 74 65 72 61 6c 3a 20 5c 22 25 77 5c 22 22 2c 20  teral: \"%w\"", 
4ab0: 7a 43 6f 6c 29 3b 0a 23 69 66 64 65 66 20 53 51  zCol);.#ifdef SQ
4ac0: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 4e 4f 52 4d  LITE_ENABLE_NORM
4ad0: 41 4c 49 5a 45 0a 20 20 20 20 20 20 73 71 6c 69  ALIZE.      sqli
4ae0: 74 65 33 56 64 62 65 41 64 64 44 62 6c 71 75 6f  te3VdbeAddDblquo
4af0: 74 65 53 74 72 28 64 62 2c 20 70 50 61 72 73 65  teStr(db, pParse
4b00: 2d 3e 70 56 64 62 65 2c 20 7a 43 6f 6c 29 3b 0a  ->pVdbe, zCol);.
4b10: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 70 45 78  #endif.      pEx
4b20: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 53 54 52 49  pr->op = TK_STRI
4b30: 4e 47 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  NG;.      pExpr-
4b40: 3e 79 2e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  >y.pTab = 0;.   
4b50: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
4b60: 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  une;.    }.    i
4b70: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 64  f( sqlite3ExprId
4b80: 54 6f 54 72 75 65 46 61 6c 73 65 28 70 45 78 70  ToTrueFalse(pExp
4b90: 72 29 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  r) ){.      retu
4ba0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4bb0: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
4bc0: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
4bd0: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
4be0: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
4bf0: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
4c00: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
4c10: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
4c20: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
4c30: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
4c40: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
4c50: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 45 72 72 3b  onst char *zErr;
4c60: 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d  .    zErr = cnt=
4c70: 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f  =0 ? "no such co
4c80: 6c 75 6d 6e 22 20 3a 20 22 61 6d 62 69 67 75 6f  lumn" : "ambiguo
4c90: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 22 3b  us column name";
4ca0: 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  .    if( zDb ){.
4cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4cc0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4cd0: 73 3a 20 25 73 2e 25 73 2e 25 73 22 2c 20 7a 45  s: %s.%s.%s", zE
4ce0: 72 72 2c 20 7a 44 62 2c 20 7a 54 61 62 2c 20 7a  rr, zDb, zTab, z
4cf0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20  Col);.    }else 
4d00: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
4d10: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
4d20: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
4d30: 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a 54 61  s.%s", zErr, zTa
4d40: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65  b, zCol);.    }e
4d50: 6c 73 65 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  lse{.      sqlit
4d60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
4d70: 65 2c 20 22 25 73 3a 20 25 73 22 2c 20 7a 45 72  e, "%s: %s", zEr
4d80: 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  r, zCol);.    }.
4d90: 20 20 20 20 70 50 61 72 73 65 2d 3e 63 68 65 63      pParse->chec
4da0: 6b 53 63 68 65 6d 61 20 3d 20 31 3b 0a 20 20 20  kSchema = 1;.   
4db0: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
4dc0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
4dd0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
4de0: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
4df0: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
4e00: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
4e10: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
4e20: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
4e30: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
4e40: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
4e50: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
4e60: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
4e70: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
4e80: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
4e90: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
4ea0: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
4eb0: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
4ec0: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
4ed0: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
4ee0: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
4ef0: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
4f00: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
4f10: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
4f20: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
4f30: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
4f40: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
4f50: 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20  ;.    testcase( 
4f60: 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20  n==BMS-1 );.    
4f70: 69 66 28 20 6e 3e 3d 42 4d 53 20 29 7b 0a 20 20  if( n>=BMS ){.  
4f80: 20 20 20 20 6e 20 3d 20 42 4d 53 2d 31 3b 0a 20      n = BMS-1;. 
4f90: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
4fa0: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
4fb0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
4fc0: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
4fd0: 6f 6c 55 73 65 64 20 7c 3d 20 28 28 42 69 74 6d  olUsed |= ((Bitm
4fe0: 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a  ask)1)<<n;.  }..
4ff0: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
5000: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
5010: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5020: 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 4c 65  e(db, pExpr->pLe
5030: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
5040: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
5050: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
5060: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
5070: 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  .  pExpr->pRight
5080: 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f   = 0;.  pExpr->o
5090: 70 20 3d 20 65 4e 65 77 45 78 70 72 4f 70 3b 0a  p = eNewExprOp;.
50a0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
50b0: 79 28 70 45 78 70 72 2c 20 45 50 5f 4c 65 61 66  y(pExpr, EP_Leaf
50c0: 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  );.lookupname_en
50d0: 64 3a 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20  d:.  if( cnt==1 
50e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
50f0: 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  NC!=0 );.    if(
5100: 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
5110: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c 69 61  y(pExpr, EP_Alia
5120: 73 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  s) ){.      sqli
5130: 74 65 33 41 75 74 68 52 65 61 64 28 70 50 61 72  te3AuthRead(pPar
5140: 73 65 2c 20 70 45 78 70 72 2c 20 70 53 63 68 65  se, pExpr, pSche
5150: 6d 61 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  ma, pNC->pSrcLis
5160: 74 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a  t);.    }.    /*
5170: 20 49 6e 63 72 65 6d 65 6e 74 20 74 68 65 20 6e   Increment the n
5180: 52 65 66 20 76 61 6c 75 65 20 6f 6e 20 61 6c 6c  Ref value on all
5190: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 20 66   name contexts f
51a0: 72 6f 6d 20 54 6f 70 4e 43 20 75 70 20 74 6f 0a  rom TopNC up to.
51b0: 20 20 20 20 2a 2a 20 74 68 65 20 70 6f 69 6e 74      ** the point
51c0: 20 77 68 65 72 65 20 74 68 65 20 6e 61 6d 65 20   where the name 
51d0: 6d 61 74 63 68 65 64 2e 20 2a 2f 0a 20 20 20 20  matched. */.    
51e0: 66 6f 72 28 3b 3b 29 7b 0a 20 20 20 20 20 20 61  for(;;){.      a
51f0: 73 73 65 72 74 28 20 70 54 6f 70 4e 43 21 3d 30  ssert( pTopNC!=0
5200: 20 29 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43   );.      pTopNC
5210: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 20 20  ->nRef++;.      
5220: 69 66 28 20 70 54 6f 70 4e 43 3d 3d 70 4e 43 20  if( pTopNC==pNC 
5230: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 70  ) break;.      p
5240: 54 6f 70 4e 43 20 3d 20 70 54 6f 70 4e 43 2d 3e  TopNC = pTopNC->
5250: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 20  pNext;.    }.   
5260: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
5270: 65 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  e;.  } else {.  
5280: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
5290: 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  rt;.  }.}../*.**
52a0: 20 41 6c 6c 6f 63 61 74 65 20 61 6e 64 20 72 65   Allocate and re
52b0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
52c0: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
52d0: 74 6f 20 6c 6f 61 64 20 74 68 65 20 63 6f 6c 75  to load the colu
52e0: 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66 72 6f 6d 20  mn iCol.** from 
52f0: 64 61 74 61 73 6f 75 72 63 65 20 69 53 72 63 20  datasource iSrc 
5300: 69 6e 20 53 72 63 4c 69 73 74 20 70 53 72 63 2e  in SrcList pSrc.
5310: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
5320: 33 43 72 65 61 74 65 43 6f 6c 75 6d 6e 45 78 70  3CreateColumnExp
5330: 72 28 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 53  r(sqlite3 *db, S
5340: 72 63 4c 69 73 74 20 2a 70 53 72 63 2c 20 69 6e  rcList *pSrc, in
5350: 74 20 69 53 72 63 2c 20 69 6e 74 20 69 43 6f 6c  t iSrc, int iCol
5360: 29 7b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20 73  ){.  Expr *p = s
5370: 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f 63 28  qlite3ExprAlloc(
5380: 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 2c 20 30  db, TK_COLUMN, 0
5390: 2c 20 30 29 3b 0a 20 20 69 66 28 20 70 20 29 7b  , 0);.  if( p ){
53a0: 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c  .    struct SrcL
53b0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
53c0: 3d 20 26 70 53 72 63 2d 3e 61 5b 69 53 72 63 5d  = &pSrc->a[iSrc]
53d0: 3b 0a 20 20 20 20 70 2d 3e 79 2e 70 54 61 62 20  ;.    p->y.pTab 
53e0: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
53f0: 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70     p->iTable = p
5400: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
5410: 20 20 20 69 66 28 20 70 2d 3e 79 2e 70 54 61 62     if( p->y.pTab
5420: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b  ->iPKey==iCol ){
5430: 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
5440: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  n = -1;.    }els
5450: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  e{.      p->iCol
5460: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f  umn = (ynVar)iCo
5470: 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
5480: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
5490: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
54a0: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
54b0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55       pItem->colU
54c0: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
54d0: 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20  )1)<<(iCol>=BMS 
54e0: 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b  ? BMS-1 : iCol);
54f0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
5500: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
5510: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
5520: 74 68 61 74 20 61 6e 20 65 78 70 72 65 73 73 69  that an expressi
5530: 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  on is not valid 
5540: 66 6f 72 20 73 6f 6d 65 20 73 65 74 20 6f 66 0a  for some set of.
5550: 2a 2a 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ** pNC->ncFlags 
5560: 76 61 6c 75 65 73 20 64 65 74 65 72 6d 69 6e 65  values determine
5570: 64 20 62 79 20 76 61 6c 69 64 4d 61 73 6b 2e 0a  d by validMask..
5580: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
5590: 6f 74 56 61 6c 69 64 28 0a 20 20 50 61 72 73 65  otValid(.  Parse
55a0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
55b0: 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  /* Leave error m
55c0: 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  essage here */. 
55d0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
55e0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
55f0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
5600: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c  onst char *zMsg,
5610: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 65      /* Type of e
5620: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 76 61  rror */.  int va
5630: 6c 69 64 4d 61 73 6b 20 20 20 20 20 20 20 20 2f  lidMask        /
5640: 2a 20 53 65 74 20 6f 66 20 63 6f 6e 74 65 78 74  * Set of context
5650: 73 20 66 6f 72 20 77 68 69 63 68 20 70 72 6f 68  s for which proh
5660: 69 62 69 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  ibited */.){.  a
5670: 73 73 65 72 74 28 20 28 76 61 6c 69 64 4d 61 73  ssert( (validMas
5680: 6b 26 7e 28 4e 43 5f 49 73 43 68 65 63 6b 7c 4e  k&~(NC_IsCheck|N
5690: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78  C_PartIdx|NC_Idx
56a0: 45 78 70 72 7c 4e 43 5f 47 65 6e 43 6f 6c 29 29  Expr|NC_GenCol))
56b0: 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70 4e  ==0 );.  if( (pN
56c0: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 76 61 6c  C->ncFlags & val
56d0: 69 64 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20  idMask)!=0 ){.  
56e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
56f0: 6e 20 3d 20 22 70 61 72 74 69 61 6c 20 69 6e 64  n = "partial ind
5700: 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65 73  ex WHERE clauses
5710: 22 3b 0a 20 20 20 20 69 66 28 20 70 4e 43 2d 3e  ";.    if( pNC->
5720: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64 78  ncFlags & NC_Idx
5730: 45 78 70 72 20 29 20 20 20 20 20 20 7a 49 6e 20  Expr )      zIn 
5740: 3d 20 22 69 6e 64 65 78 20 65 78 70 72 65 73 73  = "index express
5750: 69 6f 6e 73 22 3b 0a 23 69 66 6e 64 65 66 20 53  ions";.#ifndef S
5760: 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b  QLITE_OMIT_CHECK
5770: 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70 4e  .    else if( pN
5780: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
5790: 49 73 43 68 65 63 6b 20 29 20 7a 49 6e 20 3d 20  IsCheck ) zIn = 
57a0: 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e  "CHECK constrain
57b0: 74 73 22 3b 0a 23 65 6e 64 69 66 0a 23 69 66 6e  ts";.#endif.#ifn
57c0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
57d0: 47 45 4e 45 52 41 54 45 44 5f 43 4f 4c 55 4d 4e  GENERATED_COLUMN
57e0: 53 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  S.    else if( p
57f0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
5800: 5f 47 65 6e 43 6f 6c 20 29 20 7a 49 6e 20 3d 20  _GenCol ) zIn = 
5810: 22 67 65 6e 65 72 61 74 65 64 20 63 6f 6c 75 6d  "generated colum
5820: 6e 73 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20  ns";.#endif.    
5830: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
5840: 70 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f 68  pParse, "%s proh
5850: 69 62 69 74 65 64 20 69 6e 20 25 73 22 2c 20 7a  ibited in %s", z
5860: 4d 73 67 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a 7d  Msg, zIn);.  }.}
5870: 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69  ../*.** Expressi
5880: 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f  on p should enco
5890: 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f  de a floating po
58a0: 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65 65  int value betwee
58b0: 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a  n 1.0 and 0.0..*
58c0: 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74 69  * Return 1024 ti
58d0: 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e 20  mes this value. 
58e0: 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69 66   Or return -1 if
58f0: 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61   p is not a floa
5900: 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61  ting point.** va
5910: 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20  lue between 1.0 
5920: 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74  and 0.0..*/.stat
5930: 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62 61  ic int exprProba
5940: 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29 7b  bility(Expr *p){
5950: 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31  .  double r = -1
5960: 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21  .0;.  if( p->op!
5970: 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74 75  =TK_FLOAT ) retu
5980: 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33  rn -1;.  sqlite3
5990: 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e  AtoF(p->u.zToken
59a0: 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74 72  , &r, sqlite3Str
59b0: 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65  len30(p->u.zToke
59c0: 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38 29  n), SQLITE_UTF8)
59d0: 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d 30  ;.  assert( r>=0
59e0: 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e  .0 );.  if( r>1.
59f0: 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20  0 ) return -1;. 
5a00: 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72 2a   return (int)(r*
5a10: 31 33 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d 0a  134217728.0);.}.
5a20: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
5a30: 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b 20  ine is callback 
5a40: 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  for sqlite3WalkE
5a50: 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73  xpr()..**.** Res
5a60: 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61  olve symbolic na
5a70: 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55  mes into TK_COLU
5a80: 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f 72  MN operators for
5a90: 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20   the current.** 
5aa0: 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70 72  node in the expr
5ab0: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
5ac0: 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e  turn 0 to contin
5ad0: 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64 6f  ue the search do
5ae0: 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 6f  wn.** the tree o
5af0: 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68 65  r 2 to abort the
5b00: 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a   tree walk..**.*
5b10: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
5b20: 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20 63  lso does error c
5b30: 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65  hecking and name
5b40: 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a   resolution for.
5b50: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
5b60: 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f 72  s.  The operator
5b70: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
5b80: 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61 6e  unctions is chan
5b90: 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47  ged.** to TK_AGG
5ba0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74  _FUNCTION..*/.st
5bb0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
5bc0: 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72 20  ExprStep(Walker 
5bd0: 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a  *pWalker, Expr *
5be0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
5bf0: 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61  ntext *pNC;.  Pa
5c00: 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20  rse *pParse;..  
5c10: 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  pNC = pWalker->u
5c20: 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28 20  .pNC;.  assert( 
5c30: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61 72  pNC!=0 );.  pPar
5c40: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
5c50: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61 72  ;.  assert( pPar
5c60: 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61  se==pWalker->pPa
5c70: 72 73 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20  rse );..#ifndef 
5c80: 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e 43  NDEBUG.  if( pNC
5c90: 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70 4e  ->pSrcList && pN
5ca0: 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c  C->pSrcList->nAl
5cb0: 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72 63  loc>0 ){.    Src
5cc0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20 3d  List *pSrcList =
5cd0: 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a   pNC->pSrcList;.
5ce0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 66      int i;.    f
5cf0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70  or(i=0; i<pNC->p
5d00: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
5d10: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
5d20: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
5d30: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
5d40: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
5d50: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
5d60: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
5d70: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
5d80: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23   pExpr->op ){..#
5d90: 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  if defined(SQLIT
5da0: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
5db0: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26 26  DELETE_LIMIT) &&
5dc0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
5dd0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
5de0: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
5df0: 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f 52  al operator TK_R
5e00: 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74 68 65  OW means use the
5e10: 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20 66   rowid for the f
5e20: 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75  irst.    ** colu
5e30: 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d 20 63  mn in the FROM c
5e40: 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69 73 20  lause.  This is 
5e50: 75 73 65 64 20 62 79 20 74 68 65 20 4c 49 4d 49  used by the LIMI
5e60: 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59 0a 20  T and ORDER BY. 
5e70: 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70 72 6f     ** clause pro
5e80: 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44 41 54  cessing on UPDAT
5e90: 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74 61  E and DELETE sta
5ea0: 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a  tements..    */.
5eb0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f 57 3a      case TK_ROW:
5ec0: 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73 74   {.      SrcList
5ed0: 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43   *pSrcList = pNC
5ee0: 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20  ->pSrcList;.    
5ef0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5f00: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
5f10: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63      assert( pSrc
5f20: 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69 73 74  List && pSrcList
5f30: 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20  ->nSrc==1 );.   
5f40: 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72 63 4c     pItem = pSrcL
5f50: 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 61 73  ist->a;.      as
5f60: 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28 70  sert( HasRowid(p
5f70: 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20 70  Item->pTab) && p
5f80: 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 65 6c  Item->pTab->pSel
5f90: 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ect==0 );.      
5fa0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
5fb0: 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78  OLUMN;.      pEx
5fc0: 70 72 2d 3e 79 2e 70 54 61 62 20 3d 20 70 49 74  pr->y.pTab = pIt
5fd0: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  em->pTab;.      
5fe0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
5ff0: 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a  pItem->iCursor;.
6000: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
6010: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
6020: 20 70 45 78 70 72 2d 3e 61 66 66 45 78 70 72 20   pExpr->affExpr 
6030: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
6040: 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61  EGER;.      brea
6050: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  k;.    }.#endif 
6060: 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54  /* defined(SQLIT
6070: 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f  E_ENABLE_UPDATE_
6080: 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 0a 20 20  DELETE_LIMIT).  
6090: 20 20 20 20 20 20 20 20 26 26 20 21 64 65 66 69          && !defi
60a0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
60b0: 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a 20 20  SUBQUERY) */..  
60c0: 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 61    /* A column na
60d0: 6d 65 3a 20 20 20 20 20 20 20 20 20 20 20 20 20  me:             
60e0: 20 20 20 20 20 20 20 49 44 0a 20 20 20 20 2a 2a         ID.    **
60f0: 20 4f 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 61   Or table name a
6100: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
6110: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
6120: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
6130: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
6140: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
6150: 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 54 4b 5f  *.    ** The TK_
6160: 49 44 20 61 6e 64 20 54 4b 5f 4f 55 54 20 63 61  ID and TK_OUT ca
6170: 73 65 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64  ses are combined
6180: 20 73 6f 20 74 68 61 74 20 74 68 65 72 65 20 77   so that there w
6190: 69 6c 6c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20  ill only.    ** 
61a0: 62 65 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 6c  be one call to l
61b0: 6f 6f 6b 75 70 4e 61 6d 65 28 29 2e 20 20 54 68  ookupName().  Th
61c0: 65 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20  en the compiler 
61d0: 77 69 6c 6c 20 69 6e 2d 6c 69 6e 65 20 0a 20 20  will in-line .  
61e0: 20 20 2a 2a 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28    ** lookupName(
61f0: 29 20 66 6f 72 20 61 20 73 69 7a 65 20 72 65 64  ) for a size red
6200: 75 63 74 69 6f 6e 20 61 6e 64 20 70 65 72 66 6f  uction and perfo
6210: 72 6d 61 6e 63 65 20 69 6e 63 72 65 61 73 65 2e  rmance increase.
6220: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
6230: 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65   TK_ID:.    case
6240: 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_DOT: {.     
6250: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f   const char *zCo
6260: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73  lumn;.      cons
6270: 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a  t char *zTable;.
6280: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
6290: 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20 45 78 70   *zDb;.      Exp
62a0: 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20  r *pRight;..    
62b0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
62c0: 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20  =TK_ID ){.      
62d0: 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20    zDb = 0;.     
62e0: 20 20 20 7a 54 61 62 6c 65 20 3d 20 30 3b 0a 20     zTable = 0;. 
62f0: 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d         zColumn =
6300: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
6310: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
6320: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65         Expr *pLe
6330: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
6340: 74 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61  t;.        notVa
6350: 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c  lid(pParse, pNC,
6360: 20 22 74 68 65 20 5c 22 2e 5c 22 20 6f 70 65 72   "the \".\" oper
6370: 61 74 6f 72 22 2c 20 4e 43 5f 49 64 78 45 78 70  ator", NC_IdxExp
6380: 72 7c 4e 43 5f 47 65 6e 43 6f 6c 29 3b 0a 20 20  r|NC_GenCol);.  
6390: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
63a0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
63b0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
63c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
63d0: 20 20 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30           zDb = 0
63e0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
63f0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
6400: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
6410: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20  K_DOT );.       
6420: 20 20 20 7a 44 62 20 3d 20 70 4c 65 66 74 2d 3e     zDb = pLeft->
6430: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
6440: 20 20 20 20 70 4c 65 66 74 20 3d 20 70 52 69 67      pLeft = pRig
6450: 68 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  ht->pLeft;.     
6460: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 52       pRight = pR
6470: 69 67 68 74 2d 3e 70 52 69 67 68 74 3b 0a 20 20  ight->pRight;.  
6480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6490: 7a 54 61 62 6c 65 20 3d 20 70 4c 65 66 74 2d 3e  zTable = pLeft->
64a0: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
64b0: 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67    zColumn = pRig
64c0: 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ht->u.zToken;.  
64d0: 20 20 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e        if( IN_REN
64e0: 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20  AME_OBJECT ){.  
64f0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
6500: 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
6510: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 70  pParse, (void*)p
6520: 45 78 70 72 2c 20 28 76 6f 69 64 2a 29 70 52 69  Expr, (void*)pRi
6530: 67 68 74 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ght);.          
6540: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
6550: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
6560: 28 76 6f 69 64 2a 29 26 70 45 78 70 72 2d 3e 79  (void*)&pExpr->y
6570: 2e 70 54 61 62 2c 20 28 76 6f 69 64 2a 29 70 4c  .pTab, (void*)pL
6580: 65 66 74 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  eft);.        }.
6590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65        }.      re
65a0: 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28  turn lookupName(
65b0: 70 50 61 72 73 65 2c 20 7a 44 62 2c 20 7a 54 61  pParse, zDb, zTa
65c0: 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e  ble, zColumn, pN
65d0: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 7d  C, pExpr);.    }
65e0: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
65f0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a   function names.
6600: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
6610: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
6620: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
6630: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e  List = pExpr->x.
6640: 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54 68 65  pList;    /* The
6650: 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a   argument list *
6660: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20  /.      int n = 
6670: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
6680: 45 78 70 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20  Expr : 0;    /* 
6690: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
66a0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
66b0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
66c0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
66d0: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
66e0: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
66f0: 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e       int wrong_n
6700: 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20  um_args = 0;    
6710: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e   /* True if wron
6720: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
6730: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
6740: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20  nt is_agg = 0;  
6750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
6760: 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72  ue if is an aggr
6770: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
6780: 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  /.      int nId;
6790: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
67b0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66   characters in f
67c0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
67d0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
67e0: 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20   *zId;          
67f0: 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
6800: 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  n name. */.     
6810: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
6820: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6830: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
6840: 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  t the function *
6850: 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d  /.      u8 enc =
6860: 20 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29   ENC(pParse->db)
6870: 3b 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  ;   /* The datab
6880: 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ase encoding */.
6890: 20 20 20 20 20 20 69 6e 74 20 73 61 76 65 64 41        int savedA
68a0: 6c 6c 6f 77 46 6c 61 67 73 20 3d 20 28 70 4e 43  llowFlags = (pNC
68b0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e 43 5f  ->ncFlags & (NC_
68c0: 41 6c 6c 6f 77 41 67 67 20 7c 20 4e 43 5f 41 6c  AllowAgg | NC_Al
68d0: 6c 6f 77 57 69 6e 29 29 3b 0a 23 69 66 6e 64 65  lowWin));.#ifnde
68e0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
68f0: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 57  NDOWFUNC.      W
6900: 69 6e 64 6f 77 20 2a 70 57 69 6e 20 3d 20 28 49  indow *pWin = (I
6910: 73 57 69 6e 64 6f 77 46 75 6e 63 28 70 45 78 70  sWindowFunc(pExp
6920: 72 29 20 3f 20 70 45 78 70 72 2d 3e 79 2e 70 57  r) ? pExpr->y.pW
6930: 69 6e 20 3a 20 30 29 3b 0a 23 65 6e 64 69 66 0a  in : 0);.#endif.
6940: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45        assert( !E
6950: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
6960: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
6970: 63 74 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ct) );.      zId
6980: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
6990: 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
69a0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
69b0: 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
69c0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
69d0: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
69e0: 62 2c 20 7a 49 64 2c 20 6e 2c 20 65 6e 63 2c 20  b, zId, n, enc, 
69f0: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44  0);.      if( pD
6a00: 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ef==0 ){.       
6a10: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
6a20: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
6a30: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 2d 32 2c  se->db, zId, -2,
6a40: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
6a50: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
6a60: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
6a70: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
6a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6a90: 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f        wrong_num_
6aa0: 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20  args = 1;.      
6ab0: 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b    }.      }else{
6ac0: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
6ad0: 3d 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a  = pDef->xFinaliz
6ae0: 65 21 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66  e!=0;.        if
6af0: 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67  ( pDef->funcFlag
6b00: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
6b10: 55 4e 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20  UNLIKELY ){.    
6b20: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
6b30: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
6b40: 55 6e 6c 69 6b 65 6c 79 29 3b 0a 20 20 20 20 20  Unlikely);.     
6b50: 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b       if( n==2 ){
6b60: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6b70: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78 70  pr->iTable = exp
6b80: 72 50 72 6f 62 61 62 69 6c 69 74 79 28 70 4c 69  rProbability(pLi
6b90: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
6ba0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6bb0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30   pExpr->iTable<0
6bc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6bd0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6be0: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
6bf0: 20 20 20 20 20 20 20 20 20 20 22 73 65 63 6f 6e            "secon
6c00: 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69  d argument to li
6c10: 6b 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74 20  kelihood() must 
6c20: 62 65 20 61 20 22 0a 20 20 20 20 20 20 20 20 20  be a ".         
6c30: 20 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e 74         "constant
6c40: 20 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e 64   between 0.0 and
6c50: 20 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20 20   1.0");.        
6c60: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
6c70: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  +;.            }
6c80: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
6c90: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  {.            /*
6ca0: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
6cb0: 36 31 33 30 34 2d 32 39 34 34 39 20 54 68 65 20  61304-29449 The 
6cc0: 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63  unlikely(X) func
6cd0: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20  tion is.        
6ce0: 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e      ** equivalen
6cf0: 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  t to likelihood(
6d00: 58 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20 20  X, 0.0625)..    
6d10: 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45          ** EVIDE
6d20: 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d  NCE-OF: R-01283-
6d30: 31 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b 65  11636 The unlike
6d40: 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  ly(X) function i
6d50: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
6d60: 20 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20   short-hand for 
6d70: 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30  likelihood(X,0.0
6d80: 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20  625)..          
6d90: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
6da0: 3a 20 52 2d 33 36 38 35 30 2d 33 34 31 32 37 20  : R-36850-34127 
6db0: 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75  The likely(X) fu
6dc0: 6e 63 74 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d  nction is short-
6dd0: 68 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20 20  hand.           
6de0: 20 2a 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f   ** for likeliho
6df0: 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20  od(X,0.9375)..  
6e00: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49            ** EVI
6e10: 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33  DENCE-OF: R-5343
6e20: 36 2d 34 30 39 37 33 20 54 68 65 20 6c 69 6b 65  6-40973 The like
6e30: 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  ly(X) function i
6e40: 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20 20  s equivalent.   
6e50: 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c           ** to l
6e60: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33  ikelihood(X,0.93
6e70: 37 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  75). */.        
6e80: 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75      /* TUNING: u
6e90: 6e 6c 69 6b 65 6c 79 28 29 20 70 72 6f 62 61 62  nlikely() probab
6ea0: 69 6c 69 74 79 20 69 73 20 30 2e 30 36 32 35 2e  ility is 0.0625.
6eb0: 20 20 6c 69 6b 65 6c 79 28 29 20 69 73 20 30 2e    likely() is 0.
6ec0: 39 33 37 35 20 2a 2f 0a 20 20 20 20 20 20 20 20  9375 */.        
6ed0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6ee0: 65 20 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b  e = pDef->zName[
6ef0: 30 5d 3d 3d 27 75 27 20 3f 20 38 33 38 38 36 30  0]=='u' ? 838860
6f00: 38 20 3a 20 31 32 35 38 32 39 31 32 30 3b 0a 20  8 : 125829120;. 
6f10: 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20 20           }      
6f20: 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20         .        
6f30: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
6f40: 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41 54  _OMIT_AUTHORIZAT
6f50: 49 4f 4e 0a 20 20 20 20 20 20 20 20 7b 0a 20 20  ION.        {.  
6f60: 20 20 20 20 20 20 20 20 69 6e 74 20 61 75 74 68          int auth
6f70: 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43 68   = sqlite3AuthCh
6f80: 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c 49  eck(pParse, SQLI
6f90: 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 70  TE_FUNCTION, 0,p
6fa0: 44 65 66 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20  Def->zName,0);. 
6fb0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74           if( aut
6fc0: 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a  h!=SQLITE_OK ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6fe0: 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e  auth==SQLITE_DEN
6ff0: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  Y ){.           
7000: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7010: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74 20  sg(pParse, "not 
7020: 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75 73  authorized to us
7030: 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c  e function: %s",
7040: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
7050: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7060: 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61         pDef->zNa
7070: 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  me);.           
7080: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
7090: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
70a0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
70b0: 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20  >op = TK_NULL;. 
70c0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
70d0: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20  n WRC_Prune;.   
70e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
70f0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7100: 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e 63    if( pDef->func
7110: 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45 5f  Flags & (SQLITE_
7120: 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51  FUNC_CONSTANT|SQ
7130: 4c 49 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e  LITE_FUNC_SLOCHN
7140: 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  G) ){.          
7150: 2f 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  /* For the purpo
7160: 73 65 73 20 6f 66 20 74 68 65 20 45 50 5f 43 6f  ses of the EP_Co
7170: 6e 73 74 46 75 6e 63 20 66 6c 61 67 2c 20 64 61  nstFunc flag, da
7180: 74 65 20 61 6e 64 20 74 69 6d 65 0a 20 20 20 20  te and time.    
7190: 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f        ** functio
71a0: 6e 73 20 61 6e 64 20 6f 74 68 65 72 20 66 75 6e  ns and other fun
71b0: 63 74 69 6f 6e 73 20 74 68 61 74 20 63 68 61 6e  ctions that chan
71c0: 67 65 20 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f  ge slowly are co
71d0: 6e 73 69 64 65 72 65 64 0a 20 20 20 20 20 20 20  nsidered.       
71e0: 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62     ** constant b
71f0: 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65 20  ecause they are 
7200: 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 74 68 65  constant for the
7210: 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65   duration of one
7220: 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20 20   query */.      
7230: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
7240: 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e  rty(pExpr,EP_Con
7250: 73 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20 20  stFunc);.       
7260: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
7270: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
7280: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f  & SQLITE_FUNC_CO
7290: 4e 53 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20  NSTANT)==0 ){.  
72a0: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65 2f          /* Date/
72b0: 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  time functions t
72c0: 68 61 74 20 75 73 65 20 27 6e 6f 77 27 2c 20 61  hat use 'now', a
72d0: 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f  nd other functio
72e0: 6e 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20 20  ns like.        
72f0: 20 20 2a 2a 20 73 71 6c 69 74 65 5f 76 65 72 73    ** sqlite_vers
7300: 69 6f 6e 28 29 20 74 68 61 74 20 6d 69 67 68 74  ion() that might
7310: 20 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69 6d   change over tim
7320: 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65 64  e cannot be used
7330: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 6e  .          ** in
7340: 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20   an index. */.  
7350: 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64          notValid
7360: 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e  (pParse, pNC, "n
7370: 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69 63  on-deterministic
7380: 20 66 75 6e 63 74 69 6f 6e 73 22 2c 0a 20 20 20   functions",.   
7390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
73a0: 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 50 61  NC_IdxExpr|NC_Pa
73b0: 72 74 49 64 78 7c 4e 43 5f 47 65 6e 43 6f 6c 29  rtIdx|NC_GenCol)
73c0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
73d0: 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
73e0: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
73f0: 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e 41 4c 29  E_FUNC_INTERNAL)
7400: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26 20  !=0.         && 
7410: 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d  pParse->nested==
7420: 30 0a 20 20 20 20 20 20 20 20 20 26 26 20 73 71  0.         && sq
7430: 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62 49 6e 74  lite3Config.bInt
7440: 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e 73 3d 3d  ernalFunctions==
7450: 30 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  0.        ){.   
7460: 20 20 20 20 20 20 20 2f 2a 20 49 6e 74 65 72 6e         /* Intern
7470: 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 66 75 6e 63  al-use-only func
7480: 74 69 6f 6e 73 20 61 72 65 20 64 69 73 61 6c 6c  tions are disall
7490: 6f 77 65 64 20 75 6e 6c 65 73 73 20 74 68 65 0a  owed unless the.
74a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c            ** SQL
74b0: 20 69 73 20 62 65 69 6e 67 20 63 6f 6d 70 69 6c   is being compil
74c0: 65 64 20 75 73 69 6e 67 20 73 71 6c 69 74 65 33  ed using sqlite3
74d0: 4e 65 73 74 65 64 50 61 72 73 65 28 29 20 2a 2f  NestedParse() */
74e0: 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75  .          no_su
74f0: 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20  ch_func = 1;.   
7500: 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 30 3b         pDef = 0;
7510: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 20  .        }else. 
7520: 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
7530: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
7540: 4c 49 54 45 5f 46 55 4e 43 5f 44 49 52 45 43 54  LITE_FUNC_DIRECT
7550: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  )!=0.         &&
7560: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
7570: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 64 69 72  (pExpr, EP_Indir
7580: 65 63 74 29 0a 20 20 20 20 20 20 20 20 20 26 26  ect).         &&
7590: 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45   !IN_RENAME_OBJE
75a0: 43 54 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  CT.        ){.  
75b0: 20 20 20 20 20 20 20 20 2f 2a 20 46 75 6e 63 74          /* Funct
75c0: 69 6f 6e 73 20 74 61 67 67 65 64 20 77 69 74 68  ions tagged with
75d0: 20 53 51 4c 49 54 45 5f 44 49 52 45 43 54 4f 4e   SQLITE_DIRECTON
75e0: 4c 59 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73  LY may not be us
75f0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
7600: 69 6e 73 69 64 65 20 6f 66 20 74 72 69 67 67 65  inside of trigge
7610: 72 73 20 61 6e 64 20 76 69 65 77 73 20 2a 2f 0a  rs and views */.
7620: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
7630: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
7640: 2c 20 22 25 73 28 29 20 70 72 6f 68 69 62 69 74  , "%s() prohibit
7650: 65 64 20 69 6e 20 74 72 69 67 67 65 72 73 20 61  ed in triggers a
7660: 6e 64 20 76 69 65 77 73 22 2c 0a 20 20 20 20 20  nd views",.     
7670: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7680: 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65       pDef->zName
7690: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
76a0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
76b0: 30 3d 3d 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  0==IN_RENAME_OBJ
76c0: 45 43 54 20 29 7b 0a 23 69 66 6e 64 65 66 20 53  ECT ){.#ifndef S
76d0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
76e0: 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20 61 73  WFUNC.        as
76f0: 73 65 72 74 28 20 69 73 5f 61 67 67 3d 3d 30 20  sert( is_agg==0 
7700: 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  || (pDef->funcFl
7710: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
7720: 43 5f 4d 49 4e 4d 41 58 29 0a 20 20 20 20 20 20  C_MINMAX).      
7730: 20 20 20 20 7c 7c 20 28 70 44 65 66 2d 3e 78 56      || (pDef->xV
7740: 61 6c 75 65 3d 3d 30 20 26 26 20 70 44 65 66 2d  alue==0 && pDef-
7750: 3e 78 49 6e 76 65 72 73 65 3d 3d 30 29 0a 20 20  >xInverse==0).  
7760: 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44 65 66          || (pDef
7770: 2d 3e 78 56 61 6c 75 65 20 26 26 20 70 44 65 66  ->xValue && pDef
7780: 2d 3e 78 49 6e 76 65 72 73 65 20 26 26 20 70 44  ->xInverse && pD
7790: 65 66 2d 3e 78 53 46 75 6e 63 20 26 26 20 70 44  ef->xSFunc && pD
77a0: 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 0a 20  ef->xFinalize). 
77b0: 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20         );.      
77c0: 20 20 69 66 28 20 70 44 65 66 20 26 26 20 70 44    if( pDef && pD
77d0: 65 66 2d 3e 78 56 61 6c 75 65 3d 3d 30 20 26 26  ef->xValue==0 &&
77e0: 20 70 57 69 6e 20 29 7b 0a 20 20 20 20 20 20 20   pWin ){.       
77f0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7800: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
7810: 20 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 28            "%.*s(
7820: 29 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65  ) may not be use
7830: 64 20 61 73 20 61 20 77 69 6e 64 6f 77 20 66 75  d as a window fu
7840: 6e 63 74 69 6f 6e 22 2c 20 6e 49 64 2c 20 7a 49  nction", nId, zI
7850: 64 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20  d.          );. 
7860: 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45           pNC->nE
7870: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65  rr++;.        }e
7880: 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20 20 20  lse if( .       
7890: 20 20 20 20 20 20 20 28 69 73 5f 61 67 67 20 26         (is_agg &
78a0: 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  & (pNC->ncFlags 
78b0: 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d  & NC_AllowAgg)==
78c0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  0).           ||
78d0: 20 28 69 73 5f 61 67 67 20 26 26 20 28 70 44 65   (is_agg && (pDe
78e0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c  f->funcFlags&SQL
78f0: 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 29  ITE_FUNC_WINDOW)
7900: 20 26 26 20 21 70 57 69 6e 29 0a 20 20 20 20 20   && !pWin).     
7910: 20 20 20 20 20 20 7c 7c 20 28 69 73 5f 61 67 67        || (is_agg
7920: 20 26 26 20 70 57 69 6e 20 26 26 20 28 70 4e 43   && pWin && (pNC
7930: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41  ->ncFlags & NC_A
7940: 6c 6c 6f 77 57 69 6e 29 3d 3d 30 29 0a 20 20 20  llowWin)==0).   
7950: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7960: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
7970: 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ype;.          i
7980: 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c  f( (pDef->funcFl
7990: 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e  ags & SQLITE_FUN
79a0: 43 5f 57 49 4e 44 4f 57 29 20 7c 7c 20 70 57 69  C_WINDOW) || pWi
79b0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  n ){.           
79c0: 20 7a 54 79 70 65 20 3d 20 22 77 69 6e 64 6f 77   zType = "window
79d0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c  ";.          }el
79e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
79f0: 7a 54 79 70 65 20 3d 20 22 61 67 67 72 65 67 61  zType = "aggrega
7a00: 74 65 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  te";.          }
7a10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7a20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7a30: 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 25 73  e, "misuse of %s
7a40: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
7a50: 22 2c 7a 54 79 70 65 2c 6e 49 64 2c 7a 49 64 29  ",zType,nId,zId)
7a60: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  ;.          pNC-
7a70: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
7a80: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
7a90: 20 20 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20         }.#else. 
7aa0: 20 20 20 20 20 20 20 69 66 28 20 28 69 73 5f 61         if( (is_a
7ab0: 67 67 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c  gg && (pNC->ncFl
7ac0: 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67  ags & NC_AllowAg
7ad0: 67 29 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20  g)==0) ){.      
7ae0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7af0: 4d 73 67 28 70 50 61 72 73 65 2c 22 6d 69 73 75  Msg(pParse,"misu
7b00: 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  se of aggregate 
7b10: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
7b20: 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20  ,nId,zId);.     
7b30: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
7b40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f 61  ;.          is_a
7b50: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  gg = 0;.        
7b60: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20  }.#endif.       
7b70: 20 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63   else if( no_suc
7b80: 68 5f 66 75 6e 63 20 26 26 20 70 50 61 72 73 65  h_func && pParse
7b90: 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d  ->db->init.busy=
7ba0: 3d 30 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45  =0.#ifdef SQLITE
7bb0: 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f  _ENABLE_UNKNOWN_
7bc0: 53 51 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20  SQL_FUNCTION.   
7bd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 26                 &
7be0: 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69  & pParse->explai
7bf0: 6e 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20  n==0.#endif.    
7c00: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
7c10: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7c20: 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63  (pParse, "no suc
7c30: 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73  h function: %.*s
7c40: 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20  ", nId, zId);.  
7c50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
7c60: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  r++;.        }el
7c70: 73 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d  se if( wrong_num
7c80: 5f 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20  _args ){.       
7c90: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
7ca0: 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67  sg(pParse,"wrong
7cb0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
7cc0: 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e  ents to function
7cd0: 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20   %.*s()",.      
7ce0: 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49           nId, zI
7cf0: 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e  d);.          pN
7d00: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
7d10: 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
7d20: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
7d30: 55 4e 43 0a 20 20 20 20 20 20 20 20 65 6c 73 65  UNC.        else
7d40: 20 69 66 28 20 69 73 5f 61 67 67 3d 3d 30 20 26   if( is_agg==0 &
7d50: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
7d60: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
7d70: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
7d80: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7d90: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
7da0: 20 20 20 20 20 20 20 20 20 22 46 49 4c 54 45 52           "FILTER
7db0: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
7dc0: 20 77 69 74 68 20 6e 6f 6e 2d 61 67 67 72 65 67   with non-aggreg
7dd0: 61 74 65 20 25 2e 2a 73 28 29 22 2c 20 0a 20 20  ate %.*s()", .  
7de0: 20 20 20 20 20 20 20 20 20 20 20 20 6e 49 64 2c              nId,
7df0: 20 7a 49 64 0a 20 20 20 20 20 20 20 20 20 20 29   zId.          )
7e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  ;.          pNC-
7e10: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
7e20: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20   }.#endif.      
7e30: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
7e40: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 57 69 6e            /* Win
7e50: 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 20 6d 61  dow functions ma
7e60: 79 20 6e 6f 74 20 62 65 20 61 72 67 75 6d 65 6e  y not be argumen
7e70: 74 73 20 6f 66 20 61 67 67 72 65 67 61 74 65 20  ts of aggregate 
7e80: 66 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20 20  functions..     
7e90: 20 20 20 20 20 2a 2a 20 4f 72 20 61 72 67 75 6d       ** Or argum
7ea0: 65 6e 74 73 20 6f 66 20 6f 74 68 65 72 20 77 69  ents of other wi
7eb0: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 73 2e 20  ndow functions. 
7ec0: 42 75 74 20 61 67 67 72 65 67 61 74 65 20 66 75  But aggregate fu
7ed0: 6e 63 74 69 6f 6e 73 0a 20 20 20 20 20 20 20 20  nctions.        
7ee0: 20 20 2a 2a 20 6d 61 79 20 62 65 20 61 72 67 75    ** may be argu
7ef0: 6d 65 6e 74 73 20 66 6f 72 20 77 69 6e 64 6f 77  ments for window
7f00: 20 66 75 6e 63 74 69 6f 6e 73 2e 20 20 2a 2f 0a   functions.  */.
7f10: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7f20: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
7f30: 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63           pNC->nc
7f40: 46 6c 61 67 73 20 26 3d 20 7e 28 4e 43 5f 41 6c  Flags &= ~(NC_Al
7f50: 6c 6f 77 57 69 6e 20 7c 20 28 21 70 57 69 6e 20  lowWin | (!pWin 
7f60: 3f 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 20 3a 20  ? NC_AllowAgg : 
7f70: 30 29 29 3b 0a 23 65 6c 73 65 0a 20 20 20 20 20  0));.#else.     
7f80: 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67       pNC->ncFlag
7f90: 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67  s &= ~NC_AllowAg
7fa0: 67 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  g;.#endif.      
7fb0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e    }.      }.#ifn
7fc0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7fd0: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
7fe0: 20 65 6c 73 65 20 69 66 28 20 45 78 70 72 48 61   else if( ExprHa
7ff0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
8000: 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a   EP_WinFunc) ){.
8010: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
8020: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64   1;.      }.#end
8030: 69 66 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  if.      sqlite3
8040: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61  WalkExprList(pWa
8050: 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  lker, pList);.  
8060: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
8070: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
8080: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
8090: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 57 69  .        if( pWi
80a0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 53  n ){.          S
80b0: 65 6c 65 63 74 20 2a 70 53 65 6c 20 3d 20 70 4e  elect *pSel = pN
80c0: 43 2d 3e 70 57 69 6e 53 65 6c 65 63 74 3b 0a 20  C->pWinSelect;. 
80d0: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
80e0: 20 70 57 69 6e 3d 3d 70 45 78 70 72 2d 3e 79 2e   pWin==pExpr->y.
80f0: 70 57 69 6e 20 29 3b 0a 20 20 20 20 20 20 20 20  pWin );.        
8100: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
8110: 4f 42 4a 45 43 54 3d 3d 30 20 29 7b 0a 20 20 20  OBJECT==0 ){.   
8120: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
8130: 57 69 6e 64 6f 77 55 70 64 61 74 65 28 70 50 61  WindowUpdate(pPa
8140: 72 73 65 2c 20 70 53 65 6c 2d 3e 70 57 69 6e 44  rse, pSel->pWinD
8150: 65 66 6e 2c 20 70 57 69 6e 2c 20 70 44 65 66 29  efn, pWin, pDef)
8160: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
8170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
8180: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c  alkExprList(pWal
8190: 6b 65 72 2c 20 70 57 69 6e 2d 3e 70 50 61 72 74  ker, pWin->pPart
81a0: 69 74 69 6f 6e 29 3b 0a 20 20 20 20 20 20 20 20  ition);.        
81b0: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
81c0: 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70  rList(pWalker, p
81d0: 57 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a  Win->pOrderBy);.
81e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
81f0: 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65  3WalkExpr(pWalke
8200: 72 2c 20 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72  r, pWin->pFilter
8210: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
8220: 69 74 65 33 57 69 6e 64 6f 77 4c 69 6e 6b 28 70  ite3WindowLink(p
8230: 53 65 6c 2c 20 70 57 69 6e 29 3b 0a 20 20 20 20  Sel, pWin);.    
8240: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
8250: 67 73 20 7c 3d 20 4e 43 5f 48 61 73 57 69 6e 3b  gs |= NC_HasWin;
8260: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  .        }else.#
8270: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
8280: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
8290: 2a 2f 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20  */.        {.   
82a0: 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74 65         NameConte
82b0: 78 74 20 2a 70 4e 43 32 20 3d 20 70 4e 43 3b 0a  xt *pNC2 = pNC;.
82c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
82d0: 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e  >op = TK_AGG_FUN
82e0: 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 20  CTION;.         
82f0: 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 30 3b   pExpr->op2 = 0;
8300: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
8310: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
8320: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 45 78            if( Ex
8330: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
8340: 78 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29  xpr, EP_WinFunc)
8350: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8360: 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28  sqlite3WalkExpr(
8370: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e  pWalker, pExpr->
8380: 79 2e 70 57 69 6e 2d 3e 70 46 69 6c 74 65 72 29  y.pWin->pFilter)
8390: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 23 65  ;.          }.#e
83a0: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 20 20 77  ndif.          w
83b0: 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73  hile( pNC2 && !s
83c0: 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
83d0: 65 73 54 68 69 73 53 72 63 28 70 45 78 70 72 2c  esThisSrc(pExpr,
83e0: 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29   pNC2->pSrcList)
83f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
8400: 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20  pExpr->op2++;.  
8410: 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 20 3d            pNC2 =
8420: 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a 20 20   pNC2->pNext;.  
8430: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
8440: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
8450: 21 3d 30 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d 45  !=0 || IN_RENAME
8460: 5f 4f 42 4a 45 43 54 20 29 3b 0a 20 20 20 20 20  _OBJECT );.     
8470: 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 26 26       if( pNC2 &&
8480: 20 70 44 65 66 20 29 7b 0a 20 20 20 20 20 20 20   pDef ){.       
8490: 20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c       assert( SQL
84a0: 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 3d  ITE_FUNC_MINMAX=
84b0: 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b  =NC_MinMaxAgg );
84c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73  .            tes
84d0: 74 63 61 73 65 28 20 28 70 44 65 66 2d 3e 66 75  tcase( (pDef->fu
84e0: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
84f0: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 21 3d 30  _FUNC_MINMAX)!=0
8500: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
8510: 70 4e 43 32 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d  pNC2->ncFlags |=
8520: 20 4e 43 5f 48 61 73 41 67 67 20 7c 20 28 70 44   NC_HasAgg | (pD
8530: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
8540: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
8550: 41 58 29 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  AX);..          
8560: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
8570: 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73      pNC->ncFlags
8580: 20 7c 3d 20 73 61 76 65 64 41 6c 6c 6f 77 46 6c   |= savedAllowFl
8590: 61 67 73 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ags;.      }.   
85a0: 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43     /* FIX ME:  C
85b0: 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61 66  ompute pExpr->af
85c0: 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e 20  finity based on 
85d0: 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65 74  the expected ret
85e0: 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79 70  urn.      ** typ
85f0: 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f  e of the functio
8600: 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n .      */.    
8610: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75    return WRC_Pru
8620: 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ne;.    }.#ifnde
8630: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
8640: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
8650: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
8660: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 20  ase TK_EXISTS:  
8670: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8680: 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29  >op==TK_EXISTS )
8690: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  ;.#endif.    cas
86a0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
86b0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
86c0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b 0a 20  ->op==TK_IN );. 
86d0: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
86e0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
86f0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
8700: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 52 65  .        int nRe
8710: 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20  f = pNC->nRef;. 
8720: 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28         notValid(
8730: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 73 75  pParse, pNC, "su
8740: 62 71 75 65 72 69 65 73 22 2c 20 0a 20 20 20 20  bqueries", .    
8750: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 43 5f               NC_
8760: 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49  IsCheck|NC_PartI
8770: 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43  dx|NC_IdxExpr|NC
8780: 5f 47 65 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20  _GenCol);.      
8790: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53 65 6c    sqlite3WalkSel
87a0: 65 63 74 28 70 57 61 6c 6b 65 72 2c 20 70 45 78  ect(pWalker, pEx
87b0: 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a  pr->x.pSelect);.
87c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
87d0: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
87e0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
87f0: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
8800: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
8810: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
8820: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
8830: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  ;.          pNC-
8840: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 56  >ncFlags |= NC_V
8850: 61 72 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20  arSelect;.      
8860: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8870: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8880: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
8890: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 6e 6f 74  BLE: {.      not
88a0: 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e  Valid(pParse, pN
88b0: 43 2c 20 22 70 61 72 61 6d 65 74 65 72 73 22 2c  C, "parameters",
88c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
88d0: 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61  NC_IsCheck|NC_Pa
88e0: 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72  rtIdx|NC_IdxExpr
88f0: 7c 4e 43 5f 47 65 6e 43 6f 6c 29 3b 0a 20 20 20  |NC_GenCol);.   
8900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8910: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a      case TK_IS:.
8920: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f      case TK_ISNO
8930: 54 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  T: {.      Expr 
8940: 2a 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65  *pRight = sqlite
8950: 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65  3ExprSkipCollate
8960: 41 6e 64 4c 69 6b 65 6c 79 28 70 45 78 70 72 2d  AndLikely(pExpr-
8970: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
8980: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8990: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
89a0: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
89b0: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 73       /* Handle s
89c0: 70 65 63 69 61 6c 20 63 61 73 65 73 20 6f 66 20  pecial cases of 
89d0: 22 78 20 49 53 20 54 52 55 45 22 2c 20 22 78 20  "x IS TRUE", "x 
89e0: 49 53 20 46 41 4c 53 45 22 2c 20 22 78 20 49 53  IS FALSE", "x IS
89f0: 20 4e 4f 54 20 54 52 55 45 22 2c 0a 20 20 20 20   NOT TRUE",.    
8a00: 20 20 2a 2a 20 61 6e 64 20 22 78 20 49 53 20 4e    ** and "x IS N
8a10: 4f 54 20 46 41 4c 53 45 22 2e 20 2a 2f 0a 20 20  OT FALSE". */.  
8a20: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
8a30: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
8a40: 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65       int rc = re
8a50: 73 6f 6c 76 65 45 78 70 72 53 74 65 70 28 70 57  solveExprStep(pW
8a60: 61 6c 6b 65 72 2c 20 70 52 69 67 68 74 29 3b 0a  alker, pRight);.
8a70: 20 20 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d          if( rc==
8a80: 57 52 43 5f 41 62 6f 72 74 20 29 20 72 65 74 75  WRC_Abort ) retu
8a90: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
8aa0: 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68 74        if( pRight
8ab0: 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c  ->op==TK_TRUEFAL
8ac0: 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  SE ){.          
8ad0: 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78  pExpr->op2 = pEx
8ae0: 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20  pr->op;.        
8af0: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
8b00: 5f 54 52 55 54 48 3b 0a 20 20 20 20 20 20 20 20  _TRUTH;.        
8b10: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e    return WRC_Con
8b20: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
8b30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
8b40: 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20  * Fall thru */. 
8b50: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
8b60: 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20 20 63 61  _BETWEEN:.    ca
8b70: 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
8b80: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
8b90: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
8ba0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
8bb0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
8bc0: 73 65 20 54 4b 5f 47 45 3a 20 7b 0a 20 20 20 20  se TK_GE: {.    
8bd0: 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20 6e 52 69    int nLeft, nRi
8be0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
8bf0: 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f  Parse->db->mallo
8c00: 63 46 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b  cFailed ) break;
8c10: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
8c20: 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 29  Expr->pLeft!=0 )
8c30: 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20  ;.      nLeft = 
8c40: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
8c50: 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65  rSize(pExpr->pLe
8c60: 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ft);.      if( p
8c70: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54  Expr->op==TK_BET
8c80: 57 45 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20  WEEN ){.        
8c90: 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  nRight = sqlite3
8ca0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
8cb0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61  Expr->x.pList->a
8cc0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
8cd0: 20 20 20 20 69 66 28 20 6e 52 69 67 68 74 3d 3d      if( nRight==
8ce0: 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  nLeft ){.       
8cf0: 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69     nRight = sqli
8d00: 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a  te3ExprVectorSiz
8d10: 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  e(pExpr->x.pList
8d20: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
8d30: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8d40: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73  else{.        as
8d50: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69  sert( pExpr->pRi
8d60: 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ght!=0 );.      
8d70: 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74    nRight = sqlit
8d80: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
8d90: 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b  (pExpr->pRight);
8da0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8db0: 66 28 20 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74  f( nLeft!=nRight
8dc0: 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74   ){.        test
8dd0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8de0: 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20  =TK_EQ );.      
8df0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8e00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
8e10: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8e20: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8e30: 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LT );.        te
8e40: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8e50: 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20  p==TK_LE );.    
8e60: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8e70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29  xpr->op==TK_GT )
8e80: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
8e90: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8ea0: 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20  K_GE );.        
8eb0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8ec0: 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
8ed0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8ee0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53  pExpr->op==TK_IS
8ef0: 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74  NOT );.        t
8f00: 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e  estcase( pExpr->
8f10: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
8f20: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8f30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8f40: 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
8f50: 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 7d 0a  used");.      }.
8f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20        break; .  
8f70: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8f80: 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c   (pParse->nErr |
8f90: 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  | pParse->db->ma
8fa0: 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52  llocFailed) ? WR
8fb0: 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f  C_Abort : WRC_Co
8fc0: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
8fd0: 20 70 45 4c 69 73 74 20 69 73 20 61 20 6c 69 73   pEList is a lis
8fe0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
8ff0: 20 77 68 69 63 68 20 61 72 65 20 72 65 61 6c 6c   which are reall
9000: 79 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  y the result set
9010: 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c   of the.** a SEL
9020: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
9030: 70 45 20 69 73 20 61 20 74 65 72 6d 20 69 6e 20  pE is a term in 
9040: 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47  an ORDER BY or G
9050: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a  ROUP BY clause..
9060: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
9070: 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66  checks to see if
9080: 20 70 45 20 69 73 20 61 20 73 69 6d 70 6c 65 20   pE is a simple 
9090: 69 64 65 6e 74 69 66 69 65 72 20 77 68 69 63 68  identifier which
90a0: 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20   corresponds.** 
90b0: 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f  to the AS-name o
90c0: 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72  f one of the ter
90d0: 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ms of the expres
90e0: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 69  sion list.  If i
90f0: 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f  t is,.** this ro
9100: 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61 6e 20  utine return an 
9110: 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e 20  integer between 
9120: 31 20 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20  1 and N where N 
9130: 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  is the number of
9140: 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20  .** elements in 
9150: 70 45 4c 69 73 74 2c 20 63 6f 72 72 65 73 70 6f  pEList, correspo
9160: 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6d 61 74  nding to the mat
9170: 63 68 69 6e 67 20 65 6e 74 72 79 2e 20 20 49 66  ching entry.  If
9180: 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20   there is.** no 
9190: 6d 61 74 63 68 2c 20 6f 72 20 69 66 20 70 45 20  match, or if pE 
91a0: 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20  is not a simple 
91b0: 69 64 65 6e 74 69 66 69 65 72 2c 20 74 68 65 6e  identifier, then
91c0: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a   this routine.**
91d0: 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a   return 0..**.**
91e0: 20 70 45 4c 69 73 74 20 68 61 73 20 62 65 65 6e   pEList has been
91f0: 20 72 65 73 6f 6c 76 65 64 2e 20 20 70 45 20 68   resolved.  pE h
9200: 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69  as not..*/.stati
9210: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e  c int resolveAsN
9220: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
9230: 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72  arse,     /* Par
9240: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72  sing context for
9250: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20   error messages 
9260: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
9270: 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  EList,  /* List 
9280: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74  of expressions t
9290: 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72  o scan */.  Expr
92a0: 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20 2f   *pE           /
92b0: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 77 65 20  * Expression we 
92c0: 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61  are trying to ma
92d0: 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  tch */.){.  int 
92e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
92f0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
9300: 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41  /..  UNUSED_PARA
9310: 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b 0a 0a  METER(pParse);..
9320: 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b    if( pE->op==TK
9330: 5f 49 44 20 29 7b 0a 20 20 20 20 63 68 61 72 20  _ID ){.    char 
9340: 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54  *zCol = pE->u.zT
9350: 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  oken;.    for(i=
9360: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
9370: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
9380: 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69  char *zAs = pELi
9390: 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a  st->a[i].zName;.
93a0: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
93b0: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
93c0: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
93d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
93e0: 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a  rn i+1;.      }.
93f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
9400: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  rn 0;.}../*.** p
9410: 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74  E is a pointer t
9420: 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  o an expression 
9430: 77 68 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c  which is a singl
9440: 65 20 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a  e term in the.**
9450: 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61 20 63   ORDER BY of a c
9460: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20  ompound SELECT. 
9470: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
9480: 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20  has not been.** 
9490: 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a  name resolved..*
94a0: 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e  *.** At the poin
94b0: 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69  t this routine i
94c0: 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72  s called, we alr
94d0: 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74  eady know that t
94e0: 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74  he.** ORDER BY t
94f0: 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  erm is not an in
9500: 74 65 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f  teger index into
9510: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
9520: 20 20 54 68 61 74 0a 2a 2a 20 63 61 73 65 20 69    That.** case i
9530: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65  s handled by the
9540: 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65   calling routine
9550: 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20  ..**.** Attempt 
9560: 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67 61 69  to match pE agai
9570: 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 63  nst result set c
9580: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65  olumns in the le
9590: 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43  ft-most.** SELEC
95a0: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65  T statement.  Re
95b0: 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69  turn the index i
95c0: 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67   of the matching
95d0: 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61   column,.** as a
95e0: 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20  n indication to 
95f0: 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20  the caller that 
9600: 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62  it should sort b
9610: 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d  y the i-th colum
9620: 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d  n..** The left-m
9630: 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e  ost column is 1.
9640: 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73    In other words
9650: 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65 74 75  , the value retu
9660: 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 73  rned is the.** s
9670: 61 6d 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75  ame integer valu
9680: 65 20 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20  e that would be 
9690: 75 73 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20  used in the SQL 
96a0: 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64  statement to ind
96b0: 69 63 61 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c  icate.** the col
96c0: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  umn..**.** If th
96d0: 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c  ere is no match,
96e0: 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75   return 0.  Retu
96f0: 72 6e 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f  rn -1 if an erro
9700: 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61  r occurs..*/.sta
9710: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f  tic int resolveO
9720: 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72  rderByTermToExpr
9730: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
9740: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
9750: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f  rsing context fo
9760: 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73  r error messages
9770: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53   */.  Select *pS
9780: 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20  elect,   /* The 
9790: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
97a0: 20 77 69 74 68 20 74 68 65 20 4f 52 44 45 52 20   with the ORDER 
97b0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45  BY clause */.  E
97c0: 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20  xpr *pE         
97d0: 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69    /* The specifi
97e0: 63 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  c ORDER BY term 
97f0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20  */.){.  int i;  
9800: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
9810: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
9820: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
9830: 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e  ;  /* The column
9840: 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  s of the result 
9850: 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  set */.  NameCon
9860: 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e  text nc;    /* N
9870: 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ame context for 
9880: 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a  resolving pE */.
9890: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20    sqlite3 *db;  
98a0: 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65       /* Database
98b0: 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20   connection */. 
98c0: 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20   int rc;        
98d0: 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f      /* Return co
98e0: 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65  de from subproce
98f0: 64 75 72 65 73 20 2a 2f 0a 20 20 75 38 20 73 61  dures */.  u8 sa
9900: 76 65 64 53 75 70 70 45 72 72 3b 20 20 20 2f 2a  vedSuppErr;   /*
9910: 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20   Saved value of 
9920: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20  db->suppressErr 
9930: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71  */..  assert( sq
9940: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
9950: 65 72 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b  er(pE, &i)==0 );
9960: 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c  .  pEList = pSel
9970: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  ect->pEList;..  
9980: 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  /* Resolve all n
9990: 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45  ames in the ORDE
99a0: 52 20 42 59 20 74 65 72 6d 20 65 78 70 72 65 73  R BY term expres
99b0: 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73  sion.  */.  mems
99c0: 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f  et(&nc, 0, sizeo
99d0: 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61  f(nc));.  nc.pPa
99e0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
99f0: 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53  nc.pSrcList = pS
9a00: 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e  elect->pSrc;.  n
9a10: 63 2e 75 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70  c.uNC.pEList = p
9a20: 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c  EList;.  nc.ncFl
9a30: 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  ags = NC_AllowAg
9a40: 67 7c 4e 43 5f 55 45 4c 69 73 74 3b 0a 20 20 6e  g|NC_UEList;.  n
9a50: 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62  c.nErr = 0;.  db
9a60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
9a70: 20 73 61 76 65 64 53 75 70 70 45 72 72 20 3d 20   savedSuppErr = 
9a80: 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b  db->suppressErr;
9a90: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
9aa0: 72 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73  rr = 1;.  rc = s
9ab0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
9ac0: 72 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b  rNames(&nc, pE);
9ad0: 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45  .  db->suppressE
9ae0: 72 72 20 3d 20 73 61 76 65 64 53 75 70 70 45 72  rr = savedSuppEr
9af0: 72 3b 0a 20 20 69 66 28 20 72 63 20 29 20 72 65  r;.  if( rc ) re
9b00: 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72  turn 0;..  /* Tr
9b10: 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f  y to match the O
9b20: 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69  RDER BY expressi
9b30: 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78  on against an ex
9b40: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e  pression.  ** in
9b50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e   the result set.
9b60: 20 20 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61    Return an 1-ba
9b70: 73 65 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65  sed index of the
9b80: 20 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72   matching.  ** r
9b90: 65 73 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e  esult-set entry.
9ba0: 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b  .  */.  for(i=0;
9bb0: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
9bc0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  ; i++){.    if( 
9bd0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
9be0: 72 65 28 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b  re(0, pEList->a[
9bf0: 69 5d 2e 70 45 78 70 72 2c 20 70 45 2c 20 2d 31  i].pExpr, pE, -1
9c00: 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74  )<2 ){.      ret
9c10: 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20  urn i+1;.    }. 
9c20: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d   }..  /* If no m
9c30: 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20  atch, return 0. 
9c40: 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  */.  return 0;.}
9c50: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
9c60: 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20   an ORDER BY or 
9c70: 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20 6f 75  GROUP BY term ou
9c80: 74 2d 6f 66 2d 72 61 6e 67 65 20 65 72 72 6f 72  t-of-range error
9c90: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
9ca0: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
9cb0: 67 65 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65  geError(.  Parse
9cc0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
9cd0: 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 63    /* The error c
9ce0: 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63  ontext into whic
9cf0: 68 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 65  h to write the e
9d00: 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  rror */.  const 
9d10: 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20  char *zType,    
9d20: 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22   /* "ORDER" or "
9d30: 47 52 4f 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20  GROUP" */.  int 
9d40: 69 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i,              
9d50: 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20     /* The index 
9d60: 28 31 2d 62 61 73 65 64 29 20 6f 66 20 74 68 65  (1-based) of the
9d70: 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e   term out of ran
9d80: 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20  ge */.  int mx  
9d90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9da0: 2a 20 4c 61 72 67 65 73 74 20 70 65 72 6d 69 73  * Largest permis
9db0: 73 69 62 6c 65 20 76 61 6c 75 65 20 6f 66 20 69  sible value of i
9dc0: 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33   */.){.  sqlite3
9dd0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
9de0: 20 0a 20 20 20 20 22 25 72 20 25 73 20 42 59 20   .    "%r %s BY 
9df0: 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67  term out of rang
9e00: 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a  e - should be ".
9e10: 20 20 20 20 22 62 65 74 77 65 65 6e 20 31 20 61      "between 1 a
9e20: 6e 64 20 25 64 22 2c 20 69 2c 20 7a 54 79 70 65  nd %d", i, zType
9e30: 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  , mx);.}../*.** 
9e40: 41 6e 61 6c 79 7a 65 20 74 68 65 20 4f 52 44 45  Analyze the ORDE
9e50: 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61  R BY clause in a
9e60: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
9e70: 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f   statement.   Mo
9e80: 64 69 66 79 0a 2a 2a 20 65 61 63 68 20 74 65 72  dify.** each ter
9e90: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
9ea0: 59 20 63 6c 61 75 73 65 20 69 73 20 61 20 63 6f  Y clause is a co
9eb0: 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 62  nstant integer b
9ec0: 65 74 77 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20  etween 1.** and 
9ed0: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
9ee0: 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d   number of colum
9ef0: 6e 73 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75  ns in the compou
9f00: 6e 64 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a  nd SELECT..**.**
9f10: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20   ORDER BY terms 
9f20: 74 68 61 74 20 61 72 65 20 61 6c 72 65 61 64 79  that are already
9f30: 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
9f40: 65 65 6e 20 31 20 61 6e 64 20 4e 20 61 72 65 0a  een 1 and N are.
9f50: 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20  ** unmodified.  
9f60: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74  ORDER BY terms t
9f70: 68 61 74 20 61 72 65 20 69 6e 74 65 67 65 72 73  hat are integers
9f80: 20 6f 75 74 73 69 64 65 20 74 68 65 20 72 61 6e   outside the ran
9f90: 67 65 20 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75  ge of.** 1 throu
9fa0: 67 68 20 4e 20 67 65 6e 65 72 61 74 65 20 61 6e  gh N generate an
9fb0: 20 65 72 72 6f 72 2e 20 20 4f 52 44 45 52 20 42   error.  ORDER B
9fc0: 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72 65  Y terms that are
9fd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20   expressions.** 
9fe0: 61 72 65 20 6d 61 74 63 68 65 64 20 61 67 61 69  are matched agai
9ff0: 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74 20 65  nst result set e
a000: 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f  xpressions of co
a010: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a  mpound SELECT.**
a020: 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20   beginning with 
a030: 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45  the left-most SE
a040: 4c 45 43 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67  LECT and working
a050: 20 74 6f 77 61 72 64 20 74 68 65 20 72 69 67 68   toward the righ
a060: 74 2e 0a 2a 2a 20 41 74 20 74 68 65 20 66 69 72  t..** At the fir
a070: 73 74 20 6d 61 74 63 68 2c 20 74 68 65 20 4f 52  st match, the OR
a080: 44 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f  DER BY expressio
a090: 6e 20 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64  n is transformed
a0a0: 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74   into.** the int
a0b0: 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  eger column numb
a0c0: 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  er..**.** Return
a0d0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
a0e0: 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73  rrors seen..*/.s
a0f0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
a100: 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79  eCompoundOrderBy
a110: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a120: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
a130: 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c  sing context.  L
a140: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
a150: 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ges here */.  Se
a160: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20  lect *pSelect   
a170: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
a180: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
a190: 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52  aining the ORDER
a1a0: 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20   BY */.){.  int 
a1b0: 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  i;.  ExprList *p
a1c0: 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c  OrderBy;.  ExprL
a1d0: 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73  ist *pEList;.  s
a1e0: 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e  qlite3 *db;.  in
a1f0: 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a  t moreToDo = 1;.
a200: 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53  .  pOrderBy = pS
a210: 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b  elect->pOrderBy;
a220: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
a230: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
a240: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
a250: 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79  ;.  if( pOrderBy
a260: 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d  ->nExpr>db->aLim
a270: 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f  it[SQLITE_LIMIT_
a280: 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73  COLUMN] ){.    s
a290: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
a2a0: 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79  Parse, "too many
a2b0: 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20   terms in ORDER 
a2c0: 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20  BY clause");.   
a2d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
a2e0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
a2f0: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
a300: 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d  ){.    pOrderBy-
a310: 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a  >a[i].done = 0;.
a320: 20 20 7d 0a 20 20 70 53 65 6c 65 63 74 2d 3e 70    }.  pSelect->p
a330: 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c  Next = 0;.  whil
a340: 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69  e( pSelect->pPri
a350: 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63  or ){.    pSelec
a360: 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74  t->pPrior->pNext
a370: 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20   = pSelect;.    
a380: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
a390: 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20  t->pPrior;.  }. 
a3a0: 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20   while( pSelect 
a3b0: 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20  && moreToDo ){. 
a3c0: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
a3d0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
a3e0: 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30      moreToDo = 0
a3f0: 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70  ;.    pEList = p
a400: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
a410: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c 69      assert( pELi
a420: 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72  st!=0 );.    for
a430: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
a440: 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
a450: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
a460: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
a470: 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a   int iCol = -1;.
a480: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20        Expr *pE, 
a490: 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28  *pDup;.      if(
a4a0: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 29 20 63   pItem->done ) c
a4b0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70  ontinue;.      p
a4c0: 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  E = sqlite3ExprS
a4d0: 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b  kipCollateAndLik
a4e0: 65 6c 79 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ely(pItem->pExpr
a4f0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  );.      if( sql
a500: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
a510: 72 28 70 45 2c 20 26 69 43 6f 6c 29 20 29 7b 0a  r(pE, &iCol) ){.
a520: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
a530: 3c 3d 30 20 7c 7c 20 69 43 6f 6c 3e 70 45 4c 69  <=0 || iCol>pELi
a540: 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20  st->nExpr ){.   
a550: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
a560: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
a570: 61 72 73 65 2c 20 22 4f 52 44 45 52 22 2c 20 69  arse, "ORDER", i
a580: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
a590: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  r);.          re
a5a0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
a5b0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
a5c0: 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65         iCol = re
a5d0: 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50 61 72  solveAsName(pPar
a5e0: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 45 29 3b  se, pEList, pE);
a5f0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f  .        if( iCo
a600: 6c 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  l==0 ){.        
a610: 20 20 2f 2a 20 4e 6f 77 20 74 65 73 74 20 69 66    /* Now test if
a620: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 20 6d   expression pE m
a630: 61 74 63 68 65 73 20 6f 6e 65 20 6f 66 20 74 68  atches one of th
a640: 65 20 76 61 6c 75 65 73 20 72 65 74 75 72 6e 65  e values returne
a650: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 62  d.          ** b
a660: 79 20 70 53 65 6c 65 63 74 2e 20 49 6e 20 74 68  y pSelect. In th
a670: 65 20 75 73 75 61 6c 20 63 61 73 65 20 74 68 69  e usual case thi
a680: 73 20 69 73 20 64 6f 6e 65 20 62 79 20 64 75 70  s is done by dup
a690: 6c 69 63 61 74 69 6e 67 20 74 68 65 20 0a 20 20  licating the .  
a6a0: 20 20 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65          ** expre
a6b0: 73 73 69 6f 6e 2c 20 72 65 73 6f 6c 76 69 6e 67  ssion, resolving
a6c0: 20 61 6e 79 20 73 79 6d 62 6f 6c 73 20 69 6e 20   any symbols in 
a6d0: 69 74 2c 20 61 6e 64 20 74 68 65 6e 20 63 6f 6d  it, and then com
a6e0: 70 61 72 69 6e 67 0a 20 20 20 20 20 20 20 20 20  paring.         
a6f0: 20 2a 2a 20 69 74 20 61 67 61 69 6e 73 74 20 65   ** it against e
a700: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 72  ach expression r
a710: 65 74 75 72 6e 65 64 20 62 79 20 74 68 65 20 53  eturned by the S
a720: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
a730: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 6e  .          ** On
a740: 63 65 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ce the compariso
a750: 6e 73 20 61 72 65 20 66 69 6e 69 73 68 65 64 2c  ns are finished,
a760: 20 74 68 65 20 64 75 70 6c 69 63 61 74 65 20 65   the duplicate e
a770: 78 70 72 65 73 73 69 6f 6e 0a 20 20 20 20 20 20  xpression.      
a780: 20 20 20 20 2a 2a 20 69 73 20 64 65 6c 65 74 65      ** is delete
a790: 64 2e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 0a  d..          **.
a7a0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 4f 72 2c            ** Or,
a7b0: 20 69 66 20 74 68 69 73 20 69 73 20 72 75 6e 6e   if this is runn
a7c0: 69 6e 67 20 61 73 20 70 61 72 74 20 6f 66 20 61  ing as part of a
a7d0: 6e 20 41 4c 54 45 52 20 54 41 42 4c 45 20 6f 70  n ALTER TABLE op
a7e0: 65 72 61 74 69 6f 6e 2c 0a 20 20 20 20 20 20 20  eration,.       
a7f0: 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68     ** resolve th
a800: 65 20 73 79 6d 62 6f 6c 73 20 69 6e 20 74 68 65  e symbols in the
a810: 20 61 63 74 75 61 6c 20 65 78 70 72 65 73 73 69   actual expressi
a820: 6f 6e 2c 20 6e 6f 74 20 61 20 64 75 70 6c 69 63  on, not a duplic
a830: 61 74 65 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ate..          *
a840: 2a 20 41 6e 64 2c 20 69 66 20 6f 6e 65 20 6f 66  * And, if one of
a850: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 73   the comparisons
a860: 20 69 73 20 73 75 63 63 65 73 73 66 75 6c 2c 20   is successful, 
a870: 6c 65 61 76 65 20 74 68 65 20 65 78 70 72 65 73  leave the expres
a880: 73 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  sion.          *
a890: 2a 20 61 73 20 69 73 20 69 6e 73 74 65 61 64 20  * as is instead 
a8a0: 6f 66 20 74 72 61 6e 73 66 6f 72 6d 69 6e 67 20  of transforming 
a8b0: 69 74 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  it to an integer
a8c0: 20 61 73 20 69 6e 20 74 68 65 20 75 73 75 61 6c   as in the usual
a8d0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 63 61  .          ** ca
a8e0: 73 65 2e 20 54 68 69 73 20 61 6c 6c 6f 77 73 20  se. This allows 
a8f0: 74 68 65 20 63 6f 64 65 20 69 6e 20 61 6c 74 65  the code in alte
a900: 72 2e 63 20 74 6f 20 6d 6f 64 69 66 79 20 63 6f  r.c to modify co
a910: 6c 75 6d 6e 0a 20 20 20 20 20 20 20 20 20 20 2a  lumn.          *
a920: 2a 20 72 65 66 65 72 65 72 65 6e 63 65 73 20 77  * refererences w
a930: 69 74 68 69 6e 20 74 68 65 20 4f 52 44 45 52 20  ithin the ORDER 
a940: 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20 61 73  BY expression as
a950: 20 72 65 71 75 69 72 65 64 2e 20 20 2a 2f 0a 20   required.  */. 
a960: 20 20 20 20 20 20 20 20 20 69 66 28 20 49 4e 5f           if( IN_
a970: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
a980: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44 75  .            pDu
a990: 70 20 3d 20 70 45 3b 0a 20 20 20 20 20 20 20 20  p = pE;.        
a9a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a9b0: 20 20 20 20 20 70 44 75 70 20 3d 20 73 71 6c 69       pDup = sqli
a9c0: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
a9d0: 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  E, 0);.         
a9e0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28   }.          if(
a9f0: 20 21 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c   !db->mallocFail
aa00: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ed ){.          
aa10: 20 20 61 73 73 65 72 74 28 70 44 75 70 29 3b 0a    assert(pDup);.
aa20: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
aa30: 20 3d 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42   = resolveOrderB
aa40: 79 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28  yTermToExprList(
aa50: 70 50 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c  pParse, pSelect,
aa60: 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20   pDup);.        
aa70: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
aa80: 28 20 21 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a  ( !IN_RENAME_OBJ
aa90: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ECT ){.         
aaa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
aab0: 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b 0a  lete(db, pDup);.
aac0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
aad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
aae0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29      if( iCol>0 )
aaf0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6e  {.        /* Con
ab00: 76 65 72 74 20 74 68 65 20 4f 52 44 45 52 20 42  vert the ORDER B
ab10: 59 20 74 65 72 6d 20 69 6e 74 6f 20 61 6e 20 69  Y term into an i
ab20: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
ab30: 6d 62 65 72 20 69 43 6f 6c 2c 0a 20 20 20 20 20  mber iCol,.     
ab40: 20 20 20 2a 2a 20 74 61 6b 69 6e 67 20 63 61 72     ** taking car
ab50: 65 20 74 6f 20 70 72 65 73 65 72 76 65 20 74 68  e to preserve th
ab60: 65 20 43 4f 4c 4c 41 54 45 20 63 6c 61 75 73 65  e COLLATE clause
ab70: 20 69 66 20 69 74 20 65 78 69 73 74 73 20 2a 2f   if it exists */
ab80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 49 4e  .        if( !IN
ab90: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
aba0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
abb0: 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 33   *pNew = sqlite3
abc0: 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e 54 45  Expr(db, TK_INTE
abd0: 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  GER, 0);.       
abe0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
abf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
ac00: 20 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73       pNew->flags
ac10: 20 7c 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b   |= EP_IntValue;
ac20: 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d  .          pNew-
ac30: 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 43 6f 6c  >u.iValue = iCol
ac40: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
ac50: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45  pItem->pExpr==pE
ac60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
ac70: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
ac80: 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  New;.          }
ac90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
aca0: 20 20 45 78 70 72 20 2a 70 50 61 72 65 6e 74 20    Expr *pParent 
acb0: 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a  = pItem->pExpr;.
acc0: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
acd0: 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6f 70 3d  rt( pParent->op=
ace0: 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b 0a 20  =TK_COLLATE );. 
acf0: 20 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65             while
ad00: 28 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  ( pParent->pLeft
ad10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
ad20: 20 29 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61   ) pParent = pPa
ad30: 72 65 6e 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  rent->pLeft;.   
ad40: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
ad50: 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3d   pParent->pLeft=
ad60: 3d 70 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =pE );.         
ad70: 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66     pParent->pLef
ad80: 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 20 20  t = pNew;.      
ad90: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
ada0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
adb0: 65 28 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20  e(db, pE);.     
adc0: 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e       pItem->u.x.
add0: 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75  iOrderByCol = (u
ade0: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
adf0: 20 7d 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d   }.        pItem
ae00: 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20 20 20  ->done = 1;.    
ae10: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
ae20: 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 20   moreToDo = 1;. 
ae30: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
ae40: 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65   pSelect = pSele
ae50: 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20  ct->pNext;.  }. 
ae60: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64   for(i=0; i<pOrd
ae70: 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  erBy->nExpr; i++
ae80: 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72 64 65  ){.    if( pOrde
ae90: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d  rBy->a[i].done==
aea0: 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 ){.      sqlit
aeb0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
aec0: 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42 59 20  e, "%r ORDER BY 
aed0: 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20 6d 61  term does not ma
aee0: 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20 20 20  tch any ".      
aef0: 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20 69 6e        "column in
af00: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 22   the result set"
af10: 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20 72 65  , i+1);.      re
af20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
af30: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
af40: 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65 76 65  ./*.** Check eve
af50: 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65 20 4f  ry term in the O
af60: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
af70: 20 42 59 20 63 6c 61 75 73 65 20 70 4f 72 64 65   BY clause pOrde
af80: 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20 53 45  rBy of.** the SE
af90: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
afa0: 53 65 6c 65 63 74 2e 20 20 49 66 20 61 6e 79 20  Select.  If any 
afb0: 74 65 72 6d 20 69 73 20 72 65 66 65 72 65 6e 63  term is referenc
afc0: 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75 6c 74  e to a.** result
afd0: 20 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20   set expression 
afe0: 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62  (as determined b
aff0: 79 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  y the ExprList.a
b000: 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  .u.x.iOrderByCol
b010: 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68 65 6e 20  .** field) then 
b020: 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74 65 72  convert that ter
b030: 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20 6f 66  m into a copy of
b040: 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69   the correspondi
b050: 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a 2a 2a  ng result set.**
b060: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
b070: 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61 72 65  f any errors are
b080: 20 64 65 74 65 63 74 65 64 2c 20 61 64 64 20 61   detected, add a
b090: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
b0a0: 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a 2a 2a  to pParse and.**
b0b0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
b0c0: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 69  .  Return zero i
b0d0: 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72 65 20  f no errors are 
b0e0: 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  seen..*/.int sql
b0f0: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
b100: 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72 73 65  GroupBy(.  Parse
b110: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
b120: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
b130: 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72 72 6f  ext.  Leave erro
b140: 72 20 6d 65 73 73 61 67 65 73 20 68 65 72 65 20  r messages here 
b150: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65  */.  Select *pSe
b160: 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  lect,      /* Th
b170: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
b180: 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68  nt containing th
b190: 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78  e clause */.  Ex
b1a0: 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79  prList *pOrderBy
b1b0: 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52  ,   /* The ORDER
b1c0: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
b1d0: 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70 72 6f  clause to be pro
b1e0: 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f 6e 73  cessed */.  cons
b1f0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20  t char *zType   
b200: 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72 20    /* "ORDER" or 
b210: 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a 20 20  "GROUP" */.){.  
b220: 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74 65 33  int i;.  sqlite3
b230: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
b240: 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  b;.  ExprList *p
b250: 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63 74 20  EList;.  struct 
b260: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
b270: 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70 4f 72  Item;..  if( pOr
b280: 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50 61 72  derBy==0 || pPar
b290: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
b2a0: 69 6c 65 64 20 7c 7c 20 49 4e 5f 52 45 4e 41 4d  iled || IN_RENAM
b2b0: 45 5f 4f 42 4a 45 43 54 20 29 20 72 65 74 75 72  E_OBJECT ) retur
b2c0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  n 0;.  if( pOrde
b2d0: 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61  rBy->nExpr>db->a
b2e0: 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d  Limit[SQLITE_LIM
b2f0: 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20  IT_COLUMN] ){.  
b300: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b310: 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d  g(pParse, "too m
b320: 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20  any terms in %s 
b330: 42 59 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70  BY clause", zTyp
b340: 65 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31  e);.    return 1
b350: 3b 0a 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d  ;.  }.  pEList =
b360: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
b370: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 4c 69  ;.  assert( pELi
b380: 73 74 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71 6c  st!=0 );  /* sql
b390: 69 74 65 33 53 65 6c 65 63 74 4e 65 77 28 29 20  ite3SelectNew() 
b3a0: 67 75 61 72 61 6e 74 65 65 73 20 74 68 69 73 20  guarantees this 
b3b0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49  */.  for(i=0, pI
b3c0: 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b  tem=pOrderBy->a;
b3d0: 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78   i<pOrderBy->nEx
b3e0: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
b3f0: 29 7b 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d  ){.    if( pItem
b400: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
b410: 6c 20 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70  l ){.      if( p
b420: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
b430: 42 79 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45  ByCol>pEList->nE
b440: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72  xpr ){.        r
b450: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
b460: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54  Error(pParse, zT
b470: 79 70 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74  ype, i+1, pEList
b480: 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ->nExpr);.      
b490: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
b4a0: 20 20 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76    }.      resolv
b4b0: 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
b4c0: 45 4c 69 73 74 2c 20 70 49 74 65 6d 2d 3e 75 2e  EList, pItem->u.
b4d0: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c  x.iOrderByCol-1,
b4e0: 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 0a 20   pItem->pExpr,. 
b4f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b500: 20 20 7a 54 79 70 65 2c 30 29 3b 0a 20 20 20 20    zType,0);.    
b510: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
b520: 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ;.}..#ifndef SQL
b530: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
b540: 55 4e 43 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 65 72  UNC./*.** Walker
b550: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 69   callback for wi
b560: 6e 64 6f 77 52 65 6d 6f 76 65 45 78 70 72 46 72  ndowRemoveExprFr
b570: 6f 6d 53 65 6c 65 63 74 28 29 2e 0a 2a 2f 0a 73  omSelect()..*/.s
b580: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
b590: 65 52 65 6d 6f 76 65 57 69 6e 64 6f 77 73 43 62  eRemoveWindowsCb
b5a0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
b5b0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
b5c0: 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45 54    UNUSED_PARAMET
b5d0: 45 52 28 70 57 61 6c 6b 65 72 29 3b 0a 20 20 69  ER(pWalker);.  i
b5e0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
b5f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e  ty(pExpr, EP_Win
b600: 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 57 69 6e  Func) ){.    Win
b610: 64 6f 77 20 2a 70 57 69 6e 20 3d 20 70 45 78 70  dow *pWin = pExp
b620: 72 2d 3e 79 2e 70 57 69 6e 3b 0a 20 20 20 20 73  r->y.pWin;.    s
b630: 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 6e 6c 69  qlite3WindowUnli
b640: 6e 6b 46 72 6f 6d 53 65 6c 65 63 74 28 70 57 69  nkFromSelect(pWi
b650: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
b660: 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d   WRC_Continue;.}
b670: 0a 0a 2f 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 61  ../*.** Remove a
b680: 6e 79 20 57 69 6e 64 6f 77 20 6f 62 6a 65 63 74  ny Window object
b690: 73 20 6f 77 6e 65 64 20 62 79 20 74 68 65 20 65  s owned by the e
b6a0: 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20  xpression pExpr 
b6b0: 66 72 6f 6d 20 74 68 65 0a 2a 2a 20 53 65 6c 65  from the.** Sele
b6c0: 63 74 2e 70 57 69 6e 20 6c 69 73 74 20 6f 66 20  ct.pWin list of 
b6d0: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 70 53  Select object pS
b6e0: 65 6c 65 63 74 2e 0a 2a 2f 0a 73 74 61 74 69 63  elect..*/.static
b6f0: 20 76 6f 69 64 20 77 69 6e 64 6f 77 52 65 6d 6f   void windowRemo
b700: 76 65 45 78 70 72 46 72 6f 6d 53 65 6c 65 63 74  veExprFromSelect
b710: 28 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74  (Select *pSelect
b720: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
b730: 20 20 69 66 28 20 70 53 65 6c 65 63 74 2d 3e 70    if( pSelect->p
b740: 57 69 6e 20 29 7b 0a 20 20 20 20 57 61 6c 6b 65  Win ){.    Walke
b750: 72 20 73 57 61 6c 6b 65 72 3b 0a 20 20 20 20 6d  r sWalker;.    m
b760: 65 6d 73 65 74 28 26 73 57 61 6c 6b 65 72 2c 20  emset(&sWalker, 
b770: 30 2c 20 73 69 7a 65 6f 66 28 57 61 6c 6b 65 72  0, sizeof(Walker
b780: 29 29 3b 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e  ));.    sWalker.
b790: 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20  xExprCallback = 
b7a0: 72 65 73 6f 6c 76 65 52 65 6d 6f 76 65 57 69 6e  resolveRemoveWin
b7b0: 64 6f 77 73 43 62 3b 0a 20 20 20 20 73 57 61 6c  dowsCb;.    sWal
b7c0: 6b 65 72 2e 75 2e 70 53 65 6c 65 63 74 20 3d 20  ker.u.pSelect = 
b7d0: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 73 71 6c  pSelect;.    sql
b7e0: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 73 57  ite3WalkExpr(&sW
b7f0: 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b 0a 20  alker, pExpr);. 
b800: 20 7d 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66   }.}.#else.# def
b810: 69 6e 65 20 77 69 6e 64 6f 77 52 65 6d 6f 76 65  ine windowRemove
b820: 45 78 70 72 46 72 6f 6d 53 65 6c 65 63 74 28 61  ExprFromSelect(a
b830: 2c 20 62 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53  , b).#endif /* S
b840: 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f  QLITE_OMIT_WINDO
b850: 57 46 55 4e 43 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  WFUNC */../*.** 
b860: 70 4f 72 64 65 72 42 79 20 69 73 20 61 6e 20 4f  pOrderBy is an O
b870: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
b880: 20 42 59 20 63 6c 61 75 73 65 20 69 6e 20 53 45   BY clause in SE
b890: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
b8a0: 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68 65 20 4e  Select..** The N
b8b0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
b8c0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
b8d0: 65 6e 74 20 69 73 20 70 4e 43 2e 20 20 7a 54 79  ent is pNC.  zTy
b8e0: 70 65 20 69 73 20 65 69 74 68 65 72 0a 2a 2a 20  pe is either.** 
b8f0: 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55  "ORDER" or "GROU
b900: 50 22 20 64 65 70 65 6e 64 69 6e 67 20 6f 6e 20  P" depending on 
b910: 77 68 69 63 68 20 74 79 70 65 20 6f 66 20 63 6c  which type of cl
b920: 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 69 73  ause pOrderBy is
b930: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
b940: 74 69 6e 65 20 72 65 73 6f 6c 76 65 73 20 65 61  tine resolves ea
b950: 63 68 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63  ch term of the c
b960: 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e 20 65 78  lause into an ex
b970: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20  pression..** If 
b980: 74 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72  the order-by ter
b990: 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20  m is an integer 
b9a0: 49 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  I between 1 and 
b9b0: 4e 20 28 77 68 65 72 65 20 4e 20 69 73 20 74 68  N (where N is th
b9c0: 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 63  e.** number of c
b9d0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65  olumns in the re
b9e0: 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68 65 20  sult set of the 
b9f0: 53 45 4c 45 43 54 29 20 74 68 65 6e 20 74 68 65  SELECT) then the
ba00: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
ba10: 6e 20 74 68 65 20 72 65 73 6f 6c 75 74 69 6f 6e  n the resolution
ba20: 20 69 73 20 61 20 63 6f 70 79 20 6f 66 20 74 68   is a copy of th
ba30: 65 20 49 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  e I-th result-se
ba40: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  t expression.  I
ba50: 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65 72 2d 62  f.** the order-b
ba60: 79 20 74 65 72 6d 20 69 73 20 61 6e 20 69 64 65  y term is an ide
ba70: 6e 74 69 66 69 65 72 20 74 68 61 74 20 63 6f 72  ntifier that cor
ba80: 72 65 73 70 6f 6e 64 73 20 74 6f 20 74 68 65 20  responds to the 
ba90: 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a 20 61 20  AS-name of.** a 
baa0: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
bab0: 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20  ssion, then the 
bac0: 74 65 72 6d 20 72 65 73 6f 6c 76 65 73 20 74 6f  term resolves to
bad0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 0a 2a   a copy of the.*
bae0: 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  * result-set exp
baf0: 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68 65 72 77  ression.  Otherw
bb00: 69 73 65 2c 20 74 68 65 20 65 78 70 72 65 73 73  ise, the express
bb10: 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76 65 64 20  ion is resolved 
bb20: 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75 61 6c 20  in.** the usual 
bb30: 77 61 79 20 2d 20 75 73 69 6e 67 20 73 71 6c 69  way - using sqli
bb40: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
bb50: 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  mes()..**.** Thi
bb60: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
bb70: 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  s the number of 
bb80: 65 72 72 6f 72 73 2e 20 20 49 66 20 65 72 72 6f  errors.  If erro
bb90: 72 73 20 6f 63 63 75 72 2c 20 74 68 65 6e 0a 2a  rs occur, then.*
bba0: 2a 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  * an appropriate
bbb0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6d   error message m
bbc0: 69 67 68 74 20 62 65 20 6c 65 66 74 20 69 6e 20  ight be left in 
bbd0: 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d 20 65 72  pParse.  (OOM er
bbe0: 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70 74 65 64  rors.** excepted
bbf0: 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  .).*/.static int
bc00: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
bc10: 75 70 42 79 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  upBy(.  NameCont
bc20: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 2f 2a  ext *pNC,     /*
bc30: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
bc40: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 20  t of the SELECT 
bc50: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 53  statement */.  S
bc60: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
bc70: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
bc80: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 68 6f 6c  CT statement hol
bc90: 64 69 6e 67 20 70 4f 72 64 65 72 42 79 20 2a 2f  ding pOrderBy */
bca0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
bcb0: 64 65 72 42 79 2c 20 20 20 2f 2a 20 41 6e 20 4f  derBy,   /* An O
bcc0: 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50  RDER BY or GROUP
bcd0: 20 42 59 20 63 6c 61 75 73 65 20 74 6f 20 72 65   BY clause to re
bce0: 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f 6e 73 74  solve */.  const
bcf0: 20 63 68 61 72 20 2a 7a 54 79 70 65 20 20 20 20   char *zType    
bd00: 20 2f 2a 20 45 69 74 68 65 72 20 22 4f 52 44 45   /* Either "ORDE
bd10: 52 22 20 6f 72 20 22 47 52 4f 55 50 22 2c 20 61  R" or "GROUP", a
bd20: 73 20 61 70 70 72 6f 70 72 69 61 74 65 20 2a 2f  s appropriate */
bd30: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
bd40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd50: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
bd60: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 69  nters */.  int i
bd70: 43 6f 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20  Col;            
bd80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 6c            /* Col
bd90: 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  umn number */.  
bda0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
bdb0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20 20 2f  item *pItem;   /
bdc0: 2a 20 41 20 74 65 72 6d 20 6f 66 20 74 68 65 20  * A term of the 
bdd0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
bde0: 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  */.  Parse *pPar
bdf0: 73 65 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  se;             
be00: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
be10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20  ontext */.  int 
be20: 6e 52 65 73 75 6c 74 3b 20 20 20 20 20 20 20 20  nResult;        
be30: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
be40: 6d 62 65 72 20 6f 66 20 74 65 72 6d 73 20 69 6e  mber of terms in
be50: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
be60: 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72  */..  if( pOrder
be70: 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  By==0 ) return 0
be80: 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d 20 70 53  ;.  nResult = pS
be90: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
bea0: 45 78 70 72 3b 0a 20 20 70 50 61 72 73 65 20 3d  Expr;.  pParse =
beb0: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
bec0: 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70  for(i=0, pItem=p
bed0: 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f  OrderBy->a; i<pO
bee0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
bef0: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
bf00: 20 20 45 78 70 72 20 2a 70 45 20 3d 20 70 49 74    Expr *pE = pIt
bf10: 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 45  em->pExpr;.    E
bf20: 78 70 72 20 2a 70 45 32 20 3d 20 73 71 6c 69 74  xpr *pE2 = sqlit
bf30: 65 33 45 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74  e3ExprSkipCollat
bf40: 65 41 6e 64 4c 69 6b 65 6c 79 28 70 45 29 3b 0a  eAndLikely(pE);.
bf50: 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d      if( zType[0]
bf60: 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20 20 69  !='G' ){.      i
bf70: 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e  Col = resolveAsN
bf80: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ame(pParse, pSel
bf90: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45 32  ect->pEList, pE2
bfa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
bfb0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  l>0 ){.        /
bfc0: 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20  * If an AS-name 
bfd0: 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
bfe0: 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20  mark this ORDER 
bff0: 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69  BY column as bei
c000: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ng.        ** a 
c010: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
c020: 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 63  -th result-set c
c030: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 62 73  olumn.  The subs
c040: 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  equent call to. 
c050: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
c060: 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
c070: 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76  upBy() will conv
c080: 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
c090: 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20  on to a.        
c0a0: 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69  ** copy of the i
c0b0: 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  Col-th result-se
c0c0: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  t expression. */
c0d0: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
c0e0: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
c0f0: 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20  = (u16)iCol;.   
c100: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
c110: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
c120: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
c130: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
c140: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f  iCol) ){.      /
c150: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 74  * The ORDER BY t
c160: 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65  erm is an intege
c170: 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 67 61  r constant.  Aga
c180: 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  in, set the colu
c190: 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  mn.      ** numb
c1a0: 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  er so that sqlit
c1b0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
c1c0: 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e  oupBy() will con
c1d0: 76 65 72 74 20 74 68 65 0a 20 20 20 20 20 20 2a  vert the.      *
c1e0: 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  * order-by term 
c1f0: 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
c200: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
c210: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
c220: 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 69 43  if( iCol<1 || iC
c230: 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20 20 20  ol>0xffff ){.   
c240: 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f       resolveOutO
c250: 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72  fRangeError(pPar
c260: 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20  se, zType, i+1, 
c270: 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  nResult);.      
c280: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
c290: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d    }.      pItem-
c2a0: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
c2b0: 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20   = (u16)iCol;.  
c2c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
c2d0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65    }..    /* Othe
c2e0: 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 68 65  rwise, treat the
c2f0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 61   ORDER BY term a
c300: 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 65 78  s an ordinary ex
c310: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
c320: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
c330: 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rByCol = 0;.    
c340: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
c350: 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c  veExprNames(pNC,
c360: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pE) ){.      re
c370: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
c380: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 65    for(j=0; j<pSe
c390: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
c3a0: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
c3b0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
c3c0: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 2c 20 70  Compare(0, pE, p
c3d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
c3e0: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d  a[j].pExpr, -1)=
c3f0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
c400: 20 53 69 6e 63 65 20 74 68 69 73 20 65 78 70 72   Since this expr
c410: 65 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  esion is being c
c420: 68 61 6e 67 65 64 20 69 6e 74 6f 20 61 20 72 65  hanged into a re
c430: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20 20  ference.        
c440: 2a 2a 20 74 6f 20 61 6e 20 69 64 65 6e 74 69 63  ** to an identic
c450: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e  al expression in
c460: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
c470: 20 72 65 6d 6f 76 65 20 61 6c 6c 20 57 69 6e 64   remove all Wind
c480: 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 62  ow.        ** ob
c490: 6a 65 63 74 73 20 62 65 6c 6f 6e 67 69 6e 67 20  jects belonging 
c4a0: 74 6f 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  to the expressio
c4b0: 6e 20 66 72 6f 6d 20 74 68 65 20 53 65 6c 65 63  n from the Selec
c4c0: 74 2e 70 57 69 6e 20 6c 69 73 74 2e 20 2a 2f 0a  t.pWin list. */.
c4d0: 20 20 20 20 20 20 20 20 77 69 6e 64 6f 77 52 65          windowRe
c4e0: 6d 6f 76 65 45 78 70 72 46 72 6f 6d 53 65 6c 65  moveExprFromSele
c4f0: 63 74 28 70 53 65 6c 65 63 74 2c 20 70 45 29 3b  ct(pSelect, pE);
c500: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
c510: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
c520: 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20  = j+1;.      }. 
c530: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
c540: 6e 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  n sqlite3Resolve
c550: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50 61  OrderGroupBy(pPa
c560: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f  rse, pSelect, pO
c570: 72 64 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a  rderBy, zType);.
c580: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  }../*.** Resolve
c590: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45   names in the SE
c5a0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
c5b0: 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20   and all of its 
c5c0: 64 65 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a  descendants..*/.
c5d0: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
c5e0: 76 65 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c  veSelectStep(Wal
c5f0: 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65  ker *pWalker, Se
c600: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65  lect *p){.  Name
c610: 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e  Context *pOuterN
c620: 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74  C;  /* Context t
c630: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69  hat contains thi
c640: 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61  s SELECT */.  Na
c650: 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20  meContext sNC;  
c660: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f        /* Name co
c670: 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20 53 45  ntext of this SE
c680: 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73  LECT */.  int is
c690: 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20  Compound;       
c6a0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69    /* True if p i
c6b0: 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c  s a compound sel
c6c0: 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f  ect */.  int nCo
c6d0: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
c6e0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f   /* Number of co
c6f0: 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f  mpound terms pro
c700: 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f  cessed so far */
c710: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
c720: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61  ;          /* Pa
c730: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
c740: 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20  .  int i;       
c750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
c760: 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20  op counter */.  
c770: 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70  ExprList *pGroup
c780: 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 47  By;     /* The G
c790: 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a  ROUP BY clause *
c7a0: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66  /.  Select *pLef
c7b0: 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c  tmost;      /* L
c7c0: 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45  eft-most of SELE
c7d0: 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64  CT of a compound
c7e0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
c7f0: 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b;            /*
c800: 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63   Database connec
c810: 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61 73  tion */.  ..  as
c820: 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20  sert( p!=0 );.  
c830: 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20  if( p->selFlags 
c840: 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 7b  & SF_Resolved ){
c850: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
c860: 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f 75  Prune;.  }.  pOu
c870: 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d  terNC = pWalker-
c880: 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73 65  >u.pNC;.  pParse
c890: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72   = pWalker->pPar
c8a0: 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73  se;.  db = pPars
c8b0: 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f 72  e->db;..  /* Nor
c8c0: 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53 65 6c  mally sqlite3Sel
c8d0: 65 63 74 45 78 70 61 6e 64 28 29 20 77 69 6c 6c  ectExpand() will
c8e0: 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74   be called first
c8f0: 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a 20   and will have. 
c900: 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 70 61   ** already expa
c910: 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45 43 54  nded this SELECT
c920: 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74  .  However, if t
c930: 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65 72  his is a subquer
c940: 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61 6e  y within.  ** an
c950: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 71 6c   expression, sql
c960: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
c970: 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65 20 63  ames() will be c
c980: 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20 61 0a  alled without a.
c990: 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c 20    ** prior call 
c9a0: 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  to sqlite3Select
c9b0: 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65 6e 20  Expand().  When 
c9c0: 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 6c 65  that happens, le
c9d0: 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65  t.  ** sqlite3Se
c9e0: 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20 61 6c  lectPrep() do al
c9f0: 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73  l of the process
ca00: 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c  ing for this SEL
ca10: 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74 65  ECT..  ** sqlite
ca20: 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 77 69  3SelectPrep() wi
ca30: 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20 73  ll invoke both s
ca40: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
ca50: 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74 68  nd() and.  ** th
ca60: 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68  is routine in th
ca70: 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e  e correct order.
ca80: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e  .  */.  if( (p->
ca90: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78  selFlags & SF_Ex
caa0: 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20 20  panded)==0 ){.  
cab0: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50    sqlite3SelectP
cac0: 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70  rep(pParse, p, p
cad0: 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 72 65  OuterNC);.    re
cae0: 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45  turn (pParse->nE
caf0: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
cb00: 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62  Failed) ? WRC_Ab
cb10: 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b  ort : WRC_Prune;
cb20: 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f 75  .  }..  isCompou
cb30: 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21 3d  nd = p->pPrior!=
cb40: 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20 3d  0;.  nCompound =
cb50: 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74 20   0;.  pLeftmost 
cb60: 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20  = p;.  while( p 
cb70: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  ){.    assert( (
cb80: 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  p->selFlags & SF
cb90: 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29 3b  _Expanded)!=0 );
cba0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
cbb0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
cbc0: 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a 20  esolved)==0 );. 
cbd0: 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c     p->selFlags |
cbe0: 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a 0a  = SF_Resolved;..
cbf0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74      /* Resolve t
cc00: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  he expressions i
cc10: 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  n the LIMIT and 
cc20: 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20  OFFSET clauses. 
cc30: 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61 72 65  These.    ** are
cc40: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20   not allowed to 
cc50: 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d  refer to any nam
cc60: 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65  es, so pass an e
cc70: 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74  mpty NameContext
cc80: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d  ..    */.    mem
cc90: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
cca0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73  eof(sNC));.    s
ccb0: 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72  NC.pParse = pPar
ccc0: 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 57 69 6e  se;.    sNC.pWin
ccd0: 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 20 20  Select = p;.    
cce0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
ccf0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
cd00: 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b 0a  , p->pLimit) ){.
cd10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
cd20: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20  _Abort;.    }.. 
cd30: 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 46 5f     /* If the SF_
cd40: 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67 73 20  Converted flags 
cd50: 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69  is set, then thi
cd60: 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20  s Select object 
cd70: 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73 20 63  was.    ** was c
cd80: 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63 6f  reated by the co
cd90: 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c  nvertCompoundSel
cda0: 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 29 20  ectToSubquery() 
cdb0: 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a  function..    **
cdc0: 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74 68   In this case th
cdd0: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
cde0: 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20  e (p->pOrderBy) 
cdf0: 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c 76  should be resolv
ce00: 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69 66 20  ed.    ** as if 
ce10: 69 74 20 77 65 72 65 20 70 61 72 74 20 6f 66 20  it were part of 
ce20: 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20 6e  the sub-query, n
ce30: 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e 20 54  ot the parent. T
ce40: 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a  his block.    **
ce50: 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72 64 65   moves the pOrde
ce60: 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68 65 20  rBy down to the 
ce70: 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20 77 69  sub-query. It wi
ce80: 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61 63 6b  ll be moved back
ce90: 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68  .    ** after th
cea0: 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62 65 65  e names have bee
ceb0: 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a 2f 0a  n resolved.  */.
cec0: 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
ced0: 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74  ags & SF_Convert
cee0: 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ed ){.      Sele
cef0: 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53  ct *pSub = p->pS
cf00: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
cf10: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
cf20: 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31  p->pSrc->nSrc==1
cf30: 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 20   && p->pOrderBy 
cf40: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cf50: 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 26 26   pSub->pPrior &&
cf60: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3d   pSub->pOrderBy=
cf70: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 75 62  =0 );.      pSub
cf80: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e  ->pOrderBy = p->
cf90: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
cfa0: 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b  p->pOrderBy = 0;
cfb0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
cfc0: 20 52 65 63 75 72 73 69 76 65 6c 79 20 72 65 73   Recursively res
cfd0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c  olve names in al
cfe0: 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20 20 20  l subqueries.   
cff0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d000: 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
d010: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
d020: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
d030: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
d040: 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
d050: 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c   if( pItem->pSel
d060: 65 63 74 20 26 26 20 28 70 49 74 65 6d 2d 3e 70  ect && (pItem->p
d070: 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c 61 67 73  Select->selFlags
d080: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 29 3d   & SF_Resolved)=
d090: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61  =0 ){.        Na
d0a0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20  meContext *pNC; 
d0b0: 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20          /* Used 
d0c0: 74 6f 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20  to iterate name 
d0d0: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
d0e0: 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30      int nRef = 0
d0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
d100: 20 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f   Refcount for pO
d110: 75 74 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72  uterNC and outer
d120: 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20   contexts */.   
d130: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
d140: 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d  *zSavedContext =
d150: 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f   pParse->zAuthCo
d160: 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20  ntext;..        
d170: 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74  /* Count the tot
d180: 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66  al number of ref
d190: 65 72 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65  erences to pOute
d1a0: 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69  rNC and all of i
d1b0: 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61  ts.        ** pa
d1c0: 72 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41  rent contexts. A
d1d0: 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72  fter resolving r
d1e0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70  eferences to exp
d1f0: 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20  ressions in.    
d200: 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53      ** pItem->pS
d210: 65 6c 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20  elect, check if 
d220: 74 68 69 73 20 76 61 6c 75 65 20 68 61 73 20 63  this value has c
d230: 68 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74  hanged. If so, t
d240: 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53  hen.        ** S
d250: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
d260: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d  pItem->pSelect m
d270: 75 73 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65  ust be correlate
d280: 64 2e 20 53 65 74 20 74 68 65 0a 20 20 20 20 20  d. Set the.     
d290: 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66 67 2e     ** pItem->fg.
d2a0: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 66 6c 61  isCorrelated fla
d2b0: 67 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65  g if this is the
d2c0: 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20   case. */.      
d2d0: 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72    for(pNC=pOuter
d2e0: 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43  NC; pNC; pNC=pNC
d2f0: 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d  ->pNext) nRef +=
d300: 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20   pNC->nRef;..   
d310: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
d320: 7a 4e 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e  zName ) pParse->
d330: 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70  zAuthContext = p
d340: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  Item->zName;.   
d350: 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f       sqlite3Reso
d360: 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70  lveSelectNames(p
d370: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53  Parse, pItem->pS
d380: 65 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e 43 29  elect, pOuterNC)
d390: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
d3a0: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
d3b0: 20 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a   zSavedContext;.
d3c0: 20 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72          if( pPar
d3d0: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e  se->nErr || db->
d3e0: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72  mallocFailed ) r
d3f0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
d400: 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e  ..        for(pN
d410: 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b  C=pOuterNC; pNC;
d420: 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29   pNC=pNC->pNext)
d430: 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52   nRef -= pNC->nR
d440: 65 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  ef;.        asse
d450: 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  rt( pItem->fg.is
d460: 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26  Correlated==0 &&
d470: 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20   nRef<=0 );.    
d480: 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73      pItem->fg.is
d490: 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52  Correlated = (nR
d4a0: 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a  ef!=0);.      }.
d4b0: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
d4c0: 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c  Set up the local
d4d0: 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f   name-context to
d4e0: 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33   pass to sqlite3
d4f0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
d500: 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73  () to.    ** res
d510: 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d  olve the result-
d520: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  set expression l
d530: 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ist..    */.    
d540: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43  sNC.ncFlags = NC
d550: 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 41 6c 6c  _AllowAgg|NC_All
d560: 6f 77 57 69 6e 3b 0a 20 20 20 20 73 4e 43 2e 70  owWin;.    sNC.p
d570: 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72  SrcList = p->pSr
d580: 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  c;.    sNC.pNext
d590: 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 0a   = pOuterNC;.  .
d5a0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e      /* Resolve n
d5b0: 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ames in the resu
d5c0: 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69  lt set. */.    i
d5d0: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
d5e0: 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26  eExprListNames(&
d5f0: 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74 29 20  sNC, p->pEList) 
d600: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
d610: 72 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c  rt;.    sNC.ncFl
d620: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
d630: 57 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49  Win;.  .    /* I
d640: 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61  f there are no a
d650: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
d660: 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  ns in the result
d670: 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f  -set, and no GRO
d680: 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65 78  UP BY .    ** ex
d690: 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74  pression, do not
d6a0: 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
d6b0: 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20  s in any of the 
d6c0: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
d6d0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73  s..    */.    as
d6e0: 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61  sert( (p->selFla
d6f0: 67 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74  gs & SF_Aggregat
d700: 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47 72  e)==0 );.    pGr
d710: 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75  oupBy = p->pGrou
d720: 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47 72  pBy;.    if( pGr
d730: 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63  oupBy || (sNC.nc
d740: 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67  Flags & NC_HasAg
d750: 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  g)!=0 ){.      a
d760: 73 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d 61 78  ssert( NC_MinMax
d770: 41 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78 41 67  Agg==SF_MinMaxAg
d780: 67 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65  g );.      p->se
d790: 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67  lFlags |= SF_Agg
d7a0: 72 65 67 61 74 65 20 7c 20 28 73 4e 43 2e 6e 63  regate | (sNC.nc
d7b0: 46 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61 78 41  Flags&NC_MinMaxA
d7c0: 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  gg);.    }else{.
d7d0: 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67        sNC.ncFlag
d7e0: 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67  s &= ~NC_AllowAg
d7f0: 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  g;.    }.  .    
d800: 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63  /* If a HAVING c
d810: 6c 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74  lause is present
d820: 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73  , then there mus
d830: 74 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20  t be a GROUP BY 
d840: 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20  clause..    */. 
d850: 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e     if( p->pHavin
d860: 67 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29  g && !pGroupBy )
d870: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
d880: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
d890: 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  "a GROUP BY clau
d8a0: 73 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62  se is required b
d8b0: 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a  efore HAVING");.
d8c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
d8d0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20  _Abort;.    }.  
d8e0: 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20  .    /* Add the 
d8f0: 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69  output column li
d900: 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63  st to the name-c
d910: 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61  ontext before pa
d920: 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a  rsing the.    **
d930: 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f   other expressio
d940: 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54  ns in the SELECT
d950: 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73   statement. This
d960: 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20   is so that.    
d970: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  ** expressions i
d980: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
d990: 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65  se (etc.) can re
d9a0: 66 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f  fer to expressio
d9b0: 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69  ns by.    ** ali
d9c0: 61 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75  ases in the resu
d9d0: 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20  lt set..    **. 
d9e0: 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e     ** Minor poin
d9f0: 74 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68  t: If this is th
da00: 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65  e case, then the
da10: 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c   expression will
da20: 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76   be.    ** re-ev
da30: 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68  aluated for each
da40: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74   reference to it
da50: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
da60: 65 72 74 28 20 28 73 4e 43 2e 6e 63 46 6c 61 67  ert( (sNC.ncFlag
da70: 73 20 26 20 28 4e 43 5f 55 41 67 67 49 6e 66 6f  s & (NC_UAggInfo
da80: 7c 4e 43 5f 55 55 70 73 65 72 74 29 29 3d 3d 30  |NC_UUpsert))==0
da90: 20 29 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e   );.    sNC.uNC.
daa0: 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69  pEList = p->pELi
dab0: 73 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c  st;.    sNC.ncFl
dac0: 61 67 73 20 7c 3d 20 4e 43 5f 55 45 4c 69 73 74  ags |= NC_UEList
dad0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
dae0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
daf0: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69  s(&sNC, p->pHavi
db00: 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  ng) ) return WRC
db10: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20  _Abort;.    if( 
db20: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
db30: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d  prNames(&sNC, p-
db40: 3e 70 57 68 65 72 65 29 20 29 20 72 65 74 75 72  >pWhere) ) retur
db50: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20  n WRC_Abort;..  
db60: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d    /* Resolve nam
db70: 65 73 20 69 6e 20 74 61 62 6c 65 2d 76 61 6c 75  es in table-valu
db80: 65 64 2d 66 75 6e 63 74 69 6f 6e 20 61 72 67 75  ed-function argu
db90: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72  ments */.    for
dba0: 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d  (i=0; i<p->pSrc-
dbb0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
dbc0: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
dbd0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
dbe0: 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a  &p->pSrc->a[i];.
dbf0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
dc00: 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 0a 20 20  >fg.isTabFunc.  
dc10: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 52       && sqlite3R
dc20: 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61  esolveExprListNa
dc30: 6d 65 73 28 26 73 4e 43 2c 20 70 49 74 65 6d 2d  mes(&sNC, pItem-
dc40: 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 20 0a 20  >u1.pFuncArg) . 
dc50: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
dc60: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
dc70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
dc80: 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45  .    /* The ORDE
dc90: 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42  R BY and GROUP B
dca0: 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f  Y clauses may no
dcb0: 74 20 72 65 66 65 72 20 74 6f 20 74 65 72 6d 73  t refer to terms
dcc0: 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72   in.    ** outer
dcd0: 20 71 75 65 72 69 65 73 20 0a 20 20 20 20 2a 2f   queries .    */
dce0: 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d  .    sNC.pNext =
dcf0: 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c   0;.    sNC.ncFl
dd00: 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41  ags |= NC_AllowA
dd10: 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a  gg|NC_AllowWin;.
dd20: 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20  .    /* If this 
dd30: 69 73 20 61 20 63 6f 6e 76 65 72 74 65 64 20 63  is a converted c
dd40: 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d  ompound query, m
dd50: 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59  ove the ORDER BY
dd60: 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 0a 20 20   clause from .  
dd70: 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 71 75 65    ** the sub-que
dd80: 72 79 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70  ry back to the p
dd90: 61 72 65 6e 74 20 71 75 65 72 79 2e 20 41 74 20  arent query. At 
dda0: 74 68 69 73 20 70 6f 69 6e 74 20 65 61 63 68 20  this point each 
ddb0: 74 65 72 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68  term.    ** with
ddc0: 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  in the ORDER BY 
ddd0: 63 6c 61 75 73 65 20 68 61 73 20 62 65 65 6e 20  clause has been 
dde0: 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61  transformed to a
ddf0: 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e  n integer value.
de00: 0a 20 20 20 20 2a 2a 20 54 68 65 73 65 20 69 6e  .    ** These in
de10: 74 65 67 65 72 73 20 77 69 6c 6c 20 62 65 20 72  tegers will be r
de20: 65 70 6c 61 63 65 64 20 62 79 20 63 6f 70 69 65  eplaced by copie
de30: 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70  s of the corresp
de40: 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74 0a 20 20  onding result.  
de50: 20 20 2a 2a 20 73 65 74 20 65 78 70 72 65 73 73    ** set express
de60: 69 6f 6e 73 20 62 79 20 74 68 65 20 63 61 6c 6c  ions by the call
de70: 20 74 6f 20 72 65 73 6f 6c 76 65 4f 72 64 65 72   to resolveOrder
de80: 47 72 6f 75 70 42 79 28 29 20 62 65 6c 6f 77 2e  GroupBy() below.
de90: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e    */.    if( p->
dea0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f  selFlags & SF_Co
deb0: 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20  nverted ){.     
dec0: 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20   Select *pSub = 
ded0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53  p->pSrc->a[0].pS
dee0: 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e  elect;.      p->
def0: 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d  pOrderBy = pSub-
df00: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
df10: 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20   pSub->pOrderBy 
df20: 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  = 0;.    }..    
df30: 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4f  /* Process the O
df40: 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66  RDER BY clause f
df50: 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c  or singleton SEL
df60: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a  ECT statements..
df70: 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44 45 52      ** The ORDER
df80: 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 63   BY clause for c
df90: 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43 54 20  ompounds SELECT 
dfa0: 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20 68 61  statements is ha
dfb0: 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c  ndled.    ** bel
dfc0: 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 66  ow, after all of
dfd0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 73   the result-sets
dfe0: 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20   for all of the 
dff0: 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20  elements of.    
e000: 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20  ** the compound 
e010: 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76  have been resolv
e020: 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ed..    **.    *
e030: 2a 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e  * If there is an
e040: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
e050: 20 6f 6e 20 61 20 74 65 72 6d 20 6f 66 20 61 20   on a term of a 
e060: 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20  compound-select 
e070: 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61  other.    ** tha
e080: 6e 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74  n the right-most
e090: 20 74 65 72 6d 2c 20 74 68 65 6e 20 74 68 61 74   term, then that
e0a0: 20 69 73 20 61 20 73 79 6e 74 61 78 20 65 72 72   is a syntax err
e0b0: 6f 72 2e 20 20 42 75 74 20 74 68 65 20 65 72 72  or.  But the err
e0c0: 6f 72 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74  or.    ** is not
e0d0: 20 64 65 74 65 63 74 65 64 20 75 6e 74 69 6c 20   detected until 
e0e0: 6d 75 63 68 20 6c 61 74 65 72 2c 20 61 6e 64 20  much later, and 
e0f0: 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 67 6f  so we need to go
e100: 20 61 68 65 61 64 20 61 6e 64 0a 20 20 20 20 2a   ahead and.    *
e110: 2a 20 72 65 73 6f 6c 76 65 20 74 68 6f 73 65 20  * resolve those 
e120: 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20 69  symbols on the i
e130: 6e 63 6f 72 72 65 63 74 20 4f 52 44 45 52 20 42  ncorrect ORDER B
e140: 59 20 66 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63  Y for consistenc
e150: 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  y..    */.    if
e160: 28 20 69 73 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43  ( isCompound<=nC
e170: 6f 6d 70 6f 75 6e 64 20 20 2f 2a 20 44 65 66 65  ompound  /* Defe
e180: 72 20 72 69 67 68 74 2d 6d 6f 73 74 20 4f 52 44  r right-most ORD
e190: 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f  ER BY of a compo
e1a0: 75 6e 64 20 2a 2f 0a 20 20 20 20 20 26 26 20 72  und */.     && r
e1b0: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
e1c0: 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70  By(&sNC, p, p->p
e1d0: 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22  OrderBy, "ORDER"
e1e0: 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72  ).    ){.      r
e1f0: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
e200: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64  .    }.    if( d
e210: 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20  b->mallocFailed 
e220: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e230: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
e240: 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73  .    sNC.ncFlags
e250: 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e   &= ~NC_AllowWin
e260: 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f  ;.  .    /* Reso
e270: 6c 76 65 20 74 68 65 20 47 52 4f 55 50 20 42 59  lve the GROUP BY
e280: 20 63 6c 61 75 73 65 2e 20 20 41 74 20 74 68 65   clause.  At the
e290: 20 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65   same time, make
e2a0: 20 73 75 72 65 20 0a 20 20 20 20 2a 2a 20 74 68   sure .    ** th
e2b0: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
e2c0: 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61  e does not conta
e2d0: 69 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  in aggregate fun
e2e0: 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20  ctions..    */. 
e2f0: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
e300: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
e310: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
e320: 49 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20  Item;.    .     
e330: 20 69 66 28 20 72 65 73 6f 6c 76 65 4f 72 64 65   if( resolveOrde
e340: 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70  rGroupBy(&sNC, p
e350: 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f  , pGroupBy, "GRO
e360: 55 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c  UP") || db->mall
e370: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
e380: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
e390: 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20  bort;.      }.  
e3a0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
e3b0: 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20  em=pGroupBy->a; 
e3c0: 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70  i<pGroupBy->nExp
e3d0: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
e3e0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78  {.        if( Ex
e3f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49  prHasProperty(pI
e400: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41  tem->pExpr, EP_A
e410: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gg) ){.         
e420: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
e430: 28 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67  (pParse, "aggreg
e440: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72  ate functions ar
e450: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e  e not allowed in
e460: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   ".             
e470: 20 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63   "the GROUP BY c
e480: 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20  lause");.       
e490: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
e4a0: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ort;.        }. 
e4b0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69       }.    }..#i
e4c0: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
e4d0: 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20  T_WINDOWFUNC.   
e4e0: 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f   if( IN_RENAME_O
e4f0: 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 57  BJECT ){.      W
e500: 69 6e 64 6f 77 20 2a 70 57 69 6e 3b 0a 20 20 20  indow *pWin;.   
e510: 20 20 20 66 6f 72 28 70 57 69 6e 3d 70 2d 3e 70     for(pWin=p->p
e520: 57 69 6e 44 65 66 6e 3b 20 70 57 69 6e 3b 20 70  WinDefn; pWin; p
e530: 57 69 6e 3d 70 57 69 6e 2d 3e 70 4e 65 78 74 57  Win=pWin->pNextW
e540: 69 6e 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  in){.        if(
e550: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
e560: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
e570: 43 2c 20 70 57 69 6e 2d 3e 70 4f 72 64 65 72 42  C, pWin->pOrderB
e580: 79 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 73  y).         || s
e590: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
e5a0: 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c  rListNames(&sNC,
e5b0: 20 70 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f   pWin->pPartitio
e5c0: 6e 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20  n).        ){.  
e5d0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
e5e0: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20  RC_Abort;.      
e5f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
e600: 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 20 20 2f 2a  }.#endif..    /*
e610: 20 49 66 20 74 68 69 73 20 69 73 20 70 61 72 74   If this is part
e620: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53   of a compound S
e630: 45 4c 45 43 54 2c 20 63 68 65 63 6b 20 74 68 61  ELECT, check tha
e640: 74 20 69 74 20 68 61 73 20 74 68 65 20 72 69 67  t it has the rig
e650: 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72  ht.    ** number
e660: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
e670: 69 6e 20 74 68 65 20 73 65 6c 65 63 74 20 6c 69  in the select li
e680: 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  st. */.    if( p
e690: 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d 3e 70 45  ->pNext && p->pE
e6a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 2d 3e  List->nExpr!=p->
e6b0: 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  pNext->pEList->n
e6c0: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 73 71  Expr ){.      sq
e6d0: 6c 69 74 65 33 53 65 6c 65 63 74 57 72 6f 6e 67  lite3SelectWrong
e6e0: 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72 28 70 50  NumTermsError(pP
e6f0: 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78 74 29 3b  arse, p->pNext);
e700: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
e710: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a  C_Abort;.    }..
e720: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
e730: 6f 20 74 68 65 20 6e 65 78 74 20 74 65 72 6d 20  o the next term 
e740: 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 0a  of the compound.
e750: 20 20 20 20 2a 2f 0a 20 20 20 20 70 20 3d 20 70      */.    p = p
e760: 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20 20 6e 43  ->pPrior;.    nC
e770: 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a  ompound++;.  }..
e780: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
e790: 20 4f 52 44 45 52 20 42 59 20 6f 6e 20 61 20 63   ORDER BY on a c
e7a0: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 61  ompound SELECT a
e7b0: 66 74 65 72 20 61 6c 6c 20 74 65 72 6d 73 20 6f  fter all terms o
e7c0: 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f  f.  ** the compo
e7d0: 75 6e 64 20 68 61 76 65 20 62 65 65 6e 20 72 65  und have been re
e7e0: 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  solved..  */.  i
e7f0: 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 20 26 26  f( isCompound &&
e800: 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64   resolveCompound
e810: 4f 72 64 65 72 42 79 28 70 50 61 72 73 65 2c 20  OrderBy(pParse, 
e820: 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b 0a 20 20  pLeftmost) ){.  
e830: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e840: 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65 74 75 72  rt;.  }..  retur
e850: 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 7d 0a 0a  n WRC_Prune;.}..
e860: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
e870: 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72  ne walks an expr
e880: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
e890: 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e  resolves referen
e8a0: 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20  ces to.** table 
e8b0: 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72 65 73 75  columns and resu
e8c0: 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 73 2e 20  lt-set columns. 
e8d0: 20 41 74 20 74 68 65 20 73 61 6d 65 20 74 69 6d   At the same tim
e8e0: 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a 2a 20 63  e, do error.** c
e8f0: 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75 6e 63 74  hecking on funct
e900: 69 6f 6e 20 75 73 61 67 65 20 61 6e 64 20 73 65  ion usage and se
e910: 74 20 61 20 66 6c 61 67 20 69 66 20 61 6e 79 20  t a flag if any 
e920: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
e930: 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65 65 6e 2e  ons.** are seen.
e940: 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76  .**.** To resolv
e950: 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20  e table columns 
e960: 72 65 66 65 72 65 6e 63 65 73 20 77 65 20 6c 6f  references we lo
e970: 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20 28 6f 72  ok for nodes (or
e980: 20 73 75 62 74 72 65 65 73 29 20 6f 66 20 74 68   subtrees) of th
e990: 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e 59 2e 5a  e .** form X.Y.Z
e9a0: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
e9b0: 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a 20 20 20  Z where.**.**   
e9c0: 20 20 20 58 3a 20 20 20 54 68 65 20 6e 61 6d 65     X:   The name
e9d0: 20 6f 66 20 61 20 64 61 74 61 62 61 73 65 2e 20   of a database. 
e9e0: 20 45 78 3a 20 20 22 6d 61 69 6e 22 20 6f 72 20   Ex:  "main" or 
e9f0: 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20 20 20 20  "temp" or.**    
ea00: 20 20 20 20 20 20 20 74 68 65 20 73 79 6d 62 6f         the symbo
ea10: 6c 69 63 20 6e 61 6d 65 20 61 73 73 69 67 6e 65  lic name assigne
ea20: 64 20 74 6f 20 61 6e 20 41 54 54 41 43 48 2d 65  d to an ATTACH-e
ea30: 64 20 64 61 74 61 62 61 73 65 2e 0a 2a 2a 0a 2a  d database..**.*
ea40: 2a 20 20 20 20 20 20 59 3a 20 20 20 54 68 65 20  *      Y:   The 
ea50: 6e 61 6d 65 20 6f 66 20 61 20 74 61 62 6c 65 20  name of a table 
ea60: 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61 75 73 65  in a FROM clause
ea70: 2e 20 20 4f 72 20 69 6e 20 61 20 74 72 69 67 67  .  Or in a trigg
ea80: 65 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  er.**           
ea90: 6f 6e 65 20 6f 66 20 74 68 65 20 73 70 65 63 69  one of the speci
eaa0: 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64 22 20 6f  al names "old" o
eab0: 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a 2a 20 20  r "new"..**.**  
eac0: 20 20 20 20 5a 3a 20 20 20 54 68 65 20 6e 61 6d      Z:   The nam
ead0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 69 6e  e of a column in
eae0: 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a 2a 2a 20   table Y..**.** 
eaf0: 54 68 65 20 6e 6f 64 65 20 61 74 20 74 68 65 20  The node at the 
eb00: 72 6f 6f 74 20 6f 66 20 74 68 65 20 73 75 62 74  root of the subt
eb10: 72 65 65 20 69 73 20 6d 6f 64 69 66 69 65 64 20  ree is modified 
eb20: 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a  as follows:.**.*
eb30: 2a 20 20 20 20 45 78 70 72 2e 6f 70 20 20 20 20  *    Expr.op    
eb40: 20 20 20 20 43 68 61 6e 67 65 64 20 74 6f 20 54      Changed to T
eb50: 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20 20 20 45  K_COLUMN.**    E
eb60: 78 70 72 2e 70 54 61 62 20 20 20 20 20 20 50 6f  xpr.pTab      Po
eb70: 69 6e 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c  ints to the Tabl
eb80: 65 20 6f 62 6a 65 63 74 20 66 6f 72 20 58 2e 59  e object for X.Y
eb90: 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 43 6f 6c  .**    Expr.iCol
eba0: 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c 75 6d 6e  umn   The column
ebb0: 20 69 6e 64 65 78 20 69 6e 20 58 2e 59 2e 20 20   index in X.Y.  
ebc0: 2d 31 20 66 6f 72 20 74 68 65 20 72 6f 77 69 64  -1 for the rowid
ebd0: 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69 54 61  ..**    Expr.iTa
ebe0: 62 6c 65 20 20 20 20 54 68 65 20 56 44 42 45 20  ble    The VDBE 
ebf0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
ec00: 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54  r X.Y.**.**.** T
ec10: 6f 20 72 65 73 6f 6c 76 65 20 72 65 73 75 6c 74  o resolve result
ec20: 2d 73 65 74 20 72 65 66 65 72 65 6e 63 65 73 2c  -set references,
ec30: 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70 72 65 73   look for expres
ec40: 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66 20 74 68  sion nodes of th
ec50: 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28 77 69 74  e.** form Z (wit
ec60: 68 20 6e 6f 20 58 20 61 6e 64 20 59 20 70 72 65  h no X and Y pre
ec70: 66 69 78 29 20 77 68 65 72 65 20 74 68 65 20 5a  fix) where the Z
ec80: 20 6d 61 74 63 68 65 73 20 74 68 65 20 72 69 67   matches the rig
ec90: 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69 7a 65 20  ht-hand.** size 
eca0: 6f 66 20 61 6e 20 41 53 20 63 6c 61 75 73 65 20  of an AS clause 
ecb0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  in the result-se
ecc0: 74 20 6f 66 20 61 20 53 45 4c 45 43 54 2e 20 20  t of a SELECT.  
ecd0: 54 68 65 20 5a 20 65 78 70 72 65 73 73 69 6f 6e  The Z expression
ece0: 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63 65 64 20  .** is replaced 
ecf0: 62 79 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  by a copy of the
ed00: 20 6c 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20   left-hand side 
ed10: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
ed20: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  t expression..**
ed30: 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61 6e 64 20   Table-name and 
ed40: 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f 6c 75 74  function resolut
ed50: 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e 20 74 68  ion occurs on th
ed60: 65 20 73 75 62 73 74 69 74 75 74 65 64 20 65 78  e substituted ex
ed70: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 72 65 65  pression.** tree
ed80: 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c 65 2c 20  .  For example, 
ed90: 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53  in:.**.**      S
eda0: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20  ELECT a+b AS x, 
edb0: 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31  c+d AS y FROM t1
edc0: 20 4f 52 44 45 52 20 42 59 20 78 3b 0a 2a 2a 0a   ORDER BY x;.**.
edd0: 2a 2a 20 54 68 65 20 22 78 22 20 74 65 72 6d 20  ** The "x" term 
ede0: 6f 66 20 74 68 65 20 6f 72 64 65 72 20 62 79 20  of the order by 
edf0: 69 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 22  is replaced by "
ee00: 61 2b 62 22 20 74 6f 20 72 65 6e 64 65 72 3a 0a  a+b" to render:.
ee10: 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43  **.**      SELEC
ee20: 54 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20  T a+b AS x, c+d 
ee30: 41 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44  AS y FROM t1 ORD
ee40: 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a  ER BY a+b;.**.**
ee50: 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 73 20   Function calls 
ee60: 61 72 65 20 63 68 65 63 6b 65 64 20 74 6f 20 6d  are checked to m
ee70: 61 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68  ake sure that th
ee80: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 0a 2a  e function is .*
ee90: 2a 20 64 65 66 69 6e 65 64 20 61 6e 64 20 74 68  * defined and th
eea0: 61 74 20 74 68 65 20 63 6f 72 72 65 63 74 20 6e  at the correct n
eeb0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
eec0: 74 73 20 61 72 65 20 73 70 65 63 69 66 69 65 64  ts are specified
eed0: 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66 75 6e 63  ..** If the func
eee0: 74 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65  tion is an aggre
eef0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 2c 20 74  gate function, t
ef00: 68 65 6e 20 74 68 65 20 4e 43 5f 48 61 73 41 67  hen the NC_HasAg
ef10: 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20 73 65 74  g flag is.** set
ef20: 20 61 6e 64 20 74 68 65 20 6f 70 63 6f 64 65 20   and the opcode 
ef30: 69 73 20 63 68 61 6e 67 65 64 20 66 72 6f 6d 20  is changed from 
ef40: 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74 6f 20 54  TK_FUNCTION to T
ef50: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a  K_AGG_FUNCTION..
ef60: 2a 2a 20 49 66 20 61 6e 20 65 78 70 72 65 73 73  ** If an express
ef70: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
ef80: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ef90: 20 74 68 65 6e 20 74 68 65 20 45 50 5f 41 67 67   then the EP_Agg
efa0: 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f 6e 20  .** property on 
efb0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
efc0: 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20  s set..**.** An 
efd0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 73  error message is
efe0: 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 20   left in pParse 
eff0: 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61  if anything is a
f000: 6d 69 73 73 2e 20 20 54 68 65 20 6e 75 6d 62 65  miss.  The numbe
f010: 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72 73 20 69  r.** if errors i
f020: 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2f 0a 69  s returned..*/.i
f030: 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  nt sqlite3Resolv
f040: 65 45 78 70 72 4e 61 6d 65 73 28 20 0a 20 20 4e  eExprNames( .  N
f050: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
f060: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70         /* Namesp
f070: 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65  ace to resolve e
f080: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a  xpressions in. *
f090: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
f0a0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
f0b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
f0c0: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
f0d0: 0a 29 7b 0a 20 20 69 6e 74 20 73 61 76 65 64 48  .){.  int savedH
f0e0: 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b 65 72 20  asAgg;.  Walker 
f0f0: 77 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d  w;..  if( pExpr=
f100: 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49  =0 ) return SQLI
f110: 54 45 5f 4f 4b 3b 0a 20 20 73 61 76 65 64 48 61  TE_OK;.  savedHa
f120: 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e 63 46 6c  sAgg = pNC->ncFl
f130: 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67 67  ags & (NC_HasAgg
f140: 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 7c 4e 43  |NC_MinMaxAgg|NC
f150: 5f 48 61 73 57 69 6e 29 3b 0a 20 20 70 4e 43 2d  _HasWin);.  pNC-
f160: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e 43  >ncFlags &= ~(NC
f170: 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61  _HasAgg|NC_MinMa
f180: 78 41 67 67 7c 4e 43 5f 48 61 73 57 69 6e 29 3b  xAgg|NC_HasWin);
f190: 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 4e  .  w.pParse = pN
f1a0: 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e 78  C->pParse;.  w.x
f1b0: 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72  ExprCallback = r
f1c0: 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70 3b 0a  esolveExprStep;.
f1d0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
f1e0: 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c  ack = resolveSel
f1f0: 65 63 74 53 74 65 70 3b 0a 20 20 77 2e 78 53 65  ectStep;.  w.xSe
f200: 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20  lectCallback2 = 
f210: 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70  0;.  w.u.pNC = p
f220: 4e 43 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d  NC;.#if SQLITE_M
f230: 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a  AX_EXPR_DEPTH>0.
f240: 20 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69    w.pParse->nHei
f250: 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48  ght += pExpr->nH
f260: 65 69 67 68 74 3b 0a 20 20 69 66 28 20 73 71 6c  eight;.  if( sql
f270: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
f280: 67 68 74 28 77 2e 70 50 61 72 73 65 2c 20 77 2e  ght(w.pParse, w.
f290: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29  pParse->nHeight)
f2a0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53   ){.    return S
f2b0: 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d  QLITE_ERROR;.  }
f2c0: 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65  .#endif.  sqlite
f2d0: 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45  3WalkExpr(&w, pE
f2e0: 78 70 72 29 3b 0a 23 69 66 20 53 51 4c 49 54 45  xpr);.#if SQLITE
f2f0: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
f300: 30 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48  0.  w.pParse->nH
f310: 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e  eight -= pExpr->
f320: 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a  nHeight;.#endif.
f330: 20 20 61 73 73 65 72 74 28 20 45 50 5f 41 67 67    assert( EP_Agg
f340: 3d 3d 4e 43 5f 48 61 73 41 67 67 20 29 3b 0a 20  ==NC_HasAgg );. 
f350: 20 61 73 73 65 72 74 28 20 45 50 5f 57 69 6e 3d   assert( EP_Win=
f360: 3d 4e 43 5f 48 61 73 57 69 6e 20 29 3b 0a 20 20  =NC_HasWin );.  
f370: 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e  testcase( pNC->n
f380: 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41  cFlags & NC_HasA
f390: 67 67 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  gg );.  testcase
f3a0: 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
f3b0: 20 4e 43 5f 48 61 73 57 69 6e 20 29 3b 0a 20 20   NC_HasWin );.  
f3c0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
f3d0: 70 45 78 70 72 2c 20 70 4e 43 2d 3e 6e 63 46 6c  pExpr, pNC->ncFl
f3e0: 61 67 73 20 26 20 28 4e 43 5f 48 61 73 41 67 67  ags & (NC_HasAgg
f3f0: 7c 4e 43 5f 48 61 73 57 69 6e 29 20 29 3b 0a 20  |NC_HasWin) );. 
f400: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d   pNC->ncFlags |=
f410: 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20   savedHasAgg;.  
f420: 72 65 74 75 72 6e 20 70 4e 43 2d 3e 6e 45 72 72  return pNC->nErr
f430: 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65 2d 3e  >0 || w.pParse->
f440: 6e 45 72 72 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  nErr>0;.}../*.**
f450: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
f460: 65 73 20 66 6f 72 20 61 6c 6c 20 65 78 70 72 65  es for all expre
f470: 73 73 69 6f 6e 20 69 6e 20 61 6e 20 65 78 70 72  ssion in an expr
f480: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68  ession list.  Th
f490: 69 73 20 69 73 0a 2a 2a 20 6a 75 73 74 20 6c 69  is is.** just li
f4a0: 6b 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  ke sqlite3Resolv
f4b0: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 65 78 63  eExprNames() exc
f4c0: 65 70 74 20 74 68 61 74 20 69 74 20 77 6f 72 6b  ept that it work
f4d0: 73 20 66 6f 72 20 61 6e 20 65 78 70 72 65 73 73  s for an express
f4e0: 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 72 61 74 68  ion.** list rath
f4f0: 65 72 20 74 68 61 6e 20 61 20 73 69 6e 67 6c 65  er than a single
f500: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a   expression..*/.
f510: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  int sqlite3Resol
f520: 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28  veExprListNames(
f530: 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20   .  NameContext 
f540: 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e  *pNC,       /* N
f550: 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f  amespace to reso
f560: 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  lve expressions 
f570: 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  in. */.  ExprLis
f580: 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20 20 20  t *pList        
f590: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
f5a0: 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 61 6e  on list to be an
f5b0: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
f5c0: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69  int i;.  if( pLi
f5d0: 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d  st ){.    for(i=
f5e0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
f5f0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
f600: 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  f( sqlite3Resolv
f610: 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20  eExprNames(pNC, 
f620: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f630: 72 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  r) ) return WRC_
f640: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  Abort;.    }.  }
f650: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
f660: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
f670: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
f680: 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72 65 73  es in all expres
f690: 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c 45 43  sions of a SELEC
f6a0: 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20  T and in all.** 
f6b0: 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20 74 68  decendents of th
f6c0: 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64  e SELECT, includ
f6d0: 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66  ing compounds of
f6e0: 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a  f of p->pPrior,.
f6f0: 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20 69 6e  ** subqueries in
f700: 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e   expressions, an
f710: 64 20 73 75 62 71 75 65 72 69 65 73 20 75 73 65  d subqueries use
f720: 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75 73 65  d as FROM clause
f730: 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a  .** terms..**.**
f740: 20 53 65 65 20 73 71 6c 69 74 65 33 52 65 73 6f   See sqlite3Reso
f750: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 66  lveExprNames() f
f760: 6f 72 20 61 20 64 65 73 63 72 69 70 74 69 6f 6e  or a description
f770: 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20 6f 66   of the kinds of
f780: 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61 74 69  .** transformati
f790: 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72 2e 0a  ons that occur..
f7a0: 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54  **.** All SELECT
f7b0: 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68 6f 75   statements shou
f7c0: 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65 78 70  ld have been exp
f7d0: 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73  anded using.** s
f7e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61  qlite3SelectExpa
f7f0: 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20 69 6e  nd() prior to in
f800: 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f 75 74  voking this rout
f810: 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ine..*/.void sql
f820: 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 65 63  ite3ResolveSelec
f830: 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73 65 20  tNames(.  Parse 
f840: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20  *pParse,        
f850: 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63   /* The parser c
f860: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65  ontext */.  Sele
f870: 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20 20 20  ct *p,          
f880: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
f890: 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69 6e 67   statement being
f8a0: 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d   coded. */.  Nam
f8b0: 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
f8c0: 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74  NC  /* Name cont
f8d0: 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74 20 53  ext for parent S
f8e0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
f8f0: 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77  */.){.  Walker w
f900: 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70 21 3d  ;..  assert( p!=
f910: 30 20 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  0 );.  w.xExprCa
f920: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
f930: 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53  ExprStep;.  w.xS
f940: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
f950: 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65  resolveSelectSte
f960: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
f970: 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
f980: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
f990: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f  ;.  w.u.pNC = pO
f9a0: 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65  uterNC;.  sqlite
f9b0: 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20  3WalkSelect(&w, 
f9c0: 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73  p);.}../*.** Res
f9d0: 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 65 78  olve names in ex
f9e0: 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 63  pressions that c
f9f0: 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63  an only referenc
fa00: 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62 6c 65  e a single table
fa10: 0a 2a 2a 20 6f 72 20 77 68 69 63 68 20 63 61 6e  .** or which can
fa20: 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20 61 6e  not reference an
fa30: 79 20 74 61 62 6c 65 73 20 61 74 20 61 6c 6c 2e  y tables at all.
fa40: 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a    Examples:.**.*
fa50: 2a 20 20 20 20 28 31 29 20 20 20 43 48 45 43 4b  *    (1)   CHECK
fa60: 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20   constraints.** 
fa70: 20 20 20 28 32 29 20 20 20 57 48 45 52 45 20 63     (2)   WHERE c
fa80: 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74 69 61  lauses on partia
fa90: 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20 20 20  l indices.**    
faa0: 28 33 29 20 20 20 45 78 70 72 65 73 73 69 6f 6e  (3)   Expression
fab0: 73 20 69 6e 20 69 6e 64 65 78 65 73 20 6f 6e 20  s in indexes on 
fac0: 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 20  expressions.**  
fad0: 20 20 28 34 29 20 20 20 45 78 70 72 65 73 73 69    (4)   Expressi
fae0: 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  on arguments to 
faf0: 56 41 43 55 55 4d 20 49 4e 54 4f 2e 0a 2a 2a 20  VACUUM INTO..** 
fb00: 20 20 20 28 35 29 20 20 20 47 45 4e 45 52 41 54     (5)   GENERAT
fb10: 45 44 20 41 4c 57 41 59 53 20 61 73 20 65 78 70  ED ALWAYS as exp
fb20: 72 65 73 73 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 49  ressions.**.** I
fb30: 6e 20 61 6c 6c 20 63 61 73 65 73 20 65 78 63 65  n all cases exce
fb40: 70 74 20 28 34 29 2c 20 74 68 65 20 45 78 70 72  pt (4), the Expr
fb50: 2e 69 54 61 62 6c 65 20 76 61 6c 75 65 20 66 6f  .iTable value fo
fb60: 72 20 45 78 70 72 2e 6f 70 3d 3d 54 4b 5f 43 4f  r Expr.op==TK_CO
fb70: 4c 55 4d 4e 0a 2a 2a 20 6e 6f 64 65 73 20 6f 66  LUMN.** nodes of
fb80: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
fb90: 69 73 20 73 65 74 20 74 6f 20 2d 31 20 61 6e 64  is set to -1 and
fba0: 20 74 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d   the Expr.iColum
fbb0: 6e 20 76 61 6c 75 65 20 69 73 0a 2a 2a 20 73 65  n value is.** se
fbc0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
fbd0: 6e 75 6d 62 65 72 2e 20 20 49 6e 20 63 61 73 65  number.  In case
fbe0: 20 28 34 29 2c 20 54 4b 5f 43 4f 4c 55 4d 4e 20   (4), TK_COLUMN 
fbf0: 6e 6f 64 65 73 20 63 61 75 73 65 20 61 6e 20 65  nodes cause an e
fc00: 72 72 6f 72 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  rror..**.** Any 
fc10: 65 72 72 6f 72 73 20 63 61 75 73 65 20 61 6e 20  errors cause an 
fc20: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f  error message to
fc30: 20 62 65 20 73 65 74 20 69 6e 20 70 50 61 72 73   be set in pPars
fc40: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
fc50: 33 52 65 73 6f 6c 76 65 53 65 6c 66 52 65 66 65  3ResolveSelfRefe
fc60: 72 65 6e 63 65 28 0a 20 20 50 61 72 73 65 20 2a  rence(.  Parse *
fc70: 70 50 61 72 73 65 2c 20 20 20 2f 2a 20 50 61 72  pParse,   /* Par
fc80: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
fc90: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20 20    Table *pTab,  
fca0: 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65 20     /* The table 
fcb0: 62 65 69 6e 67 20 72 65 66 65 72 65 6e 63 65 64  being referenced
fcc0: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69  , or NULL */.  i
fcd0: 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20 20  nt type,        
fce0: 2f 2a 20 4e 43 5f 49 73 43 68 65 63 6b 2c 20 4e  /* NC_IsCheck, N
fcf0: 43 5f 50 61 72 74 49 64 78 2c 20 4e 43 5f 49 64  C_PartIdx, NC_Id
fd00: 78 45 78 70 72 2c 20 4e 43 5f 47 65 6e 43 6f 6c  xExpr, NC_GenCol
fd10: 2c 20 6f 72 20 30 20 2a 2f 0a 20 20 45 78 70 72  , or 0 */.  Expr
fd20: 20 2a 70 45 78 70 72 2c 20 20 20 20 20 2f 2a 20   *pExpr,     /* 
fd30: 45 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 72 65  Expression to re
fd40: 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e  solve.  May be N
fd50: 55 4c 4c 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ULL. */.  ExprLi
fd60: 73 74 20 2a 70 4c 69 73 74 20 20 2f 2a 20 45 78  st *pList  /* Ex
fd70: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
fd80: 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62   resolve.  May b
fd90: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
fda0: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
fdb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fdc0: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
fdd0: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
fde0: 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43  Table */.  NameC
fdf0: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
fe00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
fe10: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
fe20: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
fe30: 20 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20   */.  int rc;.. 
fe40: 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d 30   assert( type==0
fe50: 20 7c 7c 20 70 54 61 62 21 3d 30 20 29 3b 0a 20   || pTab!=0 );. 
fe60: 20 61 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e   assert( type==N
fe70: 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70  C_IsCheck || typ
fe80: 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c 7c  e==NC_PartIdx ||
fe90: 20 74 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78 70   type==NC_IdxExp
fea0: 72 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 74  r.          || t
feb0: 79 70 65 3d 3d 4e 43 5f 47 65 6e 43 6f 6c 20 7c  ype==NC_GenCol |
fec0: 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20 6d  | pTab==0 );.  m
fed0: 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73  emset(&sNC, 0, s
fee0: 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 6d  izeof(sNC));.  m
fef0: 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20  emset(&sSrc, 0, 
ff00: 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20  sizeof(sSrc));. 
ff10: 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20 20   if( pTab ){.   
ff20: 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a   sSrc.nSrc = 1;.
ff30: 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e      sSrc.a[0].zN
ff40: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
ff50: 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d  e;.    sSrc.a[0]
ff60: 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20  .pTab = pTab;.  
ff70: 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75 72    sSrc.a[0].iCur
ff80: 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20 20  sor = -1;.  }.  
ff90: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
ffa0: 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63 4c  rse;.  sNC.pSrcL
ffb0: 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20 73  ist = &sSrc;.  s
ffc0: 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79 70  NC.ncFlags = typ
ffd0: 65 20 7c 20 4e 43 5f 49 73 44 44 4c 3b 0a 20 20  e | NC_IsDDL;.  
ffe0: 69 66 28 20 28 72 63 20 3d 20 73 71 6c 69 74 65  if( (rc = sqlite
fff0: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
10000 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 29 21  s(&sNC, pExpr))!
10010 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 20 72 65 74  =SQLITE_OK ) ret
10020 75 72 6e 20 72 63 3b 0a 20 20 69 66 28 20 70 4c  urn rc;.  if( pL
10030 69 73 74 20 29 20 72 63 20 3d 20 73 71 6c 69 74  ist ) rc = sqlit
10040 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73  e3ResolveExprLis
10050 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69  tNames(&sNC, pLi
10060 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 72 63  st);.  return rc
10070 3b 0a 7d 0a                                      ;.}.