/ Hex Artifact Content
Login

Artifact f20cb5b953bd927e8c6b6e01662cce066a632b5d3a21d2938b93de0825aef5d5:


0000: 2f 2a 0a 2a 2a 20 32 30 30 38 20 41 75 67 75 73  /*.** 2008 Augus
0010: 74 20 31 38 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61  t 18.**.** The a
0020: 75 74 68 6f 72 20 64 69 73 63 6c 61 69 6d 73 20  uthor disclaims 
0030: 63 6f 70 79 72 69 67 68 74 20 74 6f 20 74 68 69  copyright to thi
0040: 73 20 73 6f 75 72 63 65 20 63 6f 64 65 2e 20 20  s source code.  
0050: 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a 2a 20 61  In place of.** a
0060: 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65 2c 20 68   legal notice, h
0070: 65 72 65 20 69 73 20 61 20 62 6c 65 73 73 69 6e  ere is a blessin
0080: 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d 61 79 20  g:.**.**    May 
0090: 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61 6e 64 20  you do good and 
00a0: 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20 20 20 20  not evil..**    
00b0: 4d 61 79 20 79 6f 75 20 66 69 6e 64 20 66 6f 72  May you find for
00c0: 67 69 76 65 6e 65 73 73 20 66 6f 72 20 79 6f 75  giveness for you
00d0: 72 73 65 6c 66 20 61 6e 64 20 66 6f 72 67 69 76  rself and forgiv
00e0: 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20 20 20 20  e others..**    
00f0: 4d 61 79 20 79 6f 75 20 73 68 61 72 65 20 66 72  May you share fr
0100: 65 65 6c 79 2c 20 6e 65 76 65 72 20 74 61 6b 69  eely, never taki
0110: 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20 79 6f 75  ng more than you
0120: 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a   give..**.******
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ***.**.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 77  tines used for w
01a0: 61 6c 6b 69 6e 67 20 74 68 65 20 70 61 72 73 65  alking the parse
01b0: 72 20 74 72 65 65 20 61 6e 64 0a 2a 2a 20 72 65  r tree and.** re
01c0: 73 6f 6c 76 65 20 61 6c 6c 20 69 64 65 6e 74 69  solve all identi
01d0: 66 69 65 72 73 20 62 79 20 61 73 73 6f 63 69 61  fiers by associa
01e0: 74 69 6e 67 20 74 68 65 6d 20 77 69 74 68 20 61  ting them with a
01f0: 20 70 61 72 74 69 63 75 6c 61 72 0a 2a 2a 20 74   particular.** t
0200: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 2e  able and column.
0210: 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71  .*/.#include "sq
0220: 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a  liteInt.h"../*.*
0230: 2a 20 57 61 6c 6b 20 74 68 65 20 65 78 70 72 65  * Walk the expre
0240: 73 73 69 6f 6e 20 74 72 65 65 20 70 45 78 70 72  ssion tree pExpr
0250: 20 61 6e 64 20 69 6e 63 72 65 61 73 65 20 74 68   and increase th
0260: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
0270: 74 69 6f 6e 0a 2a 2a 20 64 65 70 74 68 20 28 74  tion.** depth (t
0280: 68 65 20 45 78 70 72 2e 6f 70 32 20 66 69 65 6c  he Expr.op2 fiel
0290: 64 29 20 62 79 20 4e 20 6f 6e 20 65 76 65 72 79  d) by N on every
02a0: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
02b0: 20 6e 6f 64 65 2e 0a 2a 2a 20 54 68 69 73 20 6e   node..** This n
02c0: 65 65 64 73 20 74 6f 20 6f 63 63 75 72 20 77 68  eeds to occur wh
02d0: 65 6e 20 63 6f 70 79 69 6e 67 20 61 20 54 4b 5f  en copying a TK_
02e0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 20 6e 6f 64  AGG_FUNCTION nod
02f0: 65 20 66 72 6f 6d 20 61 6e 0a 2a 2a 20 6f 75 74  e from an.** out
0300: 65 72 20 71 75 65 72 79 20 69 6e 74 6f 20 61 6e  er query into an
0310: 20 69 6e 6e 65 72 20 73 75 62 71 75 65 72 79 2e   inner subquery.
0320: 0a 2a 2a 0a 2a 2a 20 69 6e 63 72 41 67 67 46 75  .**.** incrAggFu
0330: 6e 63 74 69 6f 6e 44 65 70 74 68 28 70 45 78 70  nctionDepth(pExp
0340: 72 2c 6e 29 20 69 73 20 74 68 65 20 6d 61 69 6e  r,n) is the main
0350: 20 72 6f 75 74 69 6e 65 2e 20 20 69 6e 63 72 41   routine.  incrA
0360: 67 67 44 65 70 74 68 28 2e 2e 29 0a 2a 2a 20 69  ggDepth(..).** i
0370: 73 20 61 20 68 65 6c 70 65 72 20 66 75 6e 63 74  s a helper funct
0380: 69 6f 6e 20 2d 20 61 20 63 61 6c 6c 62 61 63 6b  ion - a callback
0390: 20 66 6f 72 20 74 68 65 20 74 72 65 65 20 77 61   for the tree wa
03a0: 6c 6b 65 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lker..*/.static 
03b0: 69 6e 74 20 69 6e 63 72 41 67 67 44 65 70 74 68  int incrAggDepth
03c0: 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72  (Walker *pWalker
03d0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
03e0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
03f0: 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e  =TK_AGG_FUNCTION
0400: 20 29 20 70 45 78 70 72 2d 3e 6f 70 32 20 2b 3d   ) pExpr->op2 +=
0410: 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 6e 3b 0a 20   pWalker->u.n;. 
0420: 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74   return WRC_Cont
0430: 69 6e 75 65 3b 0a 7d 0a 73 74 61 74 69 63 20 76  inue;.}.static v
0440: 6f 69 64 20 69 6e 63 72 41 67 67 46 75 6e 63 74  oid incrAggFunct
0450: 69 6f 6e 44 65 70 74 68 28 45 78 70 72 20 2a 70  ionDepth(Expr *p
0460: 45 78 70 72 2c 20 69 6e 74 20 4e 29 7b 0a 20 20  Expr, int N){.  
0470: 69 66 28 20 4e 3e 30 20 29 7b 0a 20 20 20 20 57  if( N>0 ){.    W
0480: 61 6c 6b 65 72 20 77 3b 0a 20 20 20 20 6d 65 6d  alker w;.    mem
0490: 73 65 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f  set(&w, 0, sizeo
04a0: 66 28 77 29 29 3b 0a 20 20 20 20 77 2e 78 45 78  f(w));.    w.xEx
04b0: 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 69 6e 63  prCallback = inc
04c0: 72 41 67 67 44 65 70 74 68 3b 0a 20 20 20 20 77  rAggDepth;.    w
04d0: 2e 75 2e 6e 20 3d 20 4e 3b 0a 20 20 20 20 73 71  .u.n = N;.    sq
04e0: 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77  lite3WalkExpr(&w
04f0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 7d 0a 7d 0a  , pExpr);.  }.}.
0500: 0a 2f 2a 0a 2a 2a 20 54 75 72 6e 20 74 68 65 20  ./*.** Turn the 
0510: 70 45 78 70 72 20 65 78 70 72 65 73 73 69 6f 6e  pExpr expression
0520: 20 69 6e 74 6f 20 61 6e 20 61 6c 69 61 73 20 66   into an alias f
0530: 6f 72 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 63  or the iCol-th c
0540: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 0a 2a 2a 20  olumn of the.** 
0550: 72 65 73 75 6c 74 20 73 65 74 20 69 6e 20 70 45  result set in pE
0560: 4c 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  List..**.** If t
0570: 68 65 20 72 65 66 65 72 65 6e 63 65 20 69 73 20  he reference is 
0580: 66 6f 6c 6c 6f 77 65 64 20 62 79 20 61 20 43 4f  followed by a CO
0590: 4c 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2c 20  LLATE operator, 
05a0: 74 68 65 6e 20 6d 61 6b 65 20 73 75 72 65 0a 2a  then make sure.*
05b0: 2a 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 6f 70  * the COLLATE op
05c0: 65 72 61 74 6f 72 20 69 73 20 70 72 65 73 65 72  erator is preser
05d0: 76 65 64 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ved.  For exampl
05e0: 65 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c  e:.**.**     SEL
05f0: 45 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f  ECT a+b, c+d FRO
0600: 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20 31 20  M t1 ORDER BY 1 
0610: 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73 65 3b 0a  COLLATE nocase;.
0620: 2a 2a 0a 2a 2a 20 53 68 6f 75 6c 64 20 62 65 20  **.** Should be 
0630: 74 72 61 6e 73 66 6f 72 6d 65 64 20 69 6e 74 6f  transformed into
0640: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 53 45 4c 45  :.**.**     SELE
0650: 43 54 20 61 2b 62 2c 20 63 2b 64 20 46 52 4f 4d  CT a+b, c+d FROM
0660: 20 74 31 20 4f 52 44 45 52 20 42 59 20 28 61 2b   t1 ORDER BY (a+
0670: 62 29 20 43 4f 4c 4c 41 54 45 20 6e 6f 63 61 73  b) COLLATE nocas
0680: 65 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e 53 75  e;.**.** The nSu
0690: 62 71 75 65 72 79 20 70 61 72 61 6d 65 74 65 72  bquery parameter
06a0: 20 73 70 65 63 69 66 69 65 73 20 68 6f 77 20 6d   specifies how m
06b0: 61 6e 79 20 6c 65 76 65 6c 73 20 6f 66 20 73 75  any levels of su
06c0: 62 71 75 65 72 79 20 74 68 65 0a 2a 2a 20 61 6c  bquery the.** al
06d0: 69 61 73 20 69 73 20 72 65 6d 6f 76 65 64 20 66  ias is removed f
06e0: 72 6f 6d 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  rom the original
06f0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68   expression.  Th
0700: 65 20 75 73 75 61 6c 20 76 61 6c 75 65 20 69 73  e usual value is
0710: 0a 2a 2a 20 7a 65 72 6f 20 62 75 74 20 69 74 20  .** zero but it 
0720: 6d 69 67 68 74 20 62 65 20 6d 6f 72 65 20 69 66  might be more if
0730: 20 74 68 65 20 61 6c 69 61 73 20 69 73 20 63 6f   the alias is co
0740: 6e 74 61 69 6e 65 64 20 77 69 74 68 69 6e 20 61  ntained within a
0750: 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 6f 66 20   subquery.** of 
0760: 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 65 78 70  the original exp
0770: 72 65 73 73 69 6f 6e 2e 20 20 54 68 65 20 45 78  ression.  The Ex
0780: 70 72 2e 6f 70 32 20 66 69 65 6c 64 20 6f 66 20  pr.op2 field of 
0790: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 0a  TK_AGG_FUNCTION.
07a0: 2a 2a 20 73 74 72 75 63 74 75 72 65 73 20 6d 75  ** structures mu
07b0: 73 74 20 62 65 20 69 6e 63 72 65 61 73 65 64 20  st be increased 
07c0: 62 79 20 74 68 65 20 6e 53 75 62 71 75 65 72 79  by the nSubquery
07d0: 20 61 6d 6f 75 6e 74 2e 0a 2a 2f 0a 73 74 61 74   amount..*/.stat
07e0: 69 63 20 76 6f 69 64 20 72 65 73 6f 6c 76 65 41  ic void resolveA
07f0: 6c 69 61 73 28 0a 20 20 50 61 72 73 65 20 2a 70  lias(.  Parse *p
0800: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f  Parse,         /
0810: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
0820: 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  t */.  ExprList 
0830: 2a 70 45 4c 69 73 74 2c 20 20 20 20 20 20 2f 2a  *pEList,      /*
0840: 20 41 20 72 65 73 75 6c 74 20 73 65 74 20 2a 2f   A result set */
0850: 0a 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20  .  int iCol,    
0860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 20 63            /* A c
0870: 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65 73  olumn in the res
0880: 75 6c 74 20 73 65 74 2e 20 20 30 2e 2e 70 45 4c  ult set.  0..pEL
0890: 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 2a 2f 0a  ist->nExpr-1 */.
08a0: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
08b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 61 6e           /* Tran
08c0: 73 66 6f 72 6d 20 74 68 69 73 20 69 6e 74 6f 20  sform this into 
08d0: 61 6e 20 61 6c 69 61 73 20 74 6f 20 74 68 65 20  an alias to the 
08e0: 72 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20  result set */.  
08f0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70  const char *zTyp
0900: 65 2c 20 20 20 20 20 2f 2a 20 22 47 52 4f 55 50  e,     /* "GROUP
0910: 22 20 6f 72 20 22 4f 52 44 45 52 22 20 6f 72 20  " or "ORDER" or 
0920: 22 22 20 2a 2f 0a 20 20 69 6e 74 20 6e 53 75 62  "" */.  int nSub
0930: 71 75 65 72 79 20 20 20 20 20 20 20 20 20 20 2f  query          /
0940: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 73 75 62 71  * Number of subq
0950: 75 65 72 69 65 73 20 74 68 61 74 20 74 68 65 20  ueries that the 
0960: 6c 61 62 65 6c 20 69 73 20 6d 6f 76 69 6e 67 20  label is moving 
0970: 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70 4f  */.){.  Expr *pO
0980: 72 69 67 3b 20 20 20 20 20 20 20 20 20 20 20 2f  rig;           /
0990: 2a 20 54 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f  * The iCol-th co
09a0: 6c 75 6d 6e 20 6f 66 20 74 68 65 20 72 65 73 75  lumn of the resu
09b0: 6c 74 20 73 65 74 20 2a 2f 0a 20 20 45 78 70 72  lt set */.  Expr
09c0: 20 2a 70 44 75 70 3b 20 20 20 20 20 20 20 20 20   *pDup;         
09d0: 20 20 20 2f 2a 20 43 6f 70 79 20 6f 66 20 70 4f     /* Copy of pO
09e0: 72 69 67 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  rig */.  sqlite3
09f0: 20 2a 64 62 3b 20 20 20 20 20 20 20 20 20 20 20   *db;           
0a00: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
0a10: 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 0a 20  connection */.. 
0a20: 20 61 73 73 65 72 74 28 20 69 43 6f 6c 3e 3d 30   assert( iCol>=0
0a30: 20 26 26 20 69 43 6f 6c 3c 70 45 4c 69 73 74 2d   && iCol<pEList-
0a40: 3e 6e 45 78 70 72 20 29 3b 0a 20 20 70 4f 72 69  >nExpr );.  pOri
0a50: 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 69 43  g = pEList->a[iC
0a60: 6f 6c 5d 2e 70 45 78 70 72 3b 0a 20 20 61 73 73  ol].pExpr;.  ass
0a70: 65 72 74 28 20 70 4f 72 69 67 21 3d 30 20 29 3b  ert( pOrig!=0 );
0a80: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
0a90: 64 62 3b 0a 20 20 70 44 75 70 20 3d 20 73 71 6c  db;.  pDup = sql
0aa0: 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20  ite3ExprDup(db, 
0ab0: 70 4f 72 69 67 2c 20 30 29 3b 0a 20 20 69 66 28  pOrig, 0);.  if(
0ac0: 20 70 44 75 70 21 3d 30 20 29 7b 0a 20 20 20 20   pDup!=0 ){.    
0ad0: 69 66 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47  if( zType[0]!='G
0ae0: 27 20 29 20 69 6e 63 72 41 67 67 46 75 6e 63 74  ' ) incrAggFunct
0af0: 69 6f 6e 44 65 70 74 68 28 70 44 75 70 2c 20 6e  ionDepth(pDup, n
0b00: 53 75 62 71 75 65 72 79 29 3b 0a 20 20 20 20 69  Subquery);.    i
0b10: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
0b20: 5f 43 4f 4c 4c 41 54 45 20 29 7b 0a 20 20 20 20  _COLLATE ){.    
0b30: 20 20 70 44 75 70 20 3d 20 73 71 6c 69 74 65 33    pDup = sqlite3
0b40: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 53 74  ExprAddCollateSt
0b50: 72 69 6e 67 28 70 50 61 72 73 65 2c 20 70 44 75  ring(pParse, pDu
0b60: 70 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  p, pExpr->u.zTok
0b70: 65 6e 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  en);.    }..    
0b80: 2f 2a 20 42 65 66 6f 72 65 20 63 61 6c 6c 69 6e  /* Before callin
0b90: 67 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  g sqlite3ExprDel
0ba0: 65 74 65 28 29 2c 20 73 65 74 20 74 68 65 20 45  ete(), set the E
0bb0: 50 5f 53 74 61 74 69 63 20 66 6c 61 67 2e 20 54  P_Static flag. T
0bc0: 68 69 73 20 0a 20 20 20 20 2a 2a 20 70 72 65 76  his .    ** prev
0bd0: 65 6e 74 73 20 45 78 70 72 44 65 6c 65 74 65 28  ents ExprDelete(
0be0: 29 20 66 72 6f 6d 20 64 65 6c 65 74 69 6e 67 20  ) from deleting 
0bf0: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
0c00: 72 65 20 69 74 73 65 6c 66 2c 0a 20 20 20 20 2a  re itself,.    *
0c10: 2a 20 61 6c 6c 6f 77 69 6e 67 20 69 74 20 74 6f  * allowing it to
0c20: 20 62 65 20 72 65 70 6f 70 75 6c 61 74 65 64 20   be repopulated 
0c30: 62 79 20 74 68 65 20 6d 65 6d 63 70 79 28 29 20  by the memcpy() 
0c40: 6f 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  on the following
0c50: 20 6c 69 6e 65 2e 0a 20 20 20 20 2a 2a 20 54 68   line..    ** Th
0c60: 65 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  e pExpr->u.zToke
0c70: 6e 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 69 6e  n might point in
0c80: 74 6f 20 6d 65 6d 6f 72 79 20 74 68 61 74 20 77  to memory that w
0c90: 69 6c 6c 20 62 65 20 66 72 65 65 64 20 62 79 20  ill be freed by 
0ca0: 74 68 65 0a 20 20 20 20 2a 2a 20 73 71 6c 69 74  the.    ** sqlit
0cb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44 75  e3DbFree(db, pDu
0cc0: 70 29 20 6f 6e 20 74 68 65 20 6c 61 73 74 20 6c  p) on the last l
0cd0: 69 6e 65 20 6f 66 20 74 68 69 73 20 62 6c 6f 63  ine of this bloc
0ce0: 6b 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  k, so be sure to
0cf0: 0a 20 20 20 20 2a 2a 20 6d 61 6b 65 20 61 20 63  .    ** make a c
0d00: 6f 70 79 20 6f 66 20 74 68 65 20 74 6f 6b 65 6e  opy of the token
0d10: 20 62 65 66 6f 72 65 20 64 6f 69 6e 67 20 74 68   before doing th
0d20: 65 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  e sqlite3DbFree(
0d30: 29 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 45 78  )..    */.    Ex
0d40: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
0d50: 78 70 72 2c 20 45 50 5f 53 74 61 74 69 63 29 3b  xpr, EP_Static);
0d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
0d70: 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72  Delete(db, pExpr
0d80: 29 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 45  );.    memcpy(pE
0d90: 78 70 72 2c 20 70 44 75 70 2c 20 73 69 7a 65 6f  xpr, pDup, sizeo
0da0: 66 28 2a 70 45 78 70 72 29 29 3b 0a 20 20 20 20  f(*pExpr));.    
0db0: 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  if( !ExprHasProp
0dc0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
0dd0: 6e 74 56 61 6c 75 65 29 20 26 26 20 70 45 78 70  ntValue) && pExp
0de0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 21 3d 30 20 29  r->u.zToken!=0 )
0df0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
0e00: 28 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26 20  (pExpr->flags & 
0e10: 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54  (EP_Reduced|EP_T
0e20: 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d 30 20 29 3b  okenOnly))==0 );
0e30: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e  .      pExpr->u.
0e40: 7a 54 6f 6b 65 6e 20 3d 20 73 71 6c 69 74 65 33  zToken = sqlite3
0e50: 44 62 53 74 72 44 75 70 28 64 62 2c 20 70 45 78  DbStrDup(db, pEx
0e60: 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20  pr->u.zToken);. 
0e70: 20 20 20 20 20 70 45 78 70 72 2d 3e 66 6c 61 67       pExpr->flag
0e80: 73 20 7c 3d 20 45 50 5f 4d 65 6d 54 6f 6b 65 6e  s |= EP_MemToken
0e90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
0ea0: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 44  te3DbFree(db, pD
0eb0: 75 70 29 3b 0a 20 20 7d 0a 20 20 45 78 70 72 53  up);.  }.  ExprS
0ec0: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
0ed0: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 7d 0a 0a  , EP_Alias);.}..
0ee0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
0ef0: 55 45 20 69 66 20 74 68 65 20 6e 61 6d 65 20 7a  UE if the name z
0f00: 43 6f 6c 20 6f 63 63 75 72 73 20 61 6e 79 77 68  Col occurs anywh
0f10: 65 72 65 20 69 6e 20 74 68 65 20 55 53 49 4e 47  ere in the USING
0f20: 20 63 6c 61 75 73 65 2e 0a 2a 2a 0a 2a 2a 20 52   clause..**.** R
0f30: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
0f40: 68 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 20  he USING clause 
0f50: 69 73 20 4e 55 4c 4c 20 6f 72 20 69 66 20 69 74  is NULL or if it
0f60: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
0f70: 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a 2a 2f 0a 73 74  n.** zCol..*/.st
0f80: 61 74 69 63 20 69 6e 74 20 6e 61 6d 65 49 6e 55  atic int nameInU
0f90: 73 69 6e 67 43 6c 61 75 73 65 28 49 64 4c 69 73  singClause(IdLis
0fa0: 74 20 2a 70 55 73 69 6e 67 2c 20 63 6f 6e 73 74  t *pUsing, const
0fb0: 20 63 68 61 72 20 2a 7a 43 6f 6c 29 7b 0a 20 20   char *zCol){.  
0fc0: 69 66 28 20 70 55 73 69 6e 67 20 29 7b 0a 20 20  if( pUsing ){.  
0fd0: 20 20 69 6e 74 20 6b 3b 0a 20 20 20 20 66 6f 72    int k;.    for
0fe0: 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e 67 2d 3e  (k=0; k<pUsing->
0ff0: 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20 20 20 20  nId; k++){.     
1000: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
1010: 43 6d 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d  Cmp(pUsing->a[k]
1020: 2e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  .zName, zCol)==0
1030: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
1040: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
1050: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 75 62 71  0;.}../*.** Subq
1060: 75 65 72 69 65 73 20 73 74 6f 72 65 73 20 74 68  ueries stores th
1070: 65 20 6f 72 69 67 69 6e 61 6c 20 64 61 74 61 62  e original datab
1080: 61 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63  ase, table and c
1090: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 66 6f 72 20  olumn names for 
10a0: 74 68 65 69 72 0a 2a 2a 20 72 65 73 75 6c 74 20  their.** result 
10b0: 73 65 74 73 20 69 6e 20 45 78 70 72 4c 69 73 74  sets in ExprList
10c0: 2e 61 5b 5d 2e 7a 53 70 61 6e 2c 20 69 6e 20 74  .a[].zSpan, in t
10d0: 68 65 20 66 6f 72 6d 20 22 44 41 54 41 42 41 53  he form "DATABAS
10e0: 45 2e 54 41 42 4c 45 2e 43 4f 4c 55 4d 4e 22 2e  E.TABLE.COLUMN".
10f0: 0a 2a 2a 20 43 68 65 63 6b 20 74 6f 20 73 65 65  .** Check to see
1100: 20 69 66 20 74 68 65 20 7a 53 70 61 6e 20 67 69   if the zSpan gi
1110: 76 65 6e 20 74 6f 20 74 68 69 73 20 72 6f 75 74  ven to this rout
1120: 69 6e 65 20 6d 61 74 63 68 65 73 20 74 68 65 20  ine matches the 
1130: 7a 44 62 2c 20 7a 54 61 62 2c 0a 2a 2a 20 61 6e  zDb, zTab,.** an
1140: 64 20 7a 43 6f 6c 2e 20 20 49 66 20 61 6e 79 20  d zCol.  If any 
1150: 6f 66 20 7a 44 62 2c 20 7a 54 61 62 2c 20 61 6e  of zDb, zTab, an
1160: 64 20 7a 43 6f 6c 20 61 72 65 20 4e 55 4c 4c 20  d zCol are NULL 
1170: 74 68 65 6e 20 74 68 6f 73 65 20 66 69 65 6c 64  then those field
1180: 73 20 77 69 6c 6c 0a 2a 2a 20 6d 61 74 63 68 20  s will.** match 
1190: 61 6e 79 74 68 69 6e 67 2e 0a 2a 2f 0a 69 6e 74  anything..*/.int
11a0: 20 73 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61   sqlite3MatchSpa
11b0: 6e 4e 61 6d 65 28 0a 20 20 63 6f 6e 73 74 20 63  nName(.  const c
11c0: 68 61 72 20 2a 7a 53 70 61 6e 2c 0a 20 20 63 6f  har *zSpan,.  co
11d0: 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 0a  nst char *zCol,.
11e0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
11f0: 61 62 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72  ab,.  const char
1200: 20 2a 7a 44 62 0a 29 7b 0a 20 20 69 6e 74 20 6e   *zDb.){.  int n
1210: 3b 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57  ;.  for(n=0; ALW
1220: 41 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26  AYS(zSpan[n]) &&
1230: 20 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20   zSpan[n]!='.'; 
1240: 6e 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 44 62  n++){}.  if( zDb
1250: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 4e   && (sqlite3StrN
1260: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 44 62 2c  ICmp(zSpan, zDb,
1270: 20 6e 29 21 3d 30 20 7c 7c 20 7a 44 62 5b 6e 5d   n)!=0 || zDb[n]
1280: 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1290: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61  rn 0;.  }.  zSpa
12a0: 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 66 6f 72 28  n += n+1;.  for(
12b0: 6e 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70 61  n=0; ALWAYS(zSpa
12c0: 6e 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e  n[n]) && zSpan[n
12d0: 5d 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20  ]!='.'; n++){}. 
12e0: 20 69 66 28 20 7a 54 61 62 20 26 26 20 28 73 71   if( zTab && (sq
12f0: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53  lite3StrNICmp(zS
1300: 70 61 6e 2c 20 7a 54 61 62 2c 20 6e 29 21 3d 30  pan, zTab, n)!=0
1310: 20 7c 7c 20 7a 54 61 62 5b 6e 5d 21 3d 30 29 20   || zTab[n]!=0) 
1320: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1330: 0a 20 20 7d 0a 20 20 7a 53 70 61 6e 20 2b 3d 20  .  }.  zSpan += 
1340: 6e 2b 31 3b 0a 20 20 69 66 28 20 7a 43 6f 6c 20  n+1;.  if( zCol 
1350: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
1360: 70 28 7a 53 70 61 6e 2c 20 7a 43 6f 6c 29 21 3d  p(zSpan, zCol)!=
1370: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
1380: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
1390: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65  1;.}../*.** Give
13a0: 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  n the name of a 
13b0: 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f  column of the fo
13c0: 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  rm X.Y.Z or Y.Z 
13d0: 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20  or just Z, look 
13e0: 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20  up.** that name 
13f0: 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f  in the set of so
1400: 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70  urce tables in p
1410: 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65  SrcList and make
1420: 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65   the pExpr .** e
1430: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72  xpression node r
1440: 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61  efer back to tha
1450: 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e  t source column.
1460: 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20    The following 
1470: 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d  changes.** are m
1480: 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a  ade to pExpr:.**
1490: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .**    pExpr->iD
14a0: 62 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20  b           Set 
14b0: 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d  the index in db-
14c0: 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61  >aDb[] of the da
14d0: 74 61 62 61 73 65 20 58 0a 2a 2a 20 20 20 20 20  tabase X.**     
14e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
14f0: 20 20 20 20 28 65 76 65 6e 20 69 66 20 58 20 69      (even if X i
1500: 73 20 69 6d 70 6c 69 65 64 29 2e 0a 2a 2a 20 20  s implied)..**  
1510: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
1520: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
1530: 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  e cursor number 
1540: 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62  for the table ob
1550: 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20  tained.**       
1560: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1570: 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e    from pSrcList.
1580: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 79 2e  .**    pExpr->y.
1590: 70 54 61 62 20 20 20 20 20 20 20 20 50 6f 69 6e  pTab        Poin
15a0: 74 73 20 74 6f 20 74 68 65 20 54 61 62 6c 65 20  ts to the Table 
15b0: 73 74 72 75 63 74 75 72 65 20 6f 66 20 58 2e 59  structure of X.Y
15c0: 20 28 65 76 65 6e 20 69 66 0a 2a 2a 20 20 20 20   (even if.**    
15d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15e0: 20 20 20 20 20 58 20 61 6e 64 2f 6f 72 20 59 20       X and/or Y 
15f0: 61 72 65 20 69 6d 70 6c 69 65 64 2e 29 0a 2a 2a  are implied.).**
1600: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
1610: 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  mn       Set to 
1620: 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65  the column numbe
1630: 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62  r within the tab
1640: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
1650: 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20 53  >op            S
1660: 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  et to TK_COLUMN.
1670: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c  .**    pExpr->pL
1680: 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79 20  eft         Any 
1690: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20  expression this 
16a0: 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c  points to is del
16b0: 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72  eted.**    pExpr
16c0: 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20 20  ->pRight        
16d0: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
16e0: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
16f0: 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20   deleted..**.** 
1700: 54 68 65 20 7a 44 62 20 76 61 72 69 61 62 6c 65  The zDb variable
1710: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
1720: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
1730: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
1740: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
1750: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
1760: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
1770: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
1780: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
1790: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
17a0: 75 73 65 64 2e 20 20 54 68 65 20 7a 54 61 62 6c  used.  The zTabl
17b0: 65 20 76 61 72 69 61 62 6c 65 20 69 73 20 74 68  e variable is th
17c0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  e name of the ta
17d0: 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20 20  ble (the "Y").  
17e0: 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61  This.** value ca
17f0: 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 7a 44 62  n be NULL if zDb
1800: 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20   is also NULL.  
1810: 49 66 20 7a 54 61 62 6c 65 20 69 73 20 4e 55 4c  If zTable is NUL
1820: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
1830: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
1840: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
1850: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
1860: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
1870: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
1880: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
1890: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
18a0: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
18b0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
18c0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
18d0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
18e0: 57 52 43 5f 41 62 6f 72 74 2e 20 20 52 65 74 75  WRC_Abort.  Retu
18f0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 20 6f 6e 20  rn WRC_Prune on 
1900: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
1910: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
1920: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1930: 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  se,       /* The
1940: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
1950: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
1960: 20 2a 7a 44 62 2c 20 20 20 20 20 2f 2a 20 4e 61   *zDb,     /* Na
1970: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
1980: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
1990: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
19a0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
19b0: 61 62 2c 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ab,    /* Name o
19c0: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
19d0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
19e0: 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  LL */.  const ch
19f0: 61 72 20 2a 7a 43 6f 6c 2c 20 20 20 20 2f 2a 20  ar *zCol,    /* 
1a00: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
1a10: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
1a20: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
1a30: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
1a40: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
1a50: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
1a60: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
1a70: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
1a80: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
1a90: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
1aa0: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
1ab0: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
1ac0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1ad0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1ae0: 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  ers */.  int cnt
1af0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1b00: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
1b10: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
1b20: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
1b30: 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20  .  int cntTab = 
1b40: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  0;              
1b50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
1b60: 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65  f matching table
1b70: 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20   names */.  int 
1b80: 6e 53 75 62 71 75 65 72 79 20 3d 20 30 3b 20 20  nSubquery = 0;  
1b90: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1ba0: 20 48 6f 77 20 6d 61 6e 79 20 6c 65 76 65 6c 73   How many levels
1bb0: 20 6f 66 20 73 75 62 71 75 65 72 79 20 2a 2f 0a   of subquery */.
1bc0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
1bd0: 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 20 20 20  pParse->db;     
1be0: 20 20 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62      /* The datab
1bf0: 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a  ase connection *
1c00: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
1c10: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
1c20: 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72        /* Use for
1c30: 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53   looping over pS
1c40: 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a  rcList items */.
1c50: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
1c60: 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20  _item *pMatch = 
1c70: 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68  0;  /* The match
1c80: 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65  ing pSrcList ite
1c90: 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  m */.  NameConte
1ca0: 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43  xt *pTopNC = pNC
1cb0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73  ;        /* Firs
1cc0: 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e  t namecontext in
1cd0: 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 20 20 53   the list */.  S
1ce0: 63 68 65 6d 61 20 2a 70 53 63 68 65 6d 61 20 3d  chema *pSchema =
1cf0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1d00: 20 2f 2a 20 53 63 68 65 6d 61 20 6f 66 20 74 68   /* Schema of th
1d10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a  e expression */.
1d20: 20 20 69 6e 74 20 65 4e 65 77 45 78 70 72 4f 70    int eNewExprOp
1d30: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 20 20 20   = TK_COLUMN;   
1d40: 20 20 20 20 2f 2a 20 4e 65 77 20 76 61 6c 75 65      /* New value
1d50: 20 66 6f 72 20 70 45 78 70 72 2d 3e 6f 70 20 6f   for pExpr->op o
1d60: 6e 20 73 75 63 63 65 73 73 20 2a 2f 0a 20 20 54  n success */.  T
1d70: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 20  able *pTab = 0; 
1d80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1d90: 20 2f 2a 20 54 61 62 6c 65 20 68 6f 6c 64 20 74   /* Table hold t
1da0: 68 65 20 72 6f 77 20 2a 2f 0a 20 20 43 6f 6c 75  he row */.  Colu
1db0: 6d 6e 20 2a 70 43 6f 6c 3b 20 20 20 20 20 20 20  mn *pCol;       
1dc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
1dd0: 20 41 20 63 6f 6c 75 6d 6e 20 6f 66 20 70 54 61   A column of pTa
1de0: 62 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  b */..  assert( 
1df0: 70 4e 43 20 29 3b 20 20 20 20 20 2f 2a 20 74 68  pNC );     /* th
1e00: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 63  e name context c
1e10: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 2a  annot be NULL. *
1e20: 2f 0a 20 20 61 73 73 65 72 74 28 20 7a 43 6f 6c  /.  assert( zCol
1e30: 20 29 3b 20 20 20 20 2f 2a 20 54 68 65 20 5a 20   );    /* The Z 
1e40: 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20  in X.Y.Z cannot 
1e50: 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 61 73 73  be NULL */.  ass
1e60: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
1e70: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
1e80: 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64  TokenOnly|EP_Red
1e90: 75 63 65 64 29 20 29 3b 0a 0a 20 20 2f 2a 20 49  uced) );..  /* I
1ea0: 6e 69 74 69 61 6c 69 7a 65 20 74 68 65 20 6e 6f  nitialize the no
1eb0: 64 65 20 74 6f 20 6e 6f 2d 6d 61 74 63 68 20 2a  de to no-match *
1ec0: 2f 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  /.  pExpr->iTabl
1ed0: 65 20 3d 20 2d 31 3b 0a 20 20 45 78 70 72 53 65  e = -1;.  ExprSe
1ee0: 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45 78  tVVAProperty(pEx
1ef0: 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65 29  pr, EP_NoReduce)
1f00: 3b 0a 0a 20 20 2f 2a 20 54 72 61 6e 73 6c 61 74  ;..  /* Translat
1f10: 65 20 74 68 65 20 73 63 68 65 6d 61 20 6e 61 6d  e the schema nam
1f20: 65 20 69 6e 20 7a 44 62 20 69 6e 74 6f 20 61 20  e in zDb into a 
1f30: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 63  pointer to the c
1f40: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 20 20 2a  orresponding.  *
1f50: 2a 20 73 63 68 65 6d 61 2e 20 20 49 66 20 6e 6f  * schema.  If no
1f60: 74 20 66 6f 75 6e 64 2c 20 70 53 63 68 65 6d 61  t found, pSchema
1f70: 20 77 69 6c 6c 20 72 65 6d 61 69 6e 20 4e 55 4c   will remain NUL
1f80: 4c 20 61 6e 64 20 6e 6f 74 68 69 6e 67 20 77 69  L and nothing wi
1f90: 6c 6c 20 6d 61 74 63 68 0a 20 20 2a 2a 20 72 65  ll match.  ** re
1fa0: 73 75 6c 74 69 6e 67 20 69 6e 20 61 6e 20 61 70  sulting in an ap
1fb0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
1fc0: 6d 65 73 73 61 67 65 20 74 6f 77 61 72 64 20 74  message toward t
1fd0: 68 65 20 65 6e 64 20 6f 66 20 74 68 69 73 20 72  he end of this r
1fe0: 6f 75 74 69 6e 65 0a 20 20 2a 2f 0a 20 20 69 66  outine.  */.  if
1ff0: 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 74 65 73  ( zDb ){.    tes
2000: 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63 46 6c  tcase( pNC->ncFl
2010: 61 67 73 20 26 20 4e 43 5f 50 61 72 74 49 64 78  ags & NC_PartIdx
2020: 20 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65   );.    testcase
2030: 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  ( pNC->ncFlags &
2040: 20 4e 43 5f 49 73 43 68 65 63 6b 20 29 3b 0a 20   NC_IsCheck );. 
2050: 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46     if( (pNC->ncF
2060: 6c 61 67 73 20 26 20 28 4e 43 5f 50 61 72 74 49  lags & (NC_PartI
2070: 64 78 7c 4e 43 5f 49 73 43 68 65 63 6b 29 29 21  dx|NC_IsCheck))!
2080: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 53  =0 ){.      /* S
2090: 69 6c 65 6e 74 6c 79 20 69 67 6e 6f 72 65 20 64  ilently ignore d
20a0: 61 74 61 62 61 73 65 20 71 75 61 6c 69 66 69 65  atabase qualifie
20b0: 72 73 20 69 6e 73 69 64 65 20 43 48 45 43 4b 20  rs inside CHECK 
20c0: 63 6f 6e 73 74 72 61 69 6e 74 73 20 61 6e 64 0a  constraints and.
20d0: 20 20 20 20 20 20 2a 2a 20 70 61 72 74 69 61 6c        ** partial
20e0: 20 69 6e 64 69 63 65 73 2e 20 20 44 6f 20 6e 6f   indices.  Do no
20f0: 74 20 72 61 69 73 65 20 65 72 72 6f 72 73 20 62  t raise errors b
2100: 65 63 61 75 73 65 20 74 68 61 74 20 6d 69 67 68  ecause that migh
2110: 74 20 62 72 65 61 6b 0a 20 20 20 20 20 20 2a 2a  t break.      **
2120: 20 6c 65 67 61 63 79 20 61 6e 64 20 62 65 63 61   legacy and beca
2130: 75 73 65 20 69 74 20 64 6f 65 73 20 6e 6f 74 20  use it does not 
2140: 68 75 72 74 20 61 6e 79 74 68 69 6e 67 20 74 6f  hurt anything to
2150: 20 6a 75 73 74 20 69 67 6e 6f 72 65 20 74 68 65   just ignore the
2160: 0a 20 20 20 20 20 20 2a 2a 20 64 61 74 61 62 61  .      ** databa
2170: 73 65 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  se name. */.    
2180: 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 7d    zDb = 0;.    }
2190: 65 6c 73 65 7b 0a 20 20 20 20 20 20 66 6f 72 28  else{.      for(
21a0: 69 3d 30 3b 20 69 3c 64 62 2d 3e 6e 44 62 3b 20  i=0; i<db->nDb; 
21b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 61 73  i++){.        as
21c0: 73 65 72 74 28 20 64 62 2d 3e 61 44 62 5b 69 5d  sert( db->aDb[i]
21d0: 2e 7a 44 62 53 4e 61 6d 65 20 29 3b 0a 20 20 20  .zDbSName );.   
21e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
21f0: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
2200: 69 5d 2e 7a 44 62 53 4e 61 6d 65 2c 7a 44 62 29  i].zDbSName,zDb)
2210: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
2220: 20 70 53 63 68 65 6d 61 20 3d 20 64 62 2d 3e 61   pSchema = db->a
2230: 44 62 5b 69 5d 2e 70 53 63 68 65 6d 61 3b 0a 20  Db[i].pSchema;. 
2240: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2250: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2260: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  }.    }.  }..  /
2270: 2a 20 53 74 61 72 74 20 61 74 20 74 68 65 20 69  * Start at the i
2280: 6e 6e 65 72 2d 6d 6f 73 74 20 63 6f 6e 74 65 78  nner-most contex
2290: 74 20 61 6e 64 20 6d 6f 76 65 20 6f 75 74 77 61  t and move outwa
22a0: 72 64 20 75 6e 74 69 6c 20 61 20 6d 61 74 63 68  rd until a match
22b0: 20 69 73 20 66 6f 75 6e 64 20 2a 2f 0a 20 20 61   is found */.  a
22c0: 73 73 65 72 74 28 20 70 4e 43 20 26 26 20 63 6e  ssert( pNC && cn
22d0: 74 3d 3d 30 20 29 3b 0a 20 20 64 6f 7b 0a 20 20  t==0 );.  do{.  
22e0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
22f0: 73 74 3b 0a 20 20 20 20 53 72 63 4c 69 73 74 20  st;.    SrcList 
2300: 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d  *pSrcList = pNC-
2310: 3e 70 53 72 63 4c 69 73 74 3b 0a 0a 20 20 20 20  >pSrcList;..    
2320: 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a  if( pSrcList ){.
2330: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
2340: 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  Item=pSrcList->a
2350: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
2360: 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
2370: 29 7b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  ){.        pTab 
2380: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
2390: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
23a0: 54 61 62 21 3d 30 20 26 26 20 70 54 61 62 2d 3e  Tab!=0 && pTab->
23b0: 7a 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  zName!=0 );.    
23c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
23d0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
23e0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70      if( pItem->p
23f0: 53 65 6c 65 63 74 20 26 26 20 28 70 49 74 65 6d  Select && (pItem
2400: 2d 3e 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c  ->pSelect->selFl
2410: 61 67 73 20 26 20 53 46 5f 4e 65 73 74 65 64 46  ags & SF_NestedF
2420: 72 6f 6d 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  rom)!=0 ){.     
2430: 20 20 20 20 20 69 6e 74 20 68 69 74 20 3d 20 30       int hit = 0
2440: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 4c 69  ;.          pELi
2450: 73 74 20 3d 20 70 49 74 65 6d 2d 3e 70 53 65 6c  st = pItem->pSel
2460: 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20  ect->pEList;.   
2470: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
2480: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
2490: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   j++){.         
24a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 4d 61     if( sqlite3Ma
24b0: 74 63 68 53 70 61 6e 4e 61 6d 65 28 70 45 4c 69  tchSpanName(pELi
24c0: 73 74 2d 3e 61 5b 6a 5d 2e 7a 53 70 61 6e 2c 20  st->a[j].zSpan, 
24d0: 7a 43 6f 6c 2c 20 7a 54 61 62 2c 20 7a 44 62 29  zCol, zTab, zDb)
24e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
24f0: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
2500: 20 20 20 20 20 20 20 63 6e 74 54 61 62 20 3d 20         cntTab = 
2510: 32 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  2;.             
2520: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
2530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
2540: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
2550: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  j;.             
2560: 20 68 69 74 20 3d 20 31 3b 0a 20 20 20 20 20 20   hit = 1;.      
2570: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2580: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
2590: 28 20 68 69 74 20 7c 7c 20 7a 54 61 62 3d 3d 30  ( hit || zTab==0
25a0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
25b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
25c0: 66 28 20 7a 44 62 20 26 26 20 70 54 61 62 2d 3e  f( zDb && pTab->
25d0: 70 53 63 68 65 6d 61 21 3d 70 53 63 68 65 6d 61  pSchema!=pSchema
25e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
25f0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
2600: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54  }.        if( zT
2610: 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ab ){.          
2620: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62  const char *zTab
2630: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
2640: 6c 69 61 73 20 3f 20 70 49 74 65 6d 2d 3e 7a 41  lias ? pItem->zA
2650: 6c 69 61 73 20 3a 20 70 54 61 62 2d 3e 7a 4e 61  lias : pTab->zNa
2660: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  me;.          as
2670: 73 65 72 74 28 20 7a 54 61 62 4e 61 6d 65 21 3d  sert( zTabName!=
2680: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  0 );.          i
2690: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
26a0: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
26b0: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )!=0 ){.        
26c0: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
26d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
26e0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
26f0: 45 5f 4f 42 4a 45 43 54 20 26 26 20 70 49 74 65  E_OBJECT && pIte
2700: 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20  m->zAlias ){.   
2710: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
2720: 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70  RenameTokenRemap
2730: 28 70 50 61 72 73 65 2c 20 30 2c 20 28 76 6f 69  (pParse, 0, (voi
2740: 64 2a 29 26 70 45 78 70 72 2d 3e 79 2e 70 54 61  d*)&pExpr->y.pTa
2750: 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  b);.          }.
2760: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2770: 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62    if( 0==(cntTab
2780: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
2790: 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b   pMatch = pItem;
27a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
27b0: 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c     for(j=0, pCol
27c0: 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70  =pTab->aCol; j<p
27d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20  Tab->nCol; j++, 
27e0: 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20  pCol++){.       
27f0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
2800: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
2810: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
2820: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 66             /* If
2830: 20 74 68 65 72 65 20 68 61 73 20 62 65 65 6e 20   there has been 
2840: 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 72 69 6f  exactly one prio
2850: 72 20 6d 61 74 63 68 20 61 6e 64 20 74 68 69 73  r match and this
2860: 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20 20 20   match.         
2870: 20 20 20 2a 2a 20 69 73 20 66 6f 72 20 74 68 65     ** is for the
2880: 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61 62 6c   right-hand tabl
2890: 65 20 6f 66 20 61 20 4e 41 54 55 52 41 4c 20 4a  e of a NATURAL J
28a0: 4f 49 4e 20 6f 72 20 69 73 20 69 6e 20 61 20 0a  OIN or is in a .
28b0: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 55              ** U
28c0: 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74 68 65  SING clause, the
28d0: 6e 20 73 6b 69 70 20 74 68 69 73 20 6d 61 74 63  n skip this matc
28e0: 68 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  h..            *
28f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  /.            if
2900: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
2910: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
2920: 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65  tem->fg.jointype
2930: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 20   & JT_NATURAL ) 
2940: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
2950: 20 20 20 20 20 20 20 20 69 66 28 20 6e 61 6d 65          if( name
2960: 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28 70 49  InUsingClause(pI
2970: 74 65 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a 43 6f  tem->pUsing, zCo
2980: 6c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  l) ) continue;. 
2990: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
29a0: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
29b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74              pMat
29c0: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
29d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
29e0: 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20  itute the rowid 
29f0: 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20  (column -1) for 
2a00: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
2a10: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
2a20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
2a30: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
2a40: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 28 69  >iPKey ? -1 : (i
2a50: 31 36 29 6a 3b 0a 20 20 20 20 20 20 20 20 20 20  16)j;.          
2a60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
2a70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
2a80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
2a90: 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20 20 20   pMatch ){.     
2aa0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
2ab0: 20 3d 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73   = pMatch->iCurs
2ac0: 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  or;.        pExp
2ad0: 72 2d 3e 79 2e 70 54 61 62 20 3d 20 70 4d 61 74  r->y.pTab = pMat
2ae0: 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ch->pTab;.      
2af0: 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f 49 4e 20    /* RIGHT JOIN 
2b00: 6e 6f 74 20 28 79 65 74 29 20 73 75 70 70 6f 72  not (yet) suppor
2b10: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ted */.        a
2b20: 73 73 65 72 74 28 20 28 70 4d 61 74 63 68 2d 3e  ssert( (pMatch->
2b30: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2b40: 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b 0a 20 20  _RIGHT)==0 );.  
2b50: 20 20 20 20 20 20 69 66 28 20 28 70 4d 61 74 63        if( (pMatc
2b60: 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  h->fg.jointype &
2b70: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
2b80: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2b90: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
2ba0: 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a   EP_CanBeNull);.
2bb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2bc0: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 45 78 70    pSchema = pExp
2bd0: 72 2d 3e 79 2e 70 54 61 62 2d 3e 70 53 63 68 65  r->y.pTab->pSche
2be0: 6d 61 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ma;.      }.    
2bf0: 7d 20 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73  } /* if( pSrcLis
2c00: 74 20 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66  t ) */..#if !def
2c10: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
2c20: 5f 54 52 49 47 47 45 52 29 20 7c 7c 20 21 64 65  _TRIGGER) || !de
2c30: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
2c40: 54 5f 55 50 53 45 52 54 29 0a 20 20 20 20 2f 2a  T_UPSERT).    /*
2c50: 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20   If we have not 
2c60: 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64  already resolved
2c70: 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20   the name, then 
2c80: 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74  maybe .    ** it
2c90: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
2ca0: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
2cb0: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 2e  ument reference.
2cc0: 20 20 4f 72 0a 20 20 20 20 2a 2a 20 6d 61 79 62    Or.    ** mayb
2cd0: 65 20 69 74 20 69 73 20 61 6e 20 65 78 63 6c 75  e it is an exclu
2ce0: 64 65 64 2e 2a 20 66 72 6f 6d 20 61 6e 20 75 70  ded.* from an up
2cf0: 73 65 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  sert..    */.   
2d00: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
2d10: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 54 61 62  Tab!=0 && cntTab
2d20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61  ==0 ){.      pTa
2d30: 62 20 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53  b = 0;.#ifndef S
2d40: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
2d50: 45 52 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  ER.      if( pPa
2d60: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
2d70: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69  !=0 ){.        i
2d80: 6e 74 20 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e  nt op = pParse->
2d90: 65 54 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 20  eTriggerOp;.    
2da0: 20 20 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d      assert( op==
2db0: 54 4b 5f 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d  TK_DELETE || op=
2dc0: 3d 54 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70  =TK_UPDATE || op
2dd0: 3d 3d 54 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20  ==TK_INSERT );. 
2de0: 20 20 20 20 20 20 20 69 66 28 20 6f 70 21 3d 54         if( op!=T
2df0: 4b 5f 44 45 4c 45 54 45 20 26 26 20 73 71 6c 69  K_DELETE && sqli
2e00: 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22  te3StrICmp("new"
2e10: 2c 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20  ,zTab) == 0 ){. 
2e20: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
2e30: 69 54 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20  iTable = 1;.    
2e40: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 50 61        pTab = pPa
2e50: 72 73 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62  rse->pTriggerTab
2e60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20  ;.        }else 
2e70: 69 66 28 20 6f 70 21 3d 54 4b 5f 49 4e 53 45 52  if( op!=TK_INSER
2e80: 54 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  T && sqlite3StrI
2e90: 43 6d 70 28 22 6f 6c 64 22 2c 7a 54 61 62 29 3d  Cmp("old",zTab)=
2ea0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2eb0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2ec0: 30 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  0;.          pTa
2ed0: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
2ee0: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 20  ggerTab;.       
2ef0: 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69   }.      }.#endi
2f00: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
2f10: 5f 54 52 49 47 47 45 52 20 2a 2f 0a 23 69 66 6e  _TRIGGER */.#ifn
2f20: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
2f30: 55 50 53 45 52 54 0a 20 20 20 20 20 20 69 66 28  UPSERT.      if(
2f40: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
2f50: 20 4e 43 5f 55 55 70 73 65 72 74 29 21 3d 30 20   NC_UUpsert)!=0 
2f60: 29 7b 0a 20 20 20 20 20 20 20 20 55 70 73 65 72  ){.        Upser
2f70: 74 20 2a 70 55 70 73 65 72 74 20 3d 20 70 4e 43  t *pUpsert = pNC
2f80: 2d 3e 75 4e 43 2e 70 55 70 73 65 72 74 3b 0a 20  ->uNC.pUpsert;. 
2f90: 20 20 20 20 20 20 20 69 66 28 20 70 55 70 73 65         if( pUpse
2fa0: 72 74 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  rt && sqlite3Str
2fb0: 49 43 6d 70 28 22 65 78 63 6c 75 64 65 64 22 2c  ICmp("excluded",
2fc0: 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zTab)==0 ){.    
2fd0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 55 70        pTab = pUp
2fe0: 73 65 72 74 2d 3e 70 55 70 73 65 72 74 53 72 63  sert->pUpsertSrc
2ff0: 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20  ->a[0].pTab;.   
3000: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
3010: 61 62 6c 65 20 3d 20 32 3b 0a 20 20 20 20 20 20  able = 2;.      
3020: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64    }.      }.#end
3030: 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
3040: 54 5f 55 50 53 45 52 54 20 2a 2f 0a 0a 20 20 20  T_UPSERT */..   
3050: 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a     if( pTab ){ .
3060: 20 20 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c          int iCol
3070: 3b 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d  ;.        pSchem
3080: 61 20 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d  a = pTab->pSchem
3090: 61 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61  a;.        cntTa
30a0: 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  b++;.        for
30b0: 28 69 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d 70 54  (iCol=0, pCol=pT
30c0: 61 62 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c 3c 70  ab->aCol; iCol<p
30d0: 54 61 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b  Tab->nCol; iCol+
30e0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
30f0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3100: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
3110: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
3120: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  {.            if
3130: 28 20 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50  ( iCol==pTab->iP
3140: 4b 65 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Key ){.         
3150: 20 20 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a       iCol = -1;.
3160: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
3170: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
3180: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
31a0: 66 28 20 69 43 6f 6c 3e 3d 70 54 61 62 2d 3e 6e  f( iCol>=pTab->n
31b0: 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 49 73  Col && sqlite3Is
31c0: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 26 26 20 56  Rowid(zCol) && V
31d0: 69 73 69 62 6c 65 52 6f 77 69 64 28 70 54 61 62  isibleRowid(pTab
31e0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f  ) ){.          /
31f0: 2a 20 49 4d 50 3a 20 52 2d 35 31 34 31 34 2d 33  * IMP: R-51414-3
3200: 32 39 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20  2910 */.        
3210: 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20    iCol = -1;.   
3220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
3230: 66 28 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43  f( iCol<pTab->nC
3240: 6f 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ol ){.          
3250: 63 6e 74 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53  cnt++;.#ifndef S
3260: 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52  QLITE_OMIT_UPSER
3270: 54 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  T.          if( 
3280: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 32  pExpr->iTable==2
3290: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
32a0: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
32b0: 28 2d 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20  (-1) );.        
32c0: 20 20 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d      if( IN_RENAM
32d0: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20  E_OBJECT ){.    
32e0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
32f0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
3300: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
3310: 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d 20 70  Expr->y.pTab = p
3320: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
3330: 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20 3d 20     eNewExprOp = 
3340: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20  TK_COLUMN;.     
3350: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
3360: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
3370: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 4e 43 2d  r->iTable = pNC-
3380: 3e 75 4e 43 2e 70 55 70 73 65 72 74 2d 3e 72 65  >uNC.pUpsert->re
3390: 67 44 61 74 61 20 2b 20 69 43 6f 6c 3b 0a 20 20  gData + iCol;.  
33a0: 20 20 20 20 20 20 20 20 20 20 20 20 65 4e 65 77              eNew
33b0: 45 78 70 72 4f 70 20 3d 20 54 4b 5f 52 45 47 49  ExprOp = TK_REGI
33c0: 53 54 45 52 3b 0a 20 20 20 20 20 20 20 20 20 20  STER;.          
33d0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
33e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c  rty(pExpr, EP_Al
33f0: 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ias);.          
3400: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65    }.          }e
3410: 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51  lse.#endif /* SQ
3420: 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54  LITE_OMIT_UPSERT
3430: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 7b 0a   */.          {.
3440: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
3450: 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20  MIT_TRIGGER.    
3460: 20 20 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c          if( iCol
3470: 3c 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  <0 ){.          
3480: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
3490: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
34a0: 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20  _INTEGER;.      
34b0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
34c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 30  pExpr->iTable==0
34d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
34e0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
34f0: 3d 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20  ==31 );.        
3500: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
3510: 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20  iCol==32 );.    
3520: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
3530: 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d 20 28 69 43  ->oldmask |= (iC
3540: 6f 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66  ol>=32 ? 0xfffff
3550: 66 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c  fff : (((u32)1)<
3560: 3c 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20  <iCol));.       
3570: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
3580: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
3590: 73 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a  se( iCol==31 );.
35a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
35b0: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32  stcase( iCol==32
35c0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
35d0: 20 20 70 50 61 72 73 65 2d 3e 6e 65 77 6d 61 73    pParse->newmas
35e0: 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f  k |= (iCol>=32 ?
35f0: 20 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28   0xffffffff : ((
3600: 28 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b  (u32)1)<<iCol));
3610: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
3620: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3630: 2d 3e 79 2e 70 54 61 62 20 3d 20 70 54 61 62 3b  ->y.pTab = pTab;
3640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
3650: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 69  pr->iColumn = (i
3660: 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  16)iCol;.       
3670: 20 20 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20       eNewExprOp 
3680: 3d 20 54 4b 5f 54 52 49 47 47 45 52 3b 0a 23 65  = TK_TRIGGER;.#e
3690: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
36a0: 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f 0a 20  MIT_TRIGGER */. 
36b0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
36c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
36d0: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64 65   }.#endif /* !de
36e0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
36f0: 54 5f 54 52 49 47 47 45 52 29 20 7c 7c 20 21 64  T_TRIGGER) || !d
3700: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
3710: 49 54 5f 55 50 53 45 52 54 29 20 2a 2f 0a 0a 20  IT_UPSERT) */.. 
3720: 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72     /*.    ** Per
3730: 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73  haps the name is
3740: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
3750: 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f  the ROWID.    */
3760: 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 0a  .    if( cnt==0.
3770: 20 20 20 20 20 26 26 20 63 6e 74 54 61 62 3d 3d       && cntTab==
3780: 31 0a 20 20 20 20 20 26 26 20 70 4d 61 74 63 68  1.     && pMatch
3790: 0a 20 20 20 20 20 26 26 20 28 70 4e 43 2d 3e 6e  .     && (pNC->n
37a0: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64 78 45  cFlags & NC_IdxE
37b0: 78 70 72 29 3d 3d 30 0a 20 20 20 20 20 26 26 20  xpr)==0.     && 
37c0: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
37d0: 43 6f 6c 29 0a 20 20 20 20 20 26 26 20 56 69 73  Col).     && Vis
37e0: 69 62 6c 65 52 6f 77 69 64 28 70 4d 61 74 63 68  ibleRowid(pMatch
37f0: 2d 3e 70 54 61 62 29 0a 20 20 20 20 29 7b 0a 20  ->pTab).    ){. 
3800: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
3810: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3820: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
3830: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
3840: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
3850: 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  GER;.    }..    
3860: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  /*.    ** If the
3870: 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65   input is of the
3880: 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a   form Z (not Y.Z
3890: 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20   or X.Y.Z) then 
38a0: 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a  the name Z.    *
38b0: 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f  * might refer to
38c0: 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61   an result-set a
38d0: 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70  lias.  This happ
38e0: 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
38f0: 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65  , when.    ** we
3900: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e   are resolving n
3910: 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ames in the WHER
3920: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
3930: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
3940: 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
3950: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
3960: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
3970: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20  WHERE x<10;.    
3980: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73  **.    ** In cas
3990: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
39a0: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
39b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
39c0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
39d0: 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20     ** forms the 
39e0: 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79  result set entry
39f0: 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65   ("a+b" in the e
3a00: 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75  xample) and retu
3a10: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
3a20: 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
3a30: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3a40: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3a50: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  t should have al
3a60: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
3a70: 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68  * resolved by th
3a80: 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45  e time the WHERE
3a90: 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c   clause is resol
3aa0: 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20  ved..    **.    
3ab0: 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79 20 74  ** The ability t
3ac0: 6f 20 75 73 65 20 61 6e 20 6f 75 74 70 75 74 20  o use an output 
3ad0: 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d  result-set colum
3ae0: 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45 2c 20  n in the WHERE, 
3af0: 47 52 4f 55 50 20 42 59 2c 0a 20 20 20 20 2a 2a  GROUP BY,.    **
3b00: 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61 75 73   or HAVING claus
3b10: 65 73 2c 20 6f 72 20 61 73 20 70 61 72 74 20 6f  es, or as part o
3b20: 66 20 61 20 6c 61 72 67 65 72 20 65 78 70 72 65  f a larger expre
3b30: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f 52 44  ssion in the ORD
3b40: 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61  ER BY.    ** cla
3b50: 75 73 65 20 69 73 20 6e 6f 74 20 73 74 61 6e 64  use is not stand
3b60: 61 72 64 20 53 51 4c 2e 20 20 54 68 69 73 20 69  ard SQL.  This i
3b70: 73 20 61 20 28 67 6f 6f 66 79 29 20 53 51 4c 69  s a (goofy) SQLi
3b80: 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20 74 68  te extension, th
3b90: 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 73 75 70  at.    ** is sup
3ba0: 70 6f 72 74 65 64 20 66 6f 72 20 62 61 63 6b 77  ported for backw
3bb0: 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69 6c 69  ards compatibili
3bc0: 74 79 20 6f 6e 6c 79 2e 20 48 65 6e 63 65 2c 20  ty only. Hence, 
3bd0: 77 65 20 69 73 73 75 65 20 61 20 77 61 72 6e 69  we issue a warni
3be0: 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73 71 6c  ng.    ** on sql
3bf0: 69 74 65 33 5f 6c 6f 67 28 29 20 77 68 65 6e 65  ite3_log() whene
3c00: 76 65 72 20 74 68 65 20 63 61 70 61 62 69 6c 69  ver the capabili
3c10: 74 79 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20  ty is used..    
3c20: 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4e 43 2d  */.    if( (pNC-
3c30: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 55 45  >ncFlags & NC_UE
3c40: 4c 69 73 74 29 21 3d 30 0a 20 20 20 20 20 26 26  List)!=0.     &&
3c50: 20 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20   cnt==0.     && 
3c60: 7a 54 61 62 3d 3d 30 0a 20 20 20 20 29 7b 0a 20  zTab==0.    ){. 
3c70: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 4e       pEList = pN
3c80: 43 2d 3e 75 4e 43 2e 70 45 4c 69 73 74 3b 0a 20  C->uNC.pEList;. 
3c90: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
3ca0: 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  ist!=0 );.      
3cb0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73  for(j=0; j<pELis
3cc0: 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a  t->nExpr; j++){.
3cd0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41          char *zA
3ce0: 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  s = pEList->a[j]
3cf0: 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  .zName;.        
3d00: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
3d10: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
3d20: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
3d30: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 4f          Expr *pO
3d40: 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20 20 61  rig;.          a
3d50: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c  ssert( pExpr->pL
3d60: 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d  eft==0 && pExpr-
3d70: 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20  >pRight==0 );.  
3d80: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
3d90: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3d 3d  pExpr->x.pList==
3da0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61  0 );.          a
3db0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 78 2e  ssert( pExpr->x.
3dc0: 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20  pSelect==0 );.  
3dd0: 20 20 20 20 20 20 20 20 70 4f 72 69 67 20 3d 20          pOrig = 
3de0: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
3df0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
3e00: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 26  ( (pNC->ncFlags&
3e10: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 20  NC_AllowAgg)==0 
3e20: 26 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  && ExprHasProper
3e30: 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41 67 67  ty(pOrig, EP_Agg
3e40: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
3e50: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
3e60: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
3e70: 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67 67 72   of aliased aggr
3e80: 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73 29 3b  egate %s", zAs);
3e90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
3ea0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
3eb0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3ec0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
3ed0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
3ee0: 4f 72 69 67 29 21 3d 31 20 29 7b 0a 20 20 20 20  Orig)!=1 ){.    
3ef0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3f00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3f10: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
3f20: 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ed");.          
3f30: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
3f40: 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  rt;.          }.
3f50: 20 20 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76            resolv
3f60: 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70  eAlias(pParse, p
3f70: 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70 72 2c  EList, j, pExpr,
3f80: 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79 29 3b   "", nSubquery);
3f90: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 20 3d  .          cnt =
3fa0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d   1;.          pM
3fb0: 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20 20 20  atch = 0;.      
3fc0: 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62      assert( zTab
3fd0: 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b  ==0 && zDb==0 );
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
3ff0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
4000: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
4010: 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65  qlite3RenameToke
4020: 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20 30  nRemap(pParse, 0
4030: 2c 20 28 76 6f 69 64 2a 29 70 45 78 70 72 29 3b  , (void*)pExpr);
4040: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
4050: 20 20 20 20 20 20 20 67 6f 74 6f 20 6c 6f 6f 6b         goto look
4060: 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 20 20  upname_end;.    
4070: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
4080: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
4090: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
40a0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20   name context.  
40b0: 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78  The loop will ex
40c0: 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20  it when either. 
40d0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20     ** we have a 
40e0: 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72  match (cnt>0) or
40f0: 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74   when we run out
4100: 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74   of name context
4110: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
4120: 28 20 63 6e 74 20 29 20 62 72 65 61 6b 3b 0a 20  ( cnt ) break;. 
4130: 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e     pNC = pNC->pN
4140: 65 78 74 3b 0a 20 20 20 20 6e 53 75 62 71 75 65  ext;.    nSubque
4150: 72 79 2b 2b 3b 0a 20 20 7d 77 68 69 6c 65 28 20  ry++;.  }while( 
4160: 70 4e 43 20 29 3b 0a 0a 0a 20 20 2f 2a 0a 20 20  pNC );...  /*.  
4170: 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72  ** If X and Y ar
4180: 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72  e NULL (in other
4190: 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74   words if only t
41a0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a  he column name Z
41b0: 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65   is.  ** supplie
41c0: 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  d) and the value
41d0: 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65   of Z is enclose
41e0: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
41f0: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20  es, then.  ** Z 
4200: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
4210: 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ral if it doesn'
4220: 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75  t match any colu
4230: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68  mn names.  In th
4240: 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65  at.  ** case, we
4250: 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20   need to return 
4260: 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e  right away and n
4270: 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  ot make any chan
4280: 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70  ges to.  ** pExp
4290: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63  r..  **.  ** Bec
42a0: 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  ause no referenc
42b0: 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75  e was made to ou
42c0: 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68  ter contexts, th
42d0: 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a  e pNC->nRef.  **
42e0: 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
42f0: 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63  changed in any c
4300: 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69  ontext..  */.  i
4310: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
4320: 62 3d 3d 30 20 29 7b 0a 20 20 20 20 61 73 73 65  b==0 ){.    asse
4330: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
4340: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 69 66 28 20  K_ID );.    if( 
4350: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
4360: 70 45 78 70 72 2c 45 50 5f 44 62 6c 51 75 6f 74  pExpr,EP_DblQuot
4370: 65 64 29 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ed) ){.      /* 
4380: 49 66 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  If a double-quot
4390: 65 64 20 69 64 65 6e 74 69 66 69 65 72 20 64 6f  ed identifier do
43a0: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
43b0: 20 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 20 6e 61   known column na
43c0: 6d 65 2c 0a 20 20 20 20 20 20 2a 2a 20 74 68 65  me,.      ** the
43d0: 6e 20 74 72 65 61 74 20 69 74 20 61 73 20 61 20  n treat it as a 
43e0: 73 74 72 69 6e 67 2e 0a 20 20 20 20 20 20 2a 2a  string..      **
43f0: 0a 20 20 20 20 20 20 2a 2a 20 54 68 69 73 20 68  .      ** This h
4400: 61 63 6b 20 77 61 73 20 61 64 64 65 64 20 69 6e  ack was added in
4410: 20 74 68 65 20 65 61 72 6c 79 20 64 61 79 73 20   the early days 
4420: 6f 66 20 53 51 4c 69 74 65 20 69 6e 20 61 20 6d  of SQLite in a m
4430: 69 73 67 75 69 64 65 64 20 61 74 74 65 6d 70 74  isguided attempt
4440: 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 62 65 20  .      ** to be 
4450: 63 6f 6d 70 61 74 69 62 6c 65 20 77 69 74 68 20  compatible with 
4460: 4d 79 53 51 4c 20 33 2e 78 2c 20 77 68 69 63 68  MySQL 3.x, which
4470: 20 75 73 65 64 20 64 6f 75 62 6c 65 2d 71 75 6f   used double-quo
4480: 74 65 73 20 66 6f 72 20 73 74 72 69 6e 67 73 2e  tes for strings.
4490: 0a 20 20 20 20 20 20 2a 2a 20 49 20 6e 6f 77 20  .      ** I now 
44a0: 73 6f 72 65 6c 79 20 72 65 67 72 65 74 20 70 75  sorely regret pu
44b0: 74 74 69 6e 67 20 69 6e 20 74 68 69 73 20 68 61  tting in this ha
44c0: 63 6b 2e 20 54 68 65 20 65 66 66 65 63 74 20 6f  ck. The effect o
44d0: 66 20 74 68 69 73 20 68 61 63 6b 20 69 73 0a 20  f this hack is. 
44e0: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 6d 69 73       ** that mis
44f0: 73 70 65 6c 6c 65 64 20 69 64 65 6e 74 69 66 69  spelled identifi
4500: 65 72 20 6e 61 6d 65 73 20 61 72 65 20 73 69 6c  er names are sil
4510: 65 6e 74 6c 79 20 63 6f 6e 76 65 72 74 65 64 20  ently converted 
4520: 69 6e 74 6f 20 73 74 72 69 6e 67 73 0a 20 20 20  into strings.   
4530: 20 20 20 2a 2a 20 72 61 74 68 65 72 20 74 68 61     ** rather tha
4540: 6e 20 63 61 75 73 69 6e 67 20 61 6e 20 65 72 72  n causing an err
4550: 6f 72 2c 20 74 6f 20 74 68 65 20 66 72 75 73 74  or, to the frust
4560: 72 61 74 69 6f 6e 20 6f 66 20 63 6f 75 6e 74 6c  ration of countl
4570: 65 73 73 0a 20 20 20 20 20 20 2a 2a 20 70 72 6f  ess.      ** pro
4580: 67 72 61 6d 6d 65 72 73 2e 20 54 6f 20 61 6c 6c  grammers. To all
4590: 20 74 68 6f 73 65 20 66 72 75 73 74 72 61 74 65   those frustrate
45a0: 64 20 70 72 6f 67 72 61 6d 6d 65 72 73 2c 20 6d  d programmers, m
45b0: 79 20 61 70 6f 6c 6f 67 69 65 73 2e 0a 20 20 20  y apologies..   
45c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 53     **.      ** S
45d0: 6f 6d 65 64 61 79 2c 20 49 20 68 6f 70 65 20 74  omeday, I hope t
45e0: 6f 20 67 65 74 20 72 69 64 20 6f 66 20 74 68 69  o get rid of thi
45f0: 73 20 68 61 63 6b 2e 20 55 6e 66 6f 72 74 75 6e  s hack. Unfortun
4600: 61 74 65 6c 79 20 74 68 65 72 65 20 69 73 0a 20  ately there is. 
4610: 20 20 20 20 20 2a 2a 20 61 20 68 75 67 65 20 61       ** a huge a
4620: 6d 6f 75 6e 74 20 6f 66 20 6c 65 67 61 63 79 20  mount of legacy 
4630: 53 51 4c 20 74 68 61 74 20 75 73 65 73 20 69 74  SQL that uses it
4640: 2e 20 53 6f 20 66 6f 72 20 6e 6f 77 2c 20 77 65  . So for now, we
4650: 20 6a 75 73 74 0a 20 20 20 20 20 20 2a 2a 20 69   just.      ** i
4660: 73 73 75 65 20 61 20 77 61 72 6e 69 6e 67 2e 0a  ssue a warning..
4670: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
4680: 71 6c 69 74 65 33 5f 6c 6f 67 28 53 51 4c 49 54  qlite3_log(SQLIT
4690: 45 5f 57 41 52 4e 49 4e 47 2c 0a 20 20 20 20 20  E_WARNING,.     
46a0: 20 20 20 22 64 6f 75 62 6c 65 2d 71 75 6f 74 65     "double-quote
46b0: 64 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  d string literal
46c0: 3a 20 5c 22 25 77 5c 22 22 2c 20 7a 43 6f 6c 29  : \"%w\"", zCol)
46d0: 3b 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f  ;.#ifdef SQLITE_
46e0: 45 4e 41 42 4c 45 5f 4e 4f 52 4d 41 4c 49 5a 45  ENABLE_NORMALIZE
46f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
4700: 62 65 41 64 64 44 62 6c 71 75 6f 74 65 53 74 72  beAddDblquoteStr
4710: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 70 56 64  (db, pParse->pVd
4720: 62 65 2c 20 7a 43 6f 6c 29 3b 0a 23 65 6e 64 69  be, zCol);.#endi
4730: 66 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f  f.      pExpr->o
4740: 70 20 3d 20 54 4b 5f 53 54 52 49 4e 47 3b 0a 20  p = TK_STRING;. 
4750: 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54       pExpr->y.pT
4760: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  ab = 0;.      re
4770: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
4780: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73 71      }.    if( sq
4790: 6c 69 74 65 33 45 78 70 72 49 64 54 6f 54 72 75  lite3ExprIdToTru
47a0: 65 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  eFalse(pExpr) ){
47b0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
47c0: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
47d0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
47e0: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
47f0: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
4800: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
4810: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
4820: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
4830: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
4840: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
4850: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
4860: 3d 31 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20  =1 ){.    const 
4870: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
4880: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
4890: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 22  "no such column"
48a0: 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f   : "ambiguous co
48b0: 6c 75 6d 6e 20 6e 61 6d 65 22 3b 0a 20 20 20 20  lumn name";.    
48c0: 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20  if( zDb ){.     
48d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
48e0: 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73  (pParse, "%s: %s
48f0: 2e 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c 20 7a  .%s.%s", zErr, z
4900: 44 62 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  Db, zTab, zCol);
4910: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
4920: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
4930: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4940: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 22  rse, "%s: %s.%s"
4950: 2c 20 7a 45 72 72 2c 20 7a 54 61 62 2c 20 7a 43  , zErr, zTab, zC
4960: 6f 6c 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  ol);.    }else{.
4970: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4980: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4990: 73 3a 20 25 73 22 2c 20 7a 45 72 72 2c 20 7a 43  s: %s", zErr, zC
49a0: 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  ol);.    }.    p
49b0: 50 61 72 73 65 2d 3e 63 68 65 63 6b 53 63 68 65  Parse->checkSche
49c0: 6d 61 20 3d 20 31 3b 0a 20 20 20 20 70 54 6f 70  ma = 1;.    pTop
49d0: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a  NC->nErr++;.  }.
49e0: 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d  .  /* If a colum
49f0: 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c 65 20 69  n from a table i
4a00: 6e 20 70 53 72 63 4c 69 73 74 20 69 73 20 72 65  n pSrcList is re
4a10: 66 65 72 65 6e 63 65 64 2c 20 74 68 65 6e 20 72  ferenced, then r
4a20: 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68 69 73 20  ecord.  ** this 
4a30: 66 61 63 74 20 69 6e 20 74 68 65 20 70 53 72 63  fact in the pSrc
4a40: 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64  List.a[].colUsed
4a50: 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d   bitmask.  Colum
4a60: 6e 20 30 20 63 61 75 73 65 73 0a 20 20 2a 2a 20  n 0 causes.  ** 
4a70: 62 69 74 20 30 20 74 6f 20 62 65 20 73 65 74 2e  bit 0 to be set.
4a80: 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20    Column 1 sets 
4a90: 62 69 74 20 31 2e 20 20 41 6e 64 20 73 6f 20 66  bit 1.  And so f
4aa0: 6f 72 74 68 2e 20 20 49 66 20 74 68 65 0a 20 20  orth.  If the.  
4ab0: 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  ** column number
4ac0: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
4ad0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 62   the number of b
4ae0: 69 74 73 20 69 6e 20 74 68 65 20 62 69 74 6d 61  its in the bitma
4af0: 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20 73 65 74  sk.  ** then set
4b00: 20 74 68 65 20 68 69 67 68 2d 6f 72 64 65 72 20   the high-order 
4b10: 62 69 74 20 6f 66 20 74 68 65 20 62 69 74 6d 61  bit of the bitma
4b20: 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70  sk..  */.  if( p
4b30: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
4b40: 20 26 26 20 70 4d 61 74 63 68 21 3d 30 20 29 7b   && pMatch!=0 ){
4b50: 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78  .    int n = pEx
4b60: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20  pr->iColumn;.   
4b70: 20 74 65 73 74 63 61 73 65 28 20 6e 3d 3d 42 4d   testcase( n==BM
4b80: 53 2d 31 20 29 3b 0a 20 20 20 20 69 66 28 20 6e  S-1 );.    if( n
4b90: 3e 3d 42 4d 53 20 29 7b 0a 20 20 20 20 20 20 6e  >=BMS ){.      n
4ba0: 20 3d 20 42 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a   = BMS-1;.    }.
4bb0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74      assert( pMat
4bc0: 63 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78  ch->iCursor==pEx
4bd0: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
4be0: 20 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65    pMatch->colUse
4bf0: 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b 29 31  d |= ((Bitmask)1
4c00: 29 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  )<<n;.  }..  /* 
4c10: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
4c20: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
4c30: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4c40: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
4c50: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
4c60: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
4c70: 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70  rDelete(db, pExp
4c80: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 45  r->pRight);.  pE
4c90: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  xpr->pRight = 0;
4ca0: 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 65  .  pExpr->op = e
4cb0: 4e 65 77 45 78 70 72 4f 70 3b 0a 20 20 45 78 70  NewExprOp;.  Exp
4cc0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
4cd0: 70 72 2c 20 45 50 5f 4c 65 61 66 29 3b 0a 6c 6f  pr, EP_Leaf);.lo
4ce0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20  okupname_end:.  
4cf0: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
4d00: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
4d10: 20 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70   );.    if( !Exp
4d20: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
4d30: 70 72 2c 20 45 50 5f 41 6c 69 61 73 29 20 29 7b  pr, EP_Alias) ){
4d40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 41 75  .      sqlite3Au
4d50: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
4d60: 45 78 70 72 2c 20 70 53 63 68 65 6d 61 2c 20 70  Expr, pSchema, p
4d70: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20  NC->pSrcList);. 
4d80: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72     }.    /* Incr
4d90: 65 6d 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76  ement the nRef v
4da0: 61 6c 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65  alue on all name
4db0: 20 63 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54   contexts from T
4dc0: 6f 70 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a  opNC up to.    *
4dd0: 2a 20 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72  * the point wher
4de0: 65 20 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68  e the name match
4df0: 65 64 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b  ed. */.    for(;
4e00: 3b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ;){.      assert
4e10: 28 20 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20  ( pTopNC!=0 );. 
4e20: 20 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65       pTopNC->nRe
4e30: 66 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70  f++;.      if( p
4e40: 54 6f 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65  TopNC==pNC ) bre
4e50: 61 6b 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43  ak;.      pTopNC
4e60: 20 3d 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74   = pTopNC->pNext
4e70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75  ;.    }.    retu
4e80: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
4e90: 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 72 65 74  } else {.    ret
4ea0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
4eb0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f   }.}../*.** Allo
4ec0: 63 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20  cate and return 
4ed0: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20  a pointer to an 
4ee0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 6c 6f  expression to lo
4ef0: 61 64 20 74 68 65 20 63 6f 6c 75 6d 6e 20 69 43  ad the column iC
4f00: 6f 6c 0a 2a 2a 20 66 72 6f 6d 20 64 61 74 61 73  ol.** from datas
4f10: 6f 75 72 63 65 20 69 53 72 63 20 69 6e 20 53 72  ource iSrc in Sr
4f20: 63 4c 69 73 74 20 70 53 72 63 2e 0a 2a 2f 0a 45  cList pSrc..*/.E
4f30: 78 70 72 20 2a 73 71 6c 69 74 65 33 43 72 65 61  xpr *sqlite3Crea
4f40: 74 65 43 6f 6c 75 6d 6e 45 78 70 72 28 73 71 6c  teColumnExpr(sql
4f50: 69 74 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73  ite3 *db, SrcLis
4f60: 74 20 2a 70 53 72 63 2c 20 69 6e 74 20 69 53 72  t *pSrc, int iSr
4f70: 63 2c 20 69 6e 74 20 69 43 6f 6c 29 7b 0a 20 20  c, int iCol){.  
4f80: 45 78 70 72 20 2a 70 20 3d 20 73 71 6c 69 74 65  Expr *p = sqlite
4f90: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4fa0: 4b 5f 43 4f 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b  K_COLUMN, 0, 0);
4fb0: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
4fc0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
4fd0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
4fe0: 72 63 2d 3e 61 5b 69 53 72 63 5d 3b 0a 20 20 20  rc->a[iSrc];.   
4ff0: 20 70 2d 3e 79 2e 70 54 61 62 20 3d 20 70 49 74   p->y.pTab = pIt
5000: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 70 2d  em->pTab;.    p-
5010: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
5020: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 69 66  >iCursor;.    if
5030: 28 20 70 2d 3e 79 2e 70 54 61 62 2d 3e 69 50 4b  ( p->y.pTab->iPK
5040: 65 79 3d 3d 69 43 6f 6c 20 29 7b 0a 20 20 20 20  ey==iCol ){.    
5050: 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d    p->iColumn = -
5060: 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  1;.    }else{.  
5070: 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d      p->iColumn =
5080: 20 28 79 6e 56 61 72 29 69 43 6f 6c 3b 0a 20 20   (ynVar)iCol;.  
5090: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69 43      testcase( iC
50a0: 6f 6c 3d 3d 42 4d 53 20 29 3b 0a 20 20 20 20 20  ol==BMS );.     
50b0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
50c0: 3d 42 4d 53 2d 31 20 29 3b 0a 20 20 20 20 20 20  =BMS-1 );.      
50d0: 70 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c  pItem->colUsed |
50e0: 3d 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c  = ((Bitmask)1)<<
50f0: 28 69 43 6f 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53  (iCol>=BMS ? BMS
5100: 2d 31 20 3a 20 69 43 6f 6c 29 3b 0a 20 20 20 20  -1 : iCol);.    
5110: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
5120: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72  ;.}../*.** Repor
5130: 74 20 61 6e 20 65 72 72 6f 72 20 74 68 61 74 20  t an error that 
5140: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  an expression is
5150: 20 6e 6f 74 20 76 61 6c 69 64 20 66 6f 72 20 73   not valid for s
5160: 6f 6d 65 20 73 65 74 20 6f 66 0a 2a 2a 20 70 4e  ome set of.** pN
5170: 43 2d 3e 6e 63 46 6c 61 67 73 20 76 61 6c 75 65  C->ncFlags value
5180: 73 20 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20  s determined by 
5190: 76 61 6c 69 64 4d 61 73 6b 2e 0a 2a 2f 0a 73 74  validMask..*/.st
51a0: 61 74 69 63 20 76 6f 69 64 20 6e 6f 74 56 61 6c  atic void notVal
51b0: 69 64 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  id(.  Parse *pPa
51c0: 72 73 65 2c 20 20 20 20 20 20 20 2f 2a 20 4c 65  rse,       /* Le
51d0: 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ave error messag
51e0: 65 20 68 65 72 65 20 2a 2f 0a 20 20 4e 61 6d 65  e here */.  Name
51f0: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
5200: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
5210: 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  text */.  const 
5220: 63 68 61 72 20 2a 7a 4d 73 67 2c 20 20 20 20 2f  char *zMsg,    /
5230: 2a 20 54 79 70 65 20 6f 66 20 65 72 72 6f 72 20  * Type of error 
5240: 2a 2f 0a 20 20 69 6e 74 20 76 61 6c 69 64 4d 61  */.  int validMa
5250: 73 6b 20 20 20 20 20 20 20 20 2f 2a 20 53 65 74  sk        /* Set
5260: 20 6f 66 20 63 6f 6e 74 65 78 74 73 20 66 6f 72   of contexts for
5270: 20 77 68 69 63 68 20 70 72 6f 68 69 62 69 74 65   which prohibite
5280: 64 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74  d */.){.  assert
5290: 28 20 28 76 61 6c 69 64 4d 61 73 6b 26 7e 28 4e  ( (validMask&~(N
52a0: 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72  C_IsCheck|NC_Par
52b0: 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29  tIdx|NC_IdxExpr)
52c0: 29 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 28 70  )==0 );.  if( (p
52d0: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 76 61  NC->ncFlags & va
52e0: 6c 69 64 4d 61 73 6b 29 21 3d 30 20 29 7b 0a 20  lidMask)!=0 ){. 
52f0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5300: 49 6e 20 3d 20 22 70 61 72 74 69 61 6c 20 69 6e  In = "partial in
5310: 64 65 78 20 57 48 45 52 45 20 63 6c 61 75 73 65  dex WHERE clause
5320: 73 22 3b 0a 20 20 20 20 69 66 28 20 70 4e 43 2d  s";.    if( pNC-
5330: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64  >ncFlags & NC_Id
5340: 78 45 78 70 72 20 29 20 20 20 20 20 20 7a 49 6e  xExpr )      zIn
5350: 20 3d 20 22 69 6e 64 65 78 20 65 78 70 72 65 73   = "index expres
5360: 73 69 6f 6e 73 22 3b 0a 23 69 66 6e 64 65 66 20  sions";.#ifndef 
5370: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 48 45 43  SQLITE_OMIT_CHEC
5380: 4b 0a 20 20 20 20 65 6c 73 65 20 69 66 28 20 70  K.    else if( p
5390: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
53a0: 5f 49 73 43 68 65 63 6b 20 29 20 7a 49 6e 20 3d  _IsCheck ) zIn =
53b0: 20 22 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69   "CHECK constrai
53c0: 6e 74 73 22 3b 0a 23 65 6e 64 69 66 0a 20 20 20  nts";.#endif.   
53d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
53e0: 28 70 50 61 72 73 65 2c 20 22 25 73 20 70 72 6f  (pParse, "%s pro
53f0: 68 69 62 69 74 65 64 20 69 6e 20 25 73 22 2c 20  hibited in %s", 
5400: 7a 4d 73 67 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a  zMsg, zIn);.  }.
5410: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78 70 72 65 73 73  }../*.** Express
5420: 69 6f 6e 20 70 20 73 68 6f 75 6c 64 20 65 6e 63  ion p should enc
5430: 6f 64 65 20 61 20 66 6c 6f 61 74 69 6e 67 20 70  ode a floating p
5440: 6f 69 6e 74 20 76 61 6c 75 65 20 62 65 74 77 65  oint value betwe
5450: 65 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a  en 1.0 and 0.0..
5460: 2a 2a 20 52 65 74 75 72 6e 20 31 30 32 34 20 74  ** Return 1024 t
5470: 69 6d 65 73 20 74 68 69 73 20 76 61 6c 75 65 2e  imes this value.
5480: 20 20 4f 72 20 72 65 74 75 72 6e 20 2d 31 20 69    Or return -1 i
5490: 66 20 70 20 69 73 20 6e 6f 74 20 61 20 66 6c 6f  f p is not a flo
54a0: 61 74 69 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76  ating point.** v
54b0: 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31 2e 30  alue between 1.0
54c0: 20 61 6e 64 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61   and 0.0..*/.sta
54d0: 74 69 63 20 69 6e 74 20 65 78 70 72 50 72 6f 62  tic int exprProb
54e0: 61 62 69 6c 69 74 79 28 45 78 70 72 20 2a 70 29  ability(Expr *p)
54f0: 7b 0a 20 20 64 6f 75 62 6c 65 20 72 20 3d 20 2d  {.  double r = -
5500: 31 2e 30 3b 0a 20 20 69 66 28 20 70 2d 3e 6f 70  1.0;.  if( p->op
5510: 21 3d 54 4b 5f 46 4c 4f 41 54 20 29 20 72 65 74  !=TK_FLOAT ) ret
5520: 75 72 6e 20 2d 31 3b 0a 20 20 73 71 6c 69 74 65  urn -1;.  sqlite
5530: 33 41 74 6f 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65  3AtoF(p->u.zToke
5540: 6e 2c 20 26 72 2c 20 73 71 6c 69 74 65 33 53 74  n, &r, sqlite3St
5550: 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b  rlen30(p->u.zTok
5560: 65 6e 29 2c 20 53 51 4c 49 54 45 5f 55 54 46 38  en), SQLITE_UTF8
5570: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 72 3e 3d  );.  assert( r>=
5580: 30 2e 30 20 29 3b 0a 20 20 69 66 28 20 72 3e 31  0.0 );.  if( r>1
5590: 2e 30 20 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a  .0 ) return -1;.
55a0: 20 20 72 65 74 75 72 6e 20 28 69 6e 74 29 28 72    return (int)(r
55b0: 2a 31 33 34 32 31 37 37 32 38 2e 30 29 3b 0a 7d  *134217728.0);.}
55c0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
55d0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 62 61 63 6b  tine is callback
55e0: 20 66 6f 72 20 73 71 6c 69 74 65 33 57 61 6c 6b   for sqlite3Walk
55f0: 45 78 70 72 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65  Expr()..**.** Re
5600: 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63 20 6e  solve symbolic n
5610: 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c  ames into TK_COL
5620: 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20 66 6f  UMN operators fo
5630: 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a 2a 2a  r the current.**
5640: 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65 78 70   node in the exp
5650: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
5660: 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e 74 69  eturn 0 to conti
5670: 6e 75 65 20 74 68 65 20 73 65 61 72 63 68 20 64  nue the search d
5680: 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  own.** the tree 
5690: 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20 74 68  or 2 to abort th
56a0: 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a  e tree walk..**.
56b0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
56c0: 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f 72 20  also does error 
56d0: 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e 61 6d  checking and nam
56e0: 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66 6f 72  e resolution for
56f0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  .** function nam
5700: 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61 74 6f  es.  The operato
5710: 72 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20  r for aggregate 
5720: 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63 68 61  functions is cha
5730: 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47  nged.** to TK_AG
5740: 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73  G_FUNCTION..*/.s
5750: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
5760: 65 45 78 70 72 53 74 65 70 28 57 61 6c 6b 65 72  eExprStep(Walker
5770: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
5780: 2a 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43  *pExpr){.  NameC
5790: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 50  ontext *pNC;.  P
57a0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20  arse *pParse;.. 
57b0: 20 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e   pNC = pWalker->
57c0: 75 2e 70 4e 43 3b 0a 20 20 61 73 73 65 72 74 28  u.pNC;.  assert(
57d0: 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 50 61   pNC!=0 );.  pPa
57e0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
57f0: 65 3b 0a 20 20 61 73 73 65 72 74 28 20 70 50 61  e;.  assert( pPa
5800: 72 73 65 3d 3d 70 57 61 6c 6b 65 72 2d 3e 70 50  rse==pWalker->pP
5810: 61 72 73 65 20 29 3b 0a 0a 23 69 66 6e 64 65 66  arse );..#ifndef
5820: 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 4e   NDEBUG.  if( pN
5830: 43 2d 3e 70 53 72 63 4c 69 73 74 20 26 26 20 70  C->pSrcList && p
5840: 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e 41  NC->pSrcList->nA
5850: 6c 6c 6f 63 3e 30 20 29 7b 0a 20 20 20 20 53 72  lloc>0 ){.    Sr
5860: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 20  cList *pSrcList 
5870: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
5880: 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
5890: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e  for(i=0; i<pNC->
58a0: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
58b0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65  i++){.      asse
58c0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
58d0: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
58e0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
58f0: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
5900: 6e 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  nTab);.    }.  }
5910: 0a 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68  .#endif.  switch
5920: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a  ( pExpr->op ){..
5930: 23 69 66 20 64 65 66 69 6e 65 64 28 53 51 4c 49  #if defined(SQLI
5940: 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54 45  TE_ENABLE_UPDATE
5950: 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 20 26  _DELETE_LIMIT) &
5960: 26 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54  & !defined(SQLIT
5970: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29  E_OMIT_SUBQUERY)
5980: 0a 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63  .    /* The spec
5990: 69 61 6c 20 6f 70 65 72 61 74 6f 72 20 54 4b 5f  ial operator TK_
59a0: 52 4f 57 20 6d 65 61 6e 73 20 75 73 65 20 74 68  ROW means use th
59b0: 65 20 72 6f 77 69 64 20 66 6f 72 20 74 68 65 20  e rowid for the 
59c0: 66 69 72 73 74 0a 20 20 20 20 2a 2a 20 63 6f 6c  first.    ** col
59d0: 75 6d 6e 20 69 6e 20 74 68 65 20 46 52 4f 4d 20  umn in the FROM 
59e0: 63 6c 61 75 73 65 2e 20 20 54 68 69 73 20 69 73  clause.  This is
59f0: 20 75 73 65 64 20 62 79 20 74 68 65 20 4c 49 4d   used by the LIM
5a00: 49 54 20 61 6e 64 20 4f 52 44 45 52 20 42 59 0a  IT and ORDER BY.
5a10: 20 20 20 20 2a 2a 20 63 6c 61 75 73 65 20 70 72      ** clause pr
5a20: 6f 63 65 73 73 69 6e 67 20 6f 6e 20 55 50 44 41  ocessing on UPDA
5a30: 54 45 20 61 6e 64 20 44 45 4c 45 54 45 20 73 74  TE and DELETE st
5a40: 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a 2f  atements..    */
5a50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 4f 57  .    case TK_ROW
5a60: 3a 20 7b 0a 20 20 20 20 20 20 53 72 63 4c 69 73  : {.      SrcLis
5a70: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
5a80: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
5a90: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
5aa0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
5ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
5ac0: 63 4c 69 73 74 20 26 26 20 70 53 72 63 4c 69 73  cList && pSrcLis
5ad0: 74 2d 3e 6e 53 72 63 3d 3d 31 20 29 3b 0a 20 20  t->nSrc==1 );.  
5ae0: 20 20 20 20 70 49 74 65 6d 20 3d 20 70 53 72 63      pItem = pSrc
5af0: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 61  List->a;.      a
5b00: 73 73 65 72 74 28 20 48 61 73 52 6f 77 69 64 28  ssert( HasRowid(
5b10: 70 49 74 65 6d 2d 3e 70 54 61 62 29 20 26 26 20  pItem->pTab) && 
5b20: 70 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 70 53 65  pItem->pTab->pSe
5b30: 6c 65 63 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20  lect==0 );.     
5b40: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
5b50: 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20 20 20 70 45  COLUMN;.      pE
5b60: 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d 20 70 49  xpr->y.pTab = pI
5b70: 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20  tem->pTab;.     
5b80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
5b90: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
5ba0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
5bb0: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
5bc0: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
5bd0: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
5be0: 4e 54 45 47 45 52 3b 0a 20 20 20 20 20 20 62 72  NTEGER;.      br
5bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69  eak;.    }.#endi
5c00: 66 20 2f 2a 20 64 65 66 69 6e 65 64 28 53 51 4c  f /* defined(SQL
5c10: 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50 44 41 54  ITE_ENABLE_UPDAT
5c20: 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49 54 29 0a  E_DELETE_LIMIT).
5c30: 20 20 20 20 20 20 20 20 20 20 26 26 20 21 64 65            && !de
5c40: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
5c50: 54 5f 53 55 42 51 55 45 52 59 29 20 2a 2f 0a 0a  T_SUBQUERY) */..
5c60: 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20      /* A column 
5c70: 6e 61 6d 65 3a 20 20 20 20 20 20 20 20 20 20 20  name:           
5c80: 20 20 20 20 20 20 20 20 20 49 44 0a 20 20 20 20           ID.    
5c90: 2a 2a 20 4f 72 20 74 61 62 6c 65 20 6e 61 6d 65  ** Or table name
5ca0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   and column name
5cb0: 3a 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a  :    ID.ID.    *
5cc0: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
5cd0: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
5ce0: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
5cf0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 54   **.    ** The T
5d00: 4b 5f 49 44 20 61 6e 64 20 54 4b 5f 4f 55 54 20  K_ID and TK_OUT 
5d10: 63 61 73 65 73 20 61 72 65 20 63 6f 6d 62 69 6e  cases are combin
5d20: 65 64 20 73 6f 20 74 68 61 74 20 74 68 65 72 65  ed so that there
5d30: 20 77 69 6c 6c 20 6f 6e 6c 79 0a 20 20 20 20 2a   will only.    *
5d40: 2a 20 62 65 20 6f 6e 65 20 63 61 6c 6c 20 74 6f  * be one call to
5d50: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29 2e 20 20   lookupName().  
5d60: 54 68 65 6e 20 74 68 65 20 63 6f 6d 70 69 6c 65  Then the compile
5d70: 72 20 77 69 6c 6c 20 69 6e 2d 6c 69 6e 65 20 0a  r will in-line .
5d80: 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70 4e 61 6d      ** lookupNam
5d90: 65 28 29 20 66 6f 72 20 61 20 73 69 7a 65 20 72  e() for a size r
5da0: 65 64 75 63 74 69 6f 6e 20 61 6e 64 20 70 65 72  eduction and per
5db0: 66 6f 72 6d 61 6e 63 65 20 69 6e 63 72 65 61 73  formance increas
5dc0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  e..    */.    ca
5dd0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
5de0: 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20  se TK_DOT: {.   
5df0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5e00: 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 63 6f  Column;.      co
5e10: 6e 73 74 20 63 68 61 72 20 2a 7a 54 61 62 6c 65  nst char *zTable
5e20: 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  ;.      const ch
5e30: 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20 20 20 45  ar *zDb;.      E
5e40: 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20  xpr *pRight;..  
5e50: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f      if( pExpr->o
5e60: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
5e70: 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20      zDb = 0;.   
5e80: 20 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 30 3b       zTable = 0;
5e90: 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e  .        zColumn
5ea0: 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
5eb0: 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  en;.      }else{
5ec0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70  .        Expr *p
5ed0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
5ee0: 65 66 74 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74  eft;.        not
5ef0: 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e  Valid(pParse, pN
5f00: 43 2c 20 22 74 68 65 20 5c 22 2e 5c 22 20 6f 70  C, "the \".\" op
5f10: 65 72 61 74 6f 72 22 2c 20 4e 43 5f 49 64 78 45  erator", NC_IdxE
5f20: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 52  xpr);.        pR
5f30: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
5f40: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 69 66  ight;.        if
5f50: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
5f60: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20  _ID ){.         
5f70: 20 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20   zDb = 0;.      
5f80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5f90: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
5fa0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
5fb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 44 62 20 3d  .          zDb =
5fc0: 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
5fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4c 65 66  ;.          pLef
5fe0: 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 4c 65 66  t = pRight->pLef
5ff0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 70 52 69  t;.          pRi
6000: 67 68 74 20 3d 20 70 52 69 67 68 74 2d 3e 70 52  ght = pRight->pR
6010: 69 67 68 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ight;.        }.
6020: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
6030: 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e   pLeft->u.zToken
6040: 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c 75 6d  ;.        zColum
6050: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 75 2e 7a 54  n = pRight->u.zT
6060: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 69 66  oken;.        if
6070: 28 20 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45  ( IN_RENAME_OBJE
6080: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  CT ){.          
6090: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
60a0: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
60b0: 28 76 6f 69 64 2a 29 70 45 78 70 72 2c 20 28 76  (void*)pExpr, (v
60c0: 6f 69 64 2a 29 70 52 69 67 68 74 29 3b 0a 20 20  oid*)pRight);.  
60d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52          sqlite3R
60e0: 65 6e 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28  enameTokenRemap(
60f0: 70 50 61 72 73 65 2c 20 28 76 6f 69 64 2a 29 26  pParse, (void*)&
6100: 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 2c 20 28  pExpr->y.pTab, (
6110: 76 6f 69 64 2a 29 70 4c 65 66 74 29 3b 0a 20 20  void*)pLeft);.  
6120: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
6130: 20 20 20 20 20 20 72 65 74 75 72 6e 20 6c 6f 6f        return loo
6140: 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  kupName(pParse, 
6150: 7a 44 62 2c 20 7a 54 61 62 6c 65 2c 20 7a 43 6f  zDb, zTable, zCo
6160: 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  lumn, pNC, pExpr
6170: 29 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  );.    }..    /*
6180: 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   Resolve functio
6190: 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20  n names.    */. 
61a0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
61b0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
61c0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
61d0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 20 20  Expr->x.pList;  
61e0: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
61f0: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
6200: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
6210: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
6220: 3b 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f  ;    /* Number o
6230: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
6240: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
6250: 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  _func = 0;      
6260: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73   /* True if no s
6270: 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  uch function exi
6280: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  sts */.      int
6290: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
62a0: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
62b0: 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72   if wrong number
62c0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
62d0: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
62e0: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
62f0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73     /* True if is
6300: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
6310: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
6320: 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20  int nId;        
6330: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
6340: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
6350: 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20  ers in function 
6360: 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f  name */.      co
6370: 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20  nst char *zId;  
6380: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
6390: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20   function name. 
63a0: 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66  */.      FuncDef
63b0: 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20   *pDef;         
63c0: 20 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74       /* Informat
63d0: 69 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75  ion about the fu
63e0: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
63f0: 75 38 20 65 6e 63 20 3d 20 45 4e 43 28 70 50 61  u8 enc = ENC(pPa
6400: 72 73 65 2d 3e 64 62 29 3b 20 20 20 2f 2a 20 54  rse->db);   /* T
6410: 68 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f  he database enco
6420: 64 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 61  ding */..      a
6430: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
6440: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
6450: 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
6460: 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78 70        zId = pExp
6470: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20  r->u.zToken;.   
6480: 20 20 20 6e 49 64 20 3d 20 73 71 6c 69 74 65 33     nId = sqlite3
6490: 53 74 72 6c 65 6e 33 30 28 7a 49 64 29 3b 0a 20  Strlen30(zId);. 
64a0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
64b0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
64c0: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
64d0: 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   n, enc, 0);.   
64e0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
64f0: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
6500: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
6510: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
6520: 20 7a 49 64 2c 20 2d 32 2c 20 65 6e 63 2c 20 30   zId, -2, enc, 0
6530: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
6540: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
6550: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
6560: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 1;.        }e
6570: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 77  lse{.          w
6580: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
6590: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
65a0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
65b0: 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66 2d    is_agg = pDef-
65c0: 3e 78 46 69 6e 61 6c 69 7a 65 21 3d 30 3b 0a 20  >xFinalize!=0;. 
65d0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d         if( pDef-
65e0: 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c  >funcFlags & SQL
65f0: 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c  ITE_FUNC_UNLIKEL
6600: 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  Y ){.          E
6610: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
6620: 45 78 70 72 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c  Expr, EP_Unlikel
6630: 79 7c 45 50 5f 53 6b 69 70 29 3b 0a 20 20 20 20  y|EP_Skip);.    
6640: 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 32 20 29        if( n==2 )
6650: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
6660: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 65 78  xpr->iTable = ex
6670: 70 72 50 72 6f 62 61 62 69 6c 69 74 79 28 70 4c  prProbability(pL
6680: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
6690: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
66a0: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3c  ( pExpr->iTable<
66b0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  0 ){.           
66c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
66d0: 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20  sg(pParse,.     
66e0: 20 20 20 20 20 20 20 20 20 20 20 22 73 65 63 6f             "seco
66f0: 6e 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 6c  nd argument to l
6700: 69 6b 65 6c 69 68 6f 6f 64 28 29 20 6d 75 73 74  ikelihood() must
6710: 20 62 65 20 61 20 22 0a 20 20 20 20 20 20 20 20   be a ".        
6720: 20 20 20 20 20 20 20 20 22 63 6f 6e 73 74 61 6e          "constan
6730: 74 20 62 65 74 77 65 65 6e 20 30 2e 30 20 61 6e  t between 0.0 an
6740: 64 20 31 2e 30 22 29 3b 0a 20 20 20 20 20 20 20  d 1.0");.       
6750: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
6760: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
6770: 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73  }.          }els
6780: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  e{.            /
6790: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
67a0: 2d 36 31 33 30 34 2d 32 39 34 34 39 20 54 68 65  -61304-29449 The
67b0: 20 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e   unlikely(X) fun
67c0: 63 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20  ction is.       
67d0: 20 20 20 20 20 2a 2a 20 65 71 75 69 76 61 6c 65       ** equivale
67e0: 6e 74 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64  nt to likelihood
67f0: 28 58 2c 20 30 2e 30 36 32 35 29 2e 0a 20 20 20  (X, 0.0625)..   
6800: 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44           ** EVID
6810: 45 4e 43 45 2d 4f 46 3a 20 52 2d 30 31 32 38 33  ENCE-OF: R-01283
6820: 2d 31 31 36 33 36 20 54 68 65 20 75 6e 6c 69 6b  -11636 The unlik
6830: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
6840: 69 73 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  is.            *
6850: 2a 20 73 68 6f 72 74 2d 68 61 6e 64 20 66 6f 72  * short-hand for
6860: 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e   likelihood(X,0.
6870: 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20 20 20  0625)..         
6880: 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f     ** EVIDENCE-O
6890: 46 3a 20 52 2d 33 36 38 35 30 2d 33 34 31 32 37  F: R-36850-34127
68a0: 20 54 68 65 20 6c 69 6b 65 6c 79 28 58 29 20 66   The likely(X) f
68b0: 75 6e 63 74 69 6f 6e 20 69 73 20 73 68 6f 72 74  unction is short
68c0: 2d 68 61 6e 64 0a 20 20 20 20 20 20 20 20 20 20  -hand.          
68d0: 20 20 2a 2a 20 66 6f 72 20 6c 69 6b 65 6c 69 68    ** for likelih
68e0: 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29 2e 0a 20  ood(X,0.9375).. 
68f0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 45 56             ** EV
6900: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 35 33 34  IDENCE-OF: R-534
6910: 33 36 2d 34 30 39 37 33 20 54 68 65 20 6c 69 6b  36-40973 The lik
6920: 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f 6e 20  ely(X) function 
6930: 69 73 20 65 71 75 69 76 61 6c 65 6e 74 0a 20 20  is equivalent.  
6940: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74 6f 20            ** to 
6950: 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39  likelihood(X,0.9
6960: 33 37 35 29 2e 20 2a 2f 0a 20 20 20 20 20 20 20  375). */.       
6970: 20 20 20 20 20 2f 2a 20 54 55 4e 49 4e 47 3a 20       /* TUNING: 
6980: 75 6e 6c 69 6b 65 6c 79 28 29 20 70 72 6f 62 61  unlikely() proba
6990: 62 69 6c 69 74 79 20 69 73 20 30 2e 30 36 32 35  bility is 0.0625
69a0: 2e 20 20 6c 69 6b 65 6c 79 28 29 20 69 73 20 30  .  likely() is 0
69b0: 2e 39 33 37 35 20 2a 2f 0a 20 20 20 20 20 20 20  .9375 */.       
69c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
69d0: 6c 65 20 3d 20 70 44 65 66 2d 3e 7a 4e 61 6d 65  le = pDef->zName
69e0: 5b 30 5d 3d 3d 27 75 27 20 3f 20 38 33 38 38 36  [0]=='u' ? 83886
69f0: 30 38 20 3a 20 31 32 35 38 32 39 31 32 30 3b 0a  08 : 125829120;.
6a00: 20 20 20 20 20 20 20 20 20 20 7d 20 20 20 20 20            }     
6a10: 20 20 20 20 20 20 20 20 0a 20 20 20 20 20 20 20          .       
6a20: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
6a30: 45 5f 4f 4d 49 54 5f 41 55 54 48 4f 52 49 5a 41  E_OMIT_AUTHORIZA
6a40: 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 7b 0a 20  TION.        {. 
6a50: 20 20 20 20 20 20 20 20 20 69 6e 74 20 61 75 74           int aut
6a60: 68 20 3d 20 73 71 6c 69 74 65 33 41 75 74 68 43  h = sqlite3AuthC
6a70: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 53 51 4c  heck(pParse, SQL
6a80: 49 54 45 5f 46 55 4e 43 54 49 4f 4e 2c 20 30 2c  ITE_FUNCTION, 0,
6a90: 70 44 65 66 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a  pDef->zName,0);.
6aa0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75            if( au
6ab0: 74 68 21 3d 53 51 4c 49 54 45 5f 4f 4b 20 29 7b  th!=SQLITE_OK ){
6ac0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6ad0: 20 61 75 74 68 3d 3d 53 51 4c 49 54 45 5f 44 45   auth==SQLITE_DE
6ae0: 4e 59 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  NY ){.          
6af0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6b00: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 74  Msg(pParse, "not
6b10: 20 61 75 74 68 6f 72 69 7a 65 64 20 74 6f 20 75   authorized to u
6b20: 73 65 20 66 75 6e 63 74 69 6f 6e 3a 20 25 73 22  se function: %s"
6b30: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6b50: 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 7a 4e          pDef->zN
6b60: 61 6d 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ame);.          
6b70: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
6b80: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
6b90: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
6ba0: 2d 3e 6f 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a  ->op = TK_NULL;.
6bb0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
6bc0: 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20  rn WRC_Prune;.  
6bd0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6be0: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
6bf0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
6c00: 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54 45  cFlags & (SQLITE
6c10: 5f 46 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 7c 53  _FUNC_CONSTANT|S
6c20: 51 4c 49 54 45 5f 46 55 4e 43 5f 53 4c 4f 43 48  QLITE_FUNC_SLOCH
6c30: 4e 47 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  NG) ){.         
6c40: 20 2f 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70   /* For the purp
6c50: 6f 73 65 73 20 6f 66 20 74 68 65 20 45 50 5f 43  oses of the EP_C
6c60: 6f 6e 73 74 46 75 6e 63 20 66 6c 61 67 2c 20 64  onstFunc flag, d
6c70: 61 74 65 20 61 6e 64 20 74 69 6d 65 0a 20 20 20  ate and time.   
6c80: 20 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74 69         ** functi
6c90: 6f 6e 73 20 61 6e 64 20 6f 74 68 65 72 20 66 75  ons and other fu
6ca0: 6e 63 74 69 6f 6e 73 20 74 68 61 74 20 63 68 61  nctions that cha
6cb0: 6e 67 65 20 73 6c 6f 77 6c 79 20 61 72 65 20 63  nge slowly are c
6cc0: 6f 6e 73 69 64 65 72 65 64 0a 20 20 20 20 20 20  onsidered.      
6cd0: 20 20 20 20 2a 2a 20 63 6f 6e 73 74 61 6e 74 20      ** constant 
6ce0: 62 65 63 61 75 73 65 20 74 68 65 79 20 61 72 65  because they are
6cf0: 20 63 6f 6e 73 74 61 6e 74 20 66 6f 72 20 74 68   constant for th
6d00: 65 20 64 75 72 61 74 69 6f 6e 20 6f 66 20 6f 6e  e duration of on
6d10: 65 20 71 75 65 72 79 20 2a 2f 0a 20 20 20 20 20  e query */.     
6d20: 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70       ExprSetProp
6d30: 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 43 6f  erty(pExpr,EP_Co
6d40: 6e 73 74 46 75 6e 63 29 3b 0a 20 20 20 20 20 20  nstFunc);.      
6d50: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
6d60: 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73  (pDef->funcFlags
6d70: 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43   & SQLITE_FUNC_C
6d80: 4f 4e 53 54 41 4e 54 29 3d 3d 30 20 29 7b 0a 20  ONSTANT)==0 ){. 
6d90: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 65           /* Date
6da0: 2f 74 69 6d 65 20 66 75 6e 63 74 69 6f 6e 73 20  /time functions 
6db0: 74 68 61 74 20 75 73 65 20 27 6e 6f 77 27 2c 20  that use 'now', 
6dc0: 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69  and other functi
6dd0: 6f 6e 73 20 6c 69 6b 65 0a 20 20 20 20 20 20 20  ons like.       
6de0: 20 20 20 2a 2a 20 73 71 6c 69 74 65 5f 76 65 72     ** sqlite_ver
6df0: 73 69 6f 6e 28 29 20 74 68 61 74 20 6d 69 67 68  sion() that migh
6e00: 74 20 63 68 61 6e 67 65 20 6f 76 65 72 20 74 69  t change over ti
6e10: 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 75 73 65  me cannot be use
6e20: 64 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69  d.          ** i
6e30: 6e 20 61 6e 20 69 6e 64 65 78 2e 20 2a 2f 0a 20  n an index. */. 
6e40: 20 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69           notVali
6e50: 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  d(pParse, pNC, "
6e60: 6e 6f 6e 2d 64 65 74 65 72 6d 69 6e 69 73 74 69  non-deterministi
6e70: 63 20 66 75 6e 63 74 69 6f 6e 73 22 2c 0a 20 20  c functions",.  
6e80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6e90: 20 4e 43 5f 49 64 78 45 78 70 72 7c 4e 43 5f 50   NC_IdxExpr|NC_P
6ea0: 61 72 74 49 64 78 29 3b 0a 20 20 20 20 20 20 20  artIdx);.       
6eb0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 28   }.        if( (
6ec0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
6ed0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 49 4e  & SQLITE_FUNC_IN
6ee0: 54 45 52 4e 41 4c 29 21 3d 30 0a 20 20 20 20 20  TERNAL)!=0.     
6ef0: 20 20 20 20 26 26 20 70 50 61 72 73 65 2d 3e 6e      && pParse->n
6f00: 65 73 74 65 64 3d 3d 30 0a 20 20 20 20 20 20 20  ested==0.       
6f10: 20 20 26 26 20 73 71 6c 69 74 65 33 43 6f 6e 66    && sqlite3Conf
6f20: 69 67 2e 62 49 6e 74 65 72 6e 61 6c 46 75 6e 63  ig.bInternalFunc
6f30: 74 69 6f 6e 73 3d 3d 30 0a 20 20 20 20 20 20 20  tions==0.       
6f40: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
6f50: 20 49 6e 74 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e   Internal-use-on
6f60: 6c 79 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  ly functions are
6f70: 20 64 69 73 61 6c 6c 6f 77 65 64 20 75 6e 6c 65   disallowed unle
6f80: 73 73 20 74 68 65 0a 20 20 20 20 20 20 20 20 20  ss the.         
6f90: 20 2a 2a 20 53 51 4c 20 69 73 20 62 65 69 6e 67   ** SQL is being
6fa0: 20 63 6f 6d 70 69 6c 65 64 20 75 73 69 6e 67 20   compiled using 
6fb0: 73 71 6c 69 74 65 33 4e 65 73 74 65 64 50 61 72  sqlite3NestedPar
6fc0: 73 65 28 29 20 2a 2f 0a 20 20 20 20 20 20 20 20  se() */.        
6fd0: 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d    no_such_func =
6fe0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 44   1;.          pD
6ff0: 65 66 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  ef = 0;.        
7000: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  }.      }..     
7010: 20 69 66 28 20 30 3d 3d 49 4e 5f 52 45 4e 41 4d   if( 0==IN_RENAM
7020: 45 5f 4f 42 4a 45 43 54 20 29 7b 0a 23 69 66 6e  E_OBJECT ){.#ifn
7030: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
7040: 57 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20  WINDOWFUNC.     
7050: 20 20 20 61 73 73 65 72 74 28 20 69 73 5f 61 67     assert( is_ag
7060: 67 3d 3d 30 20 7c 7c 20 28 70 44 65 66 2d 3e 66  g==0 || (pDef->f
7070: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
7080: 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 0a 20  E_FUNC_MINMAX). 
7090: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44 65           || (pDe
70a0: 66 2d 3e 78 56 61 6c 75 65 3d 3d 30 20 26 26 20  f->xValue==0 && 
70b0: 70 44 65 66 2d 3e 78 49 6e 76 65 72 73 65 3d 3d  pDef->xInverse==
70c0: 30 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20  0).          || 
70d0: 28 70 44 65 66 2d 3e 78 56 61 6c 75 65 20 26 26  (pDef->xValue &&
70e0: 20 70 44 65 66 2d 3e 78 49 6e 76 65 72 73 65 20   pDef->xInverse 
70f0: 26 26 20 70 44 65 66 2d 3e 78 53 46 75 6e 63 20  && pDef->xSFunc 
7100: 26 26 20 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69  && pDef->xFinali
7110: 7a 65 29 0a 20 20 20 20 20 20 20 20 29 3b 0a 20  ze).        );. 
7120: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 20         if( pDef 
7130: 26 26 20 70 44 65 66 2d 3e 78 56 61 6c 75 65 3d  && pDef->xValue=
7140: 3d 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f  =0 && ExprHasPro
7150: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7160: 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20  WinFunc) ){.    
7170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
7180: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a 20  orMsg(pParse, . 
7190: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 25 2e               "%.
71a0: 2a 73 28 29 20 6d 61 79 20 6e 6f 74 20 62 65 20  *s() may not be 
71b0: 75 73 65 64 20 61 73 20 61 20 77 69 6e 64 6f 77  used as a window
71c0: 20 66 75 6e 63 74 69 6f 6e 22 2c 20 6e 49 64 2c   function", nId,
71d0: 20 7a 49 64 0a 20 20 20 20 20 20 20 20 20 20 29   zId.          )
71e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  ;.          pNC-
71f0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
7200: 20 7d 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20   }else if( .    
7210: 20 20 20 20 20 20 20 20 20 20 28 69 73 5f 61 67            (is_ag
7220: 67 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61  g && (pNC->ncFla
7230: 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67  gs & NC_AllowAgg
7240: 29 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  )==0).          
7250: 20 7c 7c 20 28 69 73 5f 61 67 67 20 26 26 20 28   || (is_agg && (
7260: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 26  pDef->funcFlags&
7270: 53 51 4c 49 54 45 5f 46 55 4e 43 5f 57 49 4e 44  SQLITE_FUNC_WIND
7280: 4f 57 29 20 26 26 20 21 70 45 78 70 72 2d 3e 79  OW) && !pExpr->y
7290: 2e 70 57 69 6e 29 0a 20 20 20 20 20 20 20 20 20  .pWin).         
72a0: 20 20 7c 7c 20 28 69 73 5f 61 67 67 20 26 26 20    || (is_agg && 
72b0: 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20 26 26  pExpr->y.pWin &&
72c0: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
72d0: 20 4e 43 5f 41 6c 6c 6f 77 57 69 6e 29 3d 3d 30   NC_AllowWin)==0
72e0: 29 0a 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20  ).        ){.   
72f0: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
7300: 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20 20 20  r *zType;.      
7310: 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
7320: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
7330: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 29 20 7c  E_FUNC_WINDOW) |
7340: 7c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20  | pExpr->y.pWin 
7350: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a  ){.            z
7360: 54 79 70 65 20 3d 20 22 77 69 6e 64 6f 77 22 3b  Type = "window";
7370: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
7380: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7a 54  {.            zT
7390: 79 70 65 20 3d 20 22 61 67 67 72 65 67 61 74 65  ype = "aggregate
73a0: 22 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  ";.          }. 
73b0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
73c0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
73d0: 20 22 6d 69 73 75 73 65 20 6f 66 20 25 73 20 66   "misuse of %s f
73e0: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
73f0: 7a 54 79 70 65 2c 6e 49 64 2c 7a 49 64 29 3b 0a  zType,nId,zId);.
7400: 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e            pNC->n
7410: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  Err++;.         
7420: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
7430: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
7440: 20 20 20 20 20 69 66 28 20 28 69 73 5f 61 67 67       if( (is_agg
7450: 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67   && (pNC->ncFlag
7460: 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29  s & NC_AllowAgg)
7470: 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ==0) ){.        
7480: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
7490: 67 28 70 50 61 72 73 65 2c 22 6d 69 73 75 73 65  g(pParse,"misuse
74a0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
74b0: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 6e  nction %.*s()",n
74c0: 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  Id,zId);.       
74d0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
74e0: 20 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67            is_agg
74f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 0;.        }.
7500: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 65  #endif.        e
7510: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
7520: 66 75 6e 63 20 26 26 20 70 50 61 72 73 65 2d 3e  func && pParse->
7530: 64 62 2d 3e 69 6e 69 74 2e 62 75 73 79 3d 3d 30  db->init.busy==0
7540: 0a 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 45  .#ifdef SQLITE_E
7550: 4e 41 42 4c 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51  NABLE_UNKNOWN_SQ
7560: 4c 5f 46 55 4e 43 54 49 4f 4e 0a 20 20 20 20 20  L_FUNCTION.     
7570: 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
7580: 70 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d  pParse->explain=
7590: 3d 30 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20  =0.#endif.      
75a0: 20 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73    ){.          s
75b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
75c0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
75d0: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
75e0: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
75f0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
7600: 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  +;.        }else
7610: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
7620: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  rgs ){.         
7630: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7640: 28 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e  (pParse,"wrong n
7650: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
7660: 74 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25  ts to function %
7670: 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20  .*s()",.        
7680: 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64 29         nId, zId)
7690: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  ;.          pNC-
76a0: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
76b0: 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 69   }.        if( i
76c0: 73 5f 61 67 67 20 29 7b 0a 23 69 66 6e 64 65 66  s_agg ){.#ifndef
76d0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
76e0: 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20  DOWFUNC.        
76f0: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26    pNC->ncFlags &
7700: 3d 20 7e 28 70 45 78 70 72 2d 3e 79 2e 70 57 69  = ~(pExpr->y.pWi
7710: 6e 20 3f 20 4e 43 5f 41 6c 6c 6f 77 57 69 6e 20  n ? NC_AllowWin 
7720: 3a 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3b 0a  : NC_AllowAgg);.
7730: 23 65 6c 73 65 0a 20 20 20 20 20 20 20 20 20 20  #else.          
7740: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20  pNC->ncFlags &= 
7750: 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 23 65  ~NC_AllowAgg;.#e
7760: 6e 64 69 66 0a 20 20 20 20 20 20 20 20 7d 0a 20  ndif.        }. 
7770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
7780: 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74  ite3WalkExprList
7790: 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73 74 29  (pWalker, pList)
77a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  ;.      if( is_a
77b0: 67 67 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  gg ){.#ifndef SQ
77c0: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
77d0: 46 55 4e 43 0a 20 20 20 20 20 20 20 20 69 66 28  FUNC.        if(
77e0: 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20 29   pExpr->y.pWin )
77f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
7800: 63 74 20 2a 70 53 65 6c 20 3d 20 70 4e 43 2d 3e  ct *pSel = pNC->
7810: 70 57 69 6e 53 65 6c 65 63 74 3b 0a 20 20 20 20  pWinSelect;.    
7820: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 69 6e        sqlite3Win
7830: 64 6f 77 55 70 64 61 74 65 28 70 50 61 72 73 65  dowUpdate(pParse
7840: 2c 20 70 53 65 6c 2d 3e 70 57 69 6e 44 65 66 6e  , pSel->pWinDefn
7850: 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2c  , pExpr->y.pWin,
7860: 20 70 44 65 66 29 3b 0a 20 20 20 20 20 20 20 20   pDef);.        
7870: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
7880: 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70  rList(pWalker, p
7890: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 50  Expr->y.pWin->pP
78a0: 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 20  artition);.     
78b0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
78c0: 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72  ExprList(pWalker
78d0: 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d  , pExpr->y.pWin-
78e0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
78f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
7900: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
7910: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46  Expr->y.pWin->pF
7920: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  ilter);.        
7930: 20 20 69 66 28 20 30 3d 3d 70 53 65 6c 2d 3e 70    if( 0==pSel->p
7940: 57 69 6e 20 0a 20 20 20 20 20 20 20 20 20 20 20  Win .           
7950: 7c 7c 20 30 3d 3d 73 71 6c 69 74 65 33 57 69 6e  || 0==sqlite3Win
7960: 64 6f 77 43 6f 6d 70 61 72 65 28 70 50 61 72 73  dowCompare(pPars
7970: 65 2c 20 70 53 65 6c 2d 3e 70 57 69 6e 2c 20 70  e, pSel->pWin, p
7980: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 29 20 0a 20  Expr->y.pWin) . 
7990: 20 20 20 20 20 20 20 20 20 29 7b 0a 20 20 20 20           ){.    
79a0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79          pExpr->y
79b0: 2e 70 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 20  .pWin->pNextWin 
79c0: 3d 20 70 53 65 6c 2d 3e 70 57 69 6e 3b 0a 20 20  = pSel->pWin;.  
79d0: 20 20 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e            pSel->
79e0: 70 57 69 6e 20 3d 20 70 45 78 70 72 2d 3e 79 2e  pWin = pExpr->y.
79f0: 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 20 20  pWin;.          
7a00: 7d 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  }.          pNC-
7a10: 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41  >ncFlags |= NC_A
7a20: 6c 6c 6f 77 57 69 6e 3b 0a 20 20 20 20 20 20 20  llowWin;.       
7a30: 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f 2a   }else.#endif /*
7a40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
7a50: 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20 20 20  DOWFUNC */.     
7a60: 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 4e     {.          N
7a70: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 32  ameContext *pNC2
7a80: 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20 20 20   = pNC;.        
7a90: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
7aa0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
7ab0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7ac0: 6f 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  op2 = 0;.       
7ad0: 20 20 20 77 68 69 6c 65 28 20 70 4e 43 32 20 26     while( pNC2 &
7ae0: 26 20 21 73 71 6c 69 74 65 33 46 75 6e 63 74 69  & !sqlite3Functi
7af0: 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 70 45  onUsesThisSrc(pE
7b00: 78 70 72 2c 20 70 4e 43 32 2d 3e 70 53 72 63 4c  xpr, pNC2->pSrcL
7b10: 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ist) ){.        
7b20: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2b 2b      pExpr->op2++
7b30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4e  ;.            pN
7b40: 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65 78 74  C2 = pNC2->pNext
7b50: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7b60: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7b70: 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20  pDef!=0 );.     
7b80: 20 20 20 20 20 69 66 28 20 70 4e 43 32 20 29 7b       if( pNC2 ){
7b90: 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73 73  .            ass
7ba0: 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55 4e 43  ert( SQLITE_FUNC
7bb0: 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d  _MINMAX==NC_MinM
7bc0: 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20 20 20  axAgg );.       
7bd0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 28       testcase( (
7be0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
7bf0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49  & SQLITE_FUNC_MI
7c00: 4e 4d 41 58 29 21 3d 30 20 29 3b 0a 20 20 20 20  NMAX)!=0 );.    
7c10: 20 20 20 20 20 20 20 20 70 4e 43 32 2d 3e 6e 63          pNC2->nc
7c20: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61 73 41  Flags |= NC_HasA
7c30: 67 67 20 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63  gg | (pDef->func
7c40: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
7c50: 55 4e 43 5f 4d 49 4e 4d 41 58 29 3b 0a 0a 20 20  UNC_MINMAX);..  
7c60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7c70: 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73      pNC->ncFlags
7c80: 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b   |= NC_AllowAgg;
7c90: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7ca0: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20   }.      /* FIX 
7cb0: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
7cc0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
7cd0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
7ce0: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
7cf0: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
7d00: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
7d10: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  /.      return W
7d20: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a  RC_Prune;.    }.
7d30: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
7d40: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
7d50: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
7d60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
7d70: 53 54 53 3a 20 20 74 65 73 74 63 61 73 65 28 20  STS:  testcase( 
7d80: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
7d90: 49 53 54 53 20 29 3b 0a 23 65 6e 64 69 66 0a 20  ISTS );.#endif. 
7da0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
7db0: 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
7dc0: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49   pExpr->op==TK_I
7dd0: 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  N );.      if( E
7de0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
7df0: 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
7e00: 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ct) ){.        i
7e10: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
7e20: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 6e 6f 74  Ref;.        not
7e30: 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e  Valid(pParse, pN
7e40: 43 2c 20 22 73 75 62 71 75 65 72 69 65 73 22 2c  C, "subqueries",
7e50: 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43 5f 50   NC_IsCheck|NC_P
7e60: 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45 78 70  artIdx|NC_IdxExp
7e70: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
7e80: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 70 57  te3WalkSelect(pW
7e90: 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e 78 2e  alker, pExpr->x.
7ea0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20  pSelect);.      
7eb0: 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d 3e 6e    assert( pNC->n
7ec0: 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20 20 20  Ref>=nRef );.   
7ed0: 20 20 20 20 20 69 66 28 20 6e 52 65 66 21 3d 70       if( nRef!=p
7ee0: 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20 20 20  NC->nRef ){.    
7ef0: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
7f00: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7f10: 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  VarSelect);.    
7f20: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
7f30: 67 73 20 7c 3d 20 4e 43 5f 56 61 72 53 65 6c 65  gs |= NC_VarSele
7f40: 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ct;.        }.  
7f50: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
7f60: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7f70: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
7f80: 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28  .      notValid(
7f90: 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22 70 61  pParse, pNC, "pa
7fa0: 72 61 6d 65 74 65 72 73 22 2c 20 4e 43 5f 49 73  rameters", NC_Is
7fb0: 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78  Check|NC_PartIdx
7fc0: 7c 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a 20 20  |NC_IdxExpr);.  
7fd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7fe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
7ff0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
8000: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  OT: {.      Expr
8010: 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20   *pRight;.      
8020: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
8030: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8040: 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20  EP_Reduced) );. 
8050: 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20 73       /* Handle s
8060: 70 65 63 69 61 6c 20 63 61 73 65 73 20 6f 66 20  pecial cases of 
8070: 22 78 20 49 53 20 54 52 55 45 22 2c 20 22 78 20  "x IS TRUE", "x 
8080: 49 53 20 46 41 4c 53 45 22 2c 20 22 78 20 49 53  IS FALSE", "x IS
8090: 20 4e 4f 54 20 54 52 55 45 22 2c 0a 20 20 20 20   NOT TRUE",.    
80a0: 20 20 2a 2a 20 61 6e 64 20 22 78 20 49 53 20 4e    ** and "x IS N
80b0: 4f 54 20 46 41 4c 53 45 22 2e 20 2a 2f 0a 20 20  OT FALSE". */.  
80c0: 20 20 20 20 69 66 28 20 28 70 52 69 67 68 74 20      if( (pRight 
80d0: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  = pExpr->pRight)
80e0: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
80f0: 20 20 20 20 20 20 20 69 6e 74 20 72 63 20 3d 20         int rc = 
8100: 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70 28  resolveExprStep(
8110: 70 57 61 6c 6b 65 72 2c 20 70 52 69 67 68 74 29  pWalker, pRight)
8120: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 72 63  ;.        if( rc
8130: 3d 3d 57 52 43 5f 41 62 6f 72 74 20 29 20 72 65  ==WRC_Abort ) re
8140: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
8150: 20 20 20 20 20 20 20 20 69 66 28 20 70 52 69 67          if( pRig
8160: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55 45 46  ht->op==TK_TRUEF
8170: 41 4c 53 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ALSE ){.        
8180: 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d 20 70    pExpr->op2 = p
8190: 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20 20 20  Expr->op;.      
81a0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
81b0: 54 4b 5f 54 52 55 54 48 3b 0a 20 20 20 20 20 20  TK_TRUTH;.      
81c0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
81d0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
81e0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
81f0: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 2a 2f   /* Fall thru */
8200: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8210: 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20 20 20  TK_BETWEEN:.    
8220: 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20  case TK_EQ:.    
8230: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
8240: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
8250: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
8260: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
8270: 63 61 73 65 20 54 4b 5f 47 45 3a 20 7b 0a 20 20  case TK_GE: {.  
8280: 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 2c 20 6e      int nLeft, n
8290: 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28  Right;.      if(
82a0: 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
82b0: 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72 65 61  locFailed ) brea
82c0: 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  k;.      assert(
82d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 21 3d 30   pExpr->pLeft!=0
82e0: 20 29 3b 0a 20 20 20 20 20 20 6e 4c 65 66 74 20   );.      nLeft 
82f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56 65 63  = sqlite3ExprVec
8300: 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 70  torSize(pExpr->p
8310: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28  Left);.      if(
8320: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42   pExpr->op==TK_B
8330: 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20 20 20  ETWEEN ){.      
8340: 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74    nRight = sqlit
8350: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
8360: 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d  (pExpr->x.pList-
8370: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
8380: 20 20 20 20 20 20 69 66 28 20 6e 52 69 67 68 74        if( nRight
8390: 3d 3d 6e 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ==nLeft ){.     
83a0: 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71       nRight = sq
83b0: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
83c0: 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69  ize(pExpr->x.pLi
83d0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
83e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
83f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8400: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
8410: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 20 20  Right!=0 );.    
8420: 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c      nRight = sql
8430: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
8440: 7a 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  ze(pExpr->pRight
8450: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
8460: 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52 69 67   if( nLeft!=nRig
8470: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65  ht ){.        te
8480: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
8490: 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20 20 20  p==TK_EQ );.    
84a0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
84b0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29  xpr->op==TK_NE )
84c0: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
84d0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
84e0: 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20 20 20  K_LT );.        
84f0: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8500: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20  >op==TK_LE );.  
8510: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8520: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54  pExpr->op==TK_GT
8530: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
8540: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8550: 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20 20 20  =TK_GE );.      
8560: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8570: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  r->op==TK_IS );.
8580: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
8590: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
85a0: 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 20  ISNOT );.       
85b0: 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
85c0: 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45 45 4e  ->op==TK_BETWEEN
85d0: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
85e0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
85f0: 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d  se, "row value m
8600: 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20  isused");.      
8610: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
8620: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8630: 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  rn (pParse->nErr
8640: 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   || pParse->db->
8650: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20 3f 20  mallocFailed) ? 
8660: 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52 43 5f  WRC_Abort : WRC_
8670: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
8680: 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61 20 6c  ** pEList is a l
8690: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
86a0: 6e 73 20 77 68 69 63 68 20 61 72 65 20 72 65 61  ns which are rea
86b0: 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74 20 73  lly the result s
86c0: 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61 20 53  et of the.** a S
86d0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
86e0: 20 20 70 45 20 69 73 20 61 20 74 65 72 6d 20 69    pE is a term i
86f0: 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f 72  n an ORDER BY or
8700: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
8710: 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  ..** This routin
8720: 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65 65 20  e checks to see 
8730: 69 66 20 70 45 20 69 73 20 61 20 73 69 6d 70 6c  if pE is a simpl
8740: 65 20 69 64 65 6e 74 69 66 69 65 72 20 77 68 69  e identifier whi
8750: 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73 0a 2a  ch corresponds.*
8760: 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65  * to the AS-name
8770: 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 74   of one of the t
8780: 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78 70 72  erms of the expr
8790: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
87a0: 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69 73 20   it is,.** this 
87b0: 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e 20 61  routine return a
87c0: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
87d0: 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72 65 20  n 1 and N where 
87e0: 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65 72 20  N is the number 
87f0: 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73 20 69  of.** elements i
8800: 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72 65 73  n pEList, corres
8810: 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65 20 6d  ponding to the m
8820: 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e 20 20  atching entry.  
8830: 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a 20 6e  If there is.** n
8840: 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66 20 70  o match, or if p
8850: 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d 70 6c  E is not a simpl
8860: 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20 74 68  e identifier, th
8870: 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  en this routine.
8880: 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a  ** return 0..**.
8890: 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20 62 65  ** pEList has be
88a0: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 70 45  en resolved.  pE
88b0: 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61   has not..*/.sta
88c0: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 41  tic int resolveA
88d0: 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a  sName(.  Parse *
88e0: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
88f0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 66  arsing context f
8900: 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  or error message
8910: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
8920: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
8930: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
8940: 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20 45 78   to scan */.  Ex
8950: 70 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20  pr *pE          
8960: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 77   /* Expression w
8970: 65 20 61 72 65 20 74 72 79 69 6e 67 20 74 6f 20  e are trying to 
8980: 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e  match */.){.  in
8990: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
89a0: 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
89b0: 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f 50 41   */..  UNUSED_PA
89c0: 52 41 4d 45 54 45 52 28 70 50 61 72 73 65 29 3b  RAMETER(pParse);
89d0: 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70 3d 3d  ..  if( pE->op==
89e0: 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63 68 61  TK_ID ){.    cha
89f0: 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e  r *zCol = pE->u.
8a00: 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f 72 28  zToken;.    for(
8a10: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8a20: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8a30: 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45    char *zAs = pE
8a40: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65  List->a[i].zName
8a50: 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41 73 21  ;.      if( zAs!
8a60: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
8a70: 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d  ICmp(zAs, zCol)=
8a80: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  =0 ){.        re
8a90: 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 20 20  turn i+1;.      
8aa0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
8ab0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
8ac0: 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74 65 72   pE is a pointer
8ad0: 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f   to an expressio
8ae0: 6e 20 77 68 69 63 68 20 69 73 20 61 20 73 69 6e  n which is a sin
8af0: 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68 65 0a  gle term in the.
8b00: 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66 20 61  ** ORDER BY of a
8b10: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
8b20: 2e 20 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  .  The expressio
8b30: 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e 0a 2a  n has not been.*
8b40: 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65 64 2e  * name resolved.
8b50: 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20 70 6f  .**.** At the po
8b60: 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69 6e 65  int this routine
8b70: 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65 20 61   is called, we a
8b80: 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68 61 74  lready know that
8b90: 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59   the.** ORDER BY
8ba0: 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61 6e 20   term is not an 
8bb0: 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20 69 6e  integer index in
8bc0: 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  to the result se
8bd0: 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61 73 65  t.  That.** case
8be0: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 74   is handled by t
8bf0: 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69  he calling routi
8c00: 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70  ne..**.** Attemp
8c10: 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20 61 67  t to match pE ag
8c20: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
8c30: 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20   columns in the 
8c40: 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c  left-most.** SEL
8c50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20  ECT statement.  
8c60: 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64 65 78  Return the index
8c70: 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63 68 69   i of the matchi
8c80: 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73  ng column,.** as
8c90: 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e 20 74   an indication t
8ca0: 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74 68 61  o the caller tha
8cb0: 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f 72 74  t it should sort
8cc0: 20 62 79 20 74 68 65 20 69 2d 74 68 20 63 6f 6c   by the i-th col
8cd0: 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65 66 74  umn..** The left
8ce0: 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69 73 20  -most column is 
8cf0: 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77 6f 72  1.  In other wor
8d00: 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20 72 65  ds, the value re
8d10: 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a 2a 2a  turned is the.**
8d20: 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20 76 61   same integer va
8d30: 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64 20 62  lue that would b
8d40: 65 20 75 73 65 64 20 69 6e 20 74 68 65 20 53 51  e used in the SQ
8d50: 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 69  L statement to i
8d60: 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65 20 63  ndicate.** the c
8d70: 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  olumn..**.** If 
8d80: 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63  there is no matc
8d90: 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20 52 65  h, return 0.  Re
8da0: 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20 65 72  turn -1 if an er
8db0: 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73  ror occurs..*/.s
8dc0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
8dd0: 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78  eOrderByTermToEx
8de0: 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20  prList(.  Parse 
8df0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
8e00: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
8e10: 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61 67  for error messag
8e20: 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  es */.  Select *
8e30: 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20 54 68  pSelect,   /* Th
8e40: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
8e50: 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52 44 45  nt with the ORDE
8e60: 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20  R BY clause */. 
8e70: 20 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20   Expr *pE       
8e80: 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65 63 69      /* The speci
8e90: 66 69 63 20 4f 52 44 45 52 20 42 59 20 74 65 72  fic ORDER BY ter
8ea0: 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  m */.){.  int i;
8eb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8ec0: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8ed0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
8ee0: 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f 6c 75  st;  /* The colu
8ef0: 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73 75 6c  mns of the resul
8f00: 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  t set */.  NameC
8f10: 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20 2f 2a  ontext nc;    /*
8f20: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
8f30: 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45 20 2a  r resolving pE *
8f40: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
8f50: 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61         /* Databa
8f60: 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f  se connection */
8f70: 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20 20 20  .  int rc;      
8f80: 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72 6e 20        /* Return 
8f90: 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70 72 6f  code from subpro
8fa0: 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75 38 20  cedures */.  u8 
8fb0: 73 61 76 65 64 53 75 70 70 45 72 72 3b 20 20 20  savedSuppErr;   
8fc0: 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65 20 6f  /* Saved value o
8fd0: 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  f db->suppressEr
8fe0: 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20  r */..  assert( 
8ff0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
9000: 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d 30 20  eger(pE, &i)==0 
9010: 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20 70 53  );.  pEList = pS
9020: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a  elect->pEList;..
9030: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c    /* Resolve all
9040: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 4f 52   names in the OR
9050: 44 45 52 20 42 59 20 74 65 72 6d 20 65 78 70 72  DER BY term expr
9060: 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65  ession.  */.  me
9070: 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73 69 7a  mset(&nc, 0, siz
9080: 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63 2e 70  eof(nc));.  nc.p
9090: 50 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a  Parse = pParse;.
90a0: 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20 3d 20    nc.pSrcList = 
90b0: 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b 0a 20  pSelect->pSrc;. 
90c0: 20 6e 63 2e 75 4e 43 2e 70 45 4c 69 73 74 20 3d   nc.uNC.pEList =
90d0: 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e 6e 63   pEList;.  nc.nc
90e0: 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77  Flags = NC_Allow
90f0: 41 67 67 7c 4e 43 5f 55 45 4c 69 73 74 3b 0a 20  Agg|NC_UEList;. 
9100: 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a 20 20   nc.nErr = 0;.  
9110: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
9120: 0a 20 20 73 61 76 65 64 53 75 70 70 45 72 72 20  .  savedSuppErr 
9130: 3d 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72  = db->suppressEr
9140: 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73  r;.  db->suppres
9150: 73 45 72 72 20 3d 20 31 3b 0a 20 20 72 63 20 3d  sErr = 1;.  rc =
9160: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
9170: 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c 20 70 45  xprNames(&nc, pE
9180: 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72 65 73  );.  db->suppres
9190: 73 45 72 72 20 3d 20 73 61 76 65 64 53 75 70 70  sErr = savedSupp
91a0: 45 72 72 3b 0a 20 20 69 66 28 20 72 63 20 29 20  Err;.  if( rc ) 
91b0: 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20  return 0;..  /* 
91c0: 54 72 79 20 74 6f 20 6d 61 74 63 68 20 74 68 65  Try to match the
91d0: 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73   ORDER BY expres
91e0: 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61 6e 20  sion against an 
91f0: 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2a 20  expression.  ** 
9200: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
9210: 74 2e 20 20 52 65 74 75 72 6e 20 61 6e 20 31 2d  t.  Return an 1-
9220: 62 61 73 65 64 20 69 6e 64 65 78 20 6f 66 20 74  based index of t
9230: 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20 2a 2a  he matching.  **
9240: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 6e 74 72   result-set entr
9250: 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  y..  */.  for(i=
9260: 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78  0; i<pEList->nEx
9270: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 69 66  pr; i++){.    if
9280: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
9290: 70 61 72 65 28 30 2c 20 70 45 4c 69 73 74 2d 3e  pare(0, pEList->
92a0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 2c 20  a[i].pExpr, pE, 
92b0: 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20 20 72  -1)<2 ){.      r
92c0: 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20 7d  eturn i+1;.    }
92d0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f  .  }..  /* If no
92e0: 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e 20 30   match, return 0
92f0: 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20 30 3b  . */.  return 0;
9300: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
9310: 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59 20 6f  te an ORDER BY o
9320: 72 20 47 52 4f 55 50 20 42 59 20 74 65 72 6d 20  r GROUP BY term 
9330: 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65 72 72  out-of-range err
9340: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  or..*/.static vo
9350: 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52  id resolveOutOfR
9360: 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50 61 72  angeError(.  Par
9370: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9380: 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72 6f 72      /* The error
9390: 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20 77 68   context into wh
93a0: 69 63 68 20 74 6f 20 77 72 69 74 65 20 74 68 65  ich to write the
93b0: 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73   error */.  cons
93c0: 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c 20 20  t char *zType,  
93d0: 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f 72     /* "ORDER" or
93e0: 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20 69 6e   "GROUP" */.  in
93f0: 74 20 69 2c 20 20 20 20 20 20 20 20 20 20 20 20  t i,            
9400: 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e 64 65       /* The inde
9410: 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66 20 74  x (1-based) of t
9420: 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72  he term out of r
9430: 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 78  ange */.  int mx
9440: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9450: 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65 72 6d   /* Largest perm
9460: 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20 6f 66  issible value of
9470: 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74   i */.){.  sqlit
9480: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
9490: 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73 20 42  e, .    "%r %s B
94a0: 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20 72 61  Y term out of ra
94b0: 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62 65 20  nge - should be 
94c0: 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e 20 31  ".    "between 1
94d0: 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a 54 79   and %d", i, zTy
94e0: 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  pe, mx);.}../*.*
94f0: 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 4f 52  * Analyze the OR
9500: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 6e  DER BY clause in
9510: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
9520: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 20  CT statement.   
9530: 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68 20 74  Modify.** each t
9540: 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52  erm of the ORDER
9550: 20 42 59 20 63 6c 61 75 73 65 20 69 73 20 61 20   BY clause is a 
9560: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
9570: 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20 61 6e   between 1.** an
9580: 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73 20 74  d N where N is t
9590: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 6f 6c  he number of col
95a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f 6d 70  umns in the comp
95b0: 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a  ound SELECT..**.
95c0: 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  ** ORDER BY term
95d0: 73 20 74 68 61 74 20 61 72 65 20 61 6c 72 65 61  s that are alrea
95e0: 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65  dy an integer be
95f0: 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20 61 72  tween 1 and N ar
9600: 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65 64 2e  e.** unmodified.
9610: 20 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 73    ORDER BY terms
9620: 20 74 68 61 74 20 61 72 65 20 69 6e 74 65 67 65   that are intege
9630: 72 73 20 6f 75 74 73 69 64 65 20 74 68 65 20 72  rs outside the r
9640: 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74 68 72  ange of.** 1 thr
9650: 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74 65 20  ough N generate 
9660: 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44 45 52  an error.  ORDER
9670: 20 42 59 20 74 65 72 6d 73 20 74 68 61 74 20 61   BY terms that a
9680: 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a  re expressions.*
9690: 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20 61 67  * are matched ag
96a0: 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73 65 74  ainst result set
96b0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20   expressions of 
96c0: 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 0a  compound SELECT.
96d0: 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77 69 74  ** beginning wit
96e0: 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73 74 20  h the left-most 
96f0: 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72 6b 69  SELECT and worki
9700: 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20 72 69  ng toward the ri
9710: 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65 20 66  ght..** At the f
9720: 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68 65 20  irst match, the 
9730: 4f 52 44 45 52 20 42 59 20 65 78 70 72 65 73 73  ORDER BY express
9740: 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f 72 6d  ion is transform
9750: 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65 20 69  ed into.** the i
9760: 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20 6e 75  nteger column nu
9770: 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  mber..**.** Retu
9780: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
9790: 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f   errors seen..*/
97a0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
97b0: 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  lveCompoundOrder
97c0: 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  By(.  Parse *pPa
97d0: 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50  rse,        /* P
97e0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20  arsing context. 
97f0: 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73   Leave error mes
9800: 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20  sages here */.  
9810: 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 20  Select *pSelect 
9820: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c        /* The SEL
9830: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  ECT statement co
9840: 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f 52 44  ntaining the ORD
9850: 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e  ER BY */.){.  in
9860: 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  t i;.  ExprList 
9870: 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45 78 70  *pOrderBy;.  Exp
9880: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
9890: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a 20 20   sqlite3 *db;.  
98a0: 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31  int moreToDo = 1
98b0: 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20 3d 20  ;..  pOrderBy = 
98c0: 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65 72 42  pSelect->pOrderB
98d0: 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  y;.  if( pOrderB
98e0: 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  y==0 ) return 0;
98f0: 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  .  db = pParse->
9900: 64 62 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72  db;.  if( pOrder
9910: 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c  By->nExpr>db->aL
9920: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
9930: 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20  T_COLUMN] ){.   
9940: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
9950: 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61  (pParse, "too ma
9960: 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52 44 45  ny terms in ORDE
9970: 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b 0a 20  R BY clause");. 
9980: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
9990: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
99a0: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
99b0: 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65 72 42  ++){.    pOrderB
99c0: 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30  y->a[i].done = 0
99d0: 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63 74 2d  ;.  }.  pSelect-
99e0: 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20 77 68  >pNext = 0;.  wh
99f0: 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e 70 50  ile( pSelect->pP
9a00: 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53 65 6c  rior ){.    pSel
9a10: 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70 4e 65  ect->pPrior->pNe
9a20: 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20  xt = pSelect;.  
9a30: 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65 6c    pSelect = pSel
9a40: 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 7d  ect->pPrior;.  }
9a50: 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c 65 63  .  while( pSelec
9a60: 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20 29 7b  t && moreToDo ){
9a70: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
9a80: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9a90: 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d  ;.    moreToDo =
9aa0: 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74 20 3d   0;.    pEList =
9ab0: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
9ac0: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 45  ;.    assert( pE
9ad0: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 66  List!=0 );.    f
9ae0: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f  or(i=0, pItem=pO
9af0: 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72  rderBy->a; i<pOr
9b00: 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  derBy->nExpr; i+
9b10: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
9b20: 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20 2d 31     int iCol = -1
9b30: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 45  ;.      Expr *pE
9b40: 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20 20 69  , *pDup;.      i
9b50: 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 29  f( pItem->done )
9b60: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
9b70: 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45 78 70   pE = sqlite3Exp
9b80: 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 49 74  rSkipCollate(pIt
9b90: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
9ba0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
9bb0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c 20 26  rIsInteger(pE, &
9bc0: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 20  iCol) ){.       
9bd0: 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20   if( iCol<=0 || 
9be0: 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78  iCol>pEList->nEx
9bf0: 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  pr ){.          
9c00: 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67  resolveOutOfRang
9c10: 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 22  eError(pParse, "
9c20: 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70 45 4c  ORDER", i+1, pEL
9c30: 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20 20 20  ist->nExpr);.   
9c40: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
9c50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9c60: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9c70: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
9c80: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 45 4c  Name(pParse, pEL
9c90: 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20 20 20  ist, pE);.      
9ca0: 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20 29 7b    if( iCol==0 ){
9cb0: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f  .          /* No
9cc0: 77 20 74 65 73 74 20 69 66 20 65 78 70 72 65 73  w test if expres
9cd0: 73 69 6f 6e 20 70 45 20 6d 61 74 63 68 65 73 20  sion pE matches 
9ce0: 6f 6e 65 20 6f 66 20 74 68 65 20 76 61 6c 75 65  one of the value
9cf0: 73 20 72 65 74 75 72 6e 65 64 0a 20 20 20 20 20  s returned.     
9d00: 20 20 20 20 20 2a 2a 20 62 79 20 70 53 65 6c 65       ** by pSele
9d10: 63 74 2e 20 49 6e 20 74 68 65 20 75 73 75 61 6c  ct. In the usual
9d20: 20 63 61 73 65 20 74 68 69 73 20 69 73 20 64 6f   case this is do
9d30: 6e 65 20 62 79 20 64 75 70 6c 69 63 61 74 69 6e  ne by duplicatin
9d40: 67 20 74 68 65 20 0a 20 20 20 20 20 20 20 20 20  g the .         
9d50: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20   ** expression, 
9d60: 72 65 73 6f 6c 76 69 6e 67 20 61 6e 79 20 73 79  resolving any sy
9d70: 6d 62 6f 6c 73 20 69 6e 20 69 74 2c 20 61 6e 64  mbols in it, and
9d80: 20 74 68 65 6e 20 63 6f 6d 70 61 72 69 6e 67 0a   then comparing.
9d90: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 74 20            ** it 
9da0: 61 67 61 69 6e 73 74 20 65 61 63 68 20 65 78 70  against each exp
9db0: 72 65 73 73 69 6f 6e 20 72 65 74 75 72 6e 65 64  ression returned
9dc0: 20 62 79 20 74 68 65 20 53 45 4c 45 43 54 20 73   by the SELECT s
9dd0: 74 61 74 65 6d 65 6e 74 2e 0a 20 20 20 20 20 20  tatement..      
9de0: 20 20 20 20 2a 2a 20 4f 6e 63 65 20 74 68 65 20      ** Once the 
9df0: 63 6f 6d 70 61 72 69 73 6f 6e 73 20 61 72 65 20  comparisons are 
9e00: 66 69 6e 69 73 68 65 64 2c 20 74 68 65 20 64 75  finished, the du
9e10: 70 6c 69 63 61 74 65 20 65 78 70 72 65 73 73 69  plicate expressi
9e20: 6f 6e 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  on.          ** 
9e30: 69 73 20 64 65 6c 65 74 65 64 2e 0a 20 20 20 20  is deleted..    
9e40: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
9e50: 20 20 20 2a 2a 20 4f 72 2c 20 69 66 20 74 68 69     ** Or, if thi
9e60: 73 20 69 73 20 72 75 6e 6e 69 6e 67 20 61 73 20  s is running as 
9e70: 70 61 72 74 20 6f 66 20 61 6e 20 41 4c 54 45 52  part of an ALTER
9e80: 20 54 41 42 4c 45 20 6f 70 65 72 61 74 69 6f 6e   TABLE operation
9e90: 2c 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 72  ,.          ** r
9ea0: 65 73 6f 6c 76 65 20 74 68 65 20 73 79 6d 62 6f  esolve the symbo
9eb0: 6c 73 20 69 6e 20 74 68 65 20 61 63 74 75 61 6c  ls in the actual
9ec0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 6e 6f 74   expression, not
9ed0: 20 61 20 64 75 70 6c 69 63 61 74 65 2e 0a 20 20   a duplicate..  
9ee0: 20 20 20 20 20 20 20 20 2a 2a 20 41 6e 64 2c 20          ** And, 
9ef0: 69 66 20 6f 6e 65 20 6f 66 20 74 68 65 20 63 6f  if one of the co
9f00: 6d 70 61 72 69 73 6f 6e 73 20 69 73 20 73 75 63  mparisons is suc
9f10: 63 65 73 73 66 75 6c 2c 20 6c 65 61 76 65 20 74  cessful, leave t
9f20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20  he expression.  
9f30: 20 20 20 20 20 20 20 20 2a 2a 20 61 73 20 69 73          ** as is
9f40: 20 69 6e 73 74 65 61 64 20 6f 66 20 74 72 61 6e   instead of tran
9f50: 73 66 6f 72 6d 69 6e 67 20 69 74 20 74 6f 20 61  sforming it to a
9f60: 6e 20 69 6e 74 65 67 65 72 20 61 73 20 69 6e 20  n integer as in 
9f70: 74 68 65 20 75 73 75 61 6c 0a 20 20 20 20 20 20  the usual.      
9f80: 20 20 20 20 2a 2a 20 63 61 73 65 2e 20 54 68 69      ** case. Thi
9f90: 73 20 61 6c 6c 6f 77 73 20 74 68 65 20 63 6f 64  s allows the cod
9fa0: 65 20 69 6e 20 61 6c 74 65 72 2e 63 20 74 6f 20  e in alter.c to 
9fb0: 6d 6f 64 69 66 79 20 63 6f 6c 75 6d 6e 0a 20 20  modify column.  
9fc0: 20 20 20 20 20 20 20 20 2a 2a 20 72 65 66 65 72          ** refer
9fd0: 65 72 65 6e 63 65 73 20 77 69 74 68 69 6e 20 74  erences within t
9fe0: 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
9ff0: 65 73 73 69 6f 6e 20 61 73 20 72 65 71 75 69 72  ession as requir
a000: 65 64 2e 20 20 2a 2f 0a 20 20 20 20 20 20 20 20  ed.  */.        
a010: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
a020: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
a030: 20 20 20 20 20 20 70 44 75 70 20 3d 20 70 45 3b        pDup = pE;
a040: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
a050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 44  {.            pD
a060: 75 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  up = sqlite3Expr
a070: 44 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a  Dup(db, pE, 0);.
a080: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a090: 20 20 20 20 20 20 69 66 28 20 21 64 62 2d 3e 6d        if( !db->m
a0a0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20  allocFailed ){. 
a0b0: 20 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72             asser
a0c0: 74 28 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  t(pDup);.       
a0d0: 20 20 20 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f       iCol = reso
a0e0: 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  lveOrderByTermTo
a0f0: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
a100: 20 70 53 65 6c 65 63 74 2c 20 70 44 75 70 29 3b   pSelect, pDup);
a110: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
a120: 20 20 20 20 20 20 20 69 66 28 20 21 49 4e 5f 52         if( !IN_R
a130: 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29 7b 0a  ENAME_OBJECT ){.
a140: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a150: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
a160: 2c 20 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20  , pDup);.       
a170: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
a180: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a190: 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20   iCol>0 ){.     
a1a0: 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20 74 68     /* Convert th
a1b0: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
a1c0: 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20  into an integer 
a1d0: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 43  column number iC
a1e0: 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ol,.        ** t
a1f0: 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20 70 72  aking care to pr
a200: 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c 4c 41  eserve the COLLA
a210: 54 45 20 63 6c 61 75 73 65 20 69 66 20 69 74 20  TE clause if it 
a220: 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20  exists */.      
a230: 20 20 69 66 28 20 21 49 4e 5f 52 45 4e 41 4d 45    if( !IN_RENAME
a240: 5f 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20  _OBJECT ){.     
a250: 20 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20       Expr *pNew 
a260: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62  = sqlite3Expr(db
a270: 2c 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29  , TK_INTEGER, 0)
a280: 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  ;.          if( 
a290: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
a2a0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   1;.          pN
a2b0: 65 77 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f  ew->flags |= EP_
a2c0: 49 6e 74 56 61 6c 75 65 3b 0a 20 20 20 20 20 20  IntValue;.      
a2d0: 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69 56 61 6c      pNew->u.iVal
a2e0: 75 65 20 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20  ue = iCol;.     
a2f0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
a300: 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20 20 20  pExpr==pE ){.   
a310: 20 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e           pItem->
a320: 70 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20  pExpr = pNew;.  
a330: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
a340: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20             Expr 
a350: 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74 65 6d  *pParent = pItem
a360: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ->pExpr;.       
a370: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61       assert( pPa
a380: 72 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c  rent->op==TK_COL
a390: 4c 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20  LATE );.        
a3a0: 20 20 20 20 77 68 69 6c 65 28 20 70 50 61 72 65      while( pPare
a3b0: 6e 74 2d 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  nt->pLeft->op==T
a3c0: 4b 5f 43 4f 4c 4c 41 54 45 20 29 20 70 50 61 72  K_COLLATE ) pPar
a3d0: 65 6e 74 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70  ent = pParent->p
a3e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 20 20 20 20  Left;.          
a3f0: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 65 6e    assert( pParen
a400: 74 2d 3e 70 4c 65 66 74 3d 3d 70 45 20 29 3b 0a  t->pLeft==pE );.
a410: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
a420: 65 6e 74 2d 3e 70 4c 65 66 74 20 3d 20 70 4e 65  ent->pLeft = pNe
a430: 77 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  w;.          }. 
a440: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a450: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
a460: 45 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 49  E);.          pI
a470: 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42  tem->u.x.iOrderB
a480: 79 43 6f 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c  yCol = (u16)iCol
a490: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a4a0: 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20      pItem->done 
a4b0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 1;.      }else
a4c0: 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72 65 54 6f  {.        moreTo
a4d0: 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  Do = 1;.      }.
a4e0: 20 20 20 20 7d 0a 20 20 20 20 70 53 65 6c 65 63      }.    pSelec
a4f0: 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65  t = pSelect->pNe
a500: 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72 28 69 3d  xt;.  }.  for(i=
a510: 30 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d 3e 6e  0; i<pOrderBy->n
a520: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
a530: 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 61 5b  if( pOrderBy->a[
a540: 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b 0a 20 20  i].done==0 ){.  
a550: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a560: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25 72 20  Msg(pParse, "%r 
a570: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 64 6f  ORDER BY term do
a580: 65 73 20 6e 6f 74 20 6d 61 74 63 68 20 61 6e 79  es not match any
a590: 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 22   ".            "
a5a0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
a5b0: 73 75 6c 74 20 73 65 74 22 2c 20 69 2b 31 29 3b  sult set", i+1);
a5c0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
a5d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a5e0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
a5f0: 43 68 65 63 6b 20 65 76 65 72 79 20 74 65 72 6d  Check every term
a600: 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59   in the ORDER BY
a610: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
a620: 75 73 65 20 70 4f 72 64 65 72 42 79 20 6f 66 0a  use pOrderBy of.
a630: 2a 2a 20 74 68 65 20 53 45 4c 45 43 54 20 73 74  ** the SELECT st
a640: 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e  atement pSelect.
a650: 20 20 49 66 20 61 6e 79 20 74 65 72 6d 20 69 73    If any term is
a660: 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 0a   reference to a.
a670: 2a 2a 20 72 65 73 75 6c 74 20 73 65 74 20 65 78  ** result set ex
a680: 70 72 65 73 73 69 6f 6e 20 28 61 73 20 64 65 74  pression (as det
a690: 65 72 6d 69 6e 65 64 20 62 79 20 74 68 65 20 45  ermined by the E
a6a0: 78 70 72 4c 69 73 74 2e 61 2e 75 2e 78 2e 69 4f  xprList.a.u.x.iO
a6b0: 72 64 65 72 42 79 43 6f 6c 0a 2a 2a 20 66 69 65  rderByCol.** fie
a6c0: 6c 64 29 20 74 68 65 6e 20 63 6f 6e 76 65 72 74  ld) then convert
a6d0: 20 74 68 61 74 20 74 65 72 6d 20 69 6e 74 6f 20   that term into 
a6e0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 63 6f  a copy of the co
a6f0: 72 72 65 73 70 6f 6e 64 69 6e 67 20 72 65 73 75  rresponding resu
a700: 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c 75 6d 6e  lt set.** column
a710: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20 65  ..**.** If any e
a720: 72 72 6f 72 73 20 61 72 65 20 64 65 74 65 63 74  rrors are detect
a730: 65 64 2c 20 61 64 64 20 61 6e 20 65 72 72 6f 72  ed, add an error
a740: 20 6d 65 73 73 61 67 65 20 74 6f 20 70 50 61 72   message to pPar
a750: 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74 75 72 6e  se and.** return
a760: 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75   non-zero.  Retu
a770: 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f 20 65 72  rn zero if no er
a780: 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2e 0a 2a  rors are seen..*
a790: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
a7a0: 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79  olveOrderGroupBy
a7b0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
a7c0: 65 2c 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72  e,        /* Par
a7d0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c  sing context.  L
a7e0: 65 61 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61  eave error messa
a7f0: 67 65 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65  ges here */.  Se
a800: 6c 65 63 74 20 2a 70 53 65 6c 65 63 74 2c 20 20  lect *pSelect,  
a810: 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43      /* The SELEC
a820: 54 20 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74  T statement cont
a830: 61 69 6e 69 6e 67 20 74 68 65 20 63 6c 61 75 73  aining the claus
a840: 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  e */.  ExprList 
a850: 2a 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20  *pOrderBy,   /* 
a860: 54 68 65 20 4f 52 44 45 52 20 42 59 20 6f 72 20  The ORDER BY or 
a870: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
a880: 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
a890: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
a8a0: 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 22 4f  *zType     /* "O
a8b0: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
a8c0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   */.){.  int i;.
a8d0: 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d 20    sqlite3 *db = 
a8e0: 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 45 78  pParse->db;.  Ex
a8f0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a900: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a910: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 0a  t_item *pItem;..
a920: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d    if( pOrderBy==
a930: 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62 2d  0 || pParse->db-
a940: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20  >mallocFailed ) 
a950: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
a960: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3e  pOrderBy->nExpr>
a970: 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54  db->aLimit[SQLIT
a980: 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20  E_LIMIT_COLUMN] 
a990: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
a9a0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
a9b0: 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d 73 20 69  too many terms i
a9c0: 6e 20 25 73 20 42 59 20 63 6c 61 75 73 65 22 2c  n %s BY clause",
a9d0: 20 7a 54 79 70 65 29 3b 0a 20 20 20 20 72 65 74   zType);.    ret
a9e0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 70 45 4c  urn 1;.  }.  pEL
a9f0: 69 73 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70  ist = pSelect->p
aa00: 45 4c 69 73 74 3b 0a 20 20 61 73 73 65 72 74 28  EList;.  assert(
aa10: 20 70 45 4c 69 73 74 21 3d 30 20 29 3b 20 20 2f   pEList!=0 );  /
aa20: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 4e  * sqlite3SelectN
aa30: 65 77 28 29 20 67 75 61 72 61 6e 74 65 65 73 20  ew() guarantees 
aa40: 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72 28 69 3d  this */.  for(i=
aa50: 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
aa60: 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79  y->a; i<pOrderBy
aa70: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
aa80: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20  tem++){.    if( 
aa90: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
aaa0: 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20  rByCol ){.      
aab0: 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69  if( pItem->u.x.i
aac0: 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45 4c 69 73  OrderByCol>pELis
aad0: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
aae0: 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66      resolveOutOf
aaf0: 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73  RangeError(pPars
ab00: 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20 70  e, zType, i+1, p
ab10: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
ab20: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
ab30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
ab40: 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50 61 72  esolveAlias(pPar
ab50: 73 65 2c 20 70 45 4c 69 73 74 2c 20 70 49 74 65  se, pEList, pIte
ab60: 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  m->u.x.iOrderByC
ab70: 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e 70 45 78  ol-1, pItem->pEx
ab80: 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  pr,.            
ab90: 20 20 20 20 20 20 20 7a 54 79 70 65 2c 30 29 3b         zType,0);
aba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
abb0: 75 72 6e 20 30 3b 0a 7d 0a 0a 23 69 66 6e 64 65  urn 0;.}..#ifnde
abc0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49  f SQLITE_OMIT_WI
abd0: 4e 44 4f 57 46 55 4e 43 0a 2f 2a 0a 2a 2a 20 57  NDOWFUNC./*.** W
abe0: 61 6c 6b 65 72 20 63 61 6c 6c 62 61 63 6b 20 66  alker callback f
abf0: 6f 72 20 72 65 73 6f 6c 76 65 52 65 6d 6f 76 65  or resolveRemove
ac00: 57 69 6e 64 6f 77 73 28 29 2e 0a 2a 2f 0a 73 74  Windows()..*/.st
ac10: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
ac20: 52 65 6d 6f 76 65 57 69 6e 64 6f 77 73 43 62 28  RemoveWindowsCb(
ac30: 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c  Walker *pWalker,
ac40: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
ac50: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
ac60: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 57  erty(pExpr, EP_W
ac70: 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20 20 20 57  inFunc) ){.    W
ac80: 69 6e 64 6f 77 20 2a 2a 70 70 3b 0a 20 20 20 20  indow **pp;.    
ac90: 66 6f 72 28 70 70 3d 26 70 57 61 6c 6b 65 72 2d  for(pp=&pWalker-
aca0: 3e 75 2e 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e  >u.pSelect->pWin
acb0: 3b 20 2a 70 70 3b 20 70 70 3d 26 28 2a 70 70 29  ; *pp; pp=&(*pp)
acc0: 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20  ->pNextWin){.   
acd0: 20 20 20 69 66 28 20 2a 70 70 3d 3d 70 45 78 70     if( *pp==pExp
ace0: 72 2d 3e 79 2e 70 57 69 6e 20 29 7b 0a 20 20 20  r->y.pWin ){.   
acf0: 20 20 20 20 20 2a 70 70 20 3d 20 28 2a 70 70 29       *pp = (*pp)
ad00: 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a 20 20 20 20  ->pNextWin;.    
ad10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
ad20: 20 7d 20 20 20 20 0a 20 20 20 20 7d 0a 20 20 7d   }    .    }.  }
ad30: 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43 6f  .  return WRC_Co
ad40: 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  ntinue;.}../*.**
ad50: 20 52 65 6d 6f 76 65 20 61 6e 79 20 57 69 6e 64   Remove any Wind
ad60: 6f 77 20 6f 62 6a 65 63 74 73 20 6f 77 6e 65 64  ow objects owned
ad70: 20 62 79 20 74 68 65 20 65 78 70 72 65 73 73 69   by the expressi
ad80: 6f 6e 20 70 45 78 70 72 20 66 72 6f 6d 20 74 68  on pExpr from th
ad90: 65 0a 2a 2a 20 53 65 6c 65 63 74 2e 70 57 69 6e  e.** Select.pWin
ada0: 20 6c 69 73 74 20 6f 66 20 53 65 6c 65 63 74 20   list of Select 
adb0: 6f 62 6a 65 63 74 20 70 53 65 6c 65 63 74 2e 0a  object pSelect..
adc0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
add0: 65 73 6f 6c 76 65 52 65 6d 6f 76 65 57 69 6e 64  esolveRemoveWind
ade0: 6f 77 73 28 53 65 6c 65 63 74 20 2a 70 53 65 6c  ows(Select *pSel
adf0: 65 63 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ect, Expr *pExpr
ae00: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 73 57 61 6c  ){.  Walker sWal
ae10: 6b 65 72 3b 0a 20 20 6d 65 6d 73 65 74 28 26 73  ker;.  memset(&s
ae20: 57 61 6c 6b 65 72 2c 20 30 2c 20 73 69 7a 65 6f  Walker, 0, sizeo
ae30: 66 28 57 61 6c 6b 65 72 29 29 3b 0a 20 20 73 57  f(Walker));.  sW
ae40: 61 6c 6b 65 72 2e 78 45 78 70 72 43 61 6c 6c 62  alker.xExprCallb
ae50: 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 52 65 6d  ack = resolveRem
ae60: 6f 76 65 57 69 6e 64 6f 77 73 43 62 3b 0a 20 20  oveWindowsCb;.  
ae70: 73 57 61 6c 6b 65 72 2e 75 2e 70 53 65 6c 65 63  sWalker.u.pSelec
ae80: 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a 20 20 73  t = pSelect;.  s
ae90: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26  qlite3WalkExpr(&
aea0: 73 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 29 3b  sWalker, pExpr);
aeb0: 0a 7d 0a 23 65 6c 73 65 0a 23 20 64 65 66 69 6e  .}.#else.# defin
aec0: 65 20 72 65 73 6f 6c 76 65 52 65 6d 6f 76 65 57  e resolveRemoveW
aed0: 69 6e 64 6f 77 73 28 78 2c 79 29 0a 23 65 6e 64  indows(x,y).#end
aee0: 69 66 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72  if../*.** pOrder
aef0: 42 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42  By is an ORDER B
af00: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
af10: 61 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 73  ause in SELECT s
af20: 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74  tatement pSelect
af30: 2e 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f  ..** The Name co
af40: 6e 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c  ntext of the SEL
af50: 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73  ECT statement is
af60: 20 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 20   pNC.  zType is 
af70: 65 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52  either.** "ORDER
af80: 22 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 70  " or "GROUP" dep
af90: 65 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20  ending on which 
afa0: 74 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 70  type of clause p
afb0: 4f 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a  OrderBy is..**.*
afc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72  * This routine r
afd0: 65 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 72  esolves each ter
afe0: 6d 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 20  m of the clause 
aff0: 69 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69  into an expressi
b000: 6f 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72  on..** If the or
b010: 64 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61  der-by term is a
b020: 6e 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 77  n integer I betw
b030: 65 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 65  een 1 and N (whe
b040: 72 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e  re N is the.** n
b050: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
b060: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
b070: 65 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54  et of the SELECT
b080: 29 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65  ) then the expre
b090: 73 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20  ssion.** in the 
b0a0: 72 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20  resolution is a 
b0b0: 63 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 68  copy of the I-th
b0c0: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
b0d0: 65 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74  ession.  If.** t
b0e0: 68 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d  he order-by term
b0f0: 20 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65   is an identifie
b100: 72 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e  r that correspon
b110: 64 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d  ds to the AS-nam
b120: 65 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74  e of.** a result
b130: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2c  -set expression,
b140: 20 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 72   then the term r
b150: 65 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f 70  esolves to a cop
b160: 79 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 75  y of the.** resu
b170: 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt-set expressio
b180: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74  n.  Otherwise, t
b190: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b1a0: 20 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20   resolved in.** 
b1b0: 74 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d 20  the usual way - 
b1c0: 75 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 73  using sqlite3Res
b1d0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e  olveExprNames().
b1e0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
b1f0: 69 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20  ine returns the 
b200: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
b210: 2e 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63 63  .  If errors occ
b220: 75 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61  ur, then.** an a
b230: 70 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72  ppropriate error
b240: 20 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20 62   message might b
b250: 65 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65  e left in pParse
b260: 2e 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a  .  (OOM errors.*
b270: 2a 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a  * excepted.).*/.
b280: 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c  static int resol
b290: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a  veOrderGroupBy(.
b2a0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
b2b0: 4e 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e  NC,     /* The n
b2c0: 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74  ame context of t
b2d0: 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d  he SELECT statem
b2e0: 65 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ent */.  Select 
b2f0: 2a 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f  *pSelect,      /
b300: 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61  * The SELECT sta
b310: 74 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70  tement holding p
b320: 4f 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78 70  OrderBy */.  Exp
b330: 72 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c  rList *pOrderBy,
b340: 20 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42     /* An ORDER B
b350: 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c  Y or GROUP BY cl
b360: 61 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65 20  ause to resolve 
b370: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
b380: 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69  *zType     /* Ei
b390: 74 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20  ther "ORDER" or 
b3a0: 22 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72  "GROUP", as appr
b3b0: 6f 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20  opriate */.){.  
b3c0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
b3e0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
b3f0: 2a 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20  */.  int iCol;  
b400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b410: 20 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75      /* Column nu
b420: 6d 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74  mber */.  struct
b430: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
b440: 70 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65  pItem;   /* A te
b450: 72 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20  rm of the ORDER 
b460: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50  BY clause */.  P
b470: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
b480: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b490: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
b4a0: 20 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c   */.  int nResul
b4b0: 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  t;              
b4c0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
b4d0: 66 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72  f terms in the r
b4e0: 65 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20  esult set */..  
b4f0: 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20  if( pOrderBy==0 
b500: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52  ) return 0;.  nR
b510: 65 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d  esult = pSelect-
b520: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  >pEList->nExpr;.
b530: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
b540: 70 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d  pParse;.  for(i=
b550: 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42  0, pItem=pOrderB
b560: 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79  y->a; i<pOrderBy
b570: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
b580: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
b590: 20 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45   *pE = pItem->pE
b5a0: 78 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70  xpr;.    Expr *p
b5b0: 45 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  E2 = sqlite3Expr
b5c0: 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 29 3b  SkipCollate(pE);
b5d0: 0a 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30  .    if( zType[0
b5e0: 5d 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20 20  ]!='G' ){.      
b5f0: 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73  iCol = resolveAs
b600: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 65  Name(pParse, pSe
b610: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45  lect->pEList, pE
b620: 32 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43  2);.      if( iC
b630: 6f 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  ol>0 ){.        
b640: 2f 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65  /* If an AS-name
b650: 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c   match is found,
b660: 20 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52   mark this ORDER
b670: 20 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65   BY column as be
b680: 69 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61  ing.        ** a
b690: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f   copy of the iCo
b6a0: 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20  l-th result-set 
b6b0: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 62  column.  The sub
b6c0: 73 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a  sequent call to.
b6d0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
b6e0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
b6f0: 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e  oupBy() will con
b700: 76 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73  vert the express
b710: 69 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20 20  ion to a.       
b720: 20 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20   ** copy of the 
b730: 69 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73  iCol-th result-s
b740: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a  et expression. *
b750: 2f 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  /.        pItem-
b760: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
b770: 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20   = (u16)iCol;.  
b780: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
b790: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
b7a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
b7b0: 72 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20  rIsInteger(pE2, 
b7c0: 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20  &iCol) ){.      
b7d0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
b7e0: 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67  term is an integ
b7f0: 65 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 67  er constant.  Ag
b800: 61 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f 6c  ain, set the col
b810: 75 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d  umn.      ** num
b820: 62 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c 69  ber so that sqli
b830: 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47  te3ResolveOrderG
b840: 72 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f  roupBy() will co
b850: 6e 76 65 72 74 20 74 68 65 0a 20 20 20 20 20 20  nvert the.      
b860: 2a 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d  ** order-by term
b870: 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68   to a copy of th
b880: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  e result-set exp
b890: 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ression */.     
b8a0: 20 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 69   if( iCol<1 || i
b8b0: 43 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20 20  Col>0xffff ){.  
b8c0: 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74        resolveOut
b8d0: 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61  OfRangeError(pPa
b8e0: 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c  rse, zType, i+1,
b8f0: 20 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20   nResult);.     
b900: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
b910: 20 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d     }.      pItem
b920: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
b930: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
b940: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
b950: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68     }..    /* Oth
b960: 65 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 68  erwise, treat th
b970: 65 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20  e ORDER BY term 
b980: 61 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 65  as an ordinary e
b990: 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20  xpression */.   
b9a0: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
b9b0: 65 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20  erByCol = 0;.   
b9c0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
b9d0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43  lveExprNames(pNC
b9e0: 2c 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72  , pE) ){.      r
b9f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
ba00: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53     for(j=0; j<pS
ba10: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
ba20: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
ba30: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
ba40: 72 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 2c 20  rCompare(0, pE, 
ba50: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
ba60: 3e 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29  >a[j].pExpr, -1)
ba70: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ==0 ){.        /
ba80: 2a 20 53 69 6e 63 65 20 74 68 69 73 20 65 78 70  * Since this exp
ba90: 72 65 73 69 6f 6e 20 69 73 20 62 65 69 6e 67 20  resion is being 
baa0: 63 68 61 6e 67 65 64 20 69 6e 74 6f 20 61 20 72  changed into a r
bab0: 65 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20  eference.       
bac0: 20 2a 2a 20 74 6f 20 61 6e 20 69 64 65 6e 74 69   ** to an identi
bad0: 63 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 20 69  cal expression i
bae0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
baf0: 2c 20 72 65 6d 6f 76 65 20 61 6c 6c 20 57 69 6e  , remove all Win
bb00: 64 6f 77 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f  dow.        ** o
bb10: 62 6a 65 63 74 73 20 62 65 6c 6f 6e 67 69 6e 67  bjects belonging
bb20: 20 74 6f 20 74 68 65 20 65 78 70 72 65 73 73 69   to the expressi
bb30: 6f 6e 20 66 72 6f 6d 20 74 68 65 20 53 65 6c 65  on from the Sele
bb40: 63 74 2e 70 57 69 6e 20 6c 69 73 74 2e 20 2a 2f  ct.pWin list. */
bb50: 0a 20 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65  .        resolve
bb60: 52 65 6d 6f 76 65 57 69 6e 64 6f 77 73 28 70 53  RemoveWindows(pS
bb70: 65 6c 65 63 74 2c 20 70 45 29 3b 0a 20 20 20 20  elect, pE);.    
bb80: 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
bb90: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 6a 2b 31  OrderByCol = j+1
bba0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
bbb0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
bbc0: 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72  ite3ResolveOrder
bbd0: 47 72 6f 75 70 42 79 28 70 50 61 72 73 65 2c 20  GroupBy(pParse, 
bbe0: 70 53 65 6c 65 63 74 2c 20 70 4f 72 64 65 72 42  pSelect, pOrderB
bbf0: 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a 0a 2f 2a  y, zType);.}../*
bc00: 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65  .** Resolve name
bc10: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
bc20: 73 74 61 74 65 6d 65 6e 74 20 70 20 61 6e 64 20  statement p and 
bc30: 61 6c 6c 20 6f 66 20 69 74 73 20 64 65 73 63 65  all of its desce
bc40: 6e 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74 61 74 69  ndants..*/.stati
bc50: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 53 65 6c  c int resolveSel
bc60: 65 63 74 53 74 65 70 28 57 61 6c 6b 65 72 20 2a  ectStep(Walker *
bc70: 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74 20  pWalker, Select 
bc80: 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  *p){.  NameConte
bc90: 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b 20 20 2f  xt *pOuterNC;  /
bca0: 2a 20 43 6f 6e 74 65 78 74 20 74 68 61 74 20 63  * Context that c
bcb0: 6f 6e 74 61 69 6e 73 20 74 68 69 73 20 53 45 4c  ontains this SEL
bcc0: 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ECT */.  NameCon
bcd0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
bce0: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
bcf0: 20 6f 66 20 74 68 69 73 20 53 45 4c 45 43 54 20   of this SELECT 
bd00: 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f 6d 70 6f  */.  int isCompo
bd10: 75 6e 64 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  und;         /* 
bd20: 54 72 75 65 20 69 66 20 70 20 69 73 20 61 20 63  True if p is a c
bd30: 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63 74 20 2a  ompound select *
bd40: 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70 6f 75 6e  /.  int nCompoun
bd50: 64 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  d;          /* N
bd60: 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70 6f 75 6e  umber of compoun
bd70: 64 20 74 65 72 6d 73 20 70 72 6f 63 65 73 73 65  d terms processe
bd80: 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 50 61  d so far */.  Pa
bd90: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
bda0: 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67        /* Parsing
bdb0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e   context */.  in
bdc0: 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20 20  t i;            
bdd0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
bde0: 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78 70 72 4c  unter */.  ExprL
bdf0: 69 73 74 20 2a 70 47 72 6f 75 70 42 79 3b 20 20  ist *pGroupBy;  
be00: 20 20 20 2f 2a 20 54 68 65 20 47 52 4f 55 50 20     /* The GROUP 
be10: 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 53  BY clause */.  S
be20: 65 6c 65 63 74 20 2a 70 4c 65 66 74 6d 6f 73 74  elect *pLeftmost
be30: 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66 74 2d 6d  ;      /* Left-m
be40: 6f 73 74 20 6f 66 20 53 45 4c 45 43 54 20 6f 66  ost of SELECT of
be50: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a 2f 0a 20   a compound */. 
be60: 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20   sqlite3 *db;   
be70: 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61           /* Data
be80: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
be90: 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65 72 74 28  */.  ..  assert(
bea0: 20 70 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70   p!=0 );.  if( p
beb0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
bec0: 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20 20 20 20  Resolved ){.    
bed0: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
bee0: 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 65 72 4e 43  ;.  }.  pOuterNC
bef0: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
bf00: 43 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 57  C;.  pParse = pW
bf10: 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65 3b 0a 20  alker->pParse;. 
bf20: 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62   db = pParse->db
bf30: 3b 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61 6c 6c 79  ;..  /* Normally
bf40: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
bf50: 70 61 6e 64 28 29 20 77 69 6c 6c 20 62 65 20 63  pand() will be c
bf60: 61 6c 6c 65 64 20 66 69 72 73 74 20 61 6e 64 20  alled first and 
bf70: 77 69 6c 6c 20 68 61 76 65 0a 20 20 2a 2a 20 61  will have.  ** a
bf80: 6c 72 65 61 64 79 20 65 78 70 61 6e 64 65 64 20  lready expanded 
bf90: 74 68 69 73 20 53 45 4c 45 43 54 2e 20 20 48 6f  this SELECT.  Ho
bfa0: 77 65 76 65 72 2c 20 69 66 20 74 68 69 73 20 69  wever, if this i
bfb0: 73 20 61 20 73 75 62 71 75 65 72 79 20 77 69 74  s a subquery wit
bfc0: 68 69 6e 0a 20 20 2a 2a 20 61 6e 20 65 78 70 72  hin.  ** an expr
bfd0: 65 73 73 69 6f 6e 2c 20 73 71 6c 69 74 65 33 52  ession, sqlite3R
bfe0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
bff0: 29 20 77 69 6c 6c 20 62 65 20 63 61 6c 6c 65 64  ) will be called
c000: 20 77 69 74 68 6f 75 74 20 61 0a 20 20 2a 2a 20   without a.  ** 
c010: 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f 20 73 71  prior call to sq
c020: 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e  lite3SelectExpan
c030: 64 28 29 2e 20 20 57 68 65 6e 20 74 68 61 74 20  d().  When that 
c040: 68 61 70 70 65 6e 73 2c 20 6c 65 74 0a 20 20 2a  happens, let.  *
c050: 2a 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50  * sqlite3SelectP
c060: 72 65 70 28 29 20 64 6f 20 61 6c 6c 20 6f 66 20  rep() do all of 
c070: 74 68 65 20 70 72 6f 63 65 73 73 69 6e 67 20 66  the processing f
c080: 6f 72 20 74 68 69 73 20 53 45 4c 45 43 54 2e 0a  or this SELECT..
c090: 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    ** sqlite3Sele
c0a0: 63 74 50 72 65 70 28 29 20 77 69 6c 6c 20 69 6e  ctPrep() will in
c0b0: 76 6f 6b 65 20 62 6f 74 68 20 73 71 6c 69 74 65  voke both sqlite
c0c0: 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20  3SelectExpand() 
c0d0: 61 6e 64 0a 20 20 2a 2a 20 74 68 69 73 20 72 6f  and.  ** this ro
c0e0: 75 74 69 6e 65 20 69 6e 20 74 68 65 20 63 6f 72  utine in the cor
c0f0: 72 65 63 74 20 6f 72 64 65 72 2e 0a 20 20 2a 2f  rect order..  */
c100: 0a 20 20 69 66 28 20 28 70 2d 3e 73 65 6c 46 6c  .  if( (p->selFl
c110: 61 67 73 20 26 20 53 46 5f 45 78 70 61 6e 64 65  ags & SF_Expande
c120: 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  d)==0 ){.    sql
c130: 69 74 65 33 53 65 6c 65 63 74 50 72 65 70 28 70  ite3SelectPrep(p
c140: 50 61 72 73 65 2c 20 70 2c 20 70 4f 75 74 65 72  Parse, p, pOuter
c150: 4e 43 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  NC);.    return 
c160: 28 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c  (pParse->nErr ||
c170: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
c180: 64 29 20 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a  d) ? WRC_Abort :
c190: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a   WRC_Prune;.  }.
c1a0: 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64 20 3d 20  .  isCompound = 
c1b0: 70 2d 3e 70 50 72 69 6f 72 21 3d 30 3b 0a 20 20  p->pPrior!=0;.  
c1c0: 6e 43 6f 6d 70 6f 75 6e 64 20 3d 20 30 3b 0a 20  nCompound = 0;. 
c1d0: 20 70 4c 65 66 74 6d 6f 73 74 20 3d 20 70 3b 0a   pLeftmost = p;.
c1e0: 20 20 77 68 69 6c 65 28 20 70 20 29 7b 0a 20 20    while( p ){.  
c1f0: 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65    assert( (p->se
c200: 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
c210: 6e 64 65 64 29 21 3d 30 20 29 3b 0a 20 20 20 20  nded)!=0 );.    
c220: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
c230: 6c 61 67 73 20 26 20 53 46 5f 52 65 73 6f 6c 76  lags & SF_Resolv
c240: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 2d  ed)==0 );.    p-
c250: 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f  >selFlags |= SF_
c260: 52 65 73 6f 6c 76 65 64 3b 0a 0a 20 20 20 20 2f  Resolved;..    /
c270: 2a 20 52 65 73 6f 6c 76 65 20 74 68 65 20 65 78  * Resolve the ex
c280: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
c290: 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46 46 53 45   LIMIT and OFFSE
c2a0: 54 20 63 6c 61 75 73 65 73 2e 20 54 68 65 73 65  T clauses. These
c2b0: 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e 6f 74 20  .    ** are not 
c2c0: 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65 66 65 72  allowed to refer
c2d0: 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73 2c 20 73   to any names, s
c2e0: 6f 20 70 61 73 73 20 61 6e 20 65 6d 70 74 79 20  o pass an empty 
c2f0: 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a 20 20 20  NameContext..   
c300: 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65 74 28 26   */.    memset(&
c310: 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66 28 73  sNC, 0, sizeof(s
c320: 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43 2e 70 50  NC));.    sNC.pP
c330: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
c340: 20 20 20 73 4e 43 2e 70 57 69 6e 53 65 6c 65 63     sNC.pWinSelec
c350: 74 20 3d 20 70 3b 0a 20 20 20 20 69 66 28 20 73  t = p;.    if( s
c360: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c370: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  rNames(&sNC, p->
c380: 70 4c 69 6d 69 74 29 20 29 7b 0a 20 20 20 20 20  pLimit) ){.     
c390: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
c3a0: 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  t;.    }..    /*
c3b0: 20 49 66 20 74 68 65 20 53 46 5f 43 6f 6e 76 65   If the SF_Conve
c3c0: 72 74 65 64 20 66 6c 61 67 73 20 69 73 20 73 65  rted flags is se
c3d0: 74 2c 20 74 68 65 6e 20 74 68 69 73 20 53 65 6c  t, then this Sel
c3e0: 65 63 74 20 6f 62 6a 65 63 74 20 77 61 73 0a 20  ect object was. 
c3f0: 20 20 20 2a 2a 20 77 61 73 20 63 72 65 61 74 65     ** was create
c400: 64 20 62 79 20 74 68 65 20 63 6f 6e 76 65 72 74  d by the convert
c410: 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63 74 54 6f  CompoundSelectTo
c420: 53 75 62 71 75 65 72 79 28 29 20 66 75 6e 63 74  Subquery() funct
c430: 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49 6e 20 74  ion..    ** In t
c440: 68 69 73 20 63 61 73 65 20 74 68 65 20 4f 52 44  his case the ORD
c450: 45 52 20 42 59 20 63 6c 61 75 73 65 20 28 70 2d  ER BY clause (p-
c460: 3e 70 4f 72 64 65 72 42 79 29 20 73 68 6f 75 6c  >pOrderBy) shoul
c470: 64 20 62 65 20 72 65 73 6f 6c 76 65 64 0a 20 20  d be resolved.  
c480: 20 20 2a 2a 20 61 73 20 69 66 20 69 74 20 77 65    ** as if it we
c490: 72 65 20 70 61 72 74 20 6f 66 20 74 68 65 20 73  re part of the s
c4a0: 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74 20 74 68  ub-query, not th
c4b0: 65 20 70 61 72 65 6e 74 2e 20 54 68 69 73 20 62  e parent. This b
c4c0: 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d 6f 76 65  lock.    ** move
c4d0: 73 20 74 68 65 20 70 4f 72 64 65 72 42 79 20 64  s the pOrderBy d
c4e0: 6f 77 6e 20 74 6f 20 74 68 65 20 73 75 62 2d 71  own to the sub-q
c4f0: 75 65 72 79 2e 20 49 74 20 77 69 6c 6c 20 62 65  uery. It will be
c500: 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20 20 20 20   moved back.    
c510: 2a 2a 20 61 66 74 65 72 20 74 68 65 20 6e 61 6d  ** after the nam
c520: 65 73 20 68 61 76 65 20 62 65 65 6e 20 72 65 73  es have been res
c530: 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20 20 20 69  olved.  */.    i
c540: 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26  f( p->selFlags &
c550: 20 53 46 5f 43 6f 6e 76 65 72 74 65 64 20 29 7b   SF_Converted ){
c560: 0a 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a 70  .      Select *p
c570: 53 75 62 20 3d 20 70 2d 3e 70 53 72 63 2d 3e 61  Sub = p->pSrc->a
c580: 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a 20 20 20  [0].pSelect;.   
c590: 20 20 20 61 73 73 65 72 74 28 20 70 2d 3e 70 53     assert( p->pS
c5a0: 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26 26 20 70  rc->nSrc==1 && p
c5b0: 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b 0a 20 20  ->pOrderBy );.  
c5c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 53 75 62      assert( pSub
c5d0: 2d 3e 70 50 72 69 6f 72 20 26 26 20 70 53 75 62  ->pPrior && pSub
c5e0: 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30 20 29 3b  ->pOrderBy==0 );
c5f0: 0a 20 20 20 20 20 20 70 53 75 62 2d 3e 70 4f 72  .      pSub->pOr
c600: 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f 72 64 65  derBy = p->pOrde
c610: 72 42 79 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f  rBy;.      p->pO
c620: 72 64 65 72 42 79 20 3d 20 30 3b 0a 20 20 20 20  rderBy = 0;.    
c630: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 63 75  }.  .    /* Recu
c640: 72 73 69 76 65 6c 79 20 72 65 73 6f 6c 76 65 20  rsively resolve 
c650: 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20 73 75 62  names in all sub
c660: 71 75 65 72 69 65 73 0a 20 20 20 20 2a 2f 0a 20  queries.    */. 
c670: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
c680: 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b  >pSrc->nSrc; i++
c690: 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  ){.      struct 
c6a0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
c6b0: 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72 63 2d 3e  tem = &p->pSrc->
c6c0: 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69 66 28 20  a[i];.      if( 
c6d0: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26  pItem->pSelect &
c6e0: 26 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  & (pItem->pSelec
c6f0: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
c700: 5f 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 7b  _Resolved)==0 ){
c710: 0a 20 20 20 20 20 20 20 20 4e 61 6d 65 43 6f 6e  .        NameCon
c720: 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20 20 20  text *pNC;      
c730: 20 20 20 2f 2a 20 55 73 65 64 20 74 6f 20 69 74     /* Used to it
c740: 65 72 61 74 65 20 6e 61 6d 65 20 63 6f 6e 74 65  erate name conte
c750: 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 69  xts */.        i
c760: 6e 74 20 6e 52 65 66 20 3d 20 30 3b 20 20 20 20  nt nRef = 0;    
c770: 20 20 20 20 20 20 20 20 20 2f 2a 20 52 65 66 63           /* Refc
c780: 6f 75 6e 74 20 66 6f 72 20 70 4f 75 74 65 72 4e  ount for pOuterN
c790: 43 20 61 6e 64 20 6f 75 74 65 72 20 63 6f 6e 74  C and outer cont
c7a0: 65 78 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20  exts */.        
c7b0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 61 76  const char *zSav
c7c0: 65 64 43 6f 6e 74 65 78 74 20 3d 20 70 50 61 72  edContext = pPar
c7d0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
c7e0: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 6f  ;..        /* Co
c7f0: 75 6e 74 20 74 68 65 20 74 6f 74 61 6c 20 6e 75  unt the total nu
c800: 6d 62 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63  mber of referenc
c810: 65 73 20 74 6f 20 70 4f 75 74 65 72 4e 43 20 61  es to pOuterNC a
c820: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 0a 20 20  nd all of its.  
c830: 20 20 20 20 20 20 2a 2a 20 70 61 72 65 6e 74 20        ** parent 
c840: 63 6f 6e 74 65 78 74 73 2e 20 41 66 74 65 72 20  contexts. After 
c850: 72 65 73 6f 6c 76 69 6e 67 20 72 65 66 65 72 65  resolving refere
c860: 6e 63 65 73 20 74 6f 20 65 78 70 72 65 73 73 69  nces to expressi
c870: 6f 6e 73 20 69 6e 0a 20 20 20 20 20 20 20 20 2a  ons in.        *
c880: 2a 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  * pItem->pSelect
c890: 2c 20 63 68 65 63 6b 20 69 66 20 74 68 69 73 20  , check if this 
c8a0: 76 61 6c 75 65 20 68 61 73 20 63 68 61 6e 67 65  value has change
c8b0: 64 2e 20 49 66 20 73 6f 2c 20 74 68 65 6e 0a 20  d. If so, then. 
c8c0: 20 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54         ** SELECT
c8d0: 20 73 74 61 74 65 6d 65 6e 74 20 70 49 74 65 6d   statement pItem
c8e0: 2d 3e 70 53 65 6c 65 63 74 20 6d 75 73 74 20 62  ->pSelect must b
c8f0: 65 20 63 6f 72 72 65 6c 61 74 65 64 2e 20 53 65  e correlated. Se
c900: 74 20 74 68 65 0a 20 20 20 20 20 20 20 20 2a 2a  t the.        **
c910: 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72   pItem->fg.isCor
c920: 72 65 6c 61 74 65 64 20 66 6c 61 67 20 69 66 20  related flag if 
c930: 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73 65  this is the case
c940: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
c950: 28 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70  (pNC=pOuterNC; p
c960: 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65  NC; pNC=pNC->pNe
c970: 78 74 29 20 6e 52 65 66 20 2b 3d 20 70 4e 43 2d  xt) nRef += pNC-
c980: 3e 6e 52 65 66 3b 0a 0a 20 20 20 20 20 20 20 20  >nRef;..        
c990: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65  if( pItem->zName
c9a0: 20 29 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   ) pParse->zAuth
c9b0: 43 6f 6e 74 65 78 74 20 3d 20 70 49 74 65 6d 2d  Context = pItem-
c9c0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
c9d0: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
c9e0: 6c 65 63 74 4e 61 6d 65 73 28 70 50 61 72 73 65  lectNames(pParse
c9f0: 2c 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  , pItem->pSelect
ca00: 2c 20 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20  , pOuterNC);.   
ca10: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 7a 41 75       pParse->zAu
ca20: 74 68 43 6f 6e 74 65 78 74 20 3d 20 7a 53 61 76  thContext = zSav
ca30: 65 64 43 6f 6e 74 65 78 74 3b 0a 20 20 20 20 20  edContext;.     
ca40: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
ca50: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
ca60: 63 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e  cFailed ) return
ca70: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20   WRC_Abort;..   
ca80: 20 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75       for(pNC=pOu
ca90: 74 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d  terNC; pNC; pNC=
caa0: 70 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66  pNC->pNext) nRef
cab0: 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 20   -= pNC->nRef;. 
cac0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
cad0: 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65  Item->fg.isCorre
cae0: 6c 61 74 65 64 3d 3d 30 20 26 26 20 6e 52 65 66  lated==0 && nRef
caf0: 3c 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  <=0 );.        p
cb00: 49 74 65 6d 2d 3e 66 67 2e 69 73 43 6f 72 72 65  Item->fg.isCorre
cb10: 6c 61 74 65 64 20 3d 20 28 6e 52 65 66 21 3d 30  lated = (nRef!=0
cb20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
cb30: 0a 20 20 0a 20 20 20 20 2f 2a 20 53 65 74 20 75  .  .    /* Set u
cb40: 70 20 74 68 65 20 6c 6f 63 61 6c 20 6e 61 6d 65  p the local name
cb50: 2d 63 6f 6e 74 65 78 74 20 74 6f 20 70 61 73 73  -context to pass
cb60: 20 74 6f 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   to sqlite3Resol
cb70: 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 74 6f  veExprNames() to
cb80: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 20  .    ** resolve 
cb90: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65  the result-set e
cba0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
cbb0: 20 20 20 20 2a 2f 0a 20 20 20 20 73 4e 43 2e 6e      */.    sNC.n
cbc0: 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c 6f  cFlags = NC_Allo
cbd0: 77 41 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e  wAgg|NC_AllowWin
cbe0: 3b 0a 20 20 20 20 73 4e 43 2e 70 53 72 63 4c 69  ;.    sNC.pSrcLi
cbf0: 73 74 20 3d 20 70 2d 3e 70 53 72 63 3b 0a 20 20  st = p->pSrc;.  
cc00: 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20 70 4f    sNC.pNext = pO
cc10: 75 74 65 72 4e 43 3b 0a 20 20 0a 20 20 20 20 2f  uterNC;.  .    /
cc20: 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20  * Resolve names 
cc30: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
cc40: 74 2e 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71  t. */.    if( sq
cc50: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
cc60: 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ListNames(&sNC, 
cc70: 70 2d 3e 70 45 4c 69 73 74 29 20 29 20 72 65 74  p->pEList) ) ret
cc80: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
cc90: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26     sNC.ncFlags &
cca0: 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a  = ~NC_AllowWin;.
ccb0: 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
ccc0: 72 65 20 61 72 65 20 6e 6f 20 61 67 67 72 65 67  re are no aggreg
ccd0: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e  ate functions in
cce0: 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 2c   the result-set,
ccf0: 20 61 6e 64 20 6e 6f 20 47 52 4f 55 50 20 42 59   and no GROUP BY
cd00: 20 0a 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73   .    ** express
cd10: 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20 61 6c 6c 6f  ion, do not allo
cd20: 77 20 61 67 67 72 65 67 61 74 65 73 20 69 6e 20  w aggregates in 
cd30: 61 6e 79 20 6f 66 20 74 68 65 20 6f 74 68 65 72  any of the other
cd40: 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 0a 20 20   expressions..  
cd50: 20 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28    */.    assert(
cd60: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
cd70: 53 46 5f 41 67 67 72 65 67 61 74 65 29 3d 3d 30  SF_Aggregate)==0
cd80: 20 29 3b 0a 20 20 20 20 70 47 72 6f 75 70 42 79   );.    pGroupBy
cd90: 20 3d 20 70 2d 3e 70 47 72 6f 75 70 42 79 3b 0a   = p->pGroupBy;.
cda0: 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42 79      if( pGroupBy
cdb0: 20 7c 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73   || (sNC.ncFlags
cdc0: 20 26 20 4e 43 5f 48 61 73 41 67 67 29 21 3d 30   & NC_HasAgg)!=0
cdd0: 20 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74   ){.      assert
cde0: 28 20 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 3d 3d  ( NC_MinMaxAgg==
cdf0: 53 46 5f 4d 69 6e 4d 61 78 41 67 67 20 29 3b 0a  SF_MinMaxAgg );.
ce00: 20 20 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67        p->selFlag
ce10: 73 20 7c 3d 20 53 46 5f 41 67 67 72 65 67 61 74  s |= SF_Aggregat
ce20: 65 20 7c 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73  e | (sNC.ncFlags
ce30: 26 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a  &NC_MinMaxAgg);.
ce40: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
ce50: 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20   sNC.ncFlags &= 
ce60: 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20  ~NC_AllowAgg;.  
ce70: 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66    }.  .    /* If
ce80: 20 61 20 48 41 56 49 4e 47 20 63 6c 61 75 73 65   a HAVING clause
ce90: 20 69 73 20 70 72 65 73 65 6e 74 2c 20 74 68 65   is present, the
cea0: 6e 20 74 68 65 72 65 20 6d 75 73 74 20 62 65 20  n there must be 
ceb0: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
cec0: 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  e..    */.    if
ced0: 28 20 70 2d 3e 70 48 61 76 69 6e 67 20 26 26 20  ( p->pHaving && 
cee0: 21 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20 20  !pGroupBy ){.   
cef0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
cf00: 73 67 28 70 50 61 72 73 65 2c 20 22 61 20 47 52  sg(pParse, "a GR
cf10: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 73  OUP BY clause is
cf20: 20 72 65 71 75 69 72 65 64 20 62 65 66 6f 72 65   required before
cf30: 20 48 41 56 49 4e 47 22 29 3b 0a 20 20 20 20 20   HAVING");.     
cf40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
cf50: 74 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  t;.    }.  .    
cf60: 2f 2a 20 41 64 64 20 74 68 65 20 6f 75 74 70 75  /* Add the outpu
cf70: 74 20 63 6f 6c 75 6d 6e 20 6c 69 73 74 20 74 6f  t column list to
cf80: 20 74 68 65 20 6e 61 6d 65 2d 63 6f 6e 74 65 78   the name-contex
cf90: 74 20 62 65 66 6f 72 65 20 70 61 72 73 69 6e 67  t before parsing
cfa0: 20 74 68 65 0a 20 20 20 20 2a 2a 20 6f 74 68 65   the.    ** othe
cfb0: 72 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  r expressions in
cfc0: 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   the SELECT stat
cfd0: 65 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 73  ement. This is s
cfe0: 6f 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 65 78  o that.    ** ex
cff0: 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  pressions in the
d000: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 28 65   WHERE clause (e
d010: 74 63 2e 29 20 63 61 6e 20 72 65 66 65 72 20 74  tc.) can refer t
d020: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 62 79  o expressions by
d030: 0a 20 20 20 20 2a 2a 20 61 6c 69 61 73 65 73 20  .    ** aliases 
d040: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
d050: 74 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  t..    **.    **
d060: 20 4d 69 6e 6f 72 20 70 6f 69 6e 74 3a 20 49 66   Minor point: If
d070: 20 74 68 69 73 20 69 73 20 74 68 65 20 63 61 73   this is the cas
d080: 65 2c 20 74 68 65 6e 20 74 68 65 20 65 78 70 72  e, then the expr
d090: 65 73 73 69 6f 6e 20 77 69 6c 6c 20 62 65 0a 20  ession will be. 
d0a0: 20 20 20 2a 2a 20 72 65 2d 65 76 61 6c 75 61 74     ** re-evaluat
d0b0: 65 64 20 66 6f 72 20 65 61 63 68 20 72 65 66 65  ed for each refe
d0c0: 72 65 6e 63 65 20 74 6f 20 69 74 2e 0a 20 20 20  rence to it..   
d0d0: 20 2a 2f 0a 20 20 20 20 61 73 73 65 72 74 28 20   */.    assert( 
d0e0: 28 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 20 28  (sNC.ncFlags & (
d0f0: 4e 43 5f 55 41 67 67 49 6e 66 6f 7c 4e 43 5f 55  NC_UAggInfo|NC_U
d100: 55 70 73 65 72 74 29 29 3d 3d 30 20 29 3b 0a 20  Upsert))==0 );. 
d110: 20 20 20 73 4e 43 2e 75 4e 43 2e 70 45 4c 69 73     sNC.uNC.pELis
d120: 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a 20  t = p->pEList;. 
d130: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
d140: 3d 20 4e 43 5f 55 45 4c 69 73 74 3b 0a 20 20 20  = NC_UEList;.   
d150: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
d160: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
d170: 43 2c 20 70 2d 3e 70 48 61 76 69 6e 67 29 20 29  C, p->pHaving) )
d180: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
d190: 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  t;.    if( sqlit
d1a0: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
d1b0: 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 57 68 65  es(&sNC, p->pWhe
d1c0: 72 65 29 20 29 20 72 65 74 75 72 6e 20 57 52 43  re) ) return WRC
d1d0: 5f 41 62 6f 72 74 3b 0a 0a 20 20 20 20 2f 2a 20  _Abort;..    /* 
d1e0: 52 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e  Resolve names in
d1f0: 20 74 61 62 6c 65 2d 76 61 6c 75 65 64 2d 66 75   table-valued-fu
d200: 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73  nction arguments
d210: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b   */.    for(i=0;
d220: 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63   i<p->pSrc->nSrc
d230: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74  ; i++){.      st
d240: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
d250: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70  m *pItem = &p->p
d260: 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20  Src->a[i];.     
d270: 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69   if( pItem->fg.i
d280: 73 54 61 62 46 75 6e 63 0a 20 20 20 20 20 20 20  sTabFunc.       
d290: 26 26 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  && sqlite3Resolv
d2a0: 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26  eExprListNames(&
d2b0: 73 4e 43 2c 20 70 49 74 65 6d 2d 3e 75 31 2e 70  sNC, pItem->u1.p
d2c0: 46 75 6e 63 41 72 67 29 20 0a 20 20 20 20 20 20  FuncArg) .      
d2d0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
d2e0: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
d2f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20 20     }.    }..    
d300: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
d310: 61 6e 64 20 47 52 4f 55 50 20 42 59 20 63 6c 61  and GROUP BY cla
d320: 75 73 65 73 20 6d 61 79 20 6e 6f 74 20 72 65 66  uses may not ref
d330: 65 72 20 74 6f 20 74 65 72 6d 73 20 69 6e 0a 20  er to terms in. 
d340: 20 20 20 2a 2a 20 6f 75 74 65 72 20 71 75 65 72     ** outer quer
d350: 69 65 73 20 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ies .    */.    
d360: 73 4e 43 2e 70 4e 65 78 74 20 3d 20 30 3b 0a 20  sNC.pNext = 0;. 
d370: 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 7c     sNC.ncFlags |
d380: 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43  = NC_AllowAgg|NC
d390: 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 0a 20 20 20 20  _AllowWin;..    
d3a0: 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 61 20  /* If this is a 
d3b0: 63 6f 6e 76 65 72 74 65 64 20 63 6f 6d 70 6f 75  converted compou
d3c0: 6e 64 20 71 75 65 72 79 2c 20 6d 6f 76 65 20 74  nd query, move t
d3d0: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
d3e0: 73 65 20 66 72 6f 6d 20 0a 20 20 20 20 2a 2a 20  se from .    ** 
d3f0: 74 68 65 20 73 75 62 2d 71 75 65 72 79 20 62 61  the sub-query ba
d400: 63 6b 20 74 6f 20 74 68 65 20 70 61 72 65 6e 74  ck to the parent
d410: 20 71 75 65 72 79 2e 20 41 74 20 74 68 69 73 20   query. At this 
d420: 70 6f 69 6e 74 20 65 61 63 68 20 74 65 72 6d 0a  point each term.
d430: 20 20 20 20 2a 2a 20 77 69 74 68 69 6e 20 74 68      ** within th
d440: 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73  e ORDER BY claus
d450: 65 20 68 61 73 20 62 65 65 6e 20 74 72 61 6e 73  e has been trans
d460: 66 6f 72 6d 65 64 20 74 6f 20 61 6e 20 69 6e 74  formed to an int
d470: 65 67 65 72 20 76 61 6c 75 65 2e 0a 20 20 20 20  eger value..    
d480: 2a 2a 20 54 68 65 73 65 20 69 6e 74 65 67 65 72  ** These integer
d490: 73 20 77 69 6c 6c 20 62 65 20 72 65 70 6c 61 63  s will be replac
d4a0: 65 64 20 62 79 20 63 6f 70 69 65 73 20 6f 66 20  ed by copies of 
d4b0: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
d4c0: 67 20 72 65 73 75 6c 74 0a 20 20 20 20 2a 2a 20  g result.    ** 
d4d0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20  set expressions 
d4e0: 62 79 20 74 68 65 20 63 61 6c 6c 20 74 6f 20 72  by the call to r
d4f0: 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70  esolveOrderGroup
d500: 42 79 28 29 20 62 65 6c 6f 77 2e 20 20 2a 2f 0a  By() below.  */.
d510: 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c      if( p->selFl
d520: 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74  ags & SF_Convert
d530: 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65  ed ){.      Sele
d540: 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53  ct *pSub = p->pS
d550: 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74  rc->a[0].pSelect
d560: 3b 0a 20 20 20 20 20 20 70 2d 3e 70 4f 72 64 65  ;.      p->pOrde
d570: 72 42 79 20 3d 20 70 53 75 62 2d 3e 70 4f 72 64  rBy = pSub->pOrd
d580: 65 72 42 79 3b 0a 20 20 20 20 20 20 70 53 75 62  erBy;.      pSub
d590: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a  ->pOrderBy = 0;.
d5a0: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 50 72      }..    /* Pr
d5b0: 6f 63 65 73 73 20 74 68 65 20 4f 52 44 45 52 20  ocess the ORDER 
d5c0: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 73 69  BY clause for si
d5d0: 6e 67 6c 65 74 6f 6e 20 53 45 4c 45 43 54 20 73  ngleton SELECT s
d5e0: 74 61 74 65 6d 65 6e 74 73 2e 0a 20 20 20 20 2a  tatements..    *
d5f0: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 63  * The ORDER BY c
d600: 6c 61 75 73 65 20 66 6f 72 20 63 6f 6d 70 6f 75  lause for compou
d610: 6e 64 73 20 53 45 4c 45 43 54 20 73 74 61 74 65  nds SELECT state
d620: 6d 65 6e 74 73 20 69 73 20 68 61 6e 64 6c 65 64  ments is handled
d630: 0a 20 20 20 20 2a 2a 20 62 65 6c 6f 77 2c 20 61  .    ** below, a
d640: 66 74 65 72 20 61 6c 6c 20 6f 66 20 74 68 65 20  fter all of the 
d650: 72 65 73 75 6c 74 2d 73 65 74 73 20 66 6f 72 20  result-sets for 
d660: 61 6c 6c 20 6f 66 20 74 68 65 20 65 6c 65 6d 65  all of the eleme
d670: 6e 74 73 20 6f 66 0a 20 20 20 20 2a 2a 20 74 68  nts of.    ** th
d680: 65 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20  e compound have 
d690: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20  been resolved.. 
d6a0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 66 20     **.    ** If 
d6b0: 74 68 65 72 65 20 69 73 20 61 6e 20 4f 52 44 45  there is an ORDE
d6c0: 52 20 42 59 20 63 6c 61 75 73 65 20 6f 6e 20 61  R BY clause on a
d6d0: 20 74 65 72 6d 20 6f 66 20 61 20 63 6f 6d 70 6f   term of a compo
d6e0: 75 6e 64 2d 73 65 6c 65 63 74 20 6f 74 68 65 72  und-select other
d6f0: 0a 20 20 20 20 2a 2a 20 74 68 61 6e 20 74 68 65  .    ** than the
d700: 20 72 69 67 68 74 2d 6d 6f 73 74 20 74 65 72 6d   right-most term
d710: 2c 20 74 68 65 6e 20 74 68 61 74 20 69 73 20 61  , then that is a
d720: 20 73 79 6e 74 61 78 20 65 72 72 6f 72 2e 20 20   syntax error.  
d730: 42 75 74 20 74 68 65 20 65 72 72 6f 72 0a 20 20  But the error.  
d740: 20 20 2a 2a 20 69 73 20 6e 6f 74 20 64 65 74 65    ** is not dete
d750: 63 74 65 64 20 75 6e 74 69 6c 20 6d 75 63 68 20  cted until much 
d760: 6c 61 74 65 72 2c 20 61 6e 64 20 73 6f 20 77 65  later, and so we
d770: 20 6e 65 65 64 20 74 6f 20 67 6f 20 61 68 65 61   need to go ahea
d780: 64 20 61 6e 64 0a 20 20 20 20 2a 2a 20 72 65 73  d and.    ** res
d790: 6f 6c 76 65 20 74 68 6f 73 65 20 73 79 6d 62 6f  olve those symbo
d7a0: 6c 73 20 6f 6e 20 74 68 65 20 69 6e 63 6f 72 72  ls on the incorr
d7b0: 65 63 74 20 4f 52 44 45 52 20 42 59 20 66 6f 72  ect ORDER BY for
d7c0: 20 63 6f 6e 73 69 73 74 65 6e 63 79 2e 0a 20 20   consistency..  
d7d0: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 69 73 43    */.    if( isC
d7e0: 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f 6d 70 6f 75  ompound<=nCompou
d7f0: 6e 64 20 20 2f 2a 20 44 65 66 65 72 20 72 69 67  nd  /* Defer rig
d800: 68 74 2d 6d 6f 73 74 20 4f 52 44 45 52 20 42 59  ht-most ORDER BY
d810: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a   of a compound *
d820: 2f 0a 20 20 20 20 20 26 26 20 72 65 73 6f 6c 76  /.     && resolv
d830: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 26 73  eOrderGroupBy(&s
d840: 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f 72 64 65 72  NC, p, p->pOrder
d850: 42 79 2c 20 22 4f 52 44 45 52 22 29 0a 20 20 20  By, "ORDER").   
d860: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
d870: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
d880: 7d 0a 20 20 20 20 69 66 28 20 64 62 2d 3e 6d 61  }.    if( db->ma
d890: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
d8a0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
d8b0: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20  bort;.    }.    
d8c0: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 26 3d 20 7e  sNC.ncFlags &= ~
d8d0: 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 20 20 0a  NC_AllowWin;.  .
d8e0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74      /* Resolve t
d8f0: 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  he GROUP BY clau
d900: 73 65 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65  se.  At the same
d910: 20 74 69 6d 65 2c 20 6d 61 6b 65 20 73 75 72 65   time, make sure
d920: 20 0a 20 20 20 20 2a 2a 20 74 68 65 20 47 52 4f   .    ** the GRO
d930: 55 50 20 42 59 20 63 6c 61 75 73 65 20 64 6f 65  UP BY clause doe
d940: 73 20 6e 6f 74 20 63 6f 6e 74 61 69 6e 20 61 67  s not contain ag
d950: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
d960: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
d970: 28 20 70 47 72 6f 75 70 42 79 20 29 7b 0a 20 20  ( pGroupBy ){.  
d980: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
d990: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
d9a0: 0a 20 20 20 20 0a 20 20 20 20 20 20 69 66 28 20  .    .      if( 
d9b0: 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  resolveOrderGrou
d9c0: 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 47 72  pBy(&sNC, p, pGr
d9d0: 6f 75 70 42 79 2c 20 22 47 52 4f 55 50 22 29 20  oupBy, "GROUP") 
d9e0: 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  || db->mallocFai
d9f0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 72  led ){.        r
da00: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
da10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
da20: 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 47  or(i=0, pItem=pG
da30: 72 6f 75 70 42 79 2d 3e 61 3b 20 69 3c 70 47 72  roupBy->a; i<pGr
da40: 6f 75 70 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b  oupBy->nExpr; i+
da50: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
da60: 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
da70: 50 72 6f 70 65 72 74 79 28 70 49 74 65 6d 2d 3e  Property(pItem->
da80: 70 45 78 70 72 2c 20 45 50 5f 41 67 67 29 20 29  pExpr, EP_Agg) )
da90: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
daa0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
dab0: 73 65 2c 20 22 61 67 67 72 65 67 61 74 65 20 66  se, "aggregate f
dac0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 6e 6f 74  unctions are not
dad0: 20 61 6c 6c 6f 77 65 64 20 69 6e 20 22 0a 20 20   allowed in ".  
dae0: 20 20 20 20 20 20 20 20 20 20 20 20 22 74 68 65              "the
daf0: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
db00: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  ");.          re
db10: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
db20: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
db30: 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64 65 66  }.    }..#ifndef
db40: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e   SQLITE_OMIT_WIN
db50: 44 4f 57 46 55 4e 43 0a 20 20 20 20 69 66 28 20  DOWFUNC.    if( 
db60: 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54  IN_RENAME_OBJECT
db70: 20 29 7b 0a 20 20 20 20 20 20 57 69 6e 64 6f 77   ){.      Window
db80: 20 2a 70 57 69 6e 3b 0a 20 20 20 20 20 20 66 6f   *pWin;.      fo
db90: 72 28 70 57 69 6e 3d 70 2d 3e 70 57 69 6e 44 65  r(pWin=p->pWinDe
dba0: 66 6e 3b 20 70 57 69 6e 3b 20 70 57 69 6e 3d 70  fn; pWin; pWin=p
dbb0: 57 69 6e 2d 3e 70 4e 65 78 74 57 69 6e 29 7b 0a  Win->pNextWin){.
dbc0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
dbd0: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69  te3ResolveExprLi
dbe0: 73 74 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57  stNames(&sNC, pW
dbf0: 69 6e 2d 3e 70 4f 72 64 65 72 42 79 29 0a 20 20  in->pOrderBy).  
dc00: 20 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65         || sqlite
dc10: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
dc20: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 57 69 6e  Names(&sNC, pWin
dc30: 2d 3e 70 50 61 72 74 69 74 69 6f 6e 29 0a 20 20  ->pPartition).  
dc40: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
dc50: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
dc60: 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ort;.        }. 
dc70: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e       }.    }.#en
dc80: 64 69 66 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74  dif..    /* If t
dc90: 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 61  his is part of a
dca0: 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54   compound SELECT
dcb0: 2c 20 63 68 65 63 6b 20 74 68 61 74 20 69 74 20  , check that it 
dcc0: 68 61 73 20 74 68 65 20 72 69 67 68 74 0a 20 20  has the right.  
dcd0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 65    ** number of e
dce0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
dcf0: 65 20 73 65 6c 65 63 74 20 6c 69 73 74 2e 20 2a  e select list. *
dd00: 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 4e 65  /.    if( p->pNe
dd10: 78 74 20 26 26 20 70 2d 3e 70 45 4c 69 73 74 2d  xt && p->pEList-
dd20: 3e 6e 45 78 70 72 21 3d 70 2d 3e 70 4e 65 78 74  >nExpr!=p->pNext
dd30: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20  ->pEList->nExpr 
dd40: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
dd50: 53 65 6c 65 63 74 57 72 6f 6e 67 4e 75 6d 54 65  SelectWrongNumTe
dd60: 72 6d 73 45 72 72 6f 72 28 70 50 61 72 73 65 2c  rmsError(pParse,
dd70: 20 70 2d 3e 70 4e 65 78 74 29 3b 0a 20 20 20 20   p->pNext);.    
dd80: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
dd90: 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  rt;.    }..    /
dda0: 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65  * Advance to the
ddb0: 20 6e 65 78 74 20 74 65 72 6d 20 6f 66 20 74 68   next term of th
ddc0: 65 20 63 6f 6d 70 6f 75 6e 64 0a 20 20 20 20 2a  e compound.    *
ddd0: 2f 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70 50 72  /.    p = p->pPr
dde0: 69 6f 72 3b 0a 20 20 20 20 6e 43 6f 6d 70 6f 75  ior;.    nCompou
ddf0: 6e 64 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  nd++;.  }..  /* 
de00: 52 65 73 6f 6c 76 65 20 74 68 65 20 4f 52 44 45  Resolve the ORDE
de10: 52 20 42 59 20 6f 6e 20 61 20 63 6f 6d 70 6f 75  R BY on a compou
de20: 6e 64 20 53 45 4c 45 43 54 20 61 66 74 65 72 20  nd SELECT after 
de30: 61 6c 6c 20 74 65 72 6d 73 20 6f 66 0a 20 20 2a  all terms of.  *
de40: 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68  * the compound h
de50: 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ave been resolve
de60: 64 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 69 73  d..  */.  if( is
de70: 43 6f 6d 70 6f 75 6e 64 20 26 26 20 72 65 73 6f  Compound && reso
de80: 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64 65 72  lveCompoundOrder
de90: 42 79 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  By(pParse, pLeft
dea0: 6d 6f 73 74 29 20 29 7b 0a 20 20 20 20 72 65 74  most) ){.    ret
deb0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
dec0: 20 7d 0a 0a 20 20 72 65 74 75 72 6e 20 57 52 43   }..  return WRC
ded0: 5f 50 72 75 6e 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  _Prune;.}../*.**
dee0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61   This routine wa
def0: 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f  lks an expressio
df00: 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c  n tree and resol
df10: 76 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74  ves references t
df20: 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d  o.** table colum
df30: 6e 73 20 61 6e 64 20 72 65 73 75 6c 74 2d 73 65  ns and result-se
df40: 74 20 63 6f 6c 75 6d 6e 73 2e 20 20 41 74 20 74  t columns.  At t
df50: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 64 6f  he same time, do
df60: 20 65 72 72 6f 72 0a 2a 2a 20 63 68 65 63 6b 69   error.** checki
df70: 6e 67 20 6f 6e 20 66 75 6e 63 74 69 6f 6e 20 75  ng on function u
df80: 73 61 67 65 20 61 6e 64 20 73 65 74 20 61 20 66  sage and set a f
df90: 6c 61 67 20 69 66 20 61 6e 79 20 61 67 67 72 65  lag if any aggre
dfa0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 0a 2a  gate functions.*
dfb0: 2a 20 61 72 65 20 73 65 65 6e 2e 0a 2a 2a 0a 2a  * are seen..**.*
dfc0: 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 74 61 62  * To resolve tab
dfd0: 6c 65 20 63 6f 6c 75 6d 6e 73 20 72 65 66 65 72  le columns refer
dfe0: 65 6e 63 65 73 20 77 65 20 6c 6f 6f 6b 20 66 6f  ences we look fo
dff0: 72 20 6e 6f 64 65 73 20 28 6f 72 20 73 75 62 74  r nodes (or subt
e000: 72 65 65 73 29 20 6f 66 20 74 68 65 20 0a 2a 2a  rees) of the .**
e010: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
e020: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 20 77 68 65  .Z or just Z whe
e030: 72 65 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 58 3a  re.**.**      X:
e040: 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61     The name of a
e050: 20 64 61 74 61 62 61 73 65 2e 20 20 45 78 3a 20   database.  Ex: 
e060: 20 22 6d 61 69 6e 22 20 6f 72 20 22 74 65 6d 70   "main" or "temp
e070: 22 20 6f 72 0a 2a 2a 20 20 20 20 20 20 20 20 20  " or.**         
e080: 20 20 74 68 65 20 73 79 6d 62 6f 6c 69 63 20 6e    the symbolic n
e090: 61 6d 65 20 61 73 73 69 67 6e 65 64 20 74 6f 20  ame assigned to 
e0a0: 61 6e 20 41 54 54 41 43 48 2d 65 64 20 64 61 74  an ATTACH-ed dat
e0b0: 61 62 61 73 65 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  abase..**.**    
e0c0: 20 20 59 3a 20 20 20 54 68 65 20 6e 61 6d 65 20    Y:   The name 
e0d0: 6f 66 20 61 20 74 61 62 6c 65 20 69 6e 20 61 20  of a table in a 
e0e0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 4f 72  FROM clause.  Or
e0f0: 20 69 6e 20 61 20 74 72 69 67 67 65 72 0a 2a 2a   in a trigger.**
e100: 20 20 20 20 20 20 20 20 20 20 20 6f 6e 65 20 6f             one o
e110: 66 20 74 68 65 20 73 70 65 63 69 61 6c 20 6e 61  f the special na
e120: 6d 65 73 20 22 6f 6c 64 22 20 6f 72 20 22 6e 65  mes "old" or "ne
e130: 77 22 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 5a  w"..**.**      Z
e140: 3a 20 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20  :   The name of 
e150: 61 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 61 62 6c  a column in tabl
e160: 65 20 59 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6e  e Y..**.** The n
e170: 6f 64 65 20 61 74 20 74 68 65 20 72 6f 6f 74 20  ode at the root 
e180: 6f 66 20 74 68 65 20 73 75 62 74 72 65 65 20 69  of the subtree i
e190: 73 20 6d 6f 64 69 66 69 65 64 20 61 73 20 66 6f  s modified as fo
e1a0: 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  llows:.**.**    
e1b0: 45 78 70 72 2e 6f 70 20 20 20 20 20 20 20 20 43  Expr.op        C
e1c0: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
e1d0: 55 4d 4e 0a 2a 2a 20 20 20 20 45 78 70 72 2e 70  UMN.**    Expr.p
e1e0: 54 61 62 20 20 20 20 20 20 50 6f 69 6e 74 73 20  Tab      Points 
e1f0: 74 6f 20 74 68 65 20 54 61 62 6c 65 20 6f 62 6a  to the Table obj
e200: 65 63 74 20 66 6f 72 20 58 2e 59 0a 2a 2a 20 20  ect for X.Y.**  
e210: 20 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 20    Expr.iColumn  
e220: 20 54 68 65 20 63 6f 6c 75 6d 6e 20 69 6e 64 65   The column inde
e230: 78 20 69 6e 20 58 2e 59 2e 20 20 2d 31 20 66 6f  x in X.Y.  -1 fo
e240: 72 20 74 68 65 20 72 6f 77 69 64 2e 0a 2a 2a 20  r the rowid..** 
e250: 20 20 20 45 78 70 72 2e 69 54 61 62 6c 65 20 20     Expr.iTable  
e260: 20 20 54 68 65 20 56 44 42 45 20 63 75 72 73 6f    The VDBE curso
e270: 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 58 2e 59  r number for X.Y
e280: 0a 2a 2a 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73  .**.**.** To res
e290: 6f 6c 76 65 20 72 65 73 75 6c 74 2d 73 65 74 20  olve result-set 
e2a0: 72 65 66 65 72 65 6e 63 65 73 2c 20 6c 6f 6f 6b  references, look
e2b0: 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e 20   for expression 
e2c0: 6e 6f 64 65 73 20 6f 66 20 74 68 65 0a 2a 2a 20  nodes of the.** 
e2d0: 66 6f 72 6d 20 5a 20 28 77 69 74 68 20 6e 6f 20  form Z (with no 
e2e0: 58 20 61 6e 64 20 59 20 70 72 65 66 69 78 29 20  X and Y prefix) 
e2f0: 77 68 65 72 65 20 74 68 65 20 5a 20 6d 61 74 63  where the Z matc
e300: 68 65 73 20 74 68 65 20 72 69 67 68 74 2d 68 61  hes the right-ha
e310: 6e 64 0a 2a 2a 20 73 69 7a 65 20 6f 66 20 61 6e  nd.** size of an
e320: 20 41 53 20 63 6c 61 75 73 65 20 69 6e 20 74 68   AS clause in th
e330: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 6f 66 20  e result-set of 
e340: 61 20 53 45 4c 45 43 54 2e 20 20 54 68 65 20 5a  a SELECT.  The Z
e350: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
e360: 73 20 72 65 70 6c 61 63 65 64 20 62 79 20 61 20  s replaced by a 
e370: 63 6f 70 79 20 6f 66 20 74 68 65 20 6c 65 66 74  copy of the left
e380: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 74 68  -hand side of th
e390: 65 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70  e result-set exp
e3a0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 54 61 62 6c  ression..** Tabl
e3b0: 65 2d 6e 61 6d 65 20 61 6e 64 20 66 75 6e 63 74  e-name and funct
e3c0: 69 6f 6e 20 72 65 73 6f 6c 75 74 69 6f 6e 20 6f  ion resolution o
e3d0: 63 63 75 72 73 20 6f 6e 20 74 68 65 20 73 75 62  ccurs on the sub
e3e0: 73 74 69 74 75 74 65 64 20 65 78 70 72 65 73 73  stituted express
e3f0: 69 6f 6e 0a 2a 2a 20 74 72 65 65 2e 20 20 46 6f  ion.** tree.  Fo
e400: 72 20 65 78 61 6d 70 6c 65 2c 20 69 6e 3a 0a 2a  r example, in:.*
e410: 2a 0a 2a 2a 20 20 20 20 20 20 53 45 4c 45 43 54  *.**      SELECT
e420: 20 61 2b 62 20 41 53 20 78 2c 20 63 2b 64 20 41   a+b AS x, c+d A
e430: 53 20 79 20 46 52 4f 4d 20 74 31 20 4f 52 44 45  S y FROM t1 ORDE
e440: 52 20 42 59 20 78 3b 0a 2a 2a 0a 2a 2a 20 54 68  R BY x;.**.** Th
e450: 65 20 22 78 22 20 74 65 72 6d 20 6f 66 20 74 68  e "x" term of th
e460: 65 20 6f 72 64 65 72 20 62 79 20 69 73 20 72 65  e order by is re
e470: 70 6c 61 63 65 64 20 62 79 20 22 61 2b 62 22 20  placed by "a+b" 
e480: 74 6f 20 72 65 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a  to render:.**.**
e490: 20 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62        SELECT a+b
e4a0: 20 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20   AS x, c+d AS y 
e4b0: 46 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59  FROM t1 ORDER BY
e4c0: 20 61 2b 62 3b 0a 2a 2a 0a 2a 2a 20 46 75 6e 63   a+b;.**.** Func
e4d0: 74 69 6f 6e 20 63 61 6c 6c 73 20 61 72 65 20 63  tion calls are c
e4e0: 68 65 63 6b 65 64 20 74 6f 20 6d 61 6b 65 20 73  hecked to make s
e4f0: 75 72 65 20 74 68 61 74 20 74 68 65 20 66 75 6e  ure that the fun
e500: 63 74 69 6f 6e 20 69 73 20 0a 2a 2a 20 64 65 66  ction is .** def
e510: 69 6e 65 64 20 61 6e 64 20 74 68 61 74 20 74 68  ined and that th
e520: 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72  e correct number
e530: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 72   of arguments ar
e540: 65 20 73 70 65 63 69 66 69 65 64 2e 0a 2a 2a 20  e specified..** 
e550: 49 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  If the function 
e560: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
e570: 66 75 6e 63 74 69 6f 6e 2c 20 74 68 65 6e 20 74  function, then t
e580: 68 65 20 4e 43 5f 48 61 73 41 67 67 20 66 6c 61  he NC_HasAgg fla
e590: 67 20 69 73 0a 2a 2a 20 73 65 74 20 61 6e 64 20  g is.** set and 
e5a0: 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20 63 68  the opcode is ch
e5b0: 61 6e 67 65 64 20 66 72 6f 6d 20 54 4b 5f 46 55  anged from TK_FU
e5c0: 4e 43 54 49 4f 4e 20 74 6f 20 54 4b 5f 41 47 47  NCTION to TK_AGG
e5d0: 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2a 20 49 66  _FUNCTION..** If
e5e0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63   an expression c
e5f0: 6f 6e 74 61 69 6e 73 20 61 67 67 72 65 67 61 74  ontains aggregat
e600: 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 65 6e  e functions then
e610: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
e620: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
e630: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 73 65 74  xpression is set
e640: 2e 0a 2a 2a 0a 2a 2a 20 41 6e 20 65 72 72 6f 72  ..**.** An error
e650: 20 6d 65 73 73 61 67 65 20 69 73 20 6c 65 66 74   message is left
e660: 20 69 6e 20 70 50 61 72 73 65 20 69 66 20 61 6e   in pParse if an
e670: 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e  ything is amiss.
e680: 20 20 54 68 65 20 6e 75 6d 62 65 72 0a 2a 2a 20    The number.** 
e690: 69 66 20 65 72 72 6f 72 73 20 69 73 20 72 65 74  if errors is ret
e6a0: 75 72 6e 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71  urned..*/.int sq
e6b0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
e6c0: 4e 61 6d 65 73 28 20 0a 20 20 4e 61 6d 65 43 6f  Names( .  NameCo
e6d0: 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20  ntext *pNC,     
e6e0: 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74    /* Namespace t
e6f0: 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73  o resolve expres
e700: 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45  sions in. */.  E
e710: 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20  xpr *pExpr      
e720: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
e730: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
e740: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20  nalyzed. */.){. 
e750: 20 75 31 36 20 73 61 76 65 64 48 61 73 41 67 67   u16 savedHasAgg
e760: 3b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20  ;.  Walker w;.. 
e770: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
e780: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 4f 4b  return SQLITE_OK
e790: 3b 0a 20 20 73 61 76 65 64 48 61 73 41 67 67 20  ;.  savedHasAgg 
e7a0: 3d 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26  = pNC->ncFlags &
e7b0: 20 28 4e 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d   (NC_HasAgg|NC_M
e7c0: 69 6e 4d 61 78 41 67 67 29 3b 0a 20 20 70 4e 43  inMaxAgg);.  pNC
e7d0: 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28 4e  ->ncFlags &= ~(N
e7e0: 43 5f 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d  C_HasAgg|NC_MinM
e7f0: 61 78 41 67 67 29 3b 0a 20 20 77 2e 70 50 61 72  axAgg);.  w.pPar
e800: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
e810: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
e820: 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70  ack = resolveExp
e830: 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65  rStep;.  w.xSele
e840: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73  ctCallback = res
e850: 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a  olveSelectStep;.
e860: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
e870: 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 75 2e  ack2 = 0;.  w.u.
e880: 70 4e 43 20 3d 20 70 4e 43 3b 0a 23 69 66 20 53  pNC = pNC;.#if S
e890: 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44  QLITE_MAX_EXPR_D
e8a0: 45 50 54 48 3e 30 0a 20 20 77 2e 70 50 61 72 73  EPTH>0.  w.pPars
e8b0: 65 2d 3e 6e 48 65 69 67 68 74 20 2b 3d 20 70 45  e->nHeight += pE
e8c0: 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a 20 20  xpr->nHeight;.  
e8d0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
e8e0: 68 65 63 6b 48 65 69 67 68 74 28 77 2e 70 50 61  heckHeight(w.pPa
e8f0: 72 73 65 2c 20 77 2e 70 50 61 72 73 65 2d 3e 6e  rse, w.pParse->n
e900: 48 65 69 67 68 74 29 20 29 7b 0a 20 20 20 20 72  Height) ){.    r
e910: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 45 52 52  eturn SQLITE_ERR
e920: 4f 52 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20  OR;.  }.#endif. 
e930: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
e940: 28 26 77 2c 20 70 45 78 70 72 29 3b 0a 23 69 66  (&w, pExpr);.#if
e950: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58 50 52   SQLITE_MAX_EXPR
e960: 5f 44 45 50 54 48 3e 30 0a 20 20 77 2e 70 50 61  _DEPTH>0.  w.pPa
e970: 72 73 65 2d 3e 6e 48 65 69 67 68 74 20 2d 3d 20  rse->nHeight -= 
e980: 70 45 78 70 72 2d 3e 6e 48 65 69 67 68 74 3b 0a  pExpr->nHeight;.
e990: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 70 4e 43  #endif.  if( pNC
e9a0: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48  ->ncFlags & NC_H
e9b0: 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70  asAgg ){.    Exp
e9c0: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
e9d0: 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d  pr, EP_Agg);.  }
e9e0: 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  .  pNC->ncFlags 
e9f0: 7c 3d 20 73 61 76 65 64 48 61 73 41 67 67 3b 0a  |= savedHasAgg;.
ea00: 20 20 72 65 74 75 72 6e 20 70 4e 43 2d 3e 6e 45    return pNC->nE
ea10: 72 72 3e 30 20 7c 7c 20 77 2e 70 50 61 72 73 65  rr>0 || w.pParse
ea20: 2d 3e 6e 45 72 72 3e 30 3b 0a 7d 0a 0a 2f 2a 0a  ->nErr>0;.}../*.
ea30: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
ea40: 61 6d 65 73 20 66 6f 72 20 61 6c 6c 20 65 78 70  ames for all exp
ea50: 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 20 65 78  ression in an ex
ea60: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
ea70: 54 68 69 73 20 69 73 0a 2a 2a 20 6a 75 73 74 20  This is.** just 
ea80: 6c 69 6b 65 20 73 71 6c 69 74 65 33 52 65 73 6f  like sqlite3Reso
ea90: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 20 65  lveExprNames() e
eaa0: 78 63 65 70 74 20 74 68 61 74 20 69 74 20 77 6f  xcept that it wo
eab0: 72 6b 73 20 66 6f 72 20 61 6e 20 65 78 70 72 65  rks for an expre
eac0: 73 73 69 6f 6e 0a 2a 2a 20 6c 69 73 74 20 72 61  ssion.** list ra
ead0: 74 68 65 72 20 74 68 61 6e 20 61 20 73 69 6e 67  ther than a sing
eae0: 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  le expression..*
eaf0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
eb00: 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65  olveExprListName
eb10: 73 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78  s( .  NameContex
eb20: 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a  t *pNC,       /*
eb30: 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65   Namespace to re
eb40: 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e  solve expression
eb50: 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 4c  s in. */.  ExprL
eb60: 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 20 20  ist *pList      
eb70: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
eb80: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
eb90: 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a  analyzed. */.){.
eba0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
ebb0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f 72 28  List ){.    for(
ebc0: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
ebd0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
ebe0: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
ebf0: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43  lveExprNames(pNC
ec00: 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  , pList->a[i].pE
ec10: 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 57 52  xpr) ) return WR
ec20: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20  C_Abort;.    }. 
ec30: 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
ec40: 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
ec50: 2a 2a 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e  ** Resolve all n
ec60: 61 6d 65 73 20 69 6e 20 61 6c 6c 20 65 78 70 72  ames in all expr
ec70: 65 73 73 69 6f 6e 73 20 6f 66 20 61 20 53 45 4c  essions of a SEL
ec80: 45 43 54 20 61 6e 64 20 69 6e 20 61 6c 6c 0a 2a  ECT and in all.*
ec90: 2a 20 64 65 63 65 6e 64 65 6e 74 73 20 6f 66 20  * decendents of 
eca0: 74 68 65 20 53 45 4c 45 43 54 2c 20 69 6e 63 6c  the SELECT, incl
ecb0: 75 64 69 6e 67 20 63 6f 6d 70 6f 75 6e 64 73 20  uding compounds 
ecc0: 6f 66 66 20 6f 66 20 70 2d 3e 70 50 72 69 6f 72  off of p->pPrior
ecd0: 2c 0a 2a 2a 20 73 75 62 71 75 65 72 69 65 73 20  ,.** subqueries 
ece0: 69 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 20  in expressions, 
ecf0: 61 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 75  and subqueries u
ed00: 73 65 64 20 61 73 20 46 52 4f 4d 20 63 6c 61 75  sed as FROM clau
ed10: 73 65 0a 2a 2a 20 74 65 72 6d 73 2e 0a 2a 2a 0a  se.** terms..**.
ed20: 2a 2a 20 53 65 65 20 73 71 6c 69 74 65 33 52 65  ** See sqlite3Re
ed30: 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29  solveExprNames()
ed40: 20 66 6f 72 20 61 20 64 65 73 63 72 69 70 74 69   for a descripti
ed50: 6f 6e 20 6f 66 20 74 68 65 20 6b 69 6e 64 73 20  on of the kinds 
ed60: 6f 66 0a 2a 2a 20 74 72 61 6e 73 66 6f 72 6d 61  of.** transforma
ed70: 74 69 6f 6e 73 20 74 68 61 74 20 6f 63 63 75 72  tions that occur
ed80: 2e 0a 2a 2a 0a 2a 2a 20 41 6c 6c 20 53 45 4c 45  ..**.** All SELE
ed90: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 20 73 68  CT statements sh
eda0: 6f 75 6c 64 20 68 61 76 65 20 62 65 65 6e 20 65  ould have been e
edb0: 78 70 61 6e 64 65 64 20 75 73 69 6e 67 0a 2a 2a  xpanded using.**
edc0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
edd0: 70 61 6e 64 28 29 20 70 72 69 6f 72 20 74 6f 20  pand() prior to 
ede0: 69 6e 76 6f 6b 69 6e 67 20 74 68 69 73 20 72 6f  invoking this ro
edf0: 75 74 69 6e 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  utine..*/.void s
ee00: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c  qlite3ResolveSel
ee10: 65 63 74 4e 61 6d 65 73 28 0a 20 20 50 61 72 73  ectNames(.  Pars
ee20: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
ee30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
ee40: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 65   context */.  Se
ee50: 6c 65 63 74 20 2a 70 2c 20 20 20 20 20 20 20 20  lect *p,        
ee60: 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45 4c 45       /* The SELE
ee70: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 62 65 69  CT statement bei
ee80: 6e 67 20 63 6f 64 65 64 2e 20 2a 2f 0a 20 20 4e  ng coded. */.  N
ee90: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74  ameContext *pOut
eea0: 65 72 4e 43 20 20 2f 2a 20 4e 61 6d 65 20 63 6f  erNC  /* Name co
eeb0: 6e 74 65 78 74 20 66 6f 72 20 70 61 72 65 6e 74  ntext for parent
eec0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
eed0: 74 20 2a 2f 0a 29 7b 0a 20 20 57 61 6c 6b 65 72  t */.){.  Walker
eee0: 20 77 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 70   w;..  assert( p
eef0: 21 3d 30 20 29 3b 0a 20 20 77 2e 78 45 78 70 72  !=0 );.  w.xExpr
ef00: 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c  Callback = resol
ef10: 76 65 45 78 70 72 53 74 65 70 3b 0a 20 20 77 2e  veExprStep;.  w.
ef20: 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20  xSelectCallback 
ef30: 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65 63 74 53  = resolveSelectS
ef40: 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74  tep;.  w.xSelect
ef50: 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30 3b 0a 20  Callback2 = 0;. 
ef60: 20 77 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72   w.pParse = pPar
ef70: 73 65 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20  se;.  w.u.pNC = 
ef80: 70 4f 75 74 65 72 4e 43 3b 0a 20 20 73 71 6c 69  pOuterNC;.  sqli
ef90: 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28 26 77  te3WalkSelect(&w
efa0: 2c 20 70 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  , p);.}../*.** R
efb0: 65 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20  esolve names in 
efc0: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
efd0: 20 63 61 6e 20 6f 6e 6c 79 20 72 65 66 65 72 65   can only refere
efe0: 6e 63 65 20 61 20 73 69 6e 67 6c 65 20 74 61 62  nce a single tab
eff0: 6c 65 0a 2a 2a 20 6f 72 20 77 68 69 63 68 20 63  le.** or which c
f000: 61 6e 6e 6f 74 20 72 65 66 65 72 65 6e 63 65 20  annot reference 
f010: 61 6e 79 20 74 61 62 6c 65 73 20 61 74 20 61 6c  any tables at al
f020: 6c 2e 20 20 45 78 61 6d 70 6c 65 73 3a 0a 2a 2a  l.  Examples:.**
f030: 0a 2a 2a 20 20 20 20 28 31 29 20 20 20 43 48 45  .**    (1)   CHE
f040: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a  CK constraints.*
f050: 2a 20 20 20 20 28 32 29 20 20 20 57 48 45 52 45  *    (2)   WHERE
f060: 20 63 6c 61 75 73 65 73 20 6f 6e 20 70 61 72 74   clauses on part
f070: 69 61 6c 20 69 6e 64 69 63 65 73 0a 2a 2a 20 20  ial indices.**  
f080: 20 20 28 33 29 20 20 20 45 78 70 72 65 73 73 69    (3)   Expressi
f090: 6f 6e 73 20 69 6e 20 69 6e 64 65 78 65 73 20 6f  ons in indexes o
f0a0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a  n expressions.**
f0b0: 20 20 20 20 28 34 29 20 20 20 45 78 70 72 65 73      (4)   Expres
f0c0: 73 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  sion arguments t
f0d0: 6f 20 56 41 43 55 55 4d 20 49 4e 54 4f 2e 0a 2a  o VACUUM INTO..*
f0e0: 2a 0a 2a 2a 20 49 6e 20 61 6c 6c 20 63 61 73 65  *.** In all case
f0f0: 73 20 65 78 63 65 70 74 20 28 34 29 2c 20 74 68  s except (4), th
f100: 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61  e Expr.iTable va
f110: 6c 75 65 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d  lue for Expr.op=
f120: 3d 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 6e 6f  =TK_COLUMN.** no
f130: 64 65 73 20 6f 66 20 74 68 65 20 65 78 70 72 65  des of the expre
f140: 73 73 69 6f 6e 20 69 73 20 73 65 74 20 74 6f 20  ssion is set to 
f150: 2d 31 20 61 6e 64 20 74 68 65 20 45 78 70 72 2e  -1 and the Expr.
f160: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73  iColumn value is
f170: 0a 2a 2a 20 73 65 74 20 74 6f 20 74 68 65 20 63  .** set to the c
f180: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 2e 20 20 49  olumn number.  I
f190: 6e 20 63 61 73 65 20 28 34 29 2c 20 54 4b 5f 43  n case (4), TK_C
f1a0: 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 63 61 75 73  OLUMN nodes caus
f1b0: 65 20 61 6e 20 65 72 72 6f 72 2e 0a 2a 2a 0a 2a  e an error..**.*
f1c0: 2a 20 41 6e 79 20 65 72 72 6f 72 73 20 63 61 75  * Any errors cau
f1d0: 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  se an error mess
f1e0: 61 67 65 20 74 6f 20 62 65 20 73 65 74 20 69 6e  age to be set in
f1f0: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e 74 20   pParse..*/.int 
f200: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65  sqlite3ResolveSe
f210: 6c 66 52 65 66 65 72 65 6e 63 65 28 0a 20 20 50  lfReference(.  P
f220: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
f230: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
f240: 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65  ntext */.  Table
f250: 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20 2f   *pTab,        /
f260: 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e  * The table bein
f270: 67 20 72 65 66 65 72 65 6e 63 65 64 2c 20 6f 72  g referenced, or
f280: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 6e 74 20 74   NULL */.  int t
f290: 79 70 65 2c 20 20 20 20 20 20 20 20 20 20 20 2f  ype,           /
f2a0: 2a 20 4e 43 5f 49 73 43 68 65 63 6b 20 6f 72 20  * NC_IsCheck or 
f2b0: 4e 43 5f 50 61 72 74 49 64 78 20 6f 72 20 4e 43  NC_PartIdx or NC
f2c0: 5f 49 64 78 45 78 70 72 2c 20 6f 72 20 30 20 2a  _IdxExpr, or 0 *
f2d0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
f2e0: 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65          /* Expre
f2f0: 73 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65  ssion to resolve
f300: 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20  .  May be NULL. 
f310: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
f320: 4c 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72  List     /* Expr
f330: 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72  ession list to r
f340: 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20  esolve.  May be 
f350: 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72  NULL. */.){.  Sr
f360: 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20  cList sSrc;     
f370: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
f380: 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f   Fake SrcList fo
f390: 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61  r pParse->pNewTa
f3a0: 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  ble */.  NameCon
f3b0: 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20  text sNC;       
f3c0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65           /* Name
f3d0: 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61   context for pPa
f3e0: 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a  rse->pNewTable *
f3f0: 2f 0a 20 20 69 6e 74 20 72 63 3b 0a 0a 20 20 61  /.  int rc;..  a
f400: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 30 20 7c  ssert( type==0 |
f410: 7c 20 70 54 61 62 21 3d 30 20 29 3b 0a 20 20 61  | pTab!=0 );.  a
f420: 73 73 65 72 74 28 20 74 79 70 65 3d 3d 4e 43 5f  ssert( type==NC_
f430: 49 73 43 68 65 63 6b 20 7c 7c 20 74 79 70 65 3d  IsCheck || type=
f440: 3d 4e 43 5f 50 61 72 74 49 64 78 20 7c 7c 20 74  =NC_PartIdx || t
f450: 79 70 65 3d 3d 4e 43 5f 49 64 78 45 78 70 72 20  ype==NC_IdxExpr 
f460: 7c 7c 20 70 54 61 62 3d 3d 30 20 29 3b 0a 20 20  || pTab==0 );.  
f470: 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20  memset(&sNC, 0, 
f480: 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20  sizeof(sNC));.  
f490: 6d 65 6d 73 65 74 28 26 73 53 72 63 2c 20 30 2c  memset(&sSrc, 0,
f4a0: 20 73 69 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a   sizeof(sSrc));.
f4b0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a 20 20    if( pTab ){.  
f4c0: 20 20 73 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b    sSrc.nSrc = 1;
f4d0: 0a 20 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 7a  .    sSrc.a[0].z
f4e0: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
f4f0: 6d 65 3b 0a 20 20 20 20 73 53 72 63 2e 61 5b 30  me;.    sSrc.a[0
f500: 5d 2e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a 20  ].pTab = pTab;. 
f510: 20 20 20 73 53 72 63 2e 61 5b 30 5d 2e 69 43 75     sSrc.a[0].iCu
f520: 72 73 6f 72 20 3d 20 2d 31 3b 0a 20 20 7d 0a 20  rsor = -1;.  }. 
f530: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
f540: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63  arse;.  sNC.pSrc
f550: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
f560: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79  sNC.ncFlags = ty
f570: 70 65 3b 0a 20 20 69 66 28 20 28 72 63 20 3d 20  pe;.  if( (rc = 
f580: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
f590: 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 45  prNames(&sNC, pE
f5a0: 78 70 72 29 29 21 3d 53 51 4c 49 54 45 5f 4f 4b  xpr))!=SQLITE_OK
f5b0: 20 29 20 72 65 74 75 72 6e 20 72 63 3b 0a 20 20   ) return rc;.  
f5c0: 69 66 28 20 70 4c 69 73 74 20 29 20 72 63 20 3d  if( pList ) rc =
f5d0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
f5e0: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73 4e  xprListNames(&sN
f5f0: 43 2c 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74  C, pList);.  ret
f600: 75 72 6e 20 72 63 3b 0a 7d 0a                    urn rc;.}.