/ Hex Artifact Content
Login

Artifact 2160146697e6e0ba251b5a954e16f542b6e684fb4778cec2994094ab401ef996:


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 47 45 4e 45 52 41 54 45 44 20 41 4c 57 41 59  "GENERATED ALWAY
5820: 53 20 41 53 20 63 6f 6c 75 6d 6e 73 22 3b 0a 23  S AS columns";.#
5830: 65 6e 64 69 66 0a 20 20 20 20 73 71 6c 69 74 65  endif.    sqlite
5840: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5850: 2c 20 22 25 73 20 70 72 6f 68 69 62 69 74 65 64  , "%s prohibited
5860: 20 69 6e 20 25 73 22 2c 20 7a 4d 73 67 2c 20 7a   in %s", zMsg, z
5870: 49 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  In);.  }.}../*.*
5880: 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 70 20 73  * Expression p s
5890: 68 6f 75 6c 64 20 65 6e 63 6f 64 65 20 61 20 66  hould encode a f
58a0: 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74 20 76 61  loating point va
58b0: 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30 20  lue between 1.0 
58c0: 61 6e 64 20 30 2e 30 2e 0a 2a 2a 20 52 65 74 75  and 0.0..** Retu
58d0: 72 6e 20 31 30 32 34 20 74 69 6d 65 73 20 74 68  rn 1024 times th
58e0: 69 73 20 76 61 6c 75 65 2e 20 20 4f 72 20 72 65  is value.  Or re
58f0: 74 75 72 6e 20 2d 31 20 69 66 20 70 20 69 73 20  turn -1 if p is 
5900: 6e 6f 74 20 61 20 66 6c 6f 61 74 69 6e 67 20 70  not a floating p
5910: 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65 20 62 65  oint.** value be
5920: 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e  tween 1.0 and 0.
5930: 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  0..*/.static int
5940: 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69 74 79   exprProbability
5950: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 64 6f 75  (Expr *p){.  dou
5960: 62 6c 65 20 72 20 3d 20 2d 31 2e 30 3b 0a 20 20  ble r = -1.0;.  
5970: 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c  if( p->op!=TK_FL
5980: 4f 41 54 20 29 20 72 65 74 75 72 6e 20 2d 31 3b  OAT ) return -1;
5990: 0a 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 70  .  sqlite3AtoF(p
59a0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20  ->u.zToken, &r, 
59b0: 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
59c0: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51  p->u.zToken), SQ
59d0: 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 61 73  LITE_UTF8);.  as
59e0: 73 65 72 74 28 20 72 3e 3d 30 2e 30 20 29 3b 0a  sert( r>=0.0 );.
59f0: 20 20 69 66 28 20 72 3e 31 2e 30 20 29 20 72 65    if( r>1.0 ) re
5a00: 74 75 72 6e 20 2d 31 3b 0a 20 20 72 65 74 75 72  turn -1;.  retur
5a10: 6e 20 28 69 6e 74 29 28 72 2a 31 33 34 32 31 37  n (int)(r*134217
5a20: 37 32 38 2e 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  728.0);.}../*.**
5a30: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
5a40: 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 73 71   callback for sq
5a50: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 29 2e  lite3WalkExpr().
5a60: 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73  .**.** Resolve s
5a70: 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e  ymbolic names in
5a80: 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65  to TK_COLUMN ope
5a90: 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63  rators for the c
5aa0: 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69  urrent.** node i
5ab0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
5ac0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30   tree.  Return 0
5ad0: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65   to continue the
5ae0: 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20   search down.** 
5af0: 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f  the tree or 2 to
5b00: 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20   abort the tree 
5b10: 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  walk..**.** This
5b20: 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f   routine also do
5b30: 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e  es error checkin
5b40: 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c  g and name resol
5b50: 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e  ution for.** fun
5b60: 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68  ction names.  Th
5b70: 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61  e operator for a
5b80: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
5b90: 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ns is changed.**
5ba0: 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54   to TK_AGG_FUNCT
5bb0: 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ION..*/.static i
5bc0: 6e 74 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74  nt resolveExprSt
5bd0: 65 70 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b  ep(Walker *pWalk
5be0: 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  er, Expr *pExpr)
5bf0: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
5c00: 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65 20 2a 70  *pNC;.  Parse *p
5c10: 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43 20 3d 20  Parse;..  pNC = 
5c20: 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a  pWalker->u.pNC;.
5c30: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
5c40: 20 29 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70   );.  pParse = p
5c50: 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 61 73  NC->pParse;.  as
5c60: 73 65 72 74 28 20 70 50 61 72 73 65 3d 3d 70 57  sert( pParse==pW
5c70: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 20 29 3b  alker->pParse );
5c80: 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55 47  ..#ifndef NDEBUG
5c90: 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70 53 72 63  .  if( pNC->pSrc
5ca0: 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e 70 53 72  List && pNC->pSr
5cb0: 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20  cList->nAlloc>0 
5cc0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
5cd0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
5ce0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 69 6e  pSrcList;.    in
5cf0: 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  t i;.    for(i=0
5d00: 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63 4c 69 73  ; i<pNC->pSrcLis
5d10: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
5d20: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
5d30: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
5d40: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
5d50: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
5d60: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
5d70: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
5d80: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
5d90: 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20 64 65 66  ->op ){..#if def
5da0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
5db0: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
5dc0: 5f 4c 49 4d 49 54 29 20 26 26 20 21 64 65 66 69  _LIMIT) && !defi
5dd0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
5de0: 53 55 42 51 55 45 52 59 29 0a 20 20 20 20 2f 2a  SUBQUERY).    /*
5df0: 20 54 68 65 20 73 70 65 63 69 61 6c 20 6f 70 65   The special ope
5e00: 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20 6d 65 61  rator TK_ROW mea
5e10: 6e 73 20 75 73 65 20 74 68 65 20 72 6f 77 69 64  ns use the rowid
5e20: 20 66 6f 72 20 74 68 65 20 66 69 72 73 74 0a 20   for the first. 
5e30: 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20     ** column in 
5e40: 74 68 65 20 46 52 4f 4d 20 63 6c 61 75 73 65 2e  the FROM clause.
5e50: 20 20 54 68 69 73 20 69 73 20 75 73 65 64 20 62    This is used b
5e60: 79 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20  y the LIMIT and 
5e70: 4f 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20  ORDER BY.    ** 
5e80: 63 6c 61 75 73 65 20 70 72 6f 63 65 73 73 69 6e  clause processin
5e90: 67 20 6f 6e 20 55 50 44 41 54 45 20 61 6e 64 20  g on UPDATE and 
5ea0: 44 45 4c 45 54 45 20 73 74 61 74 65 6d 65 6e 74  DELETE statement
5eb0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
5ec0: 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20  se TK_ROW: {.   
5ed0: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
5ee0: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
5ef0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
5f00: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
5f10: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 61 73  *pItem;.      as
5f20: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 20 26  sert( pSrcList &
5f30: 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  & pSrcList->nSrc
5f40: 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74  ==1 );.      pIt
5f50: 65 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61  em = pSrcList->a
5f60: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
5f70: 48 61 73 52 6f 77 69 64 28 70 49 74 65 6d 2d 3e  HasRowid(pItem->
5f80: 70 54 61 62 29 20 26 26 20 70 49 74 65 6d 2d 3e  pTab) && pItem->
5f90: 70 54 61 62 2d 3e 70 53 65 6c 65 63 74 3d 3d 30  pTab->pSelect==0
5fa0: 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   );.      pExpr-
5fb0: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
5fc0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e  .      pExpr->y.
5fd0: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
5fe0: 61 62 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  ab;.      pExpr-
5ff0: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
6000: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
6010: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6020: 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72   -1;.      pExpr
6030: 2d 3e 61 66 66 45 78 70 72 20 3d 20 53 51 4c 49  ->affExpr = SQLI
6040: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
6050: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6060: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 64 65 66   }.#endif /* def
6070: 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
6080: 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c 45 54 45  LE_UPDATE_DELETE
6090: 5f 4c 49 4d 49 54 29 0a 20 20 20 20 20 20 20 20  _LIMIT).        
60a0: 20 20 26 26 20 21 64 65 66 69 6e 65 64 28 53 51    && !defined(SQ
60b0: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
60c0: 52 59 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 20 41  RY) */..    /* A
60d0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 20 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 74 61   ID.    ** Or ta
6100: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ble name and col
6110: 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 49 44 2e  umn name:    ID.
6120: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64  ID.    ** Or a d
6130: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
6140: 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49  nd column:  ID.I
6150: 44 2e 49 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20  D.ID.    **.    
6160: 2a 2a 20 54 68 65 20 54 4b 5f 49 44 20 61 6e 64  ** The TK_ID and
6170: 20 54 4b 5f 4f 55 54 20 63 61 73 65 73 20 61 72   TK_OUT cases ar
6180: 65 20 63 6f 6d 62 69 6e 65 64 20 73 6f 20 74 68  e combined so th
6190: 61 74 20 74 68 65 72 65 20 77 69 6c 6c 20 6f 6e  at there will on
61a0: 6c 79 0a 20 20 20 20 2a 2a 20 62 65 20 6f 6e 65  ly.    ** be one
61b0: 20 63 61 6c 6c 20 74 6f 20 6c 6f 6f 6b 75 70 4e   call to lookupN
61c0: 61 6d 65 28 29 2e 20 20 54 68 65 6e 20 74 68 65  ame().  Then the
61d0: 20 63 6f 6d 70 69 6c 65 72 20 77 69 6c 6c 20 69   compiler will i
61e0: 6e 2d 6c 69 6e 65 20 0a 20 20 20 20 2a 2a 20 6c  n-line .    ** l
61f0: 6f 6f 6b 75 70 4e 61 6d 65 28 29 20 66 6f 72 20  ookupName() for 
6200: 61 20 73 69 7a 65 20 72 65 64 75 63 74 69 6f 6e  a size reduction
6210: 20 61 6e 64 20 70 65 72 66 6f 72 6d 61 6e 63 65   and performance
6220: 20 69 6e 63 72 65 61 73 65 2e 0a 20 20 20 20 2a   increase..    *
6230: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
6240: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
6250: 54 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74  T: {.      const
6260: 20 63 68 61 72 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a   char *zColumn;.
6270: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
6280: 20 2a 7a 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *zTable;.      
6290: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 44 62 3b  const char *zDb;
62a0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
62b0: 67 68 74 3b 0a 0a 20 20 20 20 20 20 69 66 28 20  ght;..      if( 
62c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  pExpr->op==TK_ID
62d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 7a 44 62 20   ){.        zDb 
62e0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 54 61  = 0;.        zTa
62f0: 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  ble = 0;.       
6300: 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72   zColumn = pExpr
6310: 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
6320: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6330: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
6340: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
6350: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50       notValid(pP
6360: 61 72 73 65 2c 20 70 4e 43 2c 20 22 74 68 65 20  arse, pNC, "the 
6370: 5c 22 2e 5c 22 20 6f 70 65 72 61 74 6f 72 22 2c  \".\" operator",
6380: 20 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 47   NC_IdxExpr|NC_G
6390: 65 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20  enCol);.        
63a0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
63b0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
63c0: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  if( pRight->op==
63d0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20  TK_ID ){.       
63e0: 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20     zDb = 0;.    
63f0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6400: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69       assert( pRi
6410: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20  ght->op==TK_DOT 
6420: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 44 62  );.          zDb
6430: 20 3d 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b   = pLeft->u.zTok
6440: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c  en;.          pL
6450: 65 66 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c  eft = pRight->pL
6460: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70  eft;.          p
6470: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e  Right = pRight->
6480: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20  pRight;.        
6490: 7d 0a 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65  }.        zTable
64a0: 20 3d 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b   = pLeft->u.zTok
64b0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c  en;.        zCol
64c0: 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e  umn = pRight->u.
64d0: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  zToken;.        
64e0: 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42  if( IN_RENAME_OB
64f0: 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  JECT ){.        
6500: 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54    sqlite3RenameT
6510: 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65  okenRemap(pParse
6520: 2c 20 28 76 6f 69 64 2a 29 70 45 78 70 72 2c 20  , (void*)pExpr, 
6530: 28 76 6f 69 64 2a 29 70 52 69 67 68 74 29 3b 0a  (void*)pRight);.
6540: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
6550: 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61  3RenameTokenRema
6560: 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a  p(pParse, (void*
6570: 29 26 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c  )&pExpr->y.pTab,
6580: 20 28 76 6f 69 64 2a 29 70 4c 65 66 74 29 3b 0a   (void*)pLeft);.
6590: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
65a0: 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c  }.      return l
65b0: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
65c0: 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a  , zDb, zTable, z
65d0: 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78  Column, pNC, pEx
65e0: 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  pr);.    }..    
65f0: 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74  /* Resolve funct
6600: 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f  ion names.    */
6610: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
6620: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
6630: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
6640: 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
6650: 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d      /* The argum
6660: 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20  ent list */.    
6670: 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20    int n = pList 
6680: 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ? pList->nExpr :
6690: 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72   0;    /* Number
66a0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
66b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75  .      int no_su
66c0: 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20  ch_func = 0;    
66d0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
66e0: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65   such function e
66f0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  xists */.      i
6700: 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  nt wrong_num_arg
6710: 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  s = 0;     /* Tr
6720: 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62  ue if wrong numb
6730: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
6740: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  */.      int is_
6750: 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  agg = 0;        
6760: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
6770: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
6780: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
6790: 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
67b0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
67c0: 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f  cters in functio
67d0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
67e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
67f0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
6800: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
6810: 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  . */.      FuncD
6820: 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
6830: 20 20 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d         /* Inform
6840: 61 74 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20  ation about the 
6850: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
6860: 20 20 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70    u8 enc = ENC(p
6870: 50 61 72 73 65 2d 3e 64 62 29 3b 20 20 20 2f 2a  Parse->db);   /*
6880: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 65 6e   The database en
6890: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  coding */.      
68a0: 69 6e 74 20 73 61 76 65 64 41 6c 6c 6f 77 46 6c  int savedAllowFl
68b0: 61 67 73 20 3d 20 28 70 4e 43 2d 3e 6e 63 46 6c  ags = (pNC->ncFl
68c0: 61 67 73 20 26 20 28 4e 43 5f 41 6c 6c 6f 77 41  ags & (NC_AllowA
68d0: 67 67 20 7c 20 4e 43 5f 41 6c 6c 6f 77 57 69 6e  gg | NC_AllowWin
68e0: 29 29 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  ));.#ifndef SQLI
68f0: 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55  TE_OMIT_WINDOWFU
6900: 4e 43 0a 20 20 20 20 20 20 57 69 6e 64 6f 77 20  NC.      Window 
6910: 2a 70 57 69 6e 20 3d 20 28 49 73 57 69 6e 64 6f  *pWin = (IsWindo
6920: 77 46 75 6e 63 28 70 45 78 70 72 29 20 3f 20 70  wFunc(pExpr) ? p
6930: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20 3a 20 30  Expr->y.pWin : 0
6940: 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  );.#endif.      
6950: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6960: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
6970: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
6980: 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
6990: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  pr->u.zToken;.  
69a0: 20 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65      nId = sqlite
69b0: 33 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a  3Strlen30(zId);.
69c0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
69d0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
69e0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
69f0: 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  , n, enc, 0);.  
6a00: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
6a10: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
6a20: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
6a30: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
6a40: 2c 20 7a 49 64 2c 20 2d 32 2c 20 65 6e 63 2c 20  , zId, -2, enc, 
6a50: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
6a60: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
6a70: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
6a80: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
6a90: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
6aa0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
6ab0: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
6ac0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6ad0: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
6ae0: 2d 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 3b 0a  ->xFinalize!=0;.
6af0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
6b00: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
6b10: 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45  LITE_FUNC_UNLIKE
6b20: 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  LY ){.          
6b30: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
6b40: 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65  pExpr, EP_Unlike
6b50: 6c 79 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ly);.          i
6b60: 66 28 20 6e 3d 3d 32 20 29 7b 0a 20 20 20 20 20  f( n==2 ){.     
6b70: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
6b80: 61 62 6c 65 20 3d 20 65 78 70 72 50 72 6f 62 61  able = exprProba
6b90: 62 69 6c 69 74 79 28 70 4c 69 73 74 2d 3e 61 5b  bility(pList->a[
6ba0: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
6bb0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
6bc0: 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b 0a 20 20  ->iTable<0 ){.  
6bd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6be0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6bf0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
6c00: 20 20 20 20 22 73 65 63 6f 6e 64 20 61 72 67 75      "second argu
6c10: 6d 65 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f  ment to likeliho
6c20: 6f 64 28 29 20 6d 75 73 74 20 62 65 20 61 20 22  od() must be a "
6c30: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6c40: 20 22 63 6f 6e 73 74 61 6e 74 20 62 65 74 77 65   "constant betwe
6c50: 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e 30 22 29  en 0.0 and 1.0")
6c60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6c70: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
6c80: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6c90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 45 56 49 44 45          /* EVIDE
6cb0: 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33 30 34 2d  NCE-OF: R-61304-
6cc0: 32 39 34 34 39 20 54 68 65 20 75 6e 6c 69 6b 65  29449 The unlike
6cd0: 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69  ly(X) function i
6ce0: 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  s.            **
6cf0: 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f 20 6c   equivalent to l
6d00: 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20 30 2e 30  ikelihood(X, 0.0
6d10: 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20  625)..          
6d20: 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46    ** EVIDENCE-OF
6d30: 3a 20 52 2d 30 31 32 38 33 2d 31 31 36 33 36 20  : R-01283-11636 
6d40: 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20  The unlikely(X) 
6d50: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20 20 20  function is.    
6d60: 20 20 20 20 20 20 20 20 2a 2a 20 73 68 6f 72 74          ** short
6d70: 2d 68 61 6e 64 20 66 6f 72 20 6c 69 6b 65 6c 69  -hand for likeli
6d80: 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35 29 2e 0a  hood(X,0.0625)..
6d90: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45              ** E
6da0: 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 33 36  VIDENCE-OF: R-36
6db0: 38 35 30 2d 33 34 31 32 37 20 54 68 65 20 6c 69  850-34127 The li
6dc0: 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e  kely(X) function
6dd0: 20 69 73 20 73 68 6f 72 74 2d 68 61 6e 64 0a 20   is short-hand. 
6de0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66 6f             ** fo
6df0: 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30  r likelihood(X,0
6e00: 2e 39 33 37 35 29 2e 0a 20 20 20 20 20 20 20 20  .9375)..        
6e10: 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d      ** EVIDENCE-
6e20: 4f 46 3a 20 52 2d 35 33 34 33 36 2d 34 30 39 37  OF: R-53436-4097
6e30: 33 20 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20  3 The likely(X) 
6e40: 66 75 6e 63 74 69 6f 6e 20 69 73 20 65 71 75 69  function is equi
6e50: 76 61 6c 65 6e 74 0a 20 20 20 20 20 20 20 20 20  valent.         
6e60: 20 20 20 2a 2a 20 74 6f 20 6c 69 6b 65 6c 69 68     ** to likelih
6e70: 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e 20 2a  ood(X,0.9375). *
6e80: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  /.            /*
6e90: 20 54 55 4e 49 4e 47 3a 20 75 6e 6c 69 6b 65 6c   TUNING: unlikel
6ea0: 79 28 29 20 70 72 6f 62 61 62 69 6c 69 74 79 20  y() probability 
6eb0: 69 73 20 30 2e 30 36 32 35 2e 20 20 6c 69 6b 65  is 0.0625.  like
6ec0: 6c 79 28 29 20 69 73 20 30 2e 39 33 37 35 20 2a  ly() is 0.9375 *
6ed0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
6ee0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 44  xpr->iTable = pD
6ef0: 65 66 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 75  ef->zName[0]=='u
6f00: 27 20 3f 20 38 33 38 38 36 30 38 20 3a 20 31 32  ' ? 8388608 : 12
6f10: 35 38 32 39 31 32 30 3b 0a 20 20 20 20 20 20 20  5829120;.       
6f20: 20 20 20 7d 20 20 20 20 20 20 20 20 20 20 20 20     }            
6f30: 20 0a 20 20 20 20 20 20 20 20 7d 0a 23 69 66 6e   .        }.#ifn
6f40: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
6f50: 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e 0a 20 20  AUTHORIZATION.  
6f60: 20 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20        {.        
6f70: 20 20 69 6e 74 20 61 75 74 68 20 3d 20 73 71 6c    int auth = sql
6f80: 69 74 65 33 41 75 74 68 43 68 65 63 6b 28 70 50  ite3AuthCheck(pP
6f90: 61 72 73 65 2c 20 53 51 4c 49 54 45 5f 46 55 4e  arse, SQLITE_FUN
6fa0: 43 54 49 4f 4e 2c 20 30 2c 70 44 65 66 2d 3e 7a  CTION, 0,pDef->z
6fb0: 4e 61 6d 65 2c 30 29 3b 0a 20 20 20 20 20 20 20  Name,0);.       
6fc0: 20 20 20 69 66 28 20 61 75 74 68 21 3d 53 51 4c     if( auth!=SQL
6fd0: 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20 20 20 20  ITE_OK ){.      
6fe0: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 3d 3d        if( auth==
6ff0: 53 51 4c 49 54 45 5f 44 45 4e 59 20 29 7b 0a 20  SQLITE_DENY ){. 
7000: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
7010: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7020: 72 73 65 2c 20 22 6e 6f 74 20 61 75 74 68 6f 72  rse, "not author
7030: 69 7a 65 64 20 74 6f 20 75 73 65 20 66 75 6e 63  ized to use func
7040: 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20 20 20 20  tion: %s",.     
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 20 20 20 20 20 20 20 20 20                  
7070: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20   pDef->zName);. 
7080: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 43               pNC
7090: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
70a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
70b0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
70c0: 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20 20 20 20  TK_NULL;.       
70d0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
70e0: 50 72 75 6e 65 3b 0a 20 20 20 20 20 20 20 20 20  Prune;.         
70f0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e   }.        }.#en
7100: 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
7110: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
7120: 26 20 28 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43  & (SQLITE_FUNC_C
7130: 4f 4e 53 54 41 4e 54 7c 53 51 4c 49 54 45 5f 46  ONSTANT|SQLITE_F
7140: 55 4e 43 5f 53 4c 4f 43 48 4e 47 29 20 29 7b 0a  UNC_SLOCHNG) ){.
7150: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72            /* For
7160: 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66   the purposes of
7170: 20 74 68 65 20 45 50 5f 43 6f 6e 73 74 46 75 6e   the EP_ConstFun
7180: 63 20 66 6c 61 67 2c 20 64 61 74 65 20 61 6e 64  c flag, date and
7190: 20 74 69 6d 65 0a 20 20 20 20 20 20 20 20 20 20   time.          
71a0: 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  ** functions and
71b0: 20 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73   other functions
71c0: 20 74 68 61 74 20 63 68 61 6e 67 65 20 73 6c 6f   that change slo
71d0: 77 6c 79 20 61 72 65 20 63 6f 6e 73 69 64 65 72  wly are consider
71e0: 65 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  ed.          ** 
71f0: 63 6f 6e 73 74 61 6e 74 20 62 65 63 61 75 73 65  constant because
7200: 20 74 68 65 79 20 61 72 65 20 63 6f 6e 73 74 61   they are consta
7210: 6e 74 20 66 6f 72 20 74 68 65 20 64 75 72 61 74  nt for the durat
7220: 69 6f 6e 20 6f 66 20 6f 6e 65 20 71 75 65 72 79  ion of one query
7230: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 45 78   */.          Ex
7240: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
7250: 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46 75 6e 63  xpr,EP_ConstFunc
7260: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7270: 20 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e       if( (pDef->
7280: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
7290: 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54  TE_FUNC_CONSTANT
72a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
72b0: 20 20 2f 2a 20 44 61 74 65 2f 74 69 6d 65 20 66    /* Date/time f
72c0: 75 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 75 73  unctions that us
72d0: 65 20 27 6e 6f 77 27 2c 20 61 6e 64 20 6f 74 68  e 'now', and oth
72e0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 6c 69 6b  er functions lik
72f0: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73  e.          ** s
7300: 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e 28 29 20  qlite_version() 
7310: 74 68 61 74 20 6d 69 67 68 74 20 63 68 61 6e 67  that might chang
7320: 65 20 6f 76 65 72 20 74 69 6d 65 20 63 61 6e 6e  e over time cann
7330: 6f 74 20 62 65 20 75 73 65 64 0a 20 20 20 20 20  ot be used.     
7340: 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e 20 69 6e       ** in an in
7350: 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  dex. */.        
7360: 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73    notValid(pPars
7370: 65 2c 20 70 4e 43 2c 20 22 6e 6f 6e 2d 64 65 74  e, pNC, "non-det
7380: 65 72 6d 69 6e 69 73 74 69 63 20 66 75 6e 63 74  erministic funct
7390: 69 6f 6e 73 22 2c 0a 20 20 20 20 20 20 20 20 20  ions",.         
73a0: 20 20 20 20 20 20 20 20 20 20 4e 43 5f 49 64 78            NC_Idx
73b0: 45 78 70 72 7c 4e 43 5f 50 61 72 74 49 64 78 7c  Expr|NC_PartIdx|
73c0: 4e 43 5f 47 65 6e 43 6f 6c 29 3b 0a 20 20 20 20  NC_GenCol);.    
73d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
73e0: 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  ( (pDef->funcFla
73f0: 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43  gs & SQLITE_FUNC
7400: 5f 49 4e 54 45 52 4e 41 4c 29 21 3d 30 0a 20 20  _INTERNAL)!=0.  
7410: 20 20 20 20 20 20 20 26 26 20 70 50 61 72 73 65         && pParse
7420: 2d 3e 6e 65 73 74 65 64 3d 3d 30 0a 20 20 20 20  ->nested==0.    
7430: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 43       && sqlite3C
7440: 6f 6e 66 69 67 2e 62 49 6e 74 65 72 6e 61 6c 46  onfig.bInternalF
7450: 75 6e 63 74 69 6f 6e 73 3d 3d 30 0a 20 20 20 20  unctions==0.    
7460: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20      ){.         
7470: 20 2f 2a 20 49 6e 74 65 72 6e 61 6c 2d 75 73 65   /* Internal-use
7480: 2d 6f 6e 6c 79 20 66 75 6e 63 74 69 6f 6e 73 20  -only functions 
7490: 61 72 65 20 64 69 73 61 6c 6c 6f 77 65 64 20 75  are disallowed u
74a0: 6e 6c 65 73 73 20 74 68 65 0a 20 20 20 20 20 20  nless the.      
74b0: 20 20 20 20 2a 2a 20 53 51 4c 20 69 73 20 62 65      ** SQL is be
74c0: 69 6e 67 20 63 6f 6d 70 69 6c 65 64 20 75 73 69  ing compiled usi
74d0: 6e 67 20 73 71 6c 69 74 65 33 4e 65 73 74 65 64  ng sqlite3Nested
74e0: 50 61 72 73 65 28 29 20 2a 2f 0a 20 20 20 20 20  Parse() */.     
74f0: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
7500: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  c = 1;.         
7510: 20 70 44 65 66 20 3d 20 30 3b 0a 20 20 20 20 20   pDef = 0;.     
7520: 20 20 20 7d 65 6c 73 65 0a 20 20 20 20 20 20 20     }else.       
7530: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
7540: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7550: 55 4e 43 5f 44 49 52 45 43 54 29 21 3d 30 0a 20  UNC_DIRECT)!=0. 
7560: 20 20 20 20 20 20 20 20 26 26 20 45 78 70 72 48          && ExprH
7570: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
7580: 2c 20 45 50 5f 49 6e 64 69 72 65 63 74 29 0a 20  , EP_Indirect). 
7590: 20 20 20 20 20 20 20 20 26 26 20 21 49 4e 5f 52          && !IN_R
75a0: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 0a 20 20 20  ENAME_OBJECT.   
75b0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
75c0: 20 20 2f 2a 20 46 75 6e 63 74 69 6f 6e 73 20 74    /* Functions t
75d0: 61 67 67 65 64 20 77 69 74 68 20 53 51 4c 49 54  agged with SQLIT
75e0: 45 5f 44 49 52 45 43 54 4f 4e 4c 59 20 6d 61 79  E_DIRECTONLY may
75f0: 20 6e 6f 74 20 62 65 20 75 73 65 64 0a 20 20 20   not be used.   
7600: 20 20 20 20 20 20 20 2a 2a 20 69 6e 73 69 64 65         ** inside
7610: 20 6f 66 20 74 72 69 67 67 65 72 73 20 61 6e 64   of triggers and
7620: 20 76 69 65 77 73 20 2a 2f 0a 20 20 20 20 20 20   views */.      
7630: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7640: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 73 28  Msg(pParse, "%s(
7650: 29 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  ) prohibited in 
7660: 74 72 69 67 67 65 72 73 20 61 6e 64 20 76 69 65  triggers and vie
7670: 77 73 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ws",.           
7680: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
7690: 44 65 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  Def->zName);.   
76a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 0a       }.      }..
76b0: 20 20 20 20 20 20 69 66 28 20 30 3d 3d 49 4e 5f        if( 0==IN_
76c0: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
76d0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
76e0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
76f0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7700: 69 73 5f 61 67 67 3d 3d 30 20 7c 7c 20 28 70 44  is_agg==0 || (pD
7710: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
7720: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d  SQLITE_FUNC_MINM
7730: 41 58 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c  AX).          ||
7740: 20 28 70 44 65 66 2d 3e 78 56 61 6c 75 65 3d 3d   (pDef->xValue==
7750: 30 20 26 26 20 70 44 65 66 2d 3e 78 49 6e 76 65  0 && pDef->xInve
7760: 72 73 65 3d 3d 30 29 0a 20 20 20 20 20 20 20 20  rse==0).        
7770: 20 20 7c 7c 20 28 70 44 65 66 2d 3e 78 56 61 6c    || (pDef->xVal
7780: 75 65 20 26 26 20 70 44 65 66 2d 3e 78 49 6e 76  ue && pDef->xInv
7790: 65 72 73 65 20 26 26 20 70 44 65 66 2d 3e 78 53  erse && pDef->xS
77a0: 46 75 6e 63 20 26 26 20 70 44 65 66 2d 3e 78 46  Func && pDef->xF
77b0: 69 6e 61 6c 69 7a 65 29 0a 20 20 20 20 20 20 20  inalize).       
77c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
77d0: 70 44 65 66 20 26 26 20 70 44 65 66 2d 3e 78 56  pDef && pDef->xV
77e0: 61 6c 75 65 3d 3d 30 20 26 26 20 70 57 69 6e 20  alue==0 && pWin 
77f0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7800: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7810: 72 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20  rse, .          
7820: 20 20 20 20 22 25 2e 2a 73 28 29 20 6d 61 79 20      "%.*s() may 
7830: 6e 6f 74 20 62 65 20 75 73 65 64 20 61 73 20 61  not be used as a
7840: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
7850: 22 2c 20 6e 49 64 2c 20 7a 49 64 0a 20 20 20 20  ", nId, zId.    
7860: 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 20        );.       
7870: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
7880: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
7890: 28 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ( .             
78a0: 20 28 69 73 5f 61 67 67 20 26 26 20 28 70 4e 43   (is_agg && (pNC
78b0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 41  ->ncFlags & NC_A
78c0: 6c 6c 6f 77 41 67 67 29 3d 3d 30 29 0a 20 20 20  llowAgg)==0).   
78d0: 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73 5f 61          || (is_a
78e0: 67 67 20 26 26 20 28 70 44 65 66 2d 3e 66 75 6e  gg && (pDef->fun
78f0: 63 46 6c 61 67 73 26 53 51 4c 49 54 45 5f 46 55  cFlags&SQLITE_FU
7900: 4e 43 5f 57 49 4e 44 4f 57 29 20 26 26 20 21 70  NC_WINDOW) && !p
7910: 57 69 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20  Win).           
7920: 7c 7c 20 28 69 73 5f 61 67 67 20 26 26 20 70 57  || (is_agg && pW
7930: 69 6e 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c  in && (pNC->ncFl
7940: 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 57 69  ags & NC_AllowWi
7950: 6e 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 29  n)==0).        )
7960: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  {.          cons
7970: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20  t char *zType;. 
7980: 20 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44           if( (pD
7990: 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
79a0: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
79b0: 4f 57 29 20 7c 7c 20 70 57 69 6e 20 29 7b 0a 20  OW) || pWin ){. 
79c0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
79d0: 20 3d 20 22 77 69 6e 64 6f 77 22 3b 0a 20 20 20   = "window";.   
79e0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
79f0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7a00: 3d 20 22 61 67 67 72 65 67 61 74 65 22 3b 0a 20  = "aggregate";. 
7a10: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7a20: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7a30: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
7a40: 73 75 73 65 20 6f 66 20 25 73 20 66 75 6e 63 74  suse of %s funct
7a50: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 7a 54 79 70  ion %.*s()",zTyp
7a60: 65 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20  e,nId,zId);.    
7a70: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
7a80: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f  +;.          is_
7a90: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  agg = 0;.       
7aa0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
7ab0: 20 69 66 28 20 28 69 73 5f 61 67 67 20 26 26 20   if( (is_agg && 
7ac0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
7ad0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 29  NC_AllowAgg)==0)
7ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
7af0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7b00: 61 72 73 65 2c 22 6d 69 73 75 73 65 20 6f 66 20  arse,"misuse of 
7b10: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7b20: 6f 6e 20 25 2e 2a 73 28 29 22 2c 6e 49 64 2c 7a  on %.*s()",nId,z
7b30: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Id);.          p
7b40: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
7b50: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
7b60: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
7b70: 69 66 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  if.        else 
7b80: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
7b90: 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
7ba0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66  init.busy==0.#if
7bb0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
7bc0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
7bd0: 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  NCTION.         
7be0: 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
7bf0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 0a 23  se->explain==0.#
7c00: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b  endif.        ){
7c10: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7c20: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7c30: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
7c40: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
7c50: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
7c60: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
7c70: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7c80: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
7c90: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
7ca0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7cb0: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
7cc0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
7cd0: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
7ce0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
7cf0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
7d00: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
7d10: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23  r++;.        }.#
7d20: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
7d30: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20  IT_WINDOWFUNC.  
7d40: 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 69        else if( i
7d50: 73 5f 61 67 67 3d 3d 30 20 26 26 20 45 78 70 72  s_agg==0 && Expr
7d60: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
7d70: 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20 29  r, EP_WinFunc) )
7d80: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
7d90: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7da0: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
7db0: 20 20 20 22 46 49 4c 54 45 52 20 6d 61 79 20 6e     "FILTER may n
7dc0: 6f 74 20 62 65 20 75 73 65 64 20 77 69 74 68 20  ot be used with 
7dd0: 6e 6f 6e 2d 61 67 67 72 65 67 61 74 65 20 25 2e  non-aggregate %.
7de0: 2a 73 28 29 22 2c 20 0a 20 20 20 20 20 20 20 20  *s()", .        
7df0: 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 0a 20        nId, zId. 
7e00: 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20           );.    
7e10: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
7e20: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  +;.        }.#en
7e30: 64 69 66 0a 20 20 20 20 20 20 20 20 69 66 28 20  dif.        if( 
7e40: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
7e50: 20 20 20 20 2f 2a 20 57 69 6e 64 6f 77 20 66 75      /* Window fu
7e60: 6e 63 74 69 6f 6e 73 20 6d 61 79 20 6e 6f 74 20  nctions may not 
7e70: 62 65 20 61 72 67 75 6d 65 6e 74 73 20 6f 66 20  be arguments of 
7e80: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7e90: 6f 6e 73 2e 0a 20 20 20 20 20 20 20 20 20 20 2a  ons..          *
7ea0: 2a 20 4f 72 20 61 72 67 75 6d 65 6e 74 73 20 6f  * Or arguments o
7eb0: 66 20 6f 74 68 65 72 20 77 69 6e 64 6f 77 20 66  f other window f
7ec0: 75 6e 63 74 69 6f 6e 73 2e 20 42 75 74 20 61 67  unctions. But ag
7ed0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7ee0: 73 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6d  s.          ** m
7ef0: 61 79 20 62 65 20 61 72 67 75 6d 65 6e 74 73 20  ay be arguments 
7f00: 66 6f 72 20 77 69 6e 64 6f 77 20 66 75 6e 63 74  for window funct
7f10: 69 6f 6e 73 2e 20 20 2a 2f 0a 23 69 66 6e 64 65  ions.  */.#ifnde
7f20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
7f30: 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 20  NDOWFUNC.       
7f40: 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20     pNC->ncFlags 
7f50: 26 3d 20 7e 28 4e 43 5f 41 6c 6c 6f 77 57 69 6e  &= ~(NC_AllowWin
7f60: 20 7c 20 28 21 70 57 69 6e 20 3f 20 4e 43 5f 41   | (!pWin ? NC_A
7f70: 6c 6c 6f 77 41 67 67 20 3a 20 30 29 29 3b 0a 23  llowAgg : 0));.#
7f80: 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20 70  else.          p
7f90: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  NC->ncFlags &= ~
7fa0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 23 65 6e  NC_AllowAgg;.#en
7fb0: 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  dif.        }.  
7fc0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
7fd0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
7fe0: 46 55 4e 43 0a 20 20 20 20 20 20 65 6c 73 65 20  FUNC.      else 
7ff0: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
8000: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69  rty(pExpr, EP_Wi
8010: 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20  nFunc) ){.      
8020: 20 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20    is_agg = 1;.  
8030: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
8040: 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78     sqlite3WalkEx
8050: 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20  prList(pWalker, 
8060: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 69 66  pList);.      if
8070: 28 20 69 73 5f 61 67 67 20 29 7b 0a 23 69 66 6e  ( is_agg ){.#ifn
8080: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
8090: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
80a0: 20 20 20 69 66 28 20 70 57 69 6e 20 29 7b 0a 20     if( pWin ){. 
80b0: 20 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20           Select 
80c0: 2a 70 53 65 6c 20 3d 20 70 4e 43 2d 3e 70 57 69  *pSel = pNC->pWi
80d0: 6e 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20  nSelect;.       
80e0: 20 20 20 61 73 73 65 72 74 28 20 70 57 69 6e 3d     assert( pWin=
80f0: 3d 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20 29  =pExpr->y.pWin )
8100: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
8110: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
8120: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8130: 20 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77     sqlite3Window
8140: 55 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 70  Update(pParse, p
8150: 53 65 6c 2d 3e 70 57 69 6e 44 65 66 6e 2c 20 70  Sel->pWinDefn, p
8160: 57 69 6e 2c 20 70 44 65 66 29 3b 0a 20 20 20 20  Win, pDef);.    
8170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
8180: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
8190: 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70  rList(pWalker, p
81a0: 57 69 6e 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29  Win->pPartition)
81b0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
81c0: 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28  te3WalkExprList(
81d0: 70 57 61 6c 6b 65 72 2c 20 70 57 69 6e 2d 3e 70  pWalker, pWin->p
81e0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20 20 20  OrderBy);.      
81f0: 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45      sqlite3WalkE
8200: 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70 57 69  xpr(pWalker, pWi
8210: 6e 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20  n->pFilter);.   
8220: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69         sqlite3Wi
8230: 6e 64 6f 77 4c 69 6e 6b 28 70 53 65 6c 2c 20 70  ndowLink(pSel, p
8240: 57 69 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Win);.          
8250: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20  pNC->ncFlags |= 
8260: 4e 43 5f 48 61 73 57 69 6e 3b 0a 20 20 20 20 20  NC_HasWin;.     
8270: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
8280: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
8290: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
82a0: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
82b0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
82c0: 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  C2 = pNC;.      
82d0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
82e0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
82f0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
8300: 2d 3e 6f 70 32 20 3d 20 30 3b 0a 23 69 66 6e 64  ->op2 = 0;.#ifnd
8310: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
8320: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
8330: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
8340: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
8350: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
8360: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
8370: 33 57 61 6c 6b 45 78 70 72 28 70 57 61 6c 6b 65  3WalkExpr(pWalke
8380: 72 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e  r, pExpr->y.pWin
8390: 2d 3e 70 46 69 6c 74 65 72 29 3b 0a 20 20 20 20  ->pFilter);.    
83a0: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
83b0: 20 20 20 20 20 20 20 20 20 77 68 69 6c 65 28 20           while( 
83c0: 70 4e 43 32 20 26 26 20 21 73 71 6c 69 74 65 33  pNC2 && !sqlite3
83d0: 46 75 6e 63 74 69 6f 6e 55 73 65 73 54 68 69 73  FunctionUsesThis
83e0: 53 72 63 28 70 45 78 70 72 2c 20 70 4e 43 32 2d  Src(pExpr, pNC2-
83f0: 3e 70 53 72 63 4c 69 73 74 29 20 29 7b 0a 20 20  >pSrcList) ){.  
8400: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8410: 3e 6f 70 32 2b 2b 3b 0a 20 20 20 20 20 20 20 20  >op2++;.        
8420: 20 20 20 20 70 4e 43 32 20 3d 20 70 4e 43 32 2d      pNC2 = pNC2-
8430: 3e 70 4e 65 78 74 3b 0a 20 20 20 20 20 20 20 20  >pNext;.        
8440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 61 73    }.          as
8450: 73 65 72 74 28 20 70 44 65 66 21 3d 30 20 7c 7c  sert( pDef!=0 ||
8460: 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43   IN_RENAME_OBJEC
8470: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  T );.          i
8480: 66 28 20 70 4e 43 32 20 26 26 20 70 44 65 66 20  f( pNC2 && pDef 
8490: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
84a0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
84b0: 4e 43 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69  NC_MINMAX==NC_Mi
84c0: 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20  nMaxAgg );.     
84d0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
84e0: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
84f0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
8500: 4d 49 4e 4d 41 58 29 21 3d 30 20 29 3b 0a 20 20  MINMAX)!=0 );.  
8510: 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 2d 3e            pNC2->
8520: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61  ncFlags |= NC_Ha
8530: 73 41 67 67 20 7c 20 28 70 44 65 66 2d 3e 66 75  sAgg | (pDef->fu
8540: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
8550: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 3b 0a 0a  _FUNC_MINMAX);..
8560: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
8570: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70 4e      }.        pN
8580: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61  C->ncFlags |= sa
8590: 76 65 64 41 6c 6c 6f 77 46 6c 61 67 73 3b 0a 20  vedAllowFlags;. 
85a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
85b0: 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65  FIX ME:  Compute
85c0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
85d0: 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78   based on the ex
85e0: 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20  pected return.  
85f0: 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74      ** type of t
8600: 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20  he function .   
8610: 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75     */.      retu
8620: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
8630: 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
8640: 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
8650: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
8660: 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ECT:.    case TK
8670: 5f 45 58 49 53 54 53 3a 20 20 74 65 73 74 63 61  _EXISTS:  testca
8680: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8690: 4b 5f 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64  K_EXISTS );.#end
86a0: 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  if.    case TK_I
86b0: 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
86c0: 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ase( pExpr->op==
86d0: 54 4b 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 69  TK_IN );.      i
86e0: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
86f0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73  ty(pExpr, EP_xIs
8700: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20  Select) ){.     
8710: 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e     int nRef = pN
8720: 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20  C->nRef;.       
8730: 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65   notValid(pParse
8740: 2c 20 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69  , pNC, "subqueri
8750: 65 73 22 2c 20 0a 20 20 20 20 20 20 20 20 20 20  es", .          
8760: 20 20 20 20 20 20 20 4e 43 5f 49 73 43 68 65 63         NC_IsChec
8770: 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f  k|NC_PartIdx|NC_
8780: 49 64 78 45 78 70 72 7c 4e 43 5f 47 65 6e 43 6f  IdxExpr|NC_GenCo
8790: 6c 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  l);.        sqli
87a0: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
87b0: 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  alker, pExpr->x.
87c0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
87d0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e    assert( pNC->n
87e0: 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20  Ref>=nRef );.   
87f0: 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70       if( nRef!=p
8800: 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20  NC->nRef ){.    
8810: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
8820: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
8830: 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  VarSelect);.    
8840: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
8850: 67 73 20 7c 3d 20 4e 43 5f 56 61 72 53 65 6c 65  gs |= NC_VarSele
8860: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ct;.        }.  
8870: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
8880: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8890: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
88a0: 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28  .      notValid(
88b0: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61  pParse, pNC, "pa
88c0: 72 61 6d 65 74 65 72 73 22 2c 0a 20 20 20 20 20  rameters",.     
88d0: 20 20 20 20 20 20 20 20 20 20 4e 43 5f 49 73 43            NC_IsC
88e0: 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c  heck|NC_PartIdx|
88f0: 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 47 65  NC_IdxExpr|NC_Ge
8900: 6e 43 6f 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  nCol);.      bre
8910: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8920: 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20 20 63 61  se TK_IS:.    ca
8930: 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20 7b 0a 20  se TK_ISNOT: {. 
8940: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
8950: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  t = sqlite3ExprS
8960: 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69 6b  kipCollateAndLik
8970: 65 6c 79 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ely(pExpr->pRigh
8980: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
8990: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
89a0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 64  ty(pExpr, EP_Red
89b0: 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20 20 2f  uced) );.      /
89c0: 2a 20 48 61 6e 64 6c 65 20 73 70 65 63 69 61 6c  * Handle special
89d0: 20 63 61 73 65 73 20 6f 66 20 22 78 20 49 53 20   cases of "x IS 
89e0: 54 52 55 45 22 2c 20 22 78 20 49 53 20 46 41 4c  TRUE", "x IS FAL
89f0: 53 45 22 2c 20 22 78 20 49 53 20 4e 4f 54 20 54  SE", "x IS NOT T
8a00: 52 55 45 22 2c 0a 20 20 20 20 20 20 2a 2a 20 61  RUE",.      ** a
8a10: 6e 64 20 22 78 20 49 53 20 4e 4f 54 20 46 41 4c  nd "x IS NOT FAL
8a20: 53 45 22 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66  SE". */.      if
8a30: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
8a40: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 69  _ID ){.        i
8a50: 6e 74 20 72 63 20 3d 20 72 65 73 6f 6c 76 65 45  nt rc = resolveE
8a60: 78 70 72 53 74 65 70 28 70 57 61 6c 6b 65 72 2c  xprStep(pWalker,
8a70: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
8a80: 20 20 69 66 28 20 72 63 3d 3d 57 52 43 5f 41 62    if( rc==WRC_Ab
8a90: 6f 72 74 20 29 20 72 65 74 75 72 6e 20 57 52 43  ort ) return WRC
8aa0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20  _Abort;.        
8ab0: 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  if( pRight->op==
8ac0: 54 4b 5f 54 52 55 45 46 41 4c 53 45 20 29 7b 0a  TK_TRUEFALSE ){.
8ad0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
8ae0: 3e 6f 70 32 20 3d 20 70 45 78 70 72 2d 3e 6f 70  >op2 = pExpr->op
8af0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
8b00: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54 52 55 54 48  r->op = TK_TRUTH
8b10: 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75  ;.          retu
8b20: 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65 3b  rn WRC_Continue;
8b30: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
8b40: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c   }.      /* Fall
8b50: 20 74 68 72 75 20 2a 2f 0a 20 20 20 20 7d 0a 20   thru */.    }. 
8b60: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
8b70: 45 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EN:.    case TK_
8b80: 45 51 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  EQ:.    case TK_
8b90: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
8ba0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
8bb0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
8bc0: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
8bd0: 47 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  GE: {.      int 
8be0: 6e 4c 65 66 74 2c 20 6e 52 69 67 68 74 3b 0a 20  nLeft, nRight;. 
8bf0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
8c00: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
8c10: 64 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  d ) break;.     
8c20: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
8c30: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 20 20  pLeft!=0 );.    
8c40: 20 20 6e 4c 65 66 74 20 3d 20 73 71 6c 69 74 65    nLeft = sqlite
8c50: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
8c60: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
8c70: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
8c80: 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29  op==TK_BETWEEN )
8c90: 7b 0a 20 20 20 20 20 20 20 20 6e 52 69 67 68 74  {.        nRight
8ca0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65   = sqlite3ExprVe
8cb0: 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e  ctorSize(pExpr->
8cc0: 78 2e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  x.pList->a[0].pE
8cd0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
8ce0: 28 20 6e 52 69 67 68 74 3d 3d 6e 4c 65 66 74 20  ( nRight==nLeft 
8cf0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 52 69  ){.          nRi
8d00: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
8d10: 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70  rVectorSize(pExp
8d20: 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d  r->x.pList->a[1]
8d30: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
8d40: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
8d50: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8d60: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 21 3d 30  pExpr->pRight!=0
8d70: 20 29 3b 0a 20 20 20 20 20 20 20 20 6e 52 69 67   );.        nRig
8d80: 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ht = sqlite3Expr
8d90: 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72  VectorSize(pExpr
8da0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8db0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 4c 65   }.      if( nLe
8dc0: 66 74 21 3d 6e 52 69 67 68 74 20 29 7b 0a 20 20  ft!=nRight ){.  
8dd0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8de0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
8df0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
8e00: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8e10: 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 20 20 20 20  =TK_NE );.      
8e20: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8e30: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 29 3b 0a  r->op==TK_LT );.
8e40: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8e50: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
8e60: 4c 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  LE );.        te
8e70: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8e80: 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a 20 20 20 20  p==TK_GT );.    
8e90: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8ea0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 29  xpr->op==TK_GE )
8eb0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
8ec0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8ed0: 4b 5f 49 53 20 29 3b 0a 20 20 20 20 20 20 20 20  K_IS );.        
8ee0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8ef0: 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b  >op==TK_ISNOT );
8f00: 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
8f10: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
8f20: 5f 42 45 54 57 45 45 4e 20 29 3b 0a 20 20 20 20  _BETWEEN );.    
8f30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8f40: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 72 6f 77  Msg(pParse, "row
8f50: 20 76 61 6c 75 65 20 6d 69 73 75 73 65 64 22 29   value misused")
8f60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8f70: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20  break; .    }.  
8f80: 7d 0a 20 20 72 65 74 75 72 6e 20 28 70 50 61 72  }.  return (pPar
8f90: 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 70 50 61 72  se->nErr || pPar
8fa0: 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61  se->db->mallocFa
8fb0: 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72  iled) ? WRC_Abor
8fc0: 74 20 3a 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  t : WRC_Continue
8fd0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 4c 69 73  ;.}../*.** pELis
8fe0: 74 20 69 73 20 61 20 6c 69 73 74 20 6f 66 20 65  t is a list of e
8ff0: 78 70 72 65 73 73 69 6f 6e 73 20 77 68 69 63 68  xpressions which
9000: 20 61 72 65 20 72 65 61 6c 6c 79 20 74 68 65 20   are really the 
9010: 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74 68  result set of th
9020: 65 0a 2a 2a 20 61 20 53 45 4c 45 43 54 20 73 74  e.** a SELECT st
9030: 61 74 65 6d 65 6e 74 2e 20 20 70 45 20 69 73 20  atement.  pE is 
9040: 61 20 74 65 72 6d 20 69 6e 20 61 6e 20 4f 52 44  a term in an ORD
9050: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9060: 59 20 63 6c 61 75 73 65 2e 0a 2a 2a 20 54 68 69  Y clause..** Thi
9070: 73 20 72 6f 75 74 69 6e 65 20 63 68 65 63 6b 73  s routine checks
9080: 20 74 6f 20 73 65 65 20 69 66 20 70 45 20 69 73   to see if pE is
9090: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
90a0: 66 69 65 72 20 77 68 69 63 68 20 63 6f 72 72 65  fier which corre
90b0: 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f 20 74 68 65  sponds.** to the
90c0: 20 41 53 2d 6e 61 6d 65 20 6f 66 20 6f 6e 65 20   AS-name of one 
90d0: 6f 66 20 74 68 65 20 74 65 72 6d 73 20 6f 66 20  of the terms of 
90e0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  the expression l
90f0: 69 73 74 2e 20 20 49 66 20 69 74 20 69 73 2c 0a  ist.  If it is,.
9100: 2a 2a 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  ** this routine 
9110: 72 65 74 75 72 6e 20 61 6e 20 69 6e 74 65 67 65  return an intege
9120: 72 20 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20  r between 1 and 
9130: 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74 68 65  N where N is the
9140: 20 6e 75 6d 62 65 72 20 6f 66 0a 2a 2a 20 65 6c   number of.** el
9150: 65 6d 65 6e 74 73 20 69 6e 20 70 45 4c 69 73 74  ements in pEList
9160: 2c 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20  , corresponding 
9170: 74 6f 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20  to the matching 
9180: 65 6e 74 72 79 2e 20 20 49 66 20 74 68 65 72 65  entry.  If there
9190: 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 2c   is.** no match,
91a0: 20 6f 72 20 69 66 20 70 45 20 69 73 20 6e 6f 74   or if pE is not
91b0: 20 61 20 73 69 6d 70 6c 65 20 69 64 65 6e 74 69   a simple identi
91c0: 66 69 65 72 2c 20 74 68 65 6e 20 74 68 69 73 20  fier, then this 
91d0: 72 6f 75 74 69 6e 65 0a 2a 2a 20 72 65 74 75 72  routine.** retur
91e0: 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70 45 4c 69 73  n 0..**.** pELis
91f0: 74 20 68 61 73 20 62 65 65 6e 20 72 65 73 6f 6c  t has been resol
9200: 76 65 64 2e 20 20 70 45 20 68 61 73 20 6e 6f 74  ved.  pE has not
9210: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
9220: 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 0a 20  resolveAsName(. 
9230: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
9240: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
9250: 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f 72  ontext for error
9260: 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20 45   messages */.  E
9270: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
9280: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
9290: 72 65 73 73 69 6f 6e 73 20 74 6f 20 73 63 61 6e  ressions to scan
92a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 20 20   */.  Expr *pE  
92b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72           /* Expr
92c0: 65 73 73 69 6f 6e 20 77 65 20 61 72 65 20 74 72  ession we are tr
92d0: 79 69 6e 67 20 74 6f 20 6d 61 74 63 68 20 2a 2f  ying to match */
92e0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
92f0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
9300: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 0a 20 20 55   counter */..  U
9310: 4e 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28  NUSED_PARAMETER(
9320: 70 50 61 72 73 65 29 3b 0a 0a 20 20 69 66 28 20  pParse);..  if( 
9330: 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  pE->op==TK_ID ){
9340: 0a 20 20 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  .    char *zCol 
9350: 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  = pE->u.zToken;.
9360: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
9370: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  EList->nExpr; i+
9380: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
9390: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
93a0: 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  i].zName;.      
93b0: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
93c0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
93d0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
93e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b 31        return i+1
93f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
9400: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9410: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20 69 73 20 61  }../*.** pE is a
9420: 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 65   pointer to an e
9430: 78 70 72 65 73 73 69 6f 6e 20 77 68 69 63 68 20  xpression which 
9440: 69 73 20 61 20 73 69 6e 67 6c 65 20 74 65 72 6d  is a single term
9450: 20 69 6e 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52   in the.** ORDER
9460: 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e   BY of a compoun
9470: 64 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 65  d SELECT.  The e
9480: 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 6e 6f  xpression has no
9490: 74 20 62 65 65 6e 0a 2a 2a 20 6e 61 6d 65 20 72  t been.** name r
94a0: 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a 2a 2a 20 41  esolved..**.** A
94b0: 74 20 74 68 65 20 70 6f 69 6e 74 20 74 68 69 73  t the point this
94c0: 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c   routine is call
94d0: 65 64 2c 20 77 65 20 61 6c 72 65 61 64 79 20 6b  ed, we already k
94e0: 6e 6f 77 20 74 68 61 74 20 74 68 65 0a 2a 2a 20  now that the.** 
94f0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
9500: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
9510: 69 6e 64 65 78 20 69 6e 74 6f 20 74 68 65 20 72  index into the r
9520: 65 73 75 6c 74 20 73 65 74 2e 20 20 54 68 61 74  esult set.  That
9530: 0a 2a 2a 20 63 61 73 65 20 69 73 20 68 61 6e 64  .** case is hand
9540: 6c 65 64 20 62 79 20 74 68 65 20 63 61 6c 6c 69  led by the calli
9550: 6e 67 20 72 6f 75 74 69 6e 65 2e 0a 2a 2a 0a 2a  ng routine..**.*
9560: 2a 20 41 74 74 65 6d 70 74 20 74 6f 20 6d 61 74  * Attempt to mat
9570: 63 68 20 70 45 20 61 67 61 69 6e 73 74 20 72 65  ch pE against re
9580: 73 75 6c 74 20 73 65 74 20 63 6f 6c 75 6d 6e 73  sult set columns
9590: 20 69 6e 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73   in the left-mos
95a0: 74 0a 2a 2a 20 53 45 4c 45 43 54 20 73 74 61 74  t.** SELECT stat
95b0: 65 6d 65 6e 74 2e 20 20 52 65 74 75 72 6e 20 74  ement.  Return t
95c0: 68 65 20 69 6e 64 65 78 20 69 20 6f 66 20 74 68  he index i of th
95d0: 65 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  e matching colum
95e0: 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20 69 6e 64 69  n,.** as an indi
95f0: 63 61 74 69 6f 6e 20 74 6f 20 74 68 65 20 63 61  cation to the ca
9600: 6c 6c 65 72 20 74 68 61 74 20 69 74 20 73 68 6f  ller that it sho
9610: 75 6c 64 20 73 6f 72 74 20 62 79 20 74 68 65 20  uld sort by the 
9620: 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 20  i-th column..** 
9630: 54 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20 63 6f  The left-most co
9640: 6c 75 6d 6e 20 69 73 20 31 2e 20 20 49 6e 20 6f  lumn is 1.  In o
9650: 74 68 65 72 20 77 6f 72 64 73 2c 20 74 68 65 20  ther words, the 
9660: 76 61 6c 75 65 20 72 65 74 75 72 6e 65 64 20 69  value returned i
9670: 73 20 74 68 65 0a 2a 2a 20 73 61 6d 65 20 69 6e  s the.** same in
9680: 74 65 67 65 72 20 76 61 6c 75 65 20 74 68 61 74  teger value that
9690: 20 77 6f 75 6c 64 20 62 65 20 75 73 65 64 20 69   would be used i
96a0: 6e 20 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d  n the SQL statem
96b0: 65 6e 74 20 74 6f 20 69 6e 64 69 63 61 74 65 0a  ent to indicate.
96c0: 2a 2a 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  ** the column..*
96d0: 2a 0a 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73  *.** If there is
96e0: 20 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72   no match, retur
96f0: 6e 20 30 2e 20 20 52 65 74 75 72 6e 20 2d 31 20  n 0.  Return -1 
9700: 69 66 20 61 6e 20 65 72 72 6f 72 20 6f 63 63 75  if an error occu
9710: 72 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  rs..*/.static in
9720: 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 42 79  t resolveOrderBy
9730: 54 65 72 6d 54 6f 45 78 70 72 4c 69 73 74 28 0a  TermToExprList(.
9740: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9750: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
9760: 63 6f 6e 74 65 78 74 20 66 6f 72 20 65 72 72 6f  context for erro
9770: 72 20 6d 65 73 73 61 67 65 73 20 2a 2f 0a 20 20  r messages */.  
9780: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c  Select *pSelect,
9790: 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54     /* The SELECT
97a0: 20 73 74 61 74 65 6d 65 6e 74 20 77 69 74 68 20   statement with 
97b0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61  the ORDER BY cla
97c0: 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  use */.  Expr *p
97d0: 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54  E           /* T
97e0: 68 65 20 73 70 65 63 69 66 69 63 20 4f 52 44 45  he specific ORDE
97f0: 52 20 42 59 20 74 65 72 6d 20 2a 2f 0a 29 7b 0a  R BY term */.){.
9800: 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20    int i;        
9810: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
9820: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
9830: 73 74 20 2a 70 45 4c 69 73 74 3b 20 20 2f 2a 20  st *pEList;  /* 
9840: 54 68 65 20 63 6f 6c 75 6d 6e 73 20 6f 66 20 74  The columns of t
9850: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f  he result set */
9860: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 6e  .  NameContext n
9870: 63 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  c;    /* Name co
9880: 6e 74 65 78 74 20 66 6f 72 20 72 65 73 6f 6c 76  ntext for resolv
9890: 69 6e 67 20 70 45 20 2a 2f 0a 20 20 73 71 6c 69  ing pE */.  sqli
98a0: 74 65 33 20 2a 64 62 3b 20 20 20 20 20 20 20 2f  te3 *db;       /
98b0: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
98c0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 72  ction */.  int r
98d0: 63 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  c;            /*
98e0: 20 52 65 74 75 72 6e 20 63 6f 64 65 20 66 72 6f   Return code fro
98f0: 6d 20 73 75 62 70 72 6f 63 65 64 75 72 65 73 20  m subprocedures 
9900: 2a 2f 0a 20 20 75 38 20 73 61 76 65 64 53 75 70  */.  u8 savedSup
9910: 70 45 72 72 3b 20 20 20 2f 2a 20 53 61 76 65 64  pErr;   /* Saved
9920: 20 76 61 6c 75 65 20 6f 66 20 64 62 2d 3e 73 75   value of db->su
9930: 70 70 72 65 73 73 45 72 72 20 2a 2f 0a 0a 20 20  ppressErr */..  
9940: 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33 45  assert( sqlite3E
9950: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
9960: 20 26 69 29 3d 3d 30 20 29 3b 0a 20 20 70 45 4c   &i)==0 );.  pEL
9970: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
9980: 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a 20 52 65 73  EList;..  /* Res
9990: 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69  olve all names i
99a0: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 74  n the ORDER BY t
99b0: 65 72 6d 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  erm expression. 
99c0: 20 2a 2f 0a 20 20 6d 65 6d 73 65 74 28 26 6e 63   */.  memset(&nc
99d0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6e 63 29 29  , 0, sizeof(nc))
99e0: 3b 0a 20 20 6e 63 2e 70 50 61 72 73 65 20 3d 20  ;.  nc.pParse = 
99f0: 70 50 61 72 73 65 3b 0a 20 20 6e 63 2e 70 53 72  pParse;.  nc.pSr
9a00: 63 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d  cList = pSelect-
9a10: 3e 70 53 72 63 3b 0a 20 20 6e 63 2e 75 4e 43 2e  >pSrc;.  nc.uNC.
9a20: 70 45 4c 69 73 74 20 3d 20 70 45 4c 69 73 74 3b  pEList = pEList;
9a30: 0a 20 20 6e 63 2e 6e 63 46 6c 61 67 73 20 3d 20  .  nc.ncFlags = 
9a40: 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 55  NC_AllowAgg|NC_U
9a50: 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 45 72 72  EList;.  nc.nErr
9a60: 20 3d 20 30 3b 0a 20 20 64 62 20 3d 20 70 50 61   = 0;.  db = pPa
9a70: 72 73 65 2d 3e 64 62 3b 0a 20 20 73 61 76 65 64  rse->db;.  saved
9a80: 53 75 70 70 45 72 72 20 3d 20 64 62 2d 3e 73 75  SuppErr = db->su
9a90: 70 70 72 65 73 73 45 72 72 3b 0a 20 20 64 62 2d  ppressErr;.  db-
9aa0: 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 31  >suppressErr = 1
9ab0: 3b 0a 20 20 72 63 20 3d 20 73 71 6c 69 74 65 33  ;.  rc = sqlite3
9ac0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
9ad0: 28 26 6e 63 2c 20 70 45 29 3b 0a 20 20 64 62 2d  (&nc, pE);.  db-
9ae0: 3e 73 75 70 70 72 65 73 73 45 72 72 20 3d 20 73  >suppressErr = s
9af0: 61 76 65 64 53 75 70 70 45 72 72 3b 0a 20 20 69  avedSuppErr;.  i
9b00: 66 28 20 72 63 20 29 20 72 65 74 75 72 6e 20 30  f( rc ) return 0
9b10: 3b 0a 0a 20 20 2f 2a 20 54 72 79 20 74 6f 20 6d  ;..  /* Try to m
9b20: 61 74 63 68 20 74 68 65 20 4f 52 44 45 52 20 42  atch the ORDER B
9b30: 59 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61  Y expression aga
9b40: 69 6e 73 74 20 61 6e 20 65 78 70 72 65 73 73 69  inst an expressi
9b50: 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74 68 65 20 72  on.  ** in the r
9b60: 65 73 75 6c 74 20 73 65 74 2e 20 20 52 65 74 75  esult set.  Retu
9b70: 72 6e 20 61 6e 20 31 2d 62 61 73 65 64 20 69 6e  rn an 1-based in
9b80: 64 65 78 20 6f 66 20 74 68 65 20 6d 61 74 63 68  dex of the match
9b90: 69 6e 67 0a 20 20 2a 2a 20 72 65 73 75 6c 74 2d  ing.  ** result-
9ba0: 73 65 74 20 65 6e 74 72 79 2e 0a 20 20 2a 2f 0a  set entry..  */.
9bb0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 4c    for(i=0; i<pEL
9bc0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
9bd0: 7b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  {.    if( sqlite
9be0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 30 2c 20  3ExprCompare(0, 
9bf0: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  pEList->a[i].pEx
9c00: 70 72 2c 20 70 45 2c 20 2d 31 29 3c 32 20 29 7b  pr, pE, -1)<2 ){
9c10: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69 2b  .      return i+
9c20: 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  1;.    }.  }..  
9c30: 2f 2a 20 49 66 20 6e 6f 20 6d 61 74 63 68 2c 20  /* If no match, 
9c40: 72 65 74 75 72 6e 20 30 2e 20 2a 2f 0a 20 20 72  return 0. */.  r
9c50: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
9c60: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 4f 52  * Generate an OR
9c70: 44 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20  DER BY or GROUP 
9c80: 42 59 20 74 65 72 6d 20 6f 75 74 2d 6f 66 2d 72  BY term out-of-r
9c90: 61 6e 67 65 20 65 72 72 6f 72 2e 0a 2a 2f 0a 73  ange error..*/.s
9ca0: 74 61 74 69 63 20 76 6f 69 64 20 72 65 73 6f 6c  tatic void resol
9cb0: 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f  veOutOfRangeErro
9cc0: 72 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  r(.  Parse *pPar
9cd0: 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54  se,         /* T
9ce0: 68 65 20 65 72 72 6f 72 20 63 6f 6e 74 65 78 74  he error context
9cf0: 20 69 6e 74 6f 20 77 68 69 63 68 20 74 6f 20 77   into which to w
9d00: 72 69 74 65 20 74 68 65 20 65 72 72 6f 72 20 2a  rite the error *
9d10: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
9d20: 7a 54 79 70 65 2c 20 20 20 20 20 2f 2a 20 22 4f  zType,     /* "O
9d30: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
9d40: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 20 20 20   */.  int i,    
9d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9d60: 54 68 65 20 69 6e 64 65 78 20 28 31 2d 62 61 73  The index (1-bas
9d70: 65 64 29 20 6f 66 20 74 68 65 20 74 65 72 6d 20  ed) of the term 
9d80: 6f 75 74 20 6f 66 20 72 61 6e 67 65 20 2a 2f 0a  out of range */.
9d90: 20 20 69 6e 74 20 6d 78 20 20 20 20 20 20 20 20    int mx        
9da0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 61 72 67           /* Larg
9db0: 65 73 74 20 70 65 72 6d 69 73 73 69 62 6c 65 20  est permissible 
9dc0: 76 61 6c 75 65 20 6f 66 20 69 20 2a 2f 0a 29 7b  value of i */.){
9dd0: 0a 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d  .  sqlite3ErrorM
9de0: 73 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20  sg(pParse, .    
9df0: 22 25 72 20 25 73 20 42 59 20 74 65 72 6d 20 6f  "%r %s BY term o
9e00: 75 74 20 6f 66 20 72 61 6e 67 65 20 2d 20 73 68  ut of range - sh
9e10: 6f 75 6c 64 20 62 65 20 22 0a 20 20 20 20 22 62  ould be ".    "b
9e20: 65 74 77 65 65 6e 20 31 20 61 6e 64 20 25 64 22  etween 1 and %d"
9e30: 2c 20 69 2c 20 7a 54 79 70 65 2c 20 6d 78 29 3b  , i, zType, mx);
9e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
9e50: 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  e the ORDER BY c
9e60: 6c 61 75 73 65 20 69 6e 20 61 20 63 6f 6d 70 6f  lause in a compo
9e70: 75 6e 64 20 53 45 4c 45 43 54 20 73 74 61 74 65  und SELECT state
9e80: 6d 65 6e 74 2e 20 20 20 4d 6f 64 69 66 79 0a 2a  ment.   Modify.*
9e90: 2a 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74  * each term of t
9ea0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
9eb0: 73 65 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  se is a constant
9ec0: 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65 6e   integer between
9ed0: 20 31 0a 2a 2a 20 61 6e 64 20 4e 20 77 68 65 72   1.** and N wher
9ee0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
9ef0: 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  r of columns in 
9f00: 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c  the compound SEL
9f10: 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f 52 44 45 52  ECT..**.** ORDER
9f20: 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61   BY terms that a
9f30: 72 65 20 61 6c 72 65 61 64 79 20 61 6e 20 69 6e  re already an in
9f40: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
9f50: 61 6e 64 20 4e 20 61 72 65 0a 2a 2a 20 75 6e 6d  and N are.** unm
9f60: 6f 64 69 66 69 65 64 2e 20 20 4f 52 44 45 52 20  odified.  ORDER 
9f70: 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61 72  BY terms that ar
9f80: 65 20 69 6e 74 65 67 65 72 73 20 6f 75 74 73 69  e integers outsi
9f90: 64 65 20 74 68 65 20 72 61 6e 67 65 20 6f 66 0a  de the range of.
9fa0: 2a 2a 20 31 20 74 68 72 6f 75 67 68 20 4e 20 67  ** 1 through N g
9fb0: 65 6e 65 72 61 74 65 20 61 6e 20 65 72 72 6f 72  enerate an error
9fc0: 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  .  ORDER BY term
9fd0: 73 20 74 68 61 74 20 61 72 65 20 65 78 70 72 65  s that are expre
9fe0: 73 73 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 6d 61  ssions.** are ma
9ff0: 74 63 68 65 64 20 61 67 61 69 6e 73 74 20 72 65  tched against re
a000: 73 75 6c 74 20 73 65 74 20 65 78 70 72 65 73 73  sult set express
a010: 69 6f 6e 73 20 6f 66 20 63 6f 6d 70 6f 75 6e 64  ions of compound
a020: 20 53 45 4c 45 43 54 0a 2a 2a 20 62 65 67 69 6e   SELECT.** begin
a030: 6e 69 6e 67 20 77 69 74 68 20 74 68 65 20 6c 65  ning with the le
a040: 66 74 2d 6d 6f 73 74 20 53 45 4c 45 43 54 20 61  ft-most SELECT a
a050: 6e 64 20 77 6f 72 6b 69 6e 67 20 74 6f 77 61 72  nd working towar
a060: 64 20 74 68 65 20 72 69 67 68 74 2e 0a 2a 2a 20  d the right..** 
a070: 41 74 20 74 68 65 20 66 69 72 73 74 20 6d 61 74  At the first mat
a080: 63 68 2c 20 74 68 65 20 4f 52 44 45 52 20 42 59  ch, the ORDER BY
a090: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
a0a0: 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f 0a  ransformed into.
a0b0: 2a 2a 20 74 68 65 20 69 6e 74 65 67 65 72 20 63  ** the integer c
a0c0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a  olumn number..**
a0d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e  .** Return the n
a0e0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 20  umber of errors 
a0f0: 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  seen..*/.static 
a100: 69 6e 74 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f  int resolveCompo
a110: 75 6e 64 4f 72 64 65 72 42 79 28 0a 20 20 50 61  undOrderBy(.  Pa
a120: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20  rse *pParse,    
a130: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
a140: 6f 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65  ontext.  Leave e
a150: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65  rror messages he
a160: 72 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  re */.  Select *
a170: 70 53 65 6c 65 63 74 20 20 20 20 20 20 20 2f 2a  pSelect       /*
a180: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
a190: 65 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67  ement containing
a1a0: 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 2a 2f   the ORDER BY */
a1b0: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 45  .){.  int i;.  E
a1c0: 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42  xprList *pOrderB
a1d0: 79 3b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  y;.  ExprList *p
a1e0: 45 4c 69 73 74 3b 0a 20 20 73 71 6c 69 74 65 33  EList;.  sqlite3
a1f0: 20 2a 64 62 3b 0a 20 20 69 6e 74 20 6d 6f 72 65   *db;.  int more
a200: 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20 20 70 4f 72  ToDo = 1;..  pOr
a210: 64 65 72 42 79 20 3d 20 70 53 65 6c 65 63 74 2d  derBy = pSelect-
a220: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 69 66 28  >pOrderBy;.  if(
a230: 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 20 72   pOrderBy==0 ) r
a240: 65 74 75 72 6e 20 30 3b 0a 20 20 64 62 20 3d 20  eturn 0;.  db = 
a250: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 69 66  pParse->db;.  if
a260: 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70  ( pOrderBy->nExp
a270: 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c  r>db->aLimit[SQL
a280: 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e  ITE_LIMIT_COLUMN
a290: 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ] ){.    sqlite3
a2a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
a2b0: 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73   "too many terms
a2c0: 20 69 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61   in ORDER BY cla
a2d0: 75 73 65 22 29 3b 0a 20 20 20 20 72 65 74 75 72  use");.    retur
a2e0: 6e 20 31 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  n 1;.  }.  for(i
a2f0: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
a300: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
a310: 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b 69 5d 2e   pOrderBy->a[i].
a320: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
a330: 70 53 65 6c 65 63 74 2d 3e 70 4e 65 78 74 20 3d  pSelect->pNext =
a340: 20 30 3b 0a 20 20 77 68 69 6c 65 28 20 70 53 65   0;.  while( pSe
a350: 6c 65 63 74 2d 3e 70 50 72 69 6f 72 20 29 7b 0a  lect->pPrior ){.
a360: 20 20 20 20 70 53 65 6c 65 63 74 2d 3e 70 50 72      pSelect->pPr
a370: 69 6f 72 2d 3e 70 4e 65 78 74 20 3d 20 70 53 65  ior->pNext = pSe
a380: 6c 65 63 74 3b 0a 20 20 20 20 70 53 65 6c 65 63  lect;.    pSelec
a390: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 50 72  t = pSelect->pPr
a3a0: 69 6f 72 3b 0a 20 20 7d 0a 20 20 77 68 69 6c 65  ior;.  }.  while
a3b0: 28 20 70 53 65 6c 65 63 74 20 26 26 20 6d 6f 72  ( pSelect && mor
a3c0: 65 54 6f 44 6f 20 29 7b 0a 20 20 20 20 73 74 72  eToDo ){.    str
a3d0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a3e0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 6d 6f  m *pItem;.    mo
a3f0: 72 65 54 6f 44 6f 20 3d 20 30 3b 0a 20 20 20 20  reToDo = 0;.    
a400: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
a410: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 61 73  ->pEList;.    as
a420: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
a430: 29 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  );.    for(i=0, 
a440: 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79 2d 3e  pItem=pOrderBy->
a450: 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  a; i<pOrderBy->n
a460: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
a470: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  ++){.      int i
a480: 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  Col = -1;.      
a490: 45 78 70 72 20 2a 70 45 2c 20 2a 70 44 75 70 3b  Expr *pE, *pDup;
a4a0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
a4b0: 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e 74 69 6e 75  ->done ) continu
a4c0: 65 3b 0a 20 20 20 20 20 20 70 45 20 3d 20 73 71  e;.      pE = sq
a4d0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
a4e0: 6c 61 74 65 41 6e 64 4c 69 6b 65 6c 79 28 70 49  lateAndLikely(pI
a4f0: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20  tem->pExpr);.   
a500: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
a510: 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20  prIsInteger(pE, 
a520: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
a530: 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c    if( iCol<=0 ||
a540: 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45   iCol>pEList->nE
a550: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20  xpr ){.         
a560: 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e   resolveOutOfRan
a570: 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  geError(pParse, 
a580: 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45  "ORDER", i+1, pE
a590: 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20  List->nExpr);.  
a5a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
a5b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a5c0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a5d0: 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41   iCol = resolveA
a5e0: 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45  sName(pParse, pE
a5f0: 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20  List, pE);.     
a600: 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29     if( iCol==0 )
a610: 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  {.          /* N
a620: 6f 77 20 74 65 73 74 20 69 66 20 65 78 70 72 65  ow test if expre
a630: 73 73 69 6f 6e 20 70 45 20 6d 61 74 63 68 65 73  ssion pE matches
a640: 20 6f 6e 65 20 6f 66 20 74 68 65 20 76 61 6c 75   one of the valu
a650: 65 73 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20  es returned.    
a660: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 53 65 6c        ** by pSel
a670: 65 63 74 2e 20 49 6e 20 74 68 65 20 75 73 75 61  ect. In the usua
a680: 6c 20 63 61 73 65 20 74 68 69 73 20 69 73 20 64  l case this is d
a690: 6f 6e 65 20 62 79 20 64 75 70 6c 69 63 61 74 69  one by duplicati
a6a0: 6e 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20  ng the .        
a6b0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c    ** expression,
a6c0: 20 72 65 73 6f 6c 76 69 6e 67 20 61 6e 79 20 73   resolving any s
a6d0: 79 6d 62 6f 6c 73 20 69 6e 20 69 74 2c 20 61 6e  ymbols in it, an
a6e0: 64 20 74 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67  d then comparing
a6f0: 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74  .          ** it
a700: 20 61 67 61 69 6e 73 74 20 65 61 63 68 20 65 78   against each ex
a710: 70 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65  pression returne
a720: 64 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20  d by the SELECT 
a730: 73 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20  statement..     
a740: 20 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65       ** Once the
a750: 20 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65   comparisons are
a760: 20 66 69 6e 69 73 68 65 64 2c 20 74 68 65 20 64   finished, the d
a770: 75 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73  uplicate express
a780: 69 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  ion.          **
a790: 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20   is deleted..   
a7a0: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
a7b0: 20 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68      ** Or, if th
a7c0: 69 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73  is is running as
a7d0: 20 70 61 72 74 20 6f 66 20 61 6e 20 41 4c 54 45   part of an ALTE
a7e0: 52 20 54 41 42 4c 45 20 6f 70 65 72 61 74 69 6f  R TABLE operatio
a7f0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  n,.          ** 
a800: 72 65 73 6f 6c 76 65 20 74 68 65 20 73 79 6d 62  resolve the symb
a810: 6f 6c 73 20 69 6e 20 74 68 65 20 61 63 74 75 61  ols in the actua
a820: 6c 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6e 6f  l expression, no
a830: 74 20 61 20 64 75 70 6c 69 63 61 74 65 2e 0a 20  t a duplicate.. 
a840: 20 20 20 20 20 20 20 20 20 2a 2a 20 41 6e 64 2c           ** And,
a850: 20 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 63   if one of the c
a860: 6f 6d 70 61 72 69 73 6f 6e 73 20 69 73 20 73 75  omparisons is su
a870: 63 63 65 73 73 66 75 6c 2c 20 6c 65 61 76 65 20  ccessful, leave 
a880: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20  the expression. 
a890: 20 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69           ** as i
a8a0: 73 20 69 6e 73 74 65 61 64 20 6f 66 20 74 72 61  s instead of tra
a8b0: 6e 73 66 6f 72 6d 69 6e 67 20 69 74 20 74 6f 20  nsforming it to 
a8c0: 61 6e 20 69 6e 74 65 67 65 72 20 61 73 20 69 6e  an integer as in
a8d0: 20 74 68 65 20 75 73 75 61 6c 0a 20 20 20 20 20   the usual.     
a8e0: 20 20 20 20 20 2a 2a 20 63 61 73 65 2e 20 54 68       ** case. Th
a8f0: 69 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f  is allows the co
a900: 64 65 20 69 6e 20 61 6c 74 65 72 2e 63 20 74 6f  de in alter.c to
a910: 20 6d 6f 64 69 66 79 20 63 6f 6c 75 6d 6e 0a 20   modify column. 
a920: 20 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65           ** refe
a930: 72 65 72 65 6e 63 65 73 20 77 69 74 68 69 6e 20  rerences within 
a940: 74 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70  the ORDER BY exp
a950: 72 65 73 73 69 6f 6e 20 61 73 20 72 65 71 75 69  ression as requi
a960: 72 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20  red.  */.       
a970: 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45     if( IN_RENAME
a980: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
a990: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45         pDup = pE
a9a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  ;.          }els
a9b0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  e{.            p
a9c0: 44 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Dup = sqlite3Exp
a9d0: 72 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b  rDup(db, pE, 0);
a9e0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a9f0: 20 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e         if( !db->
aa00: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a  mallocFailed ){.
aa10: 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65              asse
aa20: 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20  rt(pDup);.      
aa30: 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73        iCol = res
aa40: 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54  olveOrderByTermT
aa50: 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  oExprList(pParse
aa60: 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70 29  , pSelect, pDup)
aa70: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
aa80: 20 20 20 20 20 20 20 20 69 66 28 20 21 49 4e 5f          if( !IN_
aa90: 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b  RENAME_OBJECT ){
aaa0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
aab0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
aac0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20  b, pDup);.      
aad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
aae0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aaf0: 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20  ( iCol>0 ){.    
ab00: 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74      /* Convert t
ab10: 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  he ORDER BY term
ab20: 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72   into an integer
ab30: 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69   column number i
ab40: 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20  Col,.        ** 
ab50: 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 70  taking care to p
ab60: 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c 4c  reserve the COLL
ab70: 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69 74  ATE clause if it
ab80: 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20   exists */.     
ab90: 20 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d     if( !IN_RENAM
aba0: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
abb0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77        Expr *pNew
abc0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64   = sqlite3Expr(d
abd0: 62 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  b, TK_INTEGER, 0
abe0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
abf0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
ac00: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70  n 1;.          p
ac10: 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50  New->flags |= EP
ac20: 5f 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20  _IntValue;.     
ac30: 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61       pNew->u.iVa
ac40: 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20  lue = iCol;.    
ac50: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
ac60: 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20 20  >pExpr==pE ){.  
ac70: 20 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d            pItem-
ac80: 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20  >pExpr = pNew;. 
ac90: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
aca0: 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
acb0: 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74 65   *pParent = pIte
acc0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
acd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
ace0: 61 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  arent->op==TK_CO
acf0: 4c 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20  LLATE );.       
ad00: 20 20 20 20 20 77 68 69 6c 65 28 20 70 50 61 72       while( pPar
ad10: 65 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d  ent->pLeft->op==
ad20: 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50 61  TK_COLLATE ) pPa
ad30: 72 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e  rent = pParent->
ad40: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20  pLeft;.         
ad50: 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65     assert( pPare
ad60: 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b  nt->pLeft==pE );
ad70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61  .            pPa
ad80: 72 65 6e 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e  rent->pLeft = pN
ad90: 65 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  ew;.          }.
ada0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
adb0: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
adc0: 70 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  pE);.          p
add0: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
ade0: 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f  ByCol = (u16)iCo
adf0: 6c 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  l;.        }.   
ae00: 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65       pItem->done
ae10: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 1;.      }els
ae20: 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54  e{.        moreT
ae30: 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  oDo = 1;.      }
ae40: 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65  .    }.    pSele
ae50: 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e  ct = pSelect->pN
ae60: 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69  ext;.  }.  for(i
ae70: 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e  =0; i<pOrderBy->
ae80: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
ae90: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61   if( pOrderBy->a
aea0: 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20  [i].done==0 ){. 
aeb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
aec0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 72  rMsg(pParse, "%r
aed0: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64   ORDER BY term d
aee0: 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e  oes not match an
aef0: 79 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  y ".            
af00: 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72  "column in the r
af10: 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29  esult set", i+1)
af20: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
af30: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
af40: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
af50: 20 43 68 65 63 6b 20 65 76 65 72 79 20 74 65 72   Check every ter
af60: 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  m in the ORDER B
af70: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
af80: 61 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f 66  ause pOrderBy of
af90: 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73  .** the SELECT s
afa0: 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74  tatement pSelect
afb0: 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69  .  If any term i
afc0: 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61  s reference to a
afd0: 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65  .** result set e
afe0: 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64 65  xpression (as de
aff0: 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20  termined by the 
b000: 45 78 70 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69  ExprList.a.u.x.i
b010: 4f 72 64 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69  OrderByCol.** fi
b020: 65 6c 64 29 20 74 68 65 6e 20 63 6f 6e 76 65 72  eld) then conver
b030: 74 20 74 68 61 74 20 74 65 72 6d 20 69 6e 74 6f  t that term into
b040: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63   a copy of the c
b050: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 73  orresponding res
b060: 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d  ult set.** colum
b070: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  n..**.** If any 
b080: 65 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63  errors are detec
b090: 74 65 64 2c 20 61 64 64 20 61 6e 20 65 72 72 6f  ted, add an erro
b0a0: 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61  r message to pPa
b0b0: 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72  rse and.** retur
b0c0: 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74  n non-zero.  Ret
b0d0: 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65  urn zero if no e
b0e0: 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2e 0a  rrors are seen..
b0f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65  */.int sqlite3Re
b100: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
b110: 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  y(.  Parse *pPar
b120: 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61  se,        /* Pa
b130: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20  rsing context.  
b140: 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73  Leave error mess
b150: 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53  ages here */.  S
b160: 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20  elect *pSelect, 
b170: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
b180: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e  CT statement con
b190: 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75  taining the clau
b1a0: 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  se */.  ExprList
b1b0: 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a   *pOrderBy,   /*
b1c0: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72   The ORDER BY or
b1d0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
b1e0: 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64   to be processed
b1f0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
b200: 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 22   *zType     /* "
b210: 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50  ORDER" or "GROUP
b220: 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  " */.){.  int i;
b230: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
b240: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45   pParse->db;.  E
b250: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
b260: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
b270: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
b280: 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d  .  if( pOrderBy=
b290: 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  =0 || pParse->db
b2a0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 7c  ->mallocFailed |
b2b0: 7c 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  | IN_RENAME_OBJE
b2c0: 43 54 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  CT ) return 0;. 
b2d0: 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e   if( pOrderBy->n
b2e0: 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  Expr>db->aLimit[
b2f0: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c  SQLITE_LIMIT_COL
b300: 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69  UMN] ){.    sqli
b310: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
b320: 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65  se, "too many te
b330: 72 6d 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61  rms in %s BY cla
b340: 75 73 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20  use", zType);.  
b350: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
b360: 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65    pEList = pSele
b370: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73  ct->pEList;.  as
b380: 73 65 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20  sert( pEList!=0 
b390: 29 3b 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65  );  /* sqlite3Se
b3a0: 6c 65 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e  lectNew() guaran
b3b0: 74 65 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66  tees this */.  f
b3c0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
b3d0: 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
b3e0: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
b3f0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
b400: 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e   if( pItem->u.x.
b410: 69 4f 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20  iOrderByCol ){. 
b420: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
b430: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e  u.x.iOrderByCol>
b440: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b  pEList->nExpr ){
b450: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
b460: 4f 75 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28  OutOfRangeError(
b470: 70 50 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69  pParse, zType, i
b480: 2b 31 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  +1, pEList->nExp
b490: 72 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  r);.        retu
b4a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
b4b0: 20 20 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73      resolveAlias
b4c0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
b4d0: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
b4e0: 65 72 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d  erByCol-1, pItem
b4f0: 2d 3e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ->pExpr,.       
b500: 20 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70              zTyp
b510: 65 2c 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  e,0);.    }.  }.
b520: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 23    return 0;.}..#
b530: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
b540: 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 2f 2a  IT_WINDOWFUNC./*
b550: 0a 2a 2a 20 57 61 6c 6b 65 72 20 63 61 6c 6c 62  .** Walker callb
b560: 61 63 6b 20 66 6f 72 20 77 69 6e 64 6f 77 52 65  ack for windowRe
b570: 6d 6f 76 65 45 78 70 72 46 72 6f 6d 53 65 6c 65  moveExprFromSele
b580: 63 74 28 29 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ct()..*/.static 
b590: 69 6e 74 20 72 65 73 6f 6c 76 65 52 65 6d 6f 76  int resolveRemov
b5a0: 65 57 69 6e 64 6f 77 73 43 62 28 57 61 6c 6b 65  eWindowsCb(Walke
b5b0: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72  r *pWalker, Expr
b5c0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 55 4e 55 53   *pExpr){.  UNUS
b5d0: 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70 57 61  ED_PARAMETER(pWa
b5e0: 6c 6b 65 72 29 3b 0a 20 20 69 66 28 20 45 78 70  lker);.  if( Exp
b5f0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
b600: 70 72 2c 20 45 50 5f 57 69 6e 46 75 6e 63 29 20  pr, EP_WinFunc) 
b610: 29 7b 0a 20 20 20 20 57 69 6e 64 6f 77 20 2a 70  ){.    Window *p
b620: 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70  Win = pExpr->y.p
b630: 57 69 6e 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  Win;.    sqlite3
b640: 57 69 6e 64 6f 77 55 6e 6c 69 6e 6b 46 72 6f 6d  WindowUnlinkFrom
b650: 53 65 6c 65 63 74 28 70 57 69 6e 29 3b 0a 20 20  Select(pWin);.  
b660: 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43  }.  return WRC_C
b670: 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a  ontinue;.}../*.*
b680: 2a 20 52 65 6d 6f 76 65 20 61 6e 79 20 57 69 6e  * Remove any Win
b690: 64 6f 77 20 6f 62 6a 65 63 74 73 20 6f 77 6e 65  dow objects owne
b6a0: 64 20 62 79 20 74 68 65 20 65 78 70 72 65 73 73  d by the express
b6b0: 69 6f 6e 20 70 45 78 70 72 20 66 72 6f 6d 20 74  ion pExpr from t
b6c0: 68 65 0a 2a 2a 20 53 65 6c 65 63 74 2e 70 57 69  he.** Select.pWi
b6d0: 6e 20 6c 69 73 74 20 6f 66 20 53 65 6c 65 63 74  n list of Select
b6e0: 20 6f 62 6a 65 63 74 20 70 53 65 6c 65 63 74 2e   object pSelect.
b6f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
b700: 77 69 6e 64 6f 77 52 65 6d 6f 76 65 45 78 70 72  windowRemoveExpr
b710: 46 72 6f 6d 53 65 6c 65 63 74 28 53 65 6c 65 63  FromSelect(Selec
b720: 74 20 2a 70 53 65 6c 65 63 74 2c 20 45 78 70 72  t *pSelect, Expr
b730: 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20   *pExpr){.  if( 
b740: 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 20 29 7b  pSelect->pWin ){
b750: 0a 20 20 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  .    Walker sWal
b760: 6b 65 72 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28  ker;.    memset(
b770: 26 73 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a  &sWalker, 0, siz
b780: 65 6f 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20  eof(Walker));.  
b790: 20 20 73 57 61 6c 6b 65 72 2e 78 45 78 70 72 43    sWalker.xExprC
b7a0: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
b7b0: 65 52 65 6d 6f 76 65 57 69 6e 64 6f 77 73 43 62  eRemoveWindowsCb
b7c0: 3b 0a 20 20 20 20 73 57 61 6c 6b 65 72 2e 75 2e  ;.    sWalker.u.
b7d0: 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63  pSelect = pSelec
b7e0: 74 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 57 61  t;.    sqlite3Wa
b7f0: 6c 6b 45 78 70 72 28 26 73 57 61 6c 6b 65 72 2c  lkExpr(&sWalker,
b800: 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a 23   pExpr);.  }.}.#
b810: 65 6c 73 65 0a 23 20 64 65 66 69 6e 65 20 77 69  else.# define wi
b820: 6e 64 6f 77 52 65 6d 6f 76 65 45 78 70 72 46 72  ndowRemoveExprFr
b830: 6f 6d 53 65 6c 65 63 74 28 61 2c 20 62 29 0a 23  omSelect(a, b).#
b840: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
b850: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 20  OMIT_WINDOWFUNC 
b860: 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72  */../*.** pOrder
b870: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
b880: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
b890: 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 73  ause in SELECT s
b8a0: 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74  tatement pSelect
b8b0: 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f  ..** The Name co
b8c0: 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
b8d0: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
b8e0: 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 20   pNC.  zType is 
b8f0: 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52  either.** "ORDER
b900: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 70  " or "GROUP" dep
b910: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
b920: 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 70  type of clause p
b930: 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a  OrderBy is..**.*
b940: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
b950: 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 72  esolves each ter
b960: 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 20  m of the clause 
b970: 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  into an expressi
b980: 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  on..** If the or
b990: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
b9a0: 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 77  n integer I betw
b9b0: 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 65  een 1 and N (whe
b9c0: 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  re N is the.** n
b9d0: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b9e0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b9f0: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
ba00: 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  ) then the expre
ba10: 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ssion.** in the 
ba20: 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20  resolution is a 
ba30: 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 68  copy of the I-th
ba40: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
ba50: 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74  ession.  If.** t
ba60: 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d  he order-by term
ba70: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65   is an identifie
ba80: 72 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  r that correspon
ba90: 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ds to the AS-nam
baa0: 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74  e of.** a result
bab0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2c  -set expression,
bac0: 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 72   then the term r
bad0: 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f 70  esolves to a cop
bae0: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 75  y of the.** resu
baf0: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
bb00: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  n.  Otherwise, t
bb10: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
bb20: 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20   resolved in.** 
bb30: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d 20  the usual way - 
bb40: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 73  using sqlite3Res
bb50: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
bb60: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
bb70: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
bb80: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
bb90: 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63 63  .  If errors occ
bba0: 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61  ur, then.** an a
bbb0: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
bbc0: 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20 62   message might b
bbd0: 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65  e left in pParse
bbe0: 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a  .  (OOM errors.*
bbf0: 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a  * excepted.).*/.
bc00: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
bc10: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  veOrderGroupBy(.
bc20: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
bc30: 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  NC,     /* The n
bc40: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
bc50: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
bc60: 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ent */.  Select 
bc70: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
bc80: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
bc90: 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70  tement holding p
bca0: 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78 70  OrderBy */.  Exp
bcb0: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
bcc0: 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
bcd0: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
bce0: 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ause to resolve 
bcf0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
bd00: 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
bd10: 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
bd20: 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
bd30: 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
bd40: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
bd50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
bd60: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
bd70: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
bd80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bd90: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
bda0: 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  mber */.  struct
bdb0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
bdc0: 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65  pItem;   /* A te
bdd0: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
bde0: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50  BY clause */.  P
bdf0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
be00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
be10: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
be20: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
be30: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
be40: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
be50: 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72  f terms in the r
be60: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
be70: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
be80: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
be90: 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d  esult = pSelect-
bea0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
beb0: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
bec0: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
bed0: 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
bee0: 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79  y->a; i<pOrderBy
bef0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
bf00: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
bf10: 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45   *pE = pItem->pE
bf20: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
bf30: 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  E2 = sqlite3Expr
bf40: 53 6b 69 70 43 6f 6c 6c 61 74 65 41 6e 64 4c 69  SkipCollateAndLi
bf50: 6b 65 6c 79 28 70 45 29 3b 0a 20 20 20 20 69 66  kely(pE);.    if
bf60: 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20  ( zType[0]!='G' 
bf70: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  ){.      iCol = 
bf80: 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50  resolveAsName(pP
bf90: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
bfa0: 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20 20 20  EList, pE2);.   
bfb0: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
bfc0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
bfd0: 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20  n AS-name match 
bfe0: 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74  is found, mark t
bff0: 68 69 73 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  his ORDER BY col
c000: 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20 20 20  umn as being.   
c010: 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
c020: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65  f the iCol-th re
c030: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e  sult-set column.
c040: 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
c050: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
c060: 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   ** sqlite3Resol
c070: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29  veOrderGroupBy()
c080: 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
c090: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
c0a0: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  a.        ** cop
c0b0: 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  y of the iCol-th
c0c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
c0d0: 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ession. */.     
c0e0: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
c0f0: 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
c100: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63  )iCol;.        c
c110: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
c120: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
c130: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
c140: 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c 29 20  ger(pE2, &iCol) 
c150: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
c160: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
c170: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
c180: 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73 65  tant.  Again, se
c190: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  t the column.   
c1a0: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20     ** number so 
c1b0: 74 68 61 74 20 73 71 6c 69 74 65 33 52 65 73 6f  that sqlite3Reso
c1c0: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
c1d0: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
c1e0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  he.      ** orde
c1f0: 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61 20 63  r-by term to a c
c200: 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c  opy of the resul
c210: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
c220: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
c230: 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66  ol<1 || iCol>0xf
c240: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fff ){.        r
c250: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
c260: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54  Error(pParse, zT
c270: 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c  ype, i+1, nResul
c280: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
c290: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
c2a0: 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
c2b0: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
c2c0: 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  6)iCol;.      co
c2d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
c2e0: 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
c2f0: 20 74 72 65 61 74 20 74 68 65 20 4f 52 44 45 52   treat the ORDER
c300: 20 42 59 20 74 65 72 6d 20 61 73 20 61 6e 20 6f   BY term as an o
c310: 72 64 69 6e 61 72 79 20 65 78 70 72 65 73 73 69  rdinary expressi
c320: 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d  on */.    pItem-
c330: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
c340: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
c350: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
c360: 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
c370: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
c380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
c390: 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63 74 2d 3e  j=0; j<pSelect->
c3a0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
c3b0: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
c3c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
c3d0: 65 28 30 2c 20 70 45 2c 20 70 53 65 6c 65 63 74  e(0, pE, pSelect
c3e0: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  ->pEList->a[j].p
c3f0: 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
c400: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
c410: 20 74 68 69 73 20 65 78 70 72 65 73 69 6f 6e 20   this expresion 
c420: 69 73 20 62 65 69 6e 67 20 63 68 61 6e 67 65 64  is being changed
c430: 20 69 6e 74 6f 20 61 20 72 65 66 65 72 65 6e 63   into a referenc
c440: 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20  e.        ** to 
c450: 61 6e 20 69 64 65 6e 74 69 63 61 6c 20 65 78 70  an identical exp
c460: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
c470: 65 73 75 6c 74 20 73 65 74 2c 20 72 65 6d 6f 76  esult set, remov
c480: 65 20 61 6c 6c 20 57 69 6e 64 6f 77 0a 20 20 20  e all Window.   
c490: 20 20 20 20 20 2a 2a 20 6f 62 6a 65 63 74 73 20       ** objects 
c4a0: 62 65 6c 6f 6e 67 69 6e 67 20 74 6f 20 74 68 65  belonging to the
c4b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
c4c0: 20 74 68 65 20 53 65 6c 65 63 74 2e 70 57 69 6e   the Select.pWin
c4d0: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20   list. */.      
c4e0: 20 20 77 69 6e 64 6f 77 52 65 6d 6f 76 65 45 78    windowRemoveEx
c4f0: 70 72 46 72 6f 6d 53 65 6c 65 63 74 28 70 53 65  prFromSelect(pSe
c500: 6c 65 63 74 2c 20 70 45 29 3b 0a 20 20 20 20 20  lect, pE);.     
c510: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
c520: 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31 3b  rderByCol = j+1;
c530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69   }.  return sqli
c550: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
c560: 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20 70  roupBy(pParse, p
c570: 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42 79  Select, pOrderBy
c580: 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a 0a  , zType);.}../*.
c590: 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73  ** Resolve names
c5a0: 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20 73   in the SELECT s
c5b0: 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20 61  tatement p and a
c5c0: 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65 6e  ll of its descen
c5d0: 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  dants..*/.static
c5e0: 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c 65   int resolveSele
c5f0: 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70  ctStep(Walker *p
c600: 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20 2a  Walker, Select *
c610: 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  p){.  NameContex
c620: 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f 2a  t *pOuterNC;  /*
c630: 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63 6f   Context that co
c640: 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c 45  ntains this SELE
c650: 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  CT */.  NameCont
c660: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
c670: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
c680: 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20 2a  of this SELECT *
c690: 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f 75  /.  int isCompou
c6a0: 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54  nd;         /* T
c6b0: 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63 6f  rue if p is a co
c6c0: 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a 2f  mpound select */
c6d0: 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e 64  .  int nCompound
c6e0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
c6f0: 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e 64  mber of compound
c700: 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65 64   terms processed
c710: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61 72   so far */.  Par
c720: 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20  se *pParse;     
c730: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
c740: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74  context */.  int
c750: 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   i;             
c760: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
c770: 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c 69  nter */.  ExprLi
c780: 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20 20  st *pGroupBy;   
c790: 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20 42    /* The GROUP B
c7a0: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53 65  Y clause */.  Se
c7b0: 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74 3b  lect *pLeftmost;
c7c0: 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d 6f        /* Left-mo
c7d0: 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66 20  st of SELECT of 
c7e0: 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20 20  a compound */.  
c7f0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
c800: 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62          /* Datab
c810: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
c820: 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28 20  /.  ..  assert( 
c830: 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 2d  p!=0 );.  if( p-
c840: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52  >selFlags & SF_R
c850: 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20 72  esolved ){.    r
c860: 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b  eturn WRC_Prune;
c870: 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43 20  .  }.  pOuterNC 
c880: 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e 43  = pWalker->u.pNC
c890: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57 61  ;.  pParse = pWa
c8a0: 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20 20  lker->pParse;.  
c8b0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
c8c0: 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79 20  ..  /* Normally 
c8d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
c8e0: 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63 61  and() will be ca
c8f0: 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20 77  lled first and w
c900: 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61 6c  ill have.  ** al
c910: 72 65 61 64 79 20 65 78 70 61 6e 64 65 64 20 74  ready expanded t
c920: 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f 77  his SELECT.  How
c930: 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 69 73  ever, if this is
c940: 20 61 20 73 75 62 71 75 65 72 79 20 77 69 74 68   a subquery with
c950: 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72 65  in.  ** an expre
c960: 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52 65  ssion, sqlite3Re
c970: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
c980: 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64 20   will be called 
c990: 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20 70  without a.  ** p
c9a0: 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71 6c  rior call to sql
c9b0: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
c9c0: 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20 68  ().  When that h
c9d0: 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a 2a  appens, let.  **
c9e0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72   sqlite3SelectPr
c9f0: 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20 74  ep() do all of t
ca00: 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66 6f  he processing fo
ca10: 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a 20  r this SELECT.. 
ca20: 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63   ** sqlite3Selec
ca30: 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e 76  tPrep() will inv
ca40: 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65 33  oke both sqlite3
ca50: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 61  SelectExpand() a
ca60: 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f 75  nd.  ** this rou
ca70: 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72 72  tine in the corr
ca80: 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f 0a  ect order..  */.
ca90: 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c 61    if( (p->selFla
caa0: 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65 64  gs & SF_Expanded
cab0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  )==0 ){.    sqli
cac0: 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70 50  te3SelectPrep(pP
cad0: 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72 4e  arse, p, pOuterN
cae0: 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28  C);.    return (
caf0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
cb00: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
cb10: 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20  ) ? WRC_Abort : 
cb20: 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 0a  WRC_Prune;.  }..
cb30: 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20 70    isCompound = p
cb40: 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20 6e  ->pPrior!=0;.  n
cb50: 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20 20  Compound = 0;.  
cb60: 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a 20  pLeftmost = p;. 
cb70: 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20 20   while( p ){.   
cb80: 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c   assert( (p->sel
cb90: 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e  Flags & SF_Expan
cba0: 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20 61  ded)!=0 );.    a
cbb0: 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c  ssert( (p->selFl
cbc0: 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76 65  ags & SF_Resolve
cbd0: 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d 3e  d)==0 );.    p->
cbe0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 52  selFlags |= SF_R
cbf0: 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f 2a  esolved;..    /*
cc00: 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78 70   Resolve the exp
cc10: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
cc20: 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45 54  LIMIT and OFFSET
cc30: 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65 0a   clauses. These.
cc40: 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20 61      ** are not a
cc50: 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72 20  llowed to refer 
cc60: 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73 6f  to any names, so
cc70: 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20 4e   pass an empty N
cc80: 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20 20  ameContext..    
cc90: 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26 73  */.    memset(&s
cca0: 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73 4e  NC, 0, sizeof(sN
ccb0: 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50 61  C));.    sNC.pPa
ccc0: 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20  rse = pParse;.  
ccd0: 20 20 73 4e 43 2e 70 57 69 6e 53 65 6c 65 63 74    sNC.pWinSelect
cce0: 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 73 71   = p;.    if( sq
ccf0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
cd00: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70  Names(&sNC, p->p
cd10: 4c 69 6d 69 74 29 20 29 7b 0a 20 20 20 20 20 20  Limit) ){.      
cd20: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
cd30: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
cd40: 49 66 20 74 68 65 20 53 46 5f 43 6f 6e 76 65 72  If the SF_Conver
cd50: 74 65 64 20 66 6c 61 67 73 20 69 73 20 73 65 74  ted flags is set
cd60: 2c 20 74 68 65 6e 20 74 68 69 73 20 53 65 6c 65  , then this Sele
cd70: 63 74 20 6f 62 6a 65 63 74 20 77 61 73 0a 20 20  ct object was.  
cd80: 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65 64    ** was created
cd90: 20 62 79 20 74 68 65 20 63 6f 6e 76 65 72 74 43   by the convertC
cda0: 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f 53  ompoundSelectToS
cdb0: 75 62 71 75 65 72 79 28 29 20 66 75 6e 63 74 69  ubquery() functi
cdc0: 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74 68  on..    ** In th
cdd0: 69 73 20 63 61 73 65 20 74 68 65 20 4f 52 44 45  is case the ORDE
cde0: 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 2d 3e  R BY clause (p->
cdf0: 70 4f 72 64 65 72 42 79 29 20 73 68 6f 75 6c 64  pOrderBy) should
ce00: 20 62 65 20 72 65 73 6f 6c 76 65 64 0a 20 20 20   be resolved.   
ce10: 20 2a 2a 20 61 73 20 69 66 20 69 74 20 77 65 72   ** as if it wer
ce20: 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 73 75  e part of the su
ce30: 62 2d 71 75 65 72 79 2c 20 6e 6f 74 20 74 68 65  b-query, not the
ce40: 20 70 61 72 65 6e 74 2e 20 54 68 69 73 20 62 6c   parent. This bl
ce50: 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d 6f 76 65 73  ock.    ** moves
ce60: 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 64 6f   the pOrderBy do
ce70: 77 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 71 75  wn to the sub-qu
ce80: 65 72 79 2e 20 49 74 20 77 69 6c 6c 20 62 65 20  ery. It will be 
ce90: 6d 6f 76 65 64 20 62 61 63 6b 0a 20 20 20 20 2a  moved back.    *
cea0: 2a 20 61 66 74 65 72 20 74 68 65 20 6e 61 6d 65  * after the name
ceb0: 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  s have been reso
cec0: 6c 76 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69 66  lved.  */.    if
ced0: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
cee0: 53 46 5f 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a  SF_Converted ){.
cef0: 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53        Select *pS
cf00: 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b  ub = p->pSrc->a[
cf10: 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20 20  0].pSelect;.    
cf20: 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53 72    assert( p->pSr
cf30: 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 70 2d  c->nSrc==1 && p-
cf40: 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20 20  >pOrderBy );.   
cf50: 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62 2d     assert( pSub-
cf60: 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62 2d  >pPrior && pSub-
cf70: 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b 0a  >pOrderBy==0 );.
cf80: 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72 64        pSub->pOrd
cf90: 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65 72  erBy = p->pOrder
cfa0: 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72  By;.      p->pOr
cfb0: 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20 7d  derBy = 0;.    }
cfc0: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75 72  .  .    /* Recur
cfd0: 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20 6e  sively resolve n
cfe0: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62 71  ames in all subq
cff0: 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20 20  ueries.    */.  
d000: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
d010: 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  pSrc->nSrc; i++)
d020: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  {.      struct S
d030: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
d040: 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61  em = &p->pSrc->a
d050: 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20 70  [i];.      if( p
d060: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26  Item->pSelect &&
d070: 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74   (pItem->pSelect
d080: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
d090: 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 7b 0a  Resolved)==0 ){.
d0a0: 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e 74          NameCont
d0b0: 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 20 20 20  ext *pNC;       
d0c0: 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74 65    /* Used to ite
d0d0: 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78  rate name contex
d0e0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e  ts */.        in
d0f0: 74 20 6e 52 65 66 20 3d 20 30 3b 20 20 20 20 20  t nRef = 0;     
d100: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 63 6f          /* Refco
d110: 75 6e 74 20 66 6f 72 20 70 4f 75 74 65 72 4e 43  unt for pOuterNC
d120: 20 61 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74 65   and outer conte
d130: 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 63  xts */.        c
d140: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76 65  onst char *zSave
d150: 64 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72 73  dContext = pPars
d160: 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 3b  e->zAuthContext;
d170: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f 75  ..        /* Cou
d180: 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75 6d  nt the total num
d190: 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65  ber of reference
d1a0: 73 20 74 6f 20 70 4f 75 74 65 72 4e 43 20 61 6e  s to pOuterNC an
d1b0: 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20 20  d all of its.   
d1c0: 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20 63       ** parent c
d1d0: 6f 6e 74 65 78 74 73 2e 20 41 66 74 65 72 20 72  ontexts. After r
d1e0: 65 73 6f 6c 76 69 6e 67 20 72 65 66 65 72 65 6e  esolving referen
d1f0: 63 65 73 20 74 6f 20 65 78 70 72 65 73 73 69 6f  ces to expressio
d200: 6e 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a 2a  ns in.        **
d210: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
d220: 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20 76   check if this v
d230: 61 6c 75 65 20 68 61 73 20 63 68 61 6e 67 65 64  alue has changed
d240: 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20 20  . If so, then.  
d250: 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 20        ** SELECT 
d260: 73 74 61 74 65 6d 65 6e 74 20 70 49 74 65 6d 2d  statement pItem-
d270: 3e 70 53 65 6c 65 63 74 20 6d 75 73 74 20 62 65  >pSelect must be
d280: 20 63 6f 72 72 65 6c 61 74 65 64 2e 20 53 65 74   correlated. Set
d290: 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   the.        ** 
d2a0: 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72  pItem->fg.isCorr
d2b0: 65 6c 61 74 65 64 20 66 6c 61 67 20 69 66 20 74  elated flag if t
d2c0: 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65 2e  his is the case.
d2d0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
d2e0: 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e  pNC=pOuterNC; pN
d2f0: 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78  C; pNC=pNC->pNex
d300: 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d 3e  t) nRef += pNC->
d310: 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20 20 20 69  nRef;..        i
d320: 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  f( pItem->zName 
d330: 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43  ) pParse->zAuthC
d340: 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d 3e  ontext = pItem->
d350: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 73  zName;.        s
d360: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
d370: 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65 2c  ectNames(pParse,
d380: 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 2c   pItem->pSelect,
d390: 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20   pOuterNC);.    
d3a0: 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75 74      pParse->zAut
d3b0: 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76 65  hContext = zSave
d3c0: 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20 20  dContext;.      
d3d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 45    if( pParse->nE
d3e0: 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63  rr || db->malloc
d3f0: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
d400: 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20  WRC_Abort;..    
d410: 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74      for(pNC=pOut
d420: 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70  erNC; pNC; pNC=p
d430: 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20  NC->pNext) nRef 
d440: 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20  -= pNC->nRef;.  
d450: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 49        assert( pI
d460: 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
d470: 61 74 65 64 3d 3d 30 20 26 26 20 6e 52 65 66 3c  ated==0 && nRef<
d480: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 49  =0 );.        pI
d490: 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65 6c  tem->fg.isCorrel
d4a0: 61 74 65 64 20 3d 20 28 6e 52 65 66 21 3d 30 29  ated = (nRef!=0)
d4b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
d4c0: 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75 70    .    /* Set up
d4d0: 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65 2d   the local name-
d4e0: 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73 20  context to pass 
d4f0: 74 6f 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  to sqlite3Resolv
d500: 65 45 78 70 72 4e 61 6d 65 73 28 29 20 74 6f 0a  eExprNames() to.
d510: 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74      ** resolve t
d520: 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78  he result-set ex
d530: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 20  pression list.. 
d540: 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 6e 63     */.    sNC.nc
d550: 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77  Flags = NC_Allow
d560: 41 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b  Agg|NC_AllowWin;
d570: 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69 73  .    sNC.pSrcLis
d580: 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20 20  t = p->pSrc;.   
d590: 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f 75   sNC.pNext = pOu
d5a0: 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20 2f 2a  terNC;.  .    /*
d5b0: 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69   Resolve names i
d5c0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d5d0: 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71 6c  . */.    if( sql
d5e0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c  ite3ResolveExprL
d5f0: 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70  istNames(&sNC, p
d600: 2d 3e 70 45 4c 69 73 74 29 20 29 20 72 65 74 75  ->pEList) ) retu
d610: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
d620: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d    sNC.ncFlags &=
d630: 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 20   ~NC_AllowWin;. 
d640: 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65 72   .    /* If ther
d650: 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67 61  e are no aggrega
d660: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20  te functions in 
d670: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c 20  the result-set, 
d680: 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  and no GROUP BY 
d690: 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69  .    ** expressi
d6a0: 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f 77  on, do not allow
d6b0: 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20 61   aggregates in a
d6c0: 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72 20  ny of the other 
d6d0: 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20 20  expressions..   
d6e0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d6f0: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
d700: 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30 20  F_Aggregate)==0 
d710: 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79 20  );.    pGroupBy 
d720: 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a 20  = p->pGroupBy;. 
d730: 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20     if( pGroupBy 
d740: 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20  || (sNC.ncFlags 
d750: 26 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30 20  & NC_HasAgg)!=0 
d760: 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  ){.      assert(
d770: 20 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 3d 3d 53   NC_MinMaxAgg==S
d780: 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a 20  F_MinMaxAgg );. 
d790: 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73       p->selFlags
d7a0: 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74 65   |= SF_Aggregate
d7b0: 20 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73 26   | (sNC.ncFlags&
d7c0: 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a 20  NC_MinMaxAgg);. 
d7d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
d7e0: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
d7f0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  NC_AllowAgg;.   
d800: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66 20   }.  .    /* If 
d810: 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65 20  a HAVING clause 
d820: 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65 6e  is present, then
d830: 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20 61   there must be a
d840: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
d850: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
d860: 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20 21   p->pHaving && !
d870: 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20 20  pGroupBy ){.    
d880: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
d890: 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52 4f  g(pParse, "a GRO
d8a0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  UP BY clause is 
d8b0: 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65 20  required before 
d8c0: 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20 20  HAVING");.      
d8d0: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
d8e0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
d8f0: 2a 20 41 64 64 20 74 68 65 20 6f 75 74 70 75 74  * Add the output
d900: 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f 20   column list to 
d910: 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74  the name-context
d920: 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67 20   before parsing 
d930: 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65 72  the.    ** other
d940: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
d950: 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  the SELECT state
d960: 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73 6f  ment. This is so
d970: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78 70   that.    ** exp
d980: 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20  ressions in the 
d990: 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65 74  WHERE clause (et
d9a0: 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74 6f  c.) can refer to
d9b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79 0a   expressions by.
d9c0: 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20 69      ** aliases i
d9d0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
d9e0: 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ..    **.    ** 
d9f0: 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66 20  Minor point: If 
da00: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
da10: 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  , then the expre
da20: 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20 20  ssion will be.  
da30: 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74 65    ** re-evaluate
da40: 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65 72  d for each refer
da50: 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20 20  ence to it..    
da60: 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20 28  */.    assert( (
da70: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 28 4e  sNC.ncFlags & (N
da80: 43 5f 55 41 67 67 49 6e 66 6f 7c 4e 43 5f 55 55  C_UAggInfo|NC_UU
da90: 70 73 65 72 74 29 29 3d 3d 30 20 29 3b 0a 20 20  psert))==0 );.  
daa0: 20 20 73 4e 43 2e 75 4e 43 2e 70 45 4c 69 73 74    sNC.uNC.pEList
dab0: 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20 20   = p->pEList;.  
dac0: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
dad0: 20 4e 43 5f 55 45 4c 69 73 74 3b 0a 20 20 20 20   NC_UEList;.    
dae0: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
daf0: 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
db00: 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29 20  , p->pHaving) ) 
db10: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
db20: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
db30: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
db40: 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65 72  s(&sNC, p->pWher
db50: 65 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  e) ) return WRC_
db60: 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20 52  Abort;..    /* R
db70: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
db80: 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75 6e  table-valued-fun
db90: 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20  ction arguments 
dba0: 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  */.    for(i=0; 
dbb0: 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b  i<p->pSrc->nSrc;
dbc0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72   i++){.      str
dbd0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
dbe0: 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53   *pItem = &p->pS
dbf0: 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20  rc->a[i];.      
dc00: 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73  if( pItem->fg.is
dc10: 54 61 62 46 75 6e 63 0a 20 20 20 20 20 20 20 26  TabFunc.       &
dc20: 26 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  & sqlite3Resolve
dc30: 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73  ExprListNames(&s
dc40: 4e 43 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70 46  NC, pItem->u1.pF
dc50: 75 6e 63 41 72 67 29 20 0a 20 20 20 20 20 20 29  uncArg) .      )
dc60: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
dc70: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
dc80: 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f    }.    }..    /
dc90: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 61  * The ORDER BY a
dca0: 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  nd GROUP BY clau
dcb0: 73 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66 65  ses may not refe
dcc0: 72 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20 20  r to terms in.  
dcd0: 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72 69    ** outer queri
dce0: 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  es .    */.    s
dcf0: 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  NC.pNext = 0;.  
dd00: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c 3d    sNC.ncFlags |=
dd10: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f   NC_AllowAgg|NC_
dd20: 41 6c 6c 6f 77 57 69 6e 3b 0a 0a 20 20 20 20 2f  AllowWin;..    /
dd30: 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20 63  * If this is a c
dd40: 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70 6f 75 6e  onverted compoun
dd50: 64 20 71 75 65 72 79 2c 20 6d 6f 76 65 20 74 68  d query, move th
dd60: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
dd70: 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20 74  e from .    ** t
dd80: 68 65 20 73 75 62 2d 71 75 65 72 79 20 62 61 63  he sub-query bac
dd90: 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74 20  k to the parent 
dda0: 71 75 65 72 79 2e 20 41 74 20 74 68 69 73 20 70  query. At this p
ddb0: 6f 69 6e 74 20 65 61 63 68 20 74 65 72 6d 0a 20  oint each term. 
ddc0: 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68 65     ** within the
ddd0: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
dde0: 20 68 61 73 20 62 65 65 6e 20 74 72 61 6e 73 66   has been transf
ddf0: 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69 6e 74 65  ormed to an inte
de00: 67 65 72 20 76 61 6c 75 65 2e 0a 20 20 20 20 2a  ger value..    *
de10: 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72 73  * These integers
de20: 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63 65   will be replace
de30: 64 20 62 79 20 63 6f 70 69 65 73 20 6f 66 20 74  d by copies of t
de40: 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
de50: 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20 73   result.    ** s
de60: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62  et expressions b
de70: 79 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72 65  y the call to re
de80: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
de90: 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a 20  y() below.  */. 
dea0: 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61     if( p->selFla
deb0: 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65  gs & SF_Converte
dec0: 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63  d ){.      Selec
ded0: 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72  t *pSub = p->pSr
dee0: 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b  c->a[0].pSelect;
def0: 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65 72  .      p->pOrder
df00: 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64 65  By = pSub->pOrde
df10: 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62 2d  rBy;.      pSub-
df20: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
df30: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72 6f     }..    /* Pro
df40: 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20 42  cess the ORDER B
df50: 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69 6e  Y clause for sin
df60: 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73 74  gleton SELECT st
df70: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2a  atements..    **
df80: 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c   The ORDER BY cl
df90: 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75 6e  ause for compoun
dfa0: 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  ds SELECT statem
dfb0: 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64 0a  ents is handled.
dfc0: 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61 66      ** below, af
dfd0: 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 72  ter all of the r
dfe0: 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20 61  esult-sets for a
dff0: 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65 6e  ll of the elemen
e000: 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68 65  ts of.    ** the
e010: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
e020: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
e030: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    **.    ** If t
e040: 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45 52  here is an ORDER
e050: 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 61 20   BY clause on a 
e060: 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f 75  term of a compou
e070: 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68 65 72 0a  nd-select other.
e080: 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65 20      ** than the 
e090: 72 69 67 68 74 2d 6d 6f 73 74 20 74 65 72 6d 2c  right-most term,
e0a0: 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 61 20   then that is a 
e0b0: 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20 42  syntax error.  B
e0c0: 75 74 20 74 68 65 20 65 72 72 6f 72 0a 20 20 20  ut the error.   
e0d0: 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 74 65 63   ** is not detec
e0e0: 74 65 64 20 75 6e 74 69 6c 20 6d 75 63 68 20 6c  ted until much l
e0f0: 61 74 65 72 2c 20 61 6e 64 20 73 6f 20 77 65 20  ater, and so we 
e100: 6e 65 65 64 20 74 6f 20 67 6f 20 61 68 65 61 64  need to go ahead
e110: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72 65 73 6f   and.    ** reso
e120: 6c 76 65 20 74 68 6f 73 65 20 73 79 6d 62 6f 6c  lve those symbol
e130: 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f 72 72 65  s on the incorre
e140: 63 74 20 4f 52 44 45 52 20 42 59 20 66 6f 72 20  ct ORDER BY for 
e150: 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a 20 20 20  consistency..   
e160: 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 43 6f   */.    if( isCo
e170: 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70 6f 75 6e  mpound<=nCompoun
e180: 64 20 20 2f 2a 20 44 65 66 65 72 20 72 69 67 68  d  /* Defer righ
e190: 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20 42 59 20  t-most ORDER BY 
e1a0: 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f  of a compound */
e1b0: 0a 20 20 20 20 20 26 26 20 72 65 73 6f 6c 76 65  .     && resolve
e1c0: 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e  OrderGroupBy(&sN
e1d0: 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72 42  C, p, p->pOrderB
e1e0: 79 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 20 20  y, "ORDER").    
e1f0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
e200: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d  WRC_Abort;.    }
e210: 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61 6c  .    if( db->mal
e220: 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20  locFailed ){.   
e230: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
e240: 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73  ort;.    }.    s
e250: 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e  NC.ncFlags &= ~N
e260: 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 20 20 0a 20  C_AllowWin;.  . 
e270: 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68     /* Resolve th
e280: 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  e GROUP BY claus
e290: 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20  e.  At the same 
e2a0: 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65 20  time, make sure 
e2b0: 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f 55  .    ** the GROU
e2c0: 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65 73  P BY clause does
e2d0: 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67 67   not contain agg
e2e0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
e2f0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
e300: 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20   pGroupBy ){.   
e310: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
e320: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
e330: 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20 72      .      if( r
e340: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
e350: 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72 6f  By(&sNC, p, pGro
e360: 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20 7c  upBy, "GROUP") |
e370: 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  | db->mallocFail
e380: 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  ed ){.        re
e390: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
e3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
e3b0: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47 72  r(i=0, pItem=pGr
e3c0: 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72 6f  oupBy->a; i<pGro
e3d0: 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  upBy->nExpr; i++
e3e0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
e3f0: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
e400: 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e 70  roperty(pItem->p
e410: 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29 7b  Expr, EP_Agg) ){
e420: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
e430: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
e440: 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66 75  e, "aggregate fu
e450: 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74 20  nctions are not 
e460: 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20 20  allowed in ".   
e470: 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65 20             "the 
e480: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 22  GROUP BY clause"
e490: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65 74  );.          ret
e4a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
e4b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
e4c0: 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20  .    }..#ifndef 
e4d0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
e4e0: 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20 49  OWFUNC.    if( I
e4f0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
e500: 29 7b 0a 20 20 20 20 20 20 57 69 6e 64 6f 77 20  ){.      Window 
e510: 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 66 6f 72  *pWin;.      for
e520: 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 44 65 66  (pWin=p->pWinDef
e530: 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70 57  n; pWin; pWin=pW
e540: 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20  in->pNextWin){. 
e550: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
e560: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73  e3ResolveExprLis
e570: 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 69  tNames(&sNC, pWi
e580: 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20 20  n->pOrderBy).   
e590: 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
e5a0: 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e  ResolveExprListN
e5b0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 69 6e 2d  ames(&sNC, pWin-
e5c0: 3e 70 50 61 72 74 69 74 69 6f 6e 29 0a 20 20 20  >pPartition).   
e5d0: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
e5e0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
e5f0: 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rt;.        }.  
e600: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64      }.    }.#end
e610: 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68  if..    /* If th
e620: 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  is is part of a 
e630: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2c  compound SELECT,
e640: 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20 68   check that it h
e650: 61 73 20 74 68 65 20 72 69 67 68 74 0a 20 20 20  as the right.   
e660: 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65 78   ** number of ex
e670: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
e680: 20 73 65 6c 65 63 74 20 6c 69 73 74 2e 20 2a 2f   select list. */
e690: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65 78  .    if( p->pNex
e6a0: 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d 3e  t && p->pEList->
e6b0: 6e 45 78 70 72 21 3d 70 2d 3e 70 4e 65 78 74 2d  nExpr!=p->pNext-
e6c0: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
e6d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53  {.      sqlite3S
e6e0: 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65 72  electWrongNumTer
e6f0: 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20  msError(pParse, 
e700: 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20 20  p->pNext);.     
e710: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
e720: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
e730: 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20   Advance to the 
e740: 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68 65  next term of the
e750: 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a 2f   compound.    */
e760: 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72 69  .    p = p->pPri
e770: 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75 6e  or;.    nCompoun
e780: 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52  d++;.  }..  /* R
e790: 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45 52  esolve the ORDER
e7a0: 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e   BY on a compoun
e7b0: 64 20 53 45 4c 45 43 54 20 61 66 74 65 72 20 61  d SELECT after a
e7c0: 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a 2a  ll terms of.  **
e7d0: 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61   the compound ha
e7e0: 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65 64  ve been resolved
e7f0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73 43  ..  */.  if( isC
e800: 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f 6c  ompound && resol
e810: 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42  veCompoundOrderB
e820: 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 6d  y(pParse, pLeftm
e830: 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75  ost) ){.    retu
e840: 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20  rn WRC_Abort;.  
e850: 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f  }..  return WRC_
e860: 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Prune;.}../*.** 
e870: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
e880: 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ks an expression
e890: 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76   tree and resolv
e8a0: 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  es references to
e8b0: 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  .** table column
e8c0: 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65 74  s and result-set
e8d0: 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74 68   columns.  At th
e8e0: 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f 20  e same time, do 
e8f0: 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69 6e  error.** checkin
e900: 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75 73  g on function us
e910: 61 67 65 20 61 6e 64 20 73 65 74 20 61 20 66 6c  age and set a fl
e920: 61 67 20 69 66 20 61 6e 79 20 61 67 67 72 65 67  ag if any aggreg
e930: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a  ate functions.**
e940: 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a   are seen..**.**
e950: 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62 6c   To resolve tabl
e960: 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72 65  e columns refere
e970: 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f 72  nces we look for
e980: 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74 72   nodes (or subtr
e990: 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a 20  ees) of the .** 
e9a0: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
e9b0: 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65 72  Z or just Z wher
e9c0: 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a 20  e.**.**      X: 
e9d0: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
e9e0: 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20 20  database.  Ex:  
e9f0: 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70 22  "main" or "temp"
ea00: 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20 20   or.**          
ea10: 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61   the symbolic na
ea20: 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20 61  me assigned to a
ea30: 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61 74 61  n ATTACH-ed data
ea40: 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20  base..**.**     
ea50: 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f   Y:   The name o
ea60: 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20 46  f a table in a F
ea70: 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72 20  ROM clause.  Or 
ea80: 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a 20  in a trigger.** 
ea90: 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f 66            one of
eaa0: 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61 6d   the special nam
eab0: 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65 77  es "old" or "new
eac0: 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a  "..**.**      Z:
ead0: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
eae0: 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c 65   column in table
eaf0: 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f   Y..**.** The no
eb00: 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20 6f  de at the root o
eb10: 66 20 74 68 65 20 73 75 62 74 72 65 65 20 69 73  f the subtree is
eb20: 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f 6c   modified as fol
eb30: 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45  lows:.**.**    E
eb40: 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43 68  xpr.op        Ch
eb50: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
eb60: 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70 54  MN.**    Expr.pT
eb70: 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20 74  ab      Points t
eb80: 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a 65  o the Table obje
eb90: 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20 20  ct for X.Y.**   
eba0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20 20   Expr.iColumn   
ebb0: 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65 78  The column index
ebc0: 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f 72   in X.Y.  -1 for
ebd0: 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20 20   the rowid..**  
ebe0: 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20 20    Expr.iTable   
ebf0: 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f 72   The VDBE cursor
ec00: 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59 0a   number for X.Y.
ec10: 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f  **.**.** To reso
ec20: 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20 72  lve result-set r
ec30: 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20  eferences, look 
ec40: 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  for expression n
ec50: 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20 66  odes of the.** f
ec60: 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20 58  orm Z (with no X
ec70: 20 61 6e 64 20 59 20 70 72 65 66 69 78 29 20 77   and Y prefix) w
ec80: 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63 68  here the Z match
ec90: 65 73 20 74 68 65 20 72 69 67 68 74 2d 68 61 6e  es the right-han
eca0: 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e 20  d.** size of an 
ecb0: 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68 65  AS clause in the
ecc0: 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20 61   result-set of a
ecd0: 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a 20   SELECT.  The Z 
ece0: 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73  expression.** is
ecf0: 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20 63   replaced by a c
ed00: 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74 2d  opy of the left-
ed10: 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68 65  hand side of the
ed20: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
ed30: 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65  ession..** Table
ed40: 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74 69  -name and functi
ed50: 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f 63  on resolution oc
ed60: 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62 73  curs on the subs
ed70: 74 69 74 75 74 65 64 20 65 78 70 72 65 73 73 69  tituted expressi
ed80: 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f 72  on.** tree.  For
ed90: 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a   example, in:.**
eda0: 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54 20  .**      SELECT 
edb0: 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41 53  a+b AS x, c+d AS
edc0: 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45 52   y FROM t1 ORDER
edd0: 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65   BY x;.**.** The
ede0: 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68 65   "x" term of the
edf0: 20 6f 72 64 65 72 20 62 79 20 69 73 20 72 65 70   order by is rep
ee00: 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22 20 74  laced by "a+b" t
ee10: 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20  o render:.**.** 
ee20: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
ee30: 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46  AS x, c+d AS y F
ee40: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
ee50: 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74  a+b;.**.** Funct
ee60: 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63 68  ion calls are ch
ee70: 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73 75  ecked to make su
ee80: 72 65 20 74 68 61 74 20 74 68 65 20 66 75 6e 63  re that the func
ee90: 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66 69  tion is .** defi
eea0: 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74 68 65  ned and that the
eeb0: 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20   correct number 
eec0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72 65  of arguments are
eed0: 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20 49   specified..** I
eee0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69  f the function i
eef0: 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66  s an aggregate f
ef00: 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74 68  unction, then th
ef10: 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61 67  e NC_HasAgg flag
ef20: 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20 74   is.** set and t
ef30: 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68 61  he opcode is cha
ef40: 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55 4e  nged from TK_FUN
ef50: 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47 5f  CTION to TK_AGG_
ef60: 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20  FUNCTION..** If 
ef70: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  an expression co
ef80: 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74 65  ntains aggregate
ef90: 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20   functions then 
efa0: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
efb0: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
efc0: 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74 2e  pression is set.
efd0: 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72 20  .**.** An error 
efe0: 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74 20  message is left 
eff0: 69 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e 79  in pParse if any
f000: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
f010: 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 69   The number.** i
f020: 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74 75  f errors is retu
f030: 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rned..*/.int sql
f040: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
f050: 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e  ames( .  NameCon
f060: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
f070: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
f080: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
f090: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
f0a0: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
f0b0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
f0c0: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
f0d0: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
f0e0: 69 6e 74 20 73 61 76 65 64 48 61 73 41 67 67 3b  int savedHasAgg;
f0f0: 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20  .  Walker w;..  
f100: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
f110: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b  eturn SQLITE_OK;
f120: 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20 3d  .  savedHasAgg =
f130: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
f140: 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69  (NC_HasAgg|NC_Mi
f150: 6e 4d 61 78 41 67 67 7c 4e 43 5f 48 61 73 57 69  nMaxAgg|NC_HasWi
f160: 6e 29 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61  n);.  pNC->ncFla
f170: 67 73 20 26 3d 20 7e 28 4e 43 5f 48 61 73 41 67  gs &= ~(NC_HasAg
f180: 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 7c 4e  g|NC_MinMaxAgg|N
f190: 43 5f 48 61 73 57 69 6e 29 3b 0a 20 20 77 2e 70  C_HasWin);.  w.p
f1a0: 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61  Parse = pNC->pPa
f1b0: 72 73 65 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  rse;.  w.xExprCa
f1c0: 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65  llback = resolve
f1d0: 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e 78 53  ExprStep;.  w.xS
f1e0: 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20  electCallback = 
f1f0: 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53 74 65  resolveSelectSte
f200: 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61  p;.  w.xSelectCa
f210: 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77  llback2 = 0;.  w
f220: 2e 75 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 23 69  .u.pNC = pNC;.#i
f230: 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50  f SQLITE_MAX_EXP
f240: 52 5f 44 45 50 54 48 3e 30 0a 20 20 77 2e 70 50  R_DEPTH>0.  w.pP
f250: 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d  arse->nHeight +=
f260: 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b   pExpr->nHeight;
f270: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78  .  if( sqlite3Ex
f280: 70 72 43 68 65 63 6b 48 65 69 67 68 74 28 77 2e  prCheckHeight(w.
f290: 70 50 61 72 73 65 2c 20 77 2e 70 50 61 72 73 65  pParse, w.pParse
f2a0: 2d 3e 6e 48 65 69 67 68 74 29 20 29 7b 0a 20 20  ->nHeight) ){.  
f2b0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
f2c0: 45 52 52 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69  ERROR;.  }.#endi
f2d0: 66 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45  f.  sqlite3WalkE
f2e0: 78 70 72 28 26 77 2c 20 70 45 78 70 72 29 3b 0a  xpr(&w, pExpr);.
f2f0: 23 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45  #if SQLITE_MAX_E
f300: 58 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 77 2e  XPR_DEPTH>0.  w.
f310: 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 20  pParse->nHeight 
f320: 2d 3d 20 70 45 78 70 72 2d 3e 6e 48 65 69 67 68  -= pExpr->nHeigh
f330: 74 3b 0a 23 65 6e 64 69 66 0a 20 20 61 73 73 65  t;.#endif.  asse
f340: 72 74 28 20 45 50 5f 41 67 67 3d 3d 4e 43 5f 48  rt( EP_Agg==NC_H
f350: 61 73 41 67 67 20 29 3b 0a 20 20 61 73 73 65 72  asAgg );.  asser
f360: 74 28 20 45 50 5f 57 69 6e 3d 3d 4e 43 5f 48 61  t( EP_Win==NC_Ha
f370: 73 57 69 6e 20 29 3b 0a 20 20 74 65 73 74 63 61  sWin );.  testca
f380: 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  se( pNC->ncFlags
f390: 20 26 20 4e 43 5f 48 61 73 41 67 67 20 29 3b 0a   & NC_HasAgg );.
f3a0: 20 20 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d    testcase( pNC-
f3b0: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61  >ncFlags & NC_Ha
f3c0: 73 57 69 6e 20 29 3b 0a 20 20 45 78 70 72 53 65  sWin );.  ExprSe
f3d0: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
f3e0: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
f3f0: 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 48 61  (NC_HasAgg|NC_Ha
f400: 73 57 69 6e 29 20 29 3b 0a 20 20 70 4e 43 2d 3e  sWin) );.  pNC->
f410: 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61 76 65 64  ncFlags |= saved
f420: 48 61 73 41 67 67 3b 0a 20 20 72 65 74 75 72 6e  HasAgg;.  return
f430: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20   pNC->nErr>0 || 
f440: 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  w.pParse->nErr>0
f450: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
f460: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72  ve all names for
f470: 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 20   all expression 
f480: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
f490: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 69 73 0a   list.  This is.
f4a0: 2a 2a 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c  ** just like sql
f4b0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
f4c0: 61 6d 65 73 28 29 20 65 78 63 65 70 74 20 74 68  ames() except th
f4d0: 61 74 20 69 74 20 77 6f 72 6b 73 20 66 6f 72 20  at it works for 
f4e0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
f4f0: 20 6c 69 73 74 20 72 61 74 68 65 72 20 74 68 61   list rather tha
f500: 6e 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  n a single expre
f510: 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssion..*/.int sq
f520: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
f530: 4c 69 73 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61  ListNames( .  Na
f540: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
f550: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
f560: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
f570: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
f580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
f590: 73 74 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  st         /* Th
f5a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
f5b0: 74 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  t to be analyzed
f5c0: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  . */.){.  int i;
f5d0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
f5e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f5f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
f600: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
f610: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
f620: 61 6d 65 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d  ames(pNC, pList-
f630: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
f640: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
f650: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
f660: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
f670: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
f680: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20  ve all names in 
f690: 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  all expressions 
f6a0: 6f 66 20 61 20 53 45 4c 45 43 54 20 61 6e 64 20  of a SELECT and 
f6b0: 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64  in all.** decend
f6c0: 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ents of the SELE
f6d0: 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f  CT, including co
f6e0: 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f 66 20 70  mpounds off of p
f6f0: 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62  ->pPrior,.** sub
f700: 71 75 65 72 69 65 73 20 69 6e 20 65 78 70 72 65  queries in expre
f710: 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71  ssions, and subq
f720: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 46  ueries used as F
f730: 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ROM clause.** te
f740: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73  rms..**.** See s
f750: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
f760: 72 4e 61 6d 65 73 28 29 20 66 6f 72 20 61 20 64  rNames() for a d
f770: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
f780: 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72  e kinds of.** tr
f790: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68  ansformations th
f7a0: 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  at occur..**.** 
f7b0: 41 6c 6c 20 53 45 4c 45 43 54 20 73 74 61 74 65  All SELECT state
f7c0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 68 61 76  ments should hav
f7d0: 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
f7e0: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
f7f0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 70  SelectExpand() p
f800: 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
f810: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
f820: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
f830: 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
f840: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
f850: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
f860: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
f870: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
f880: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
f890: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
f8a0: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
f8b0: 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
f8c0: 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
f8d0: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
f8e0: 72 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 20  r parent SELECT 
f8f0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
f900: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61    Walker w;..  a
f910: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
f920: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
f930: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
f940: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
f950: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
f960: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
f970: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
f980: 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  2 = 0;.  w.pPars
f990: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e  e = pParse;.  w.
f9a0: 75 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43  u.pNC = pOuterNC
f9b0: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
f9c0: 65 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a  elect(&w, p);.}.
f9d0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
f9e0: 61 6d 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ames in expressi
f9f0: 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  ons that can onl
fa00: 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
fa10: 6e 67 6c 65 20 74 61 62 6c 65 0a 2a 2a 20 6f 72  ngle table.** or
fa20: 20 77 68 69 63 68 20 63 61 6e 6e 6f 74 20 72 65   which cannot re
fa30: 66 65 72 65 6e 63 65 20 61 6e 79 20 74 61 62 6c  ference any tabl
fa40: 65 73 20 61 74 20 61 6c 6c 2e 20 20 45 78 61 6d  es at all.  Exam
fa50: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 28  ples:.**.**    (
fa60: 31 29 20 20 20 43 48 45 43 4b 20 63 6f 6e 73 74  1)   CHECK const
fa70: 72 61 69 6e 74 73 0a 2a 2a 20 20 20 20 28 32 29  raints.**    (2)
fa80: 20 20 20 57 48 45 52 45 20 63 6c 61 75 73 65 73     WHERE clauses
fa90: 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e 64 69   on partial indi
faa0: 63 65 73 0a 2a 2a 20 20 20 20 28 33 29 20 20 20  ces.**    (3)   
fab0: 45 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 69  Expressions in i
fac0: 6e 64 65 78 65 73 20 6f 6e 20 65 78 70 72 65 73  ndexes on expres
fad0: 73 69 6f 6e 73 0a 2a 2a 20 20 20 20 28 34 29 20  sions.**    (4) 
fae0: 20 20 45 78 70 72 65 73 73 69 6f 6e 20 61 72 67    Expression arg
faf0: 75 6d 65 6e 74 73 20 74 6f 20 56 41 43 55 55 4d  uments to VACUUM
fb00: 20 49 4e 54 4f 2e 0a 2a 2a 20 20 20 20 28 35 29   INTO..**    (5)
fb10: 20 20 20 47 45 4e 45 52 41 54 45 44 20 41 4c 57     GENERATED ALW
fb20: 41 59 53 20 61 73 20 65 78 70 72 65 73 73 69 6f  AYS as expressio
fb30: 6e 73 0a 2a 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20  ns.**.** In all 
fb40: 63 61 73 65 73 20 65 78 63 65 70 74 20 28 34 29  cases except (4)
fb50: 2c 20 74 68 65 20 45 78 70 72 2e 69 54 61 62 6c  , the Expr.iTabl
fb60: 65 20 76 61 6c 75 65 20 66 6f 72 20 45 78 70 72  e value for Expr
fb70: 2e 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  .op==TK_COLUMN.*
fb80: 2a 20 6e 6f 64 65 73 20 6f 66 20 74 68 65 20 65  * nodes of the e
fb90: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74  xpression is set
fba0: 20 74 6f 20 2d 31 20 61 6e 64 20 74 68 65 20 45   to -1 and the E
fbb0: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
fbc0: 65 20 69 73 0a 2a 2a 20 73 65 74 20 74 6f 20 74  e is.** set to t
fbd0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
fbe0: 2e 20 20 49 6e 20 63 61 73 65 20 28 34 29 2c 20  .  In case (4), 
fbf0: 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20  TK_COLUMN nodes 
fc00: 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 2e 0a  cause an error..
fc10: 2a 2a 0a 2a 2a 20 41 6e 79 20 65 72 72 6f 72 73  **.** Any errors
fc20: 20 63 61 75 73 65 20 61 6e 20 65 72 72 6f 72 20   cause an error 
fc30: 6d 65 73 73 61 67 65 20 74 6f 20 62 65 20 73 65  message to be se
fc40: 74 20 69 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a  t in pParse..*/.
fc50: 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  int sqlite3Resol
fc60: 76 65 53 65 6c 66 52 65 66 65 72 65 6e 63 65 28  veSelfReference(
fc70: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
fc80: 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63  ,   /* Parsing c
fc90: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
fca0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 2f 2a 20  e *pTab,     /* 
fcb0: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
fcc0: 72 65 66 65 72 65 6e 63 65 64 2c 20 6f 72 20 4e  referenced, or N
fcd0: 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 74 79 70  ULL */.  int typ
fce0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f  e,        /* NC_
fcf0: 49 73 43 68 65 63 6b 2c 20 4e 43 5f 50 61 72 74  IsCheck, NC_Part
fd00: 49 64 78 2c 20 4e 43 5f 49 64 78 45 78 70 72 2c  Idx, NC_IdxExpr,
fd10: 20 4e 43 5f 47 65 6e 43 6f 6c 2c 20 6f 72 20 30   NC_GenCol, or 0
fd20: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
fd30: 72 2c 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  r,     /* Expres
fd40: 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e  sion to resolve.
fd50: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a    May be NULL. *
fd60: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
fd70: 69 73 74 20 20 2f 2a 20 45 78 70 72 65 73 73 69  ist  /* Expressi
fd80: 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65 73 6f 6c  on list to resol
fd90: 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ve.  May be NULL
fda0: 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63 4c 69 73  . */.){.  SrcLis
fdb0: 74 20 73 53 72 63 3b 20 20 20 20 20 20 20 20 20  t sSrc;         
fdc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 61 6b            /* Fak
fdd0: 65 20 53 72 63 4c 69 73 74 20 66 6f 72 20 70 50  e SrcList for pP
fde0: 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20  arse->pNewTable 
fdf0: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
fe00: 20 73 4e 43 3b 20 20 20 20 20 20 20 20 20 20 20   sNC;           
fe10: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e       /* Name con
fe20: 74 65 78 74 20 66 6f 72 20 70 50 61 72 73 65 2d  text for pParse-
fe30: 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f 0a 20 20  >pNewTable */.  
fe40: 69 6e 74 20 72 63 3b 0a 0a 20 20 61 73 73 65 72  int rc;..  asser
fe50: 74 28 20 74 79 70 65 3d 3d 30 20 7c 7c 20 70 54  t( type==0 || pT
fe60: 61 62 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ab!=0 );.  asser
fe70: 74 28 20 74 79 70 65 3d 3d 4e 43 5f 49 73 43 68  t( type==NC_IsCh
fe80: 65 63 6b 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f  eck || type==NC_
fe90: 50 61 72 74 49 64 78 20 7c 7c 20 74 79 70 65 3d  PartIdx || type=
fea0: 3d 4e 43 5f 49 64 78 45 78 70 72 0a 20 20 20 20  =NC_IdxExpr.    
feb0: 20 20 20 20 20 20 7c 7c 20 74 79 70 65 3d 3d 4e        || type==N
fec0: 43 5f 47 65 6e 43 6f 6c 20 7c 7c 20 70 54 61 62  C_GenCol || pTab
fed0: 3d 3d 30 20 29 3b 0a 20 20 6d 65 6d 73 65 74 28  ==0 );.  memset(
fee0: 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28  &sNC, 0, sizeof(
fef0: 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74 28  sNC));.  memset(
ff00: 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f 66  &sSrc, 0, sizeof
ff10: 28 73 53 72 63 29 29 3b 0a 20 20 69 66 28 20 70  (sSrc));.  if( p
ff20: 54 61 62 20 29 7b 0a 20 20 20 20 73 53 72 63 2e  Tab ){.    sSrc.
ff30: 6e 53 72 63 20 3d 20 31 3b 0a 20 20 20 20 73 53  nSrc = 1;.    sS
ff40: 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20  rc.a[0].zName = 
ff50: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
ff60: 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20   sSrc.a[0].pTab 
ff70: 3d 20 70 54 61 62 3b 0a 20 20 20 20 73 53 72 63  = pTab;.    sSrc
ff80: 2e 61 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20  .a[0].iCursor = 
ff90: 2d 31 3b 0a 20 20 7d 0a 20 20 73 4e 43 2e 70 50  -1;.  }.  sNC.pP
ffa0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
ffb0: 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d 20   sNC.pSrcList = 
ffc0: 26 73 53 72 63 3b 0a 20 20 73 4e 43 2e 6e 63 46  &sSrc;.  sNC.ncF
ffd0: 6c 61 67 73 20 3d 20 74 79 70 65 20 7c 20 4e 43  lags = type | NC
ffe0: 5f 49 73 44 44 4c 3b 0a 20 20 69 66 28 20 28 72  _IsDDL;.  if( (r
fff0: 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  c = sqlite3Resol
10000 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43  veExprNames(&sNC
10010 2c 20 70 45 78 70 72 29 29 21 3d 53 51 4c 49 54  , pExpr))!=SQLIT
10020 45 5f 4f 4b 20 29 20 72 65 74 75 72 6e 20 72 63  E_OK ) return rc
10030 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 20  ;.  if( pList ) 
10040 72 63 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f  rc = sqlite3Reso
10050 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
10060 28 26 73 4e 43 2c 20 70 4c 69 73 74 29 3b 0a 20  (&sNC, pList);. 
10070 20 72 65 74 75 72 6e 20 72 63 3b 0a 7d 0a         return rc;.}.