/ Hex Artifact Content
Login

Artifact 976e7879286a1eecdc71ceff64f6d1b3f58c8f8096537ba668b3dc0887f410c1:


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 2f 2f 20 20 20  en);.    }.//   
0b80: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
0b90: 28 70 44 75 70 2c 20 45 50 5f 41 6c 69 61 73 29  (pDup, EP_Alias)
0ba0: 3b 0a 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65  ;..    /* Before
0bb0: 20 63 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33   calling sqlite3
0bc0: 45 78 70 72 44 65 6c 65 74 65 28 29 2c 20 73 65  ExprDelete(), se
0bd0: 74 20 74 68 65 20 45 50 5f 53 74 61 74 69 63 20  t the EP_Static 
0be0: 66 6c 61 67 2e 20 54 68 69 73 20 0a 20 20 20 20  flag. This .    
0bf0: 2a 2a 20 70 72 65 76 65 6e 74 73 20 45 78 70 72  ** prevents Expr
0c00: 44 65 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65  Delete() from de
0c10: 6c 65 74 69 6e 67 20 74 68 65 20 45 78 70 72 20  leting the Expr 
0c20: 73 74 72 75 63 74 75 72 65 20 69 74 73 65 6c 66  structure itself
0c30: 2c 0a 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e  ,.    ** allowin
0c40: 67 20 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70  g it to be repop
0c50: 75 6c 61 74 65 64 20 62 79 20 74 68 65 20 6d 65  ulated by the me
0c60: 6d 63 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f  mcpy() on the fo
0c70: 6c 6c 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20  llowing line..  
0c80: 20 20 2a 2a 20 54 68 65 20 70 45 78 70 72 2d 3e    ** The pExpr->
0c90: 75 2e 7a 54 6f 6b 65 6e 20 6d 69 67 68 74 20 70  u.zToken might p
0ca0: 6f 69 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79  oint into memory
0cb0: 20 74 68 61 74 20 77 69 6c 6c 20 62 65 20 66 72   that will be fr
0cc0: 65 65 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a  eed by the.    *
0cd0: 2a 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28  * sqlite3DbFree(
0ce0: 64 62 2c 20 70 44 75 70 29 20 6f 6e 20 74 68 65  db, pDup) on the
0cf0: 20 6c 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 68   last line of th
0d00: 69 73 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65 20  is block, so be 
0d10: 73 75 72 65 20 74 6f 0a 20 20 20 20 2a 2a 20 6d  sure to.    ** m
0d20: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
0d30: 65 20 74 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64  e token before d
0d40: 6f 69 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33  oing the sqlite3
0d50: 44 62 46 72 65 65 28 29 2e 0a 20 20 20 20 2a 2f  DbFree()..    */
0d60: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
0d70: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53  erty(pExpr, EP_S
0d80: 74 61 74 69 63 29 3b 0a 20 20 20 20 73 71 6c 69  tatic);.    sqli
0d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62  te3ExprDelete(db
0da0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 6d 65  , pExpr);.    me
0db0: 6d 63 70 79 28 70 45 78 70 72 2c 20 70 44 75 70  mcpy(pExpr, pDup
0dc0: 2c 20 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29  , sizeof(*pExpr)
0dd0: 29 3b 0a 20 20 20 20 69 66 28 20 21 45 78 70 72  );.    if( !Expr
0de0: 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
0df0: 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  r, EP_IntValue) 
0e00: 26 26 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  && pExpr->u.zTok
0e10: 65 6e 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61  en!=0 ){.      a
0e20: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 66  ssert( (pExpr->f
0e30: 6c 61 67 73 20 26 20 28 45 50 5f 52 65 64 75 63  lags & (EP_Reduc
0e40: 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  ed|EP_TokenOnly)
0e50: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45  )==0 );.      pE
0e60: 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20  xpr->u.zToken = 
0e70: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
0e80: 64 62 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f  db, pExpr->u.zTo
0e90: 6b 65 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ken);.      pExp
0ea0: 72 2d 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 4d  r->flags |= EP_M
0eb0: 65 6d 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20  emToken;.    }. 
0ec0: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
0ed0: 28 64 62 2c 20 70 44 75 70 29 3b 0a 20 20 7d 0a  (db, pDup);.  }.
0ee0: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
0ef0: 79 28 70 45 78 70 72 2c 20 45 50 5f 41 6c 69 61  y(pExpr, EP_Alia
0f00: 73 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65  s);.}.../*.** Re
0f10: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
0f20: 20 6e 61 6d 65 20 7a 43 6f 6c 20 6f 63 63 75 72   name zCol occur
0f30: 73 20 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68  s anywhere in th
0f40: 65 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a  e USING clause..
0f50: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c  **.** Return FAL
0f60: 53 45 20 69 66 20 74 68 65 20 55 53 49 4e 47 20  SE if the USING 
0f70: 63 6c 61 75 73 65 20 69 73 20 4e 55 4c 4c 20 6f  clause is NULL o
0f80: 72 20 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74  r if it does not
0f90: 20 63 6f 6e 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c   contain.** zCol
0fa0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
0fb0: 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73  nameInUsingClaus
0fc0: 65 28 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67  e(IdList *pUsing
0fd0: 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43  , const char *zC
0fe0: 6f 6c 29 7b 0a 20 20 69 66 28 20 70 55 73 69 6e  ol){.  if( pUsin
0ff0: 67 20 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a  g ){.    int k;.
1000: 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
1010: 55 73 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29  Using->nId; k++)
1020: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
1030: 74 65 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e  te3StrICmp(pUsin
1040: 67 2d 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a  g->a[k].zName, z
1050: 43 6f 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  Col)==0 ) return
1060: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
1070: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
1080: 2a 2a 20 53 75 62 71 75 65 72 69 65 73 20 73 74  ** Subqueries st
1090: 6f 72 65 73 20 74 68 65 20 6f 72 69 67 69 6e 61  ores the origina
10a0: 6c 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c  l database, tabl
10b0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e and column nam
10c0: 65 73 20 66 6f 72 20 74 68 65 69 72 0a 2a 2a 20  es for their.** 
10d0: 72 65 73 75 6c 74 20 73 65 74 73 20 69 6e 20 45  result sets in E
10e0: 78 70 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61  xprList.a[].zSpa
10f0: 6e 2c 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 22  n, in the form "
1100: 44 41 54 41 42 41 53 45 2e 54 41 42 4c 45 2e 43  DATABASE.TABLE.C
1110: 4f 4c 55 4d 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b  OLUMN"..** Check
1120: 20 74 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a   to see if the z
1130: 53 70 61 6e 20 67 69 76 65 6e 20 74 6f 20 74 68  Span given to th
1140: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 74 63 68  is routine match
1150: 65 73 20 74 68 65 20 7a 44 62 2c 20 7a 54 61 62  es the zDb, zTab
1160: 2c 0a 2a 2a 20 61 6e 64 20 7a 43 6f 6c 2e 20 20  ,.** and zCol.  
1170: 49 66 20 61 6e 79 20 6f 66 20 7a 44 62 2c 20 7a  If any of zDb, z
1180: 54 61 62 2c 20 61 6e 64 20 7a 43 6f 6c 20 61 72  Tab, and zCol ar
1190: 65 20 4e 55 4c 4c 20 74 68 65 6e 20 74 68 6f 73  e NULL then thos
11a0: 65 20 66 69 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a  e fields will.**
11b0: 20 6d 61 74 63 68 20 61 6e 79 74 68 69 6e 67 2e   match anything.
11c0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d  .*/.int sqlite3M
11d0: 61 74 63 68 53 70 61 6e 4e 61 6d 65 28 0a 20 20  atchSpanName(.  
11e0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61  const char *zSpa
11f0: 6e 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  n,.  const char 
1200: 2a 7a 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63  *zCol,.  const c
1210: 68 61 72 20 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e  har *zTab,.  con
1220: 73 74 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a  st char *zDb.){.
1230: 20 20 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e    int n;.  for(n
1240: 3d 30 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e  =0; ALWAYS(zSpan
1250: 5b 6e 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d  [n]) && zSpan[n]
1260: 21 3d 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20  !='.'; n++){}.  
1270: 69 66 28 20 7a 44 62 20 26 26 20 28 73 71 6c 69  if( zDb && (sqli
1280: 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61  te3StrNICmp(zSpa
1290: 6e 2c 20 7a 44 62 2c 20 6e 29 21 3d 30 20 7c 7c  n, zDb, n)!=0 ||
12a0: 20 7a 44 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20   zDb[n]!=0) ){. 
12b0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
12c0: 0a 20 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b  .  zSpan += n+1;
12d0: 0a 20 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41  .  for(n=0; ALWA
12e0: 59 53 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20  YS(zSpan[n]) && 
12f0: 7a 53 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e  zSpan[n]!='.'; n
1300: 2b 2b 29 7b 7d 0a 20 20 69 66 28 20 7a 54 61 62  ++){}.  if( zTab
1310: 20 26 26 20 28 73 71 6c 69 74 65 33 53 74 72 4e   && (sqlite3StrN
1320: 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 54 61 62  ICmp(zSpan, zTab
1330: 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a 54 61 62 5b  , n)!=0 || zTab[
1340: 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65  n]!=0) ){.    re
1350: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53  turn 0;.  }.  zS
1360: 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66  pan += n+1;.  if
1370: 28 20 7a 43 6f 6c 20 26 26 20 73 71 6c 69 74 65  ( zCol && sqlite
1380: 33 53 74 72 49 43 6d 70 28 7a 53 70 61 6e 2c 20  3StrICmp(zSpan, 
1390: 7a 43 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20  zCol)!=0 ){.    
13a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
13b0: 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a  return 1;.}../*.
13c0: 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d  ** Given the nam
13d0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66  e of a column of
13e0: 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20   the form X.Y.Z 
13f0: 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a  or Y.Z or just Z
1400: 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61  , look up.** tha
1410: 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65  t name in the se
1420: 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c  t of source tabl
1430: 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61  es in pSrcList a
1440: 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70  nd make the pExp
1450: 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  r .** expression
1460: 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b   node refer back
1470: 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20   to that source 
1480: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c  column.  The fol
1490: 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a  lowing changes.*
14a0: 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45  * are made to pE
14b0: 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45  xpr:.**.**    pE
14c0: 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20  xpr->iDb        
14d0: 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78     Set the index
14e0: 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66   in db->aDb[] of
14f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 58 0a   the database X.
1500: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
1510: 20 20 20 20 20 20 20 20 20 20 20 28 65 76 65 6e             (even
1520: 20 69 66 20 58 20 69 73 20 69 6d 70 6c 69 65 64   if X is implied
1530: 29 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  )..**    pExpr->
1540: 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65  iTable        Se
1550: 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20  t to the cursor 
1560: 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74  number for the t
1570: 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a  able obtained.**
1580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1590: 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53           from pS
15a0: 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45  rcList..**    pE
15b0: 78 70 72 2d 3e 79 2e 70 54 61 62 20 20 20 20 20  xpr->y.pTab     
15c0: 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65     Points to the
15d0: 20 54 61 62 6c 65 20 73 74 72 75 63 74 75 72 65   Table structure
15e0: 20 6f 66 20 58 2e 59 20 28 65 76 65 6e 20 69 66   of X.Y (even if
15f0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
1600: 20 20 20 20 20 20 20 20 20 20 20 20 58 20 61 6e              X an
1610: 64 2f 6f 72 20 59 20 61 72 65 20 69 6d 70 6c 69  d/or Y are impli
1620: 65 64 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70 72  ed.).**    pExpr
1630: 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20  ->iColumn       
1640: 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d  Set to the colum
1650: 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20  n number within 
1660: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  the table..**   
1670: 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
1680: 20 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f        Set to TK_
1690: 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45  COLUMN..**    pE
16a0: 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20  xpr->pLeft      
16b0: 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f     Any expressio
16c0: 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f  n this points to
16d0: 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20   is deleted.**  
16e0: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
16f0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
1700: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
1710: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e  s to is deleted.
1720: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76  .**.** The zDb v
1730: 61 72 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e  ariable is the n
1740: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
1750: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
1760: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
1770: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
1780: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
1790: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
17a0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
17b0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
17c0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
17d0: 65 20 7a 54 61 62 6c 65 20 76 61 72 69 61 62 6c  e zTable variabl
17e0: 65 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  e is the name of
17f0: 20 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20   the table (the 
1800: 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76  "Y").  This.** v
1810: 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c  alue can be NULL
1820: 20 69 66 20 7a 44 62 20 69 73 20 61 6c 73 6f 20   if zDb is also 
1830: 4e 55 4c 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65  NULL.  If zTable
1840: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
1850: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
1860: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
1870: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
1880: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
1890: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
18a0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
18b0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
18c0: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
18d0: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
18e0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
18f0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
1900: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
1910: 2e 20 20 52 65 74 75 72 6e 20 57 52 43 5f 50 72  .  Return WRC_Pr
1920: 75 6e 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  une on success..
1930: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
1940: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
1950: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
1960: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
1970: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e  context */.  con
1980: 73 74 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20  st char *zDb,   
1990: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
19a0: 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69   database contai
19b0: 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e  ning table, or N
19c0: 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ULL */.  const c
19d0: 68 61 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a  har *zTab,    /*
19e0: 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63   Name of table c
19f0: 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e  ontaining column
1a00: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63  , or NULL */.  c
1a10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c  onst char *zCol,
1a20: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
1a30: 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20  he column. */.  
1a40: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
1a50: 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65  ,    /* The name
1a60: 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f   context used to
1a70: 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d   resolve the nam
1a80: 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  e */.  Expr *pEx
1a90: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
1aa0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
1ab0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
1ac0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
1ad0: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a  */.){.  int i, j
1ae0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
1af0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1b00: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
1b10: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
1b40: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
1b50: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
1b60: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20  tTab = 0;       
1b70: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
1b80: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
1b90: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
1ba0: 0a 20 20 69 6e 74 20 6e 53 75 62 71 75 65 72 79  .  int nSubquery
1bb0: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
1bc0: 20 20 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79       /* How many
1bd0: 20 6c 65 76 65 6c 73 20 6f 66 20 73 75 62 71 75   levels of subqu
1be0: 65 72 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  ery */.  sqlite3
1bf0: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
1c00: 62 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  b;         /* Th
1c10: 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  e database conne
1c20: 63 74 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63  ction */.  struc
1c30: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
1c40: 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20  pItem;       /* 
1c50: 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20  Use for looping 
1c60: 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74  over pSrcList it
1c70: 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ems */.  struct 
1c80: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d  SrcList_item *pM
1c90: 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68  atch = 0;  /* Th
1ca0: 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c  e matching pSrcL
1cb0: 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61  ist item */.  Na
1cc0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e  meContext *pTopN
1cd0: 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20  C = pNC;        
1ce0: 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e  /* First namecon
1cf0: 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74  text in the list
1d00: 20 2a 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53   */.  Schema *pS
1d10: 63 68 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20  chema = 0;      
1d20: 20 20 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d          /* Schem
1d30: 61 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  a of the express
1d40: 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65  ion */.  int eNe
1d50: 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c  wExprOp = TK_COL
1d60: 55 4d 4e 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65  UMN;       /* Ne
1d70: 77 20 76 61 6c 75 65 20 66 6f 72 20 70 45 78 70  w value for pExp
1d80: 72 2d 3e 6f 70 20 6f 6e 20 73 75 63 63 65 73 73  r->op on success
1d90: 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61   */.  Table *pTa
1da0: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  b = 0;          
1db0: 20 20 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65          /* Table
1dc0: 20 68 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f   hold the row */
1dd0: 0a 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b  .  Column *pCol;
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e       /* A column
1e00: 20 6f 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61   of pTab */..  a
1e10: 73 73 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20  ssert( pNC );   
1e20: 20 20 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f    /* the name co
1e30: 6e 74 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20  ntext cannot be 
1e40: 4e 55 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72  NULL. */.  asser
1e50: 74 28 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a  t( zCol );    /*
1e60: 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20   The Z in X.Y.Z 
1e70: 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a  cannot be NULL *
1e80: 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70  /.  assert( !Exp
1e90: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1ea0: 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  pr, EP_TokenOnly
1eb0: 7c 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a  |EP_Reduced) );.
1ec0: 0a 20 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65  .  /* Initialize
1ed0: 20 74 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d   the node to no-
1ee0: 6d 61 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72  match */.  pExpr
1ef0: 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20  ->iTable = -1;. 
1f00: 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70 65   ExprSetVVAPrope
1f10: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f  rty(pExpr, EP_No
1f20: 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20 54  Reduce);..  /* T
1f30: 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63 68  ranslate the sch
1f40: 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62 20  ema name in zDb 
1f50: 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20 74  into a pointer t
1f60: 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  o the correspond
1f70: 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61 2e  ing.  ** schema.
1f80: 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c 20    If not found, 
1f90: 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65 6d  pSchema will rem
1fa0: 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f 74  ain NULL and not
1fb0: 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68 0a  hing will match.
1fc0: 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20 69    ** resulting i
1fd0: 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74 65  n an appropriate
1fe0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 74   error message t
1ff0: 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f 66  oward the end of
2000: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20 20   this routine.  
2010: 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b 0a  */.  if( zDb ){.
2020: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 4e      testcase( pN
2030: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
2040: 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20 74  PartIdx );.    t
2050: 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e 63  estcase( pNC->nc
2060: 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68 65  Flags & NC_IsChe
2070: 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28 70  ck );.    if( (p
2080: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e  NC->ncFlags & (N
2090: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73 43  C_PartIdx|NC_IsC
20a0: 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20 20  heck))!=0 ){.   
20b0: 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20 69     /* Silently i
20c0: 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20 71  gnore database q
20d0: 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64 65  ualifiers inside
20e0: 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
20f0: 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  ts and.      ** 
2100: 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73 2e  partial indices.
2110: 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20 65    Do not raise e
2120: 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74 68  rrors because th
2130: 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a 20  at might break. 
2140: 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20 61       ** legacy a
2150: 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64 6f  nd because it do
2160: 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79 74  es not hurt anyt
2170: 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67 6e  hing to just ign
2180: 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  ore the.      **
2190: 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e 20   database name. 
21a0: 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20 30  */.      zDb = 0
21b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
21c0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64 62     for(i=0; i<db
21d0: 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nDb; i++){.   
21e0: 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62 2d       assert( db-
21f0: 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d 65  >aDb[i].zDbSName
2200: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2210: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
2220: 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61  b->aDb[i].zDbSNa
2230: 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20 20  me,zDb)==0 ){.  
2240: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
2250: 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53 63  = db->aDb[i].pSc
2260: 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20 20  hema;.          
2270: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
2280: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2290: 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20 61   }..  /* Start a
22a0: 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73 74  t the inner-most
22b0: 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f 76   context and mov
22c0: 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c 20  e outward until 
22d0: 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64  a match is found
22e0: 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 4e   */.  assert( pN
22f0: 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 3b 0a 20  C && cnt==0 );. 
2300: 20 64 6f 7b 0a 20 20 20 20 45 78 70 72 4c 69 73   do{.    ExprLis
2310: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 53  t *pEList;.    S
2320: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
2330: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
2340: 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63 4c  ;..    if( pSrcL
2350: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f 72  ist ){.      for
2360: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72 63  (i=0, pItem=pSrc
2370: 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63 4c  List->a; i<pSrcL
2380: 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c 20  ist->nSrc; i++, 
2390: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
23a0: 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e    pTab = pItem->
23b0: 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61 73  pTab;.        as
23c0: 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26 26  sert( pTab!=0 &&
23d0: 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30 20   pTab->zName!=0 
23e0: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
23f0: 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20  t( pTab->nCol>0 
2400: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
2410: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26 26  Item->pSelect &&
2420: 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74   (pItem->pSelect
2430: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
2440: 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20 29  NestedFrom)!=0 )
2450: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
2460: 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  hit = 0;.       
2470: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74 65     pEList = pIte
2480: 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  m->pSelect->pELi
2490: 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66 6f  st;.          fo
24a0: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
24b0: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
24c0: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
24d0: 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e 61  lite3MatchSpanNa
24e0: 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  me(pEList->a[j].
24f0: 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54 61  zSpan, zCol, zTa
2500: 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20 20  b, zDb) ){.     
2510: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
2520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6e                cn
2530: 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20 20  tTab = 2;.      
2540: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
2550: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
2560: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
2570: 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20  lumn = j;.      
2580: 20 20 20 20 20 20 20 20 68 69 74 20 3d 20 31 3b          hit = 1;
2590: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
25a0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
25b0: 20 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c 20       if( hit || 
25c0: 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  zTab==0 ) contin
25d0: 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ue;.        }.  
25e0: 20 20 20 20 20 20 69 66 28 20 7a 44 62 20 26 26        if( zDb &&
25f0: 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21 3d   pTab->pSchema!=
2600: 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20 20  pSchema ){.     
2610: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
2620: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2630: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
2640: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
2650: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
2660: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70 49  tem->zAlias ? pI
2670: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70 54  tem->zAlias : pT
2680: 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  ab->zName;.     
2690: 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54 61       assert( zTa
26a0: 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20 20  bName!=0 );.    
26b0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
26c0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
26d0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a 20  e, zTab)!=0 ){. 
26e0: 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69             conti
26f0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  nue;.          }
2700: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49  .          if( I
2710: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
2720: 26 26 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  && pItem->zAlias
2730: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2740: 73 71 6c 69 74 65 33 52 65 6e 61 6d 65 54 6f 6b  sqlite3RenameTok
2750: 65 6e 52 65 6d 61 70 28 70 50 61 72 73 65 2c 20  enRemap(pParse, 
2760: 30 2c 20 28 76 6f 69 64 2a 29 26 70 45 78 70 72  0, (void*)&pExpr
2770: 2d 3e 79 2e 70 54 61 62 29 3b 0a 20 20 20 20 20  ->y.pTab);.     
2780: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2790: 0a 20 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d  .        if( 0==
27a0: 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20  (cntTab++) ){.  
27b0: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
27c0: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
27d0: 7d 0a 20 20 20 20 20 20 20 20 66 6f 72 28 6a 3d  }.        for(j=
27e0: 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43  0, pCol=pTab->aC
27f0: 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c  ol; j<pTab->nCol
2800: 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; j++, pCol++){.
2810: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2820: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
2830: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
2840: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
2850: 20 20 2f 2a 20 49 66 20 74 68 65 72 65 20 68 61    /* If there ha
2860: 73 20 62 65 65 6e 20 65 78 61 63 74 6c 79 20 6f  s been exactly o
2870: 6e 65 20 70 72 69 6f 72 20 6d 61 74 63 68 20 61  ne prior match a
2880: 6e 64 20 74 68 69 73 20 6d 61 74 63 68 0a 20 20  nd this match.  
2890: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 69 73 20            ** is 
28a0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 2d 68 61  for the right-ha
28b0: 6e 64 20 74 61 62 6c 65 20 6f 66 20 61 20 4e 41  nd table of a NA
28c0: 54 55 52 41 4c 20 4a 4f 49 4e 20 6f 72 20 69 73  TURAL JOIN or is
28d0: 20 69 6e 20 61 20 0a 20 20 20 20 20 20 20 20 20   in a .         
28e0: 20 20 20 2a 2a 20 55 53 49 4e 47 20 63 6c 61 75     ** USING clau
28f0: 73 65 2c 20 74 68 65 6e 20 73 6b 69 70 20 74 68  se, then skip th
2900: 69 73 20 6d 61 74 63 68 2e 0a 20 20 20 20 20 20  is match..      
2910: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
2920: 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 31 20       if( cnt==1 
2930: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
2940: 20 69 66 28 20 70 49 74 65 6d 2d 3e 66 67 2e 6a   if( pItem->fg.j
2950: 6f 69 6e 74 79 70 65 20 26 20 4a 54 5f 4e 41 54  ointype & JT_NAT
2960: 55 52 41 4c 20 29 20 63 6f 6e 74 69 6e 75 65 3b  URAL ) continue;
2970: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
2980: 66 28 20 6e 61 6d 65 49 6e 55 73 69 6e 67 43 6c  f( nameInUsingCl
2990: 61 75 73 65 28 70 49 74 65 6d 2d 3e 70 55 73 69  ause(pItem->pUsi
29a0: 6e 67 2c 20 7a 43 6f 6c 29 20 29 20 63 6f 6e 74  ng, zCol) ) cont
29b0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
29c0: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
29d0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
29e0: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
29f0: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f  m;.            /
2a00: 2a 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65  * Substitute the
2a10: 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d   rowid (column -
2a20: 31 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47  1) for the INTEG
2a30: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a  ER PRIMARY KEY *
2a40: 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  /.            pE
2a50: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a  xpr->iColumn = j
2a60: 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20  ==pTab->iPKey ? 
2a70: 2d 31 20 3a 20 28 69 31 36 29 6a 3b 0a 20 20 20  -1 : (i16)j;.   
2a80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
2a90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
2ab0: 20 20 20 20 69 66 28 20 70 4d 61 74 63 68 20 29      if( pMatch )
2ac0: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2ad0: 3e 69 54 61 62 6c 65 20 3d 20 70 4d 61 74 63 68  >iTable = pMatch
2ae0: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20  ->iCursor;.     
2af0: 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62     pExpr->y.pTab
2b00: 20 3d 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b   = pMatch->pTab;
2b10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 52 49 47 48  .        /* RIGH
2b20: 54 20 4a 4f 49 4e 20 6e 6f 74 20 28 79 65 74 29  T JOIN not (yet)
2b30: 20 73 75 70 70 6f 72 74 65 64 20 2a 2f 0a 20 20   supported */.  
2b40: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
2b50: 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79  Match->fg.jointy
2b60: 70 65 20 26 20 4a 54 5f 52 49 47 48 54 29 3d 3d  pe & JT_RIGHT)==
2b70: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  0 );.        if(
2b80: 20 28 70 4d 61 74 63 68 2d 3e 66 67 2e 6a 6f 69   (pMatch->fg.joi
2b90: 6e 74 79 70 65 20 26 20 4a 54 5f 4c 45 46 54 29  ntype & JT_LEFT)
2ba0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  !=0 ){.         
2bb0: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
2bc0: 28 70 45 78 70 72 2c 20 45 50 5f 43 61 6e 42 65  (pExpr, EP_CanBe
2bd0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 7d  Null);.        }
2be0: 0a 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61  .        pSchema
2bf0: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62   = pExpr->y.pTab
2c00: 2d 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20  ->pSchema;.     
2c10: 20 7d 0a 20 20 20 20 7d 20 2f 2a 20 69 66 28 20   }.    } /* if( 
2c20: 70 53 72 63 4c 69 73 74 20 29 20 2a 2f 0a 0a 23  pSrcList ) */..#
2c30: 69 66 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  if !defined(SQLI
2c40: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
2c50: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
2c60: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 29  ITE_OMIT_UPSERT)
2c70: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
2c80: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
2c90: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
2ca0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
2cb0: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
2cc0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
2cd0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
2ce0: 65 72 65 6e 63 65 2e 20 20 4f 72 0a 20 20 20 20  erence.  Or.    
2cf0: 2a 2a 20 6d 61 79 62 65 20 69 74 20 69 73 20 61  ** maybe it is a
2d00: 6e 20 65 78 63 6c 75 64 65 64 2e 2a 20 66 72 6f  n excluded.* fro
2d10: 6d 20 61 6e 20 75 70 73 65 72 74 2e 0a 20 20 20  m an upsert..   
2d20: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
2d30: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
2d40: 20 63 6e 74 54 61 62 3d 3d 30 20 29 7b 0a 20 20   cntTab==0 ){.  
2d50: 20 20 20 20 70 54 61 62 20 3d 20 30 3b 0a 23 69      pTab = 0;.#i
2d60: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
2d70: 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 20 20  T_TRIGGER.      
2d80: 69 66 28 20 70 50 61 72 73 65 2d 3e 70 54 72 69  if( pParse->pTri
2d90: 67 67 65 72 54 61 62 21 3d 30 20 29 7b 0a 20 20  ggerTab!=0 ){.  
2da0: 20 20 20 20 20 20 69 6e 74 20 6f 70 20 3d 20 70        int op = p
2db0: 50 61 72 73 65 2d 3e 65 54 72 69 67 67 65 72 4f  Parse->eTriggerO
2dc0: 70 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  p;.        asser
2dd0: 74 28 20 6f 70 3d 3d 54 4b 5f 44 45 4c 45 54 45  t( op==TK_DELETE
2de0: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50 44 41 54   || op==TK_UPDAT
2df0: 45 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 49 4e 53 45  E || op==TK_INSE
2e00: 52 54 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66  RT );.        if
2e10: 28 20 6f 70 21 3d 54 4b 5f 44 45 4c 45 54 45 20  ( op!=TK_DELETE 
2e20: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2e30: 70 28 22 6e 65 77 22 2c 7a 54 61 62 29 20 3d 3d  p("new",zTab) ==
2e40: 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20   0 ){.          
2e50: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
2e60: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  1;.          pTa
2e70: 62 20 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69  b = pParse->pTri
2e80: 67 67 65 72 54 61 62 3b 0a 20 20 20 20 20 20 20  ggerTab;.       
2e90: 20 7d 65 6c 73 65 20 69 66 28 20 6f 70 21 3d 54   }else if( op!=T
2ea0: 4b 5f 49 4e 53 45 52 54 20 26 26 20 73 71 6c 69  K_INSERT && sqli
2eb0: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
2ec0: 2c 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20  ,zTab)==0 ){.   
2ed0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2ee0: 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20 20 20 20  able = 0;.      
2ef0: 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
2f00: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a  e->pTriggerTab;.
2f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2f20: 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
2f30: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20  TE_OMIT_TRIGGER 
2f40: 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  */.#ifndef SQLIT
2f50: 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a 20 20  E_OMIT_UPSERT.  
2f60: 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e 63      if( (pNC->nc
2f70: 46 6c 61 67 73 20 26 20 4e 43 5f 55 55 70 73 65  Flags & NC_UUpse
2f80: 72 74 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  rt)!=0 ){.      
2f90: 20 20 55 70 73 65 72 74 20 2a 70 55 70 73 65 72    Upsert *pUpser
2fa0: 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70  t = pNC->uNC.pUp
2fb0: 73 65 72 74 3b 0a 20 20 20 20 20 20 20 20 69 66  sert;.        if
2fc0: 28 20 70 55 70 73 65 72 74 20 26 26 20 73 71 6c  ( pUpsert && sql
2fd0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 65 78 63  ite3StrICmp("exc
2fe0: 6c 75 64 65 64 22 2c 7a 54 61 62 29 3d 3d 30 20  luded",zTab)==0 
2ff0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 61  ){.          pTa
3000: 62 20 3d 20 70 55 70 73 65 72 74 2d 3e 70 55 70  b = pUpsert->pUp
3010: 73 65 72 74 53 72 63 2d 3e 61 5b 30 5d 2e 70 54  sertSrc->a[0].pT
3020: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  ab;.          pE
3030: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 32 3b  xpr->iTable = 2;
3040: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3050: 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c   }.#endif /* SQL
3060: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 20  ITE_OMIT_UPSERT 
3070: 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54  */..      if( pT
3080: 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69  ab ){ .        i
3090: 6e 74 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20  nt iCol;.       
30a0: 20 70 53 63 68 65 6d 61 20 3d 20 70 54 61 62 2d   pSchema = pTab-
30b0: 3e 70 53 63 68 65 6d 61 3b 0a 20 20 20 20 20 20  >pSchema;.      
30c0: 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20    cntTab++;.    
30d0: 20 20 20 20 66 6f 72 28 69 43 6f 6c 3d 30 2c 20      for(iCol=0, 
30e0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
30f0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
3100: 3b 20 69 43 6f 6c 2b 2b 2c 20 70 43 6f 6c 2b 2b  ; iCol++, pCol++
3110: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
3120: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3130: 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f  pCol->zName, zCo
3140: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
3150: 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 70       if( iCol==p
3160: 54 61 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20  Tab->iPKey ){.  
3170: 20 20 20 20 20 20 20 20 20 20 20 20 69 43 6f 6c              iCol
3180: 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20 20 20   = -1;.         
3190: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20     }.           
31a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
31b0: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
31c0: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3e 3d        if( iCol>=
31d0: 70 54 61 62 2d 3e 6e 43 6f 6c 20 26 26 20 73 71  pTab->nCol && sq
31e0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
31f0: 6c 29 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77  l) && VisibleRow
3200: 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20 20 20  id(pTab) ){.    
3210: 20 20 20 20 20 20 2f 2a 20 49 4d 50 3a 20 52 2d        /* IMP: R-
3220: 35 31 34 31 34 2d 33 32 39 31 30 20 2a 2f 0a 20  51414-32910 */. 
3230: 20 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20           iCol = 
3240: 2d 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  -1;.        }.  
3250: 20 20 20 20 20 20 69 66 28 20 69 43 6f 6c 3c 70        if( iCol<p
3260: 54 61 62 2d 3e 6e 43 6f 6c 20 29 7b 0a 20 20 20  Tab->nCol ){.   
3270: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 23 69         cnt++;.#i
3280: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
3290: 54 5f 55 50 53 45 52 54 0a 20 20 20 20 20 20 20  T_UPSERT.       
32a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
32b0: 61 62 6c 65 3d 3d 32 20 29 7b 0a 20 20 20 20 20  able==2 ){.     
32c0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
32d0: 20 69 43 6f 6c 3d 3d 28 2d 31 29 20 29 3b 0a 20   iCol==(-1) );. 
32e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 49             if( I
32f0: 4e 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20  N_RENAME_OBJECT 
3300: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
3310: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
3320: 3d 20 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  = iCol;.        
3330: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70        pExpr->y.p
3340: 54 61 62 20 3d 20 70 54 61 62 3b 0a 20 20 20 20  Tab = pTab;.    
3350: 20 20 20 20 20 20 20 20 20 20 65 4e 65 77 45 78            eNewEx
3360: 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  prOp = TK_COLUMN
3370: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65  ;.            }e
3380: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20  lse{.           
3390: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
33a0: 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70 73   = pNC->uNC.pUps
33b0: 65 72 74 2d 3e 72 65 67 44 61 74 61 20 2b 20 69  ert->regData + i
33c0: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Col;.           
33d0: 20 20 20 65 4e 65 77 45 78 70 72 4f 70 20 3d 20     eNewExprOp = 
33e0: 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20 20  TK_REGISTER;.   
33f0: 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53             ExprS
3400: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
3410: 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a 20 20 20  , EP_Alias);.   
3420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3430: 20 20 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69       }else.#endi
3440: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
3450: 5f 55 50 53 45 52 54 20 2a 2f 0a 20 20 20 20 20  _UPSERT */.     
3460: 20 20 20 20 20 7b 0a 23 69 66 6e 64 65 66 20 53       {.#ifndef S
3470: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
3480: 45 52 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ER.            i
3490: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
34a0: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
34b0: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c  ->affinity = SQL
34c0: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
34d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
34e0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54  se if( pExpr->iT
34f0: 61 62 6c 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20  able==0 ){.     
3500: 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73           testcas
3510: 65 28 20 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20  e( iCol==31 );. 
3520: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65 73               tes
3530: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20  tcase( iCol==32 
3540: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
3550: 20 70 50 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b   pParse->oldmask
3560: 20 7c 3d 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20   |= (iCol>=32 ? 
3570: 30 78 66 66 66 66 66 66 66 66 20 3a 20 28 28 28  0xffffffff : (((
3580: 75 33 32 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a  u32)1)<<iCol));.
3590: 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73              }els
35a0: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e{.             
35b0: 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d   testcase( iCol=
35c0: 3d 33 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  =31 );.         
35d0: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 69       testcase( i
35e0: 43 6f 6c 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20  Col==32 );.     
35f0: 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d           pParse-
3600: 3e 6e 65 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f  >newmask |= (iCo
3610: 6c 3e 3d 33 32 20 3f 20 30 78 66 66 66 66 66 66  l>=32 ? 0xffffff
3620: 66 66 20 3a 20 28 28 28 75 33 32 29 31 29 3c 3c  ff : (((u32)1)<<
3630: 69 43 6f 6c 29 29 3b 0a 20 20 20 20 20 20 20 20  iCol));.        
3640: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
3650: 20 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20    pExpr->y.pTab 
3660: 3d 20 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  = pTab;.        
3670: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
3680: 6d 6e 20 3d 20 28 69 31 36 29 69 43 6f 6c 3b 0a  mn = (i16)iCol;.
3690: 20 20 20 20 20 20 20 20 20 20 20 20 65 4e 65 77              eNew
36a0: 45 78 70 72 4f 70 20 3d 20 54 4b 5f 54 52 49 47  ExprOp = TK_TRIG
36b0: 47 45 52 3b 0a 23 65 6e 64 69 66 20 2f 2a 20 53  GER;.#endif /* S
36c0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
36d0: 45 52 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ER */.          
36e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
36f0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
3700: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
3710: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3720: 29 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51  ) || !defined(SQ
3730: 4c 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54  LITE_OMIT_UPSERT
3740: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
3750: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
3760: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
3770: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
3780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
3790: 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26 26 20 63  cnt==0.     && c
37a0: 6e 74 54 61 62 3d 3d 31 0a 20 20 20 20 20 26 26  ntTab==1.     &&
37b0: 20 70 4d 61 74 63 68 0a 20 20 20 20 20 26 26 20   pMatch.     && 
37c0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
37d0: 4e 43 5f 49 64 78 45 78 70 72 29 3d 3d 30 0a 20  NC_IdxExpr)==0. 
37e0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 49 73      && sqlite3Is
37f0: 52 6f 77 69 64 28 7a 43 6f 6c 29 0a 20 20 20 20  Rowid(zCol).    
3800: 20 26 26 20 56 69 73 69 62 6c 65 52 6f 77 69 64   && VisibleRowid
3810: 28 70 4d 61 74 63 68 2d 3e 70 54 61 62 29 0a 20  (pMatch->pTab). 
3820: 20 20 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20     ){.      cnt 
3830: 3d 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72  = 1;.      pExpr
3840: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a  ->iColumn = -1;.
3850: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
3860: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
3870: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
3880: 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  }..    /*.    **
3890: 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73   If the input is
38a0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28   of the form Z (
38b0: 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a  not Y.Z or X.Y.Z
38c0: 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20  ) then the name 
38d0: 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72  Z.    ** might r
38e0: 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c  efer to an resul
38f0: 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68  t-set alias.  Th
3900: 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20  is happens, for 
3910: 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20  example, when.  
3920: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
3930: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
3940: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
3950: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
3960: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a   command:.    **
3970: 0a 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45  .    **     SELE
3980: 43 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d  CT a+b AS x FROM
3990: 20 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31   table WHERE x<1
39a0: 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  0;.    **.    **
39b0: 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74   In cases like t
39c0: 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78  his, replace pEx
39d0: 70 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f  pr with a copy o
39e0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
39f0: 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72   that.    ** for
3a00: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
3a10: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
3a20: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
3a30: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
3a40: 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f  ately..    ** No
3a50: 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72  te that the expr
3a60: 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65  ession in the re
3a70: 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20  sult set should 
3a80: 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65  have already bee
3a90: 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65  n.    ** resolve
3aa0: 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68  d by the time th
3ab0: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69  e WHERE clause i
3ac0: 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20  s resolved..    
3ad0: 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 65 20 61 62  **.    ** The ab
3ae0: 69 6c 69 74 79 20 74 6f 20 75 73 65 20 61 6e 20  ility to use an 
3af0: 6f 75 74 70 75 74 20 72 65 73 75 6c 74 2d 73 65  output result-se
3b00: 74 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  t column in the 
3b10: 57 48 45 52 45 2c 20 47 52 4f 55 50 20 42 59 2c  WHERE, GROUP BY,
3b20: 0a 20 20 20 20 2a 2a 20 6f 72 20 48 41 56 49 4e  .    ** or HAVIN
3b30: 47 20 63 6c 61 75 73 65 73 2c 20 6f 72 20 61 73  G clauses, or as
3b40: 20 70 61 72 74 20 6f 66 20 61 20 6c 61 72 67 65   part of a large
3b50: 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  r expression in 
3b60: 74 68 65 20 4f 52 44 45 52 20 42 59 0a 20 20 20  the ORDER BY.   
3b70: 20 2a 2a 20 63 6c 61 75 73 65 20 69 73 20 6e 6f   ** clause is no
3b80: 74 20 73 74 61 6e 64 61 72 64 20 53 51 4c 2e 20  t standard SQL. 
3b90: 20 54 68 69 73 20 69 73 20 61 20 28 67 6f 6f 66   This is a (goof
3ba0: 79 29 20 53 51 4c 69 74 65 20 65 78 74 65 6e 73  y) SQLite extens
3bb0: 69 6f 6e 2c 20 74 68 61 74 0a 20 20 20 20 2a 2a  ion, that.    **
3bc0: 20 69 73 20 73 75 70 70 6f 72 74 65 64 20 66 6f   is supported fo
3bd0: 72 20 62 61 63 6b 77 61 72 64 73 20 63 6f 6d 70  r backwards comp
3be0: 61 74 69 62 69 6c 69 74 79 20 6f 6e 6c 79 2e 20  atibility only. 
3bf0: 48 65 6e 63 65 2c 20 77 65 20 69 73 73 75 65 20  Hence, we issue 
3c00: 61 20 77 61 72 6e 69 6e 67 0a 20 20 20 20 2a 2a  a warning.    **
3c10: 20 6f 6e 20 73 71 6c 69 74 65 33 5f 6c 6f 67 28   on sqlite3_log(
3c20: 29 20 77 68 65 6e 65 76 65 72 20 74 68 65 20 63  ) whenever the c
3c30: 61 70 61 62 69 6c 69 74 79 20 69 73 20 75 73 65  apability is use
3c40: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  d..    */.    if
3c50: 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ( (pNC->ncFlags 
3c60: 26 20 4e 43 5f 55 45 4c 69 73 74 29 21 3d 30 0a  & NC_UEList)!=0.
3c70: 20 20 20 20 20 26 26 20 63 6e 74 3d 3d 30 0a 20       && cnt==0. 
3c80: 20 20 20 20 26 26 20 7a 54 61 62 3d 3d 30 0a 20      && zTab==0. 
3c90: 20 20 20 29 7b 0a 20 20 20 20 20 20 70 45 4c 69     ){.      pELi
3ca0: 73 74 20 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 45  st = pNC->uNC.pE
3cb0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  List;.      asse
3cc0: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
3cd0: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20  .      for(j=0; 
3ce0: 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  j<pEList->nExpr;
3cf0: 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63   j++){.        c
3d00: 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73  har *zAs = pELis
3d10: 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20  t->a[j].zName;. 
3d20: 20 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d         if( zAs!=
3d30: 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  0 && sqlite3StrI
3d40: 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d  Cmp(zAs, zCol)==
3d50: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  0 ){.          E
3d60: 78 70 72 20 2a 70 4f 72 69 67 3b 0a 20 20 20 20  xpr *pOrig;.    
3d70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3d80: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
3d90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
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 4c 69 73 74 3d 3d 30 20 29 3b 0a 20 20 20 20  pList==0 );.    
3dd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
3de0: 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3d 3d  xpr->x.pSelect==
3df0: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  0 );.          p
3e00: 4f 72 69 67 20 3d 20 70 45 4c 69 73 74 2d 3e 61  Orig = pEList->a
3e10: 5b 6a 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [j].pExpr;.     
3e20: 20 20 20 20 20 69 66 28 20 28 70 4e 43 2d 3e 6e       if( (pNC->n
3e30: 63 46 6c 61 67 73 26 4e 43 5f 41 6c 6c 6f 77 41  cFlags&NC_AllowA
3e40: 67 67 29 3d 3d 30 20 26 26 20 45 78 70 72 48 61  gg)==0 && ExprHa
3e50: 73 50 72 6f 70 65 72 74 79 28 70 4f 72 69 67 2c  sProperty(pOrig,
3e60: 20 45 50 5f 41 67 67 29 20 29 7b 0a 20 20 20 20   EP_Agg) ){.    
3e70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
3e80: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
3e90: 22 6d 69 73 75 73 65 20 6f 66 20 61 6c 69 61 73  "misuse of alias
3ea0: 65 64 20 61 67 67 72 65 67 61 74 65 20 25 73 22  ed aggregate %s"
3eb0: 2c 20 7a 41 73 29 3b 0a 20 20 20 20 20 20 20 20  , zAs);.        
3ec0: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
3ed0: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
3ee0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
3ef0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
3f00: 72 53 69 7a 65 28 70 4f 72 69 67 29 21 3d 31 20  rSize(pOrig)!=1 
3f10: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
3f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
3f30: 50 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75  Parse, "row valu
3f40: 65 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20  e misused");.   
3f50: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
3f60: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20  WRC_Abort;.     
3f70: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
3f80: 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70 50   resolveAlias(pP
3f90: 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 6a 2c  arse, pEList, j,
3fa0: 20 70 45 78 70 72 2c 20 22 22 2c 20 6e 53 75 62   pExpr, "", nSub
3fb0: 71 75 65 72 79 29 3b 0a 20 20 20 20 20 20 20 20  query);.        
3fc0: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
3fd0: 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 30 3b       pMatch = 0;
3fe0: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
3ff0: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
4000: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
4010: 20 20 69 66 28 20 49 4e 5f 52 45 4e 41 4d 45 5f    if( IN_RENAME_
4020: 4f 42 4a 45 43 54 20 29 7b 0a 20 20 20 20 20 20  OBJECT ){.      
4030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e        sqlite3Ren
4040: 61 6d 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50  ameTokenRemap(pP
4050: 61 72 73 65 2c 20 30 2c 20 28 76 6f 69 64 2a 29  arse, 0, (void*)
4060: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4070: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 67 6f    }.          go
4080: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
4090: 64 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  d;.        }.   
40a0: 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20     } .    }..   
40b0: 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74   /* Advance to t
40c0: 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e  he next name con
40d0: 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20  text.  The loop 
40e0: 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65  will exit when e
40f0: 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20  ither.    ** we 
4100: 68 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e  have a match (cn
4110: 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20  t>0) or when we 
4120: 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20  run out of name 
4130: 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f  contexts..    */
4140: 0a 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 62  .    if( cnt ) b
4150: 72 65 61 6b 3b 0a 20 20 20 20 70 4e 43 20 3d 20  reak;.    pNC = 
4160: 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20  pNC->pNext;.    
4170: 6e 53 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 7d  nSubquery++;.  }
4180: 77 68 69 6c 65 28 20 70 4e 43 20 29 3b 0a 0a 0a  while( pNC );...
4190: 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61    /*.  ** If X a
41a0: 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69  nd Y are NULL (i
41b0: 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66  n other words if
41c0: 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e   only the column
41d0: 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20   name Z is.  ** 
41e0: 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68  supplied) and th
41f0: 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20  e value of Z is 
4200: 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62  enclosed in doub
4210: 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a  le-quotes, then.
4220: 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69    ** Z is a stri
4230: 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74  ng literal if it
4240: 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61   doesn't match a
4250: 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e  ny column names.
4260: 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63    In that.  ** c
4270: 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20  ase, we need to 
4280: 72 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61  return right awa
4290: 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61  y and not make a
42a0: 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20  ny changes to.  
42b0: 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20  ** pExpr..  **. 
42c0: 20 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72   ** Because no r
42d0: 65 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64  eference was mad
42e0: 65 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65  e to outer conte
42f0: 78 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52  xts, the pNC->nR
4300: 65 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61  ef.  ** fields a
4310: 72 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69  re not changed i
4320: 6e 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20  n any context.. 
4330: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
4340: 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20   && zTab==0 ){. 
4350: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
4360: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20  ->op==TK_ID );. 
4370: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
4380: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f  operty(pExpr,EP_
4390: 44 62 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20  DblQuoted) ){.  
43a0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
43b0: 54 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20  TK_STRING;.     
43c0: 20 70 45 78 70 72 2d 3e 79 2e 70 54 61 62 20 3d   pExpr->y.pTab =
43d0: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
43e0: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
43f0: 7d 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  }.    if( sqlite
4400: 33 45 78 70 72 49 64 54 6f 54 72 75 65 46 61 6c  3ExprIdToTrueFal
4410: 73 65 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20  se(pExpr) ){.   
4420: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
4430: 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a  une;.    }.  }..
4440: 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30    /*.  ** cnt==0
4450: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73   means there was
4460: 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74   not match.  cnt
4470: 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  >1 means there w
4480: 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20  ere two or.  ** 
4490: 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45  more matches.  E
44a0: 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61  ither way, we ha
44b0: 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ve an error..  *
44c0: 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29  /.  if( cnt!=1 )
44d0: 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72  {.    const char
44e0: 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72   *zErr;.    zErr
44f0: 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20   = cnt==0 ? "no 
4500: 73 75 63 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22  such column" : "
4510: 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e  ambiguous column
4520: 20 6e 61 6d 65 22 3b 0a 20 20 20 20 69 66 28 20   name";.    if( 
4530: 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  zDb ){.      sql
4540: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
4550: 72 73 65 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e  rse, "%s: %s.%s.
4560: 25 73 22 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20  %s", zErr, zDb, 
4570: 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20  zTab, zCol);.   
4580: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20   }else if( zTab 
4590: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
45a0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
45b0: 20 22 25 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45   "%s: %s.%s", zE
45c0: 72 72 2c 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b  rr, zTab, zCol);
45d0: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
45e0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
45f0: 67 28 70 50 61 72 73 65 2c 20 22 25 73 3a 20 25  g(pParse, "%s: %
4600: 73 22 2c 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b  s", zErr, zCol);
4610: 0a 20 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73  .    }.    pPars
4620: 65 2d 3e 63 68 65 63 6b 53 63 68 65 6d 61 20 3d  e->checkSchema =
4630: 20 31 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e   1;.    pTopNC->
4640: 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f  nErr++;.  }..  /
4650: 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72  * If a column fr
4660: 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53  om a table in pS
4670: 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72 65  rcList is refere
4680: 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72  nced, then recor
4690: 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74  d.  ** this fact
46a0: 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74   in the pSrcList
46b0: 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74  .a[].colUsed bit
46c0: 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20  mask.  Column 0 
46d0: 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20  causes.  ** bit 
46e0: 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f  0 to be set.  Co
46f0: 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20  lumn 1 sets bit 
4700: 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  1.  And so forth
4710: 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63  .  If the.  ** c
4720: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20  olumn number is 
4730: 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68 65  greater than the
4740: 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20   number of bits 
4750: 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20  in the bitmask. 
4760: 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65   ** then set the
4770: 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20   high-order bit 
4780: 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a  of the bitmask..
4790: 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72    */.  if( pExpr
47a0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20  ->iColumn>=0 && 
47b0: 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20  pMatch!=0 ){.   
47c0: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
47d0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 74 65 73  iColumn;.    tes
47e0: 74 63 61 73 65 28 20 6e 3d 3d 42 4d 53 2d 31 20  tcase( n==BMS-1 
47f0: 29 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 42 4d  );.    if( n>=BM
4800: 53 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 42  S ){.      n = B
4810: 4d 53 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  MS-1;.    }.    
4820: 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e  assert( pMatch->
4830: 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e  iCursor==pExpr->
4840: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d  iTable );.    pM
4850: 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d  atch->colUsed |=
4860: 20 28 28 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e   ((Bitmask)1)<<n
4870: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61  ;.  }..  /* Clea
4880: 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a  n up and return.
4890: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78    */.  sqlite3Ex
48a0: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
48b0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
48c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
48d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
48e0: 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d 3e 70  ete(db, pExpr->p
48f0: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
4900: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70  >pRight = 0;.  p
4910: 45 78 70 72 2d 3e 6f 70 20 3d 20 65 4e 65 77 45  Expr->op = eNewE
4920: 78 70 72 4f 70 3b 0a 20 20 45 78 70 72 53 65 74  xprOp;.  ExprSet
4930: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
4940: 45 50 5f 4c 65 61 66 29 3b 0a 6c 6f 6f 6b 75 70  EP_Leaf);.lookup
4950: 6e 61 6d 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20  name_end:.  if( 
4960: 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73  cnt==1 ){.    as
4970: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
4980: 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61 73      if( !ExprHas
4990: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
49a0: 45 50 5f 41 6c 69 61 73 29 20 29 7b 0a 20 20 20  EP_Alias) ){.   
49b0: 20 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65     sqlite3AuthRe
49c0: 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ad(pParse, pExpr
49d0: 2c 20 70 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e  , pSchema, pNC->
49e0: 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 20 20 7d  pSrcList);.    }
49f0: 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e  .    /* Incremen
4a00: 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75 65  t the nRef value
4a10: 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e   on all name con
4a20: 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43  texts from TopNC
4a30: 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68   up to.    ** th
4a40: 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74 68  e point where th
4a50: 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e 20  e name matched. 
4a60: 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a  */.    for(;;){.
4a70: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
4a80: 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20 20  opNC!=0 );.     
4a90: 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b   pTopNC->nRef++;
4aa0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70 4e  .      if( pTopN
4ab0: 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a  C==pNC ) break;.
4ac0: 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20 70        pTopNC = p
4ad0: 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  TopNC->pNext;.  
4ae0: 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20 57    }.    return W
4af0: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 7d 20 65 6c  RC_Prune;.  } el
4b00: 73 65 20 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  se {.    return 
4b10: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d  WRC_Abort;.  }.}
4b20: 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65  ../*.** Allocate
4b30: 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f   and return a po
4b40: 69 6e 74 65 72 20 74 6f 20 61 6e 20 65 78 70 72  inter to an expr
4b50: 65 73 73 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 74  ession to load t
4b60: 68 65 20 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a  he column iCol.*
4b70: 2a 20 66 72 6f 6d 20 64 61 74 61 73 6f 75 72 63  * from datasourc
4b80: 65 20 69 53 72 63 20 69 6e 20 53 72 63 4c 69 73  e iSrc in SrcLis
4b90: 74 20 70 53 72 63 2e 0a 2a 2f 0a 45 78 70 72 20  t pSrc..*/.Expr 
4ba0: 2a 73 71 6c 69 74 65 33 43 72 65 61 74 65 43 6f  *sqlite3CreateCo
4bb0: 6c 75 6d 6e 45 78 70 72 28 73 71 6c 69 74 65 33  lumnExpr(sqlite3
4bc0: 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20 2a 70   *db, SrcList *p
4bd0: 53 72 63 2c 20 69 6e 74 20 69 53 72 63 2c 20 69  Src, int iSrc, i
4be0: 6e 74 20 69 43 6f 6c 29 7b 0a 20 20 45 78 70 72  nt iCol){.  Expr
4bf0: 20 2a 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70   *p = sqlite3Exp
4c00: 72 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 43 4f  rAlloc(db, TK_CO
4c10: 4c 55 4d 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 69  LUMN, 0, 0);.  i
4c20: 66 28 20 70 20 29 7b 0a 20 20 20 20 73 74 72 75  f( p ){.    stru
4c30: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
4c40: 2a 70 49 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e  *pItem = &pSrc->
4c50: 61 5b 69 53 72 63 5d 3b 0a 20 20 20 20 70 2d 3e  a[iSrc];.    p->
4c60: 79 2e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e  y.pTab = pItem->
4c70: 70 54 61 62 3b 0a 20 20 20 20 70 2d 3e 69 54 61  pTab;.    p->iTa
4c80: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
4c90: 72 73 6f 72 3b 0a 20 20 20 20 69 66 28 20 70 2d  rsor;.    if( p-
4ca0: 3e 79 2e 70 54 61 62 2d 3e 69 50 4b 65 79 3d 3d  >y.pTab->iPKey==
4cb0: 69 43 6f 6c 20 29 7b 0a 20 20 20 20 20 20 70 2d  iCol ){.      p-
4cc0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
4cd0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4ce0: 70 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28 79 6e  p->iColumn = (yn
4cf0: 56 61 72 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20  Var)iCol;.      
4d00: 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d  testcase( iCol==
4d10: 42 4d 53 20 29 3b 0a 20 20 20 20 20 20 74 65 73  BMS );.      tes
4d20: 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 42 4d 53  tcase( iCol==BMS
4d30: 2d 31 20 29 3b 0a 20 20 20 20 20 20 70 49 74 65  -1 );.      pIte
4d40: 6d 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28  m->colUsed |= ((
4d50: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 28 69 43 6f  Bitmask)1)<<(iCo
4d60: 6c 3e 3d 42 4d 53 20 3f 20 42 4d 53 2d 31 20 3a  l>=BMS ? BMS-1 :
4d70: 20 69 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20   iCol);.    }.  
4d80: 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  }.  return p;.}.
4d90: 0a 2f 2a 0a 2a 2a 20 52 65 70 6f 72 74 20 61 6e  ./*.** Report an
4da0: 20 65 72 72 6f 72 20 74 68 61 74 20 61 6e 20 65   error that an e
4db0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
4dc0: 20 76 61 6c 69 64 20 66 6f 72 20 73 6f 6d 65 20   valid for some 
4dd0: 73 65 74 20 6f 66 0a 2a 2a 20 70 4e 43 2d 3e 6e  set of.** pNC->n
4de0: 63 46 6c 61 67 73 20 76 61 6c 75 65 73 20 64 65  cFlags values de
4df0: 74 65 72 6d 69 6e 65 64 20 62 79 20 76 61 6c 69  termined by vali
4e00: 64 4d 61 73 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  dMask..*/.static
4e10: 20 76 6f 69 64 20 6e 6f 74 56 61 6c 69 64 28 0a   void notValid(.
4e20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4e30: 20 20 20 20 20 20 20 2f 2a 20 4c 65 61 76 65 20         /* Leave 
4e40: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 68 65  error message he
4e50: 72 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  re */.  NameCont
4e60: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20  ext *pNC,    /* 
4e70: 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  The name context
4e80: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
4e90: 20 2a 7a 4d 73 67 2c 20 20 20 20 2f 2a 20 54 79   *zMsg,    /* Ty
4ea0: 70 65 20 6f 66 20 65 72 72 6f 72 20 2a 2f 0a 20  pe of error */. 
4eb0: 20 69 6e 74 20 76 61 6c 69 64 4d 61 73 6b 20 20   int validMask  
4ec0: 20 20 20 20 20 20 2f 2a 20 53 65 74 20 6f 66 20        /* Set of 
4ed0: 63 6f 6e 74 65 78 74 73 20 66 6f 72 20 77 68 69  contexts for whi
4ee0: 63 68 20 70 72 6f 68 69 62 69 74 65 64 20 2a 2f  ch prohibited */
4ef0: 0a 29 7b 0a 20 20 61 73 73 65 72 74 28 20 28 76  .){.  assert( (v
4f00: 61 6c 69 64 4d 61 73 6b 26 7e 28 4e 43 5f 49 73  alidMask&~(NC_Is
4f10: 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49 64 78  Check|NC_PartIdx
4f20: 7c 4e 43 5f 49 64 78 45 78 70 72 29 29 3d 3d 30  |NC_IdxExpr))==0
4f30: 20 29 3b 0a 20 20 69 66 28 20 28 70 4e 43 2d 3e   );.  if( (pNC->
4f40: 6e 63 46 6c 61 67 73 20 26 20 76 61 6c 69 64 4d  ncFlags & validM
4f50: 61 73 6b 29 21 3d 30 20 29 7b 0a 20 20 20 20 63  ask)!=0 ){.    c
4f60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 6e 20 3d  onst char *zIn =
4f70: 20 22 70 61 72 74 69 61 6c 20 69 6e 64 65 78 20   "partial index 
4f80: 57 48 45 52 45 20 63 6c 61 75 73 65 73 22 3b 0a  WHERE clauses";.
4f90: 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46      if( pNC->ncF
4fa0: 6c 61 67 73 20 26 20 4e 43 5f 49 64 78 45 78 70  lags & NC_IdxExp
4fb0: 72 20 29 20 20 20 20 20 20 7a 49 6e 20 3d 20 22  r )      zIn = "
4fc0: 69 6e 64 65 78 20 65 78 70 72 65 73 73 69 6f 6e  index expression
4fd0: 73 22 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  s";.#ifndef SQLI
4fe0: 54 45 5f 4f 4d 49 54 5f 43 48 45 43 4b 0a 20 20  TE_OMIT_CHECK.  
4ff0: 20 20 65 6c 73 65 20 69 66 28 20 70 4e 43 2d 3e    else if( pNC->
5000: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43  ncFlags & NC_IsC
5010: 68 65 63 6b 20 29 20 7a 49 6e 20 3d 20 22 43 48  heck ) zIn = "CH
5020: 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 22  ECK constraints"
5030: 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 73 71 6c  ;.#endif.    sql
5040: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
5050: 72 73 65 2c 20 22 25 73 20 70 72 6f 68 69 62 69  rse, "%s prohibi
5060: 74 65 64 20 69 6e 20 25 73 22 2c 20 7a 4d 73 67  ted in %s", zMsg
5070: 2c 20 7a 49 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  , zIn);.  }.}../
5080: 2a 0a 2a 2a 20 45 78 70 72 65 73 73 69 6f 6e 20  *.** Expression 
5090: 70 20 73 68 6f 75 6c 64 20 65 6e 63 6f 64 65 20  p should encode 
50a0: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
50b0: 20 76 61 6c 75 65 20 62 65 74 77 65 65 6e 20 31   value between 1
50c0: 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a 2a 20 52  .0 and 0.0..** R
50d0: 65 74 75 72 6e 20 31 30 32 34 20 74 69 6d 65 73  eturn 1024 times
50e0: 20 74 68 69 73 20 76 61 6c 75 65 2e 20 20 4f 72   this value.  Or
50f0: 20 72 65 74 75 72 6e 20 2d 31 20 69 66 20 70 20   return -1 if p 
5100: 69 73 20 6e 6f 74 20 61 20 66 6c 6f 61 74 69 6e  is not a floatin
5110: 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75 65  g point.** value
5120: 20 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64   between 1.0 and
5130: 20 30 2e 30 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   0.0..*/.static 
5140: 69 6e 74 20 65 78 70 72 50 72 6f 62 61 62 69 6c  int exprProbabil
5150: 69 74 79 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ity(Expr *p){.  
5160: 64 6f 75 62 6c 65 20 72 20 3d 20 2d 31 2e 30 3b  double r = -1.0;
5170: 0a 20 20 69 66 28 20 70 2d 3e 6f 70 21 3d 54 4b  .  if( p->op!=TK
5180: 5f 46 4c 4f 41 54 20 29 20 72 65 74 75 72 6e 20  _FLOAT ) return 
5190: 2d 31 3b 0a 20 20 73 71 6c 69 74 65 33 41 74 6f  -1;.  sqlite3Ato
51a0: 46 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 26  F(p->u.zToken, &
51b0: 72 2c 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e  r, sqlite3Strlen
51c0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 2c  30(p->u.zToken),
51d0: 20 53 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20   SQLITE_UTF8);. 
51e0: 20 61 73 73 65 72 74 28 20 72 3e 3d 30 2e 30 20   assert( r>=0.0 
51f0: 29 3b 0a 20 20 69 66 28 20 72 3e 31 2e 30 20 29  );.  if( r>1.0 )
5200: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 72 65   return -1;.  re
5210: 74 75 72 6e 20 28 69 6e 74 29 28 72 2a 31 33 34  turn (int)(r*134
5220: 32 31 37 37 32 38 2e 30 29 3b 0a 7d 0a 0a 2f 2a  217728.0);.}../*
5230: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
5240: 20 69 73 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72   is callback for
5250: 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72   sqlite3WalkExpr
5260: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
5270: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
5280: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
5290: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
52a0: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
52b0: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
52c0: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
52d0: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
52e0: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
52f0: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
5300: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
5310: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
5320: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
5330: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
5340: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
5350: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
5360: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
5370: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
5380: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
5390: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
53a0: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
53b0: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
53c0: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 45 78 70  c int resolveExp
53d0: 72 53 74 65 70 28 57 61 6c 6b 65 72 20 2a 70 57  rStep(Walker *pW
53e0: 61 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78  alker, Expr *pEx
53f0: 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  pr){.  NameConte
5400: 78 74 20 2a 70 4e 43 3b 0a 20 20 50 61 72 73 65  xt *pNC;.  Parse
5410: 20 2a 70 50 61 72 73 65 3b 0a 0a 20 20 70 4e 43   *pParse;..  pNC
5420: 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 4e   = pWalker->u.pN
5430: 43 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  C;.  assert( pNC
5440: 21 3d 30 20 29 3b 0a 20 20 70 50 61 72 73 65 20  !=0 );.  pParse 
5450: 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20  = pNC->pParse;. 
5460: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 3d   assert( pParse=
5470: 3d 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65  =pWalker->pParse
5480: 20 29 3b 0a 0a 23 69 66 6e 64 65 66 20 4e 44 45   );..#ifndef NDE
5490: 42 55 47 0a 20 20 69 66 28 20 70 4e 43 2d 3e 70  BUG.  if( pNC->p
54a0: 53 72 63 4c 69 73 74 20 26 26 20 70 4e 43 2d 3e  SrcList && pNC->
54b0: 70 53 72 63 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  pSrcList->nAlloc
54c0: 3e 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  >0 ){.    SrcLis
54d0: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
54e0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
54f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
5500: 69 3d 30 3b 20 69 3c 70 4e 43 2d 3e 70 53 72 63  i=0; i<pNC->pSrc
5510: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29  List->nSrc; i++)
5520: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
5530: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
5540: 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53 72  Cursor>=0 && pSr
5550: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
5560: 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62  sor<pParse->nTab
5570: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e  );.    }.  }.#en
5580: 64 69 66 0a 20 20 73 77 69 74 63 68 28 20 70 45  dif.  switch( pE
5590: 78 70 72 2d 3e 6f 70 20 29 7b 0a 0a 23 69 66 20  xpr->op ){..#if 
55a0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 45  defined(SQLITE_E
55b0: 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45 4c  NABLE_UPDATE_DEL
55c0: 45 54 45 5f 4c 49 4d 49 54 29 20 26 26 20 21 64  ETE_LIMIT) && !d
55d0: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
55e0: 49 54 5f 53 55 42 51 55 45 52 59 29 0a 20 20 20  IT_SUBQUERY).   
55f0: 20 2f 2a 20 54 68 65 20 73 70 65 63 69 61 6c 20   /* The special 
5600: 6f 70 65 72 61 74 6f 72 20 54 4b 5f 52 4f 57 20  operator TK_ROW 
5610: 6d 65 61 6e 73 20 75 73 65 20 74 68 65 20 72 6f  means use the ro
5620: 77 69 64 20 66 6f 72 20 74 68 65 20 66 69 72 73  wid for the firs
5630: 74 0a 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  t.    ** column 
5640: 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
5650: 73 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  se.  This is use
5660: 64 20 62 79 20 74 68 65 20 4c 49 4d 49 54 20 61  d by the LIMIT a
5670: 6e 64 20 4f 52 44 45 52 20 42 59 0a 20 20 20 20  nd ORDER BY.    
5680: 2a 2a 20 63 6c 61 75 73 65 20 70 72 6f 63 65 73  ** clause proces
5690: 73 69 6e 67 20 6f 6e 20 55 50 44 41 54 45 20 61  sing on UPDATE a
56a0: 6e 64 20 44 45 4c 45 54 45 20 73 74 61 74 65 6d  nd DELETE statem
56b0: 65 6e 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ents..    */.   
56c0: 20 63 61 73 65 20 54 4b 5f 52 4f 57 3a 20 7b 0a   case TK_ROW: {.
56d0: 20 20 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70        SrcList *p
56e0: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
56f0: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  SrcList;.      s
5700: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
5710: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
5720: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
5730: 74 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 6e  t && pSrcList->n
5740: 53 72 63 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20  Src==1 );.      
5750: 70 49 74 65 6d 20 3d 20 70 53 72 63 4c 69 73 74  pItem = pSrcList
5760: 2d 3e 61 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ->a;.      asser
5770: 74 28 20 48 61 73 52 6f 77 69 64 28 70 49 74 65  t( HasRowid(pIte
5780: 6d 2d 3e 70 54 61 62 29 20 26 26 20 70 49 74 65  m->pTab) && pIte
5790: 6d 2d 3e 70 54 61 62 2d 3e 70 53 65 6c 65 63 74  m->pTab->pSelect
57a0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78  ==0 );.      pEx
57b0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
57c0: 4d 4e 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  MN;.      pExpr-
57d0: 3e 79 2e 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  >y.pTab = pItem-
57e0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 70 45 78  >pTab;.      pEx
57f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
5800: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
5810: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
5820: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
5830: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
5840: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
5850: 45 52 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ER;.      break;
5860: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
5870: 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
5880: 45 4e 41 42 4c 45 5f 55 50 44 41 54 45 5f 44 45  ENABLE_UPDATE_DE
5890: 4c 45 54 45 5f 4c 49 4d 49 54 29 0a 20 20 20 20  LETE_LIMIT).    
58a0: 20 20 20 20 20 20 26 26 20 21 64 65 66 69 6e 65        && !define
58b0: 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  d(SQLITE_OMIT_SU
58c0: 42 51 55 45 52 59 29 20 2a 2f 0a 0a 20 20 20 20  BQUERY) */..    
58d0: 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  /* A column name
58e0: 3a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  :               
58f0: 20 20 20 20 20 49 44 0a 20 20 20 20 2a 2a 20 4f       ID.    ** O
5900: 72 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  r table name and
5910: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
5920: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
5930: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
5940: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
5950: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2a 0a  ID.ID.ID.    **.
5960: 20 20 20 20 2a 2a 20 54 68 65 20 54 4b 5f 49 44      ** The TK_ID
5970: 20 61 6e 64 20 54 4b 5f 4f 55 54 20 63 61 73 65   and TK_OUT case
5980: 73 20 61 72 65 20 63 6f 6d 62 69 6e 65 64 20 73  s are combined s
5990: 6f 20 74 68 61 74 20 74 68 65 72 65 20 77 69 6c  o that there wil
59a0: 6c 20 6f 6e 6c 79 0a 20 20 20 20 2a 2a 20 62 65  l only.    ** be
59b0: 20 6f 6e 65 20 63 61 6c 6c 20 74 6f 20 6c 6f 6f   one call to loo
59c0: 6b 75 70 4e 61 6d 65 28 29 2e 20 20 54 68 65 6e  kupName().  Then
59d0: 20 74 68 65 20 63 6f 6d 70 69 6c 65 72 20 77 69   the compiler wi
59e0: 6c 6c 20 69 6e 2d 6c 69 6e 65 20 0a 20 20 20 20  ll in-line .    
59f0: 2a 2a 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29 20  ** lookupName() 
5a00: 66 6f 72 20 61 20 73 69 7a 65 20 72 65 64 75 63  for a size reduc
5a10: 74 69 6f 6e 20 61 6e 64 20 70 65 72 66 6f 72 6d  tion and perform
5a20: 61 6e 63 65 20 69 6e 63 72 65 61 73 65 2e 0a 20  ance increase.. 
5a30: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
5a40: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
5a50: 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 63  K_DOT: {.      c
5a60: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 75  onst char *zColu
5a70: 6d 6e 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  mn;.      const 
5a80: 63 68 61 72 20 2a 7a 54 61 62 6c 65 3b 0a 20 20  char *zTable;.  
5a90: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
5aa0: 7a 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  zDb;.      Expr 
5ab0: 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20  *pRight;..      
5ac0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
5ad0: 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20  K_ID ){.        
5ae0: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  zDb = 0;.       
5af0: 20 7a 54 61 62 6c 65 20 3d 20 30 3b 0a 20 20 20   zTable = 0;.   
5b00: 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20 70       zColumn = p
5b10: 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a  Expr->u.zToken;.
5b20: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
5b30: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
5b40: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
5b50: 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69  .        notVali
5b60: 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  d(pParse, pNC, "
5b70: 74 68 65 20 5c 22 2e 5c 22 20 6f 70 65 72 61 74  the \".\" operat
5b80: 6f 72 22 2c 20 4e 43 5f 49 64 78 45 78 70 72 29  or", NC_IdxExpr)
5b90: 3b 0a 20 20 20 20 20 20 20 20 70 52 69 67 68 74  ;.        pRight
5ba0: 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74   = pExpr->pRight
5bb0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
5bc0: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
5bd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 7a 44 62  ){.          zDb
5be0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 65   = 0;.        }e
5bf0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 61  lse{.          a
5c00: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
5c10: 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20  p==TK_DOT );.   
5c20: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 70 4c 65         zDb = pLe
5c30: 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
5c40: 20 20 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20          pLeft = 
5c50: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 3b 0a 20  pRight->pLeft;. 
5c60: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 20           pRight 
5c70: 3d 20 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74  = pRight->pRight
5c80: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
5c90: 20 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 4c 65      zTable = pLe
5ca0: 66 74 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20  ft->u.zToken;.  
5cb0: 20 20 20 20 20 20 7a 43 6f 6c 75 6d 6e 20 3d 20        zColumn = 
5cc0: 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65 6e  pRight->u.zToken
5cd0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 49 4e  ;.        if( IN
5ce0: 5f 52 45 4e 41 4d 45 5f 4f 42 4a 45 43 54 20 29  _RENAME_OBJECT )
5cf0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
5d00: 74 65 33 52 65 6e 61 6d 65 54 6f 6b 65 6e 52 65  te3RenameTokenRe
5d10: 6d 61 70 28 70 50 61 72 73 65 2c 20 28 76 6f 69  map(pParse, (voi
5d20: 64 2a 29 70 45 78 70 72 2c 20 28 76 6f 69 64 2a  d*)pExpr, (void*
5d30: 29 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  )pRight);.      
5d40: 20 20 20 20 73 71 6c 69 74 65 33 52 65 6e 61 6d      sqlite3Renam
5d50: 65 54 6f 6b 65 6e 52 65 6d 61 70 28 70 50 61 72  eTokenRemap(pPar
5d60: 73 65 2c 20 28 76 6f 69 64 2a 29 26 70 45 78 70  se, (void*)&pExp
5d70: 72 2d 3e 79 2e 70 54 61 62 2c 20 28 76 6f 69 64  r->y.pTab, (void
5d80: 2a 29 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  *)pLeft);.      
5d90: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
5da0: 20 20 72 65 74 75 72 6e 20 6c 6f 6f 6b 75 70 4e    return lookupN
5db0: 61 6d 65 28 70 50 61 72 73 65 2c 20 7a 44 62 2c  ame(pParse, zDb,
5dc0: 20 7a 54 61 62 6c 65 2c 20 7a 43 6f 6c 75 6d 6e   zTable, zColumn
5dd0: 2c 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20  , pNC, pExpr);. 
5de0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73     }..    /* Res
5df0: 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61  olve function na
5e00: 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  mes.    */.    c
5e10: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
5e20: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
5e30: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
5e40: 2d 3e 78 2e 70 4c 69 73 74 3b 20 20 20 20 2f 2a  ->x.pList;    /*
5e50: 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69   The argument li
5e60: 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  st */.      int 
5e70: 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73  n = pList ? pLis
5e80: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 20  t->nExpr : 0;   
5e90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
5ea0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
5eb0: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
5ec0: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
5ed0: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
5ee0: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
5ef0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
5f00: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
5f10: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
5f20: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
5f30: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
5f40: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
5f50: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
5f60: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
5f70: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
5f80: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
5f90: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
5fa0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
5fb0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
5fc0: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
5fd0: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
5fe0: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
5ff0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
6000: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
6010: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
6020: 65 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  ef;             
6030: 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20   /* Information 
6040: 61 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69  about the functi
6050: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65  on */.      u8 e
6060: 6e 63 20 3d 20 45 4e 43 28 70 50 61 72 73 65 2d  nc = ENC(pParse-
6070: 3e 64 62 29 3b 20 20 20 2f 2a 20 54 68 65 20 64  >db);   /* The d
6080: 61 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67  atabase encoding
6090: 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73 73 65 72   */..      asser
60a0: 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65  t( !ExprHasPrope
60b0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 78 49  rty(pExpr, EP_xI
60c0: 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20 20 20  sSelect) );.    
60d0: 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 75    zId = pExpr->u
60e0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 6e  .zToken;.      n
60f0: 49 64 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c  Id = sqlite3Strl
6100: 65 6e 33 30 28 7a 49 64 29 3b 0a 20 20 20 20 20  en30(zId);.     
6110: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
6120: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
6130: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 2c 20  se->db, zId, n, 
6140: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
6150: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
6160: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
6170: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
6180: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
6190: 2c 20 2d 32 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  , -2, enc, 0);. 
61a0: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
61b0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
61c0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
61d0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
61e0: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
61f0: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
6200: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6210: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
6220: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 69  _agg = pDef->xFi
6230: 6e 61 6c 69 7a 65 21 3d 30 3b 0a 20 20 20 20 20  nalize!=0;.     
6240: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 66 75 6e     if( pDef->fun
6250: 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f  cFlags & SQLITE_
6260: 46 55 4e 43 5f 55 4e 4c 49 4b 45 4c 59 20 29 7b  FUNC_UNLIKELY ){
6270: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53  .          ExprS
6280: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
6290: 2c 20 45 50 5f 55 6e 6c 69 6b 65 6c 79 7c 45 50  , EP_Unlikely|EP
62a0: 5f 53 6b 69 70 29 3b 0a 20 20 20 20 20 20 20 20  _Skip);.        
62b0: 20 20 69 66 28 20 6e 3d 3d 32 20 29 7b 0a 20 20    if( n==2 ){.  
62c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
62d0: 3e 69 54 61 62 6c 65 20 3d 20 65 78 70 72 50 72  >iTable = exprPr
62e0: 6f 62 61 62 69 6c 69 74 79 28 70 4c 69 73 74 2d  obability(pList-
62f0: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
6300: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
6310: 78 70 72 2d 3e 69 54 61 62 6c 65 3c 30 20 29 7b  xpr->iTable<0 ){
6320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
6330: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6340: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
6350: 20 20 20 20 20 20 20 22 73 65 63 6f 6e 64 20 61         "second a
6360: 72 67 75 6d 65 6e 74 20 74 6f 20 6c 69 6b 65 6c  rgument to likel
6370: 69 68 6f 6f 64 28 29 20 6d 75 73 74 20 62 65 20  ihood() must be 
6380: 61 20 22 0a 20 20 20 20 20 20 20 20 20 20 20 20  a ".            
6390: 20 20 20 20 22 63 6f 6e 73 74 61 6e 74 20 62 65      "constant be
63a0: 74 77 65 65 6e 20 30 2e 30 20 61 6e 64 20 31 2e  tween 0.0 and 1.
63b0: 30 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  0");.           
63c0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
63e0: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
63f0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 56             /* EV
6400: 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d 36 31 33  IDENCE-OF: R-613
6410: 30 34 2d 32 39 34 34 39 20 54 68 65 20 75 6e 6c  04-29449 The unl
6420: 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74 69 6f  ikely(X) functio
6430: 6e 20 69 73 0a 20 20 20 20 20 20 20 20 20 20 20  n is.           
6440: 20 2a 2a 20 65 71 75 69 76 61 6c 65 6e 74 20 74   ** equivalent t
6450: 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 58 2c 20  o likelihood(X, 
6460: 30 2e 30 36 32 35 29 2e 0a 20 20 20 20 20 20 20  0.0625)..       
6470: 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e 43 45       ** EVIDENCE
6480: 2d 4f 46 3a 20 52 2d 30 31 32 38 33 2d 31 31 36  -OF: R-01283-116
6490: 33 36 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28  36 The unlikely(
64a0: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20  X) function is. 
64b0: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 73 68             ** sh
64c0: 6f 72 74 2d 68 61 6e 64 20 66 6f 72 20 6c 69 6b  ort-hand for lik
64d0: 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 30 36 32 35  elihood(X,0.0625
64e0: 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  )..            *
64f0: 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52  * EVIDENCE-OF: R
6500: 2d 33 36 38 35 30 2d 33 34 31 32 37 20 54 68 65  -36850-34127 The
6510: 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63 74   likely(X) funct
6520: 69 6f 6e 20 69 73 20 73 68 6f 72 74 2d 68 61 6e  ion is short-han
6530: 64 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  d.            **
6540: 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28   for likelihood(
6550: 58 2c 30 2e 39 33 37 35 29 2e 0a 20 20 20 20 20  X,0.9375)..     
6560: 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45 4e         ** EVIDEN
6570: 43 45 2d 4f 46 3a 20 52 2d 35 33 34 33 36 2d 34  CE-OF: R-53436-4
6580: 30 39 37 33 20 54 68 65 20 6c 69 6b 65 6c 79 28  0973 The likely(
6590: 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 65  X) function is e
65a0: 71 75 69 76 61 6c 65 6e 74 0a 20 20 20 20 20 20  quivalent.      
65b0: 20 20 20 20 20 20 2a 2a 20 74 6f 20 6c 69 6b 65        ** to like
65c0: 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37 35 29  lihood(X,0.9375)
65d0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  . */.           
65e0: 20 2f 2a 20 54 55 4e 49 4e 47 3a 20 75 6e 6c 69   /* TUNING: unli
65f0: 6b 65 6c 79 28 29 20 70 72 6f 62 61 62 69 6c 69  kely() probabili
6600: 74 79 20 69 73 20 30 2e 30 36 32 35 2e 20 20 6c  ty is 0.0625.  l
6610: 69 6b 65 6c 79 28 29 20 69 73 20 30 2e 39 33 37  ikely() is 0.937
6620: 35 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  5 */.           
6630: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6640: 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 5b 30 5d 3d   pDef->zName[0]=
6650: 3d 27 75 27 20 3f 20 38 33 38 38 36 30 38 20 3a  ='u' ? 8388608 :
6660: 20 31 32 35 38 32 39 31 32 30 3b 0a 20 20 20 20   125829120;.    
6670: 20 20 20 20 20 20 7d 20 20 20 20 20 20 20 20 20        }         
6680: 20 20 20 20 0a 20 20 20 20 20 20 20 20 7d 0a 23      .        }.#
6690: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
66a0: 49 54 5f 41 55 54 48 4f 52 49 5a 41 54 49 4f 4e  IT_AUTHORIZATION
66b0: 0a 20 20 20 20 20 20 20 20 7b 0a 20 20 20 20 20  .        {.     
66c0: 20 20 20 20 20 69 6e 74 20 61 75 74 68 20 3d 20       int auth = 
66d0: 73 71 6c 69 74 65 33 41 75 74 68 43 68 65 63 6b  sqlite3AuthCheck
66e0: 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54 45 5f  (pParse, SQLITE_
66f0: 46 55 4e 43 54 49 4f 4e 2c 20 30 2c 70 44 65 66  FUNCTION, 0,pDef
6700: 2d 3e 7a 4e 61 6d 65 2c 30 29 3b 0a 20 20 20 20  ->zName,0);.    
6710: 20 20 20 20 20 20 69 66 28 20 61 75 74 68 21 3d        if( auth!=
6720: 53 51 4c 49 54 45 5f 4f 4b 20 29 7b 0a 20 20 20  SQLITE_OK ){.   
6730: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 75 74           if( aut
6740: 68 3d 3d 53 51 4c 49 54 45 5f 44 45 4e 59 20 29  h==SQLITE_DENY )
6750: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6760: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
6770: 70 50 61 72 73 65 2c 20 22 6e 6f 74 20 61 75 74  pParse, "not aut
6780: 68 6f 72 69 7a 65 64 20 74 6f 20 75 73 65 20 66  horized to use f
6790: 75 6e 63 74 69 6f 6e 3a 20 25 73 22 2c 0a 20 20  unction: %s",.  
67a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
67c0: 20 20 20 20 70 44 65 66 2d 3e 7a 4e 61 6d 65 29      pDef->zName)
67d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
67e0: 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  pNC->nErr++;.   
67f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6800: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6810: 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 20 20   = TK_NULL;.    
6820: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 57          return W
6830: 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 20 20  RC_Prune;.      
6840: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
6850: 23 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 69  #endif.        i
6860: 66 28 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61  f( pDef->funcFla
6870: 67 73 20 26 20 28 53 51 4c 49 54 45 5f 46 55 4e  gs & (SQLITE_FUN
6880: 43 5f 43 4f 4e 53 54 41 4e 54 7c 53 51 4c 49 54  C_CONSTANT|SQLIT
6890: 45 5f 46 55 4e 43 5f 53 4c 4f 43 48 4e 47 29 20  E_FUNC_SLOCHNG) 
68a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
68b0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
68c0: 20 6f 66 20 74 68 65 20 45 50 5f 43 6f 6e 73 74   of the EP_Const
68d0: 46 75 6e 63 20 66 6c 61 67 2c 20 64 61 74 65 20  Func flag, date 
68e0: 61 6e 64 20 74 69 6d 65 0a 20 20 20 20 20 20 20  and time.       
68f0: 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 73 20     ** functions 
6900: 61 6e 64 20 6f 74 68 65 72 20 66 75 6e 63 74 69  and other functi
6910: 6f 6e 73 20 74 68 61 74 20 63 68 61 6e 67 65 20  ons that change 
6920: 73 6c 6f 77 6c 79 20 61 72 65 20 63 6f 6e 73 69  slowly are consi
6930: 64 65 72 65 64 0a 20 20 20 20 20 20 20 20 20 20  dered.          
6940: 2a 2a 20 63 6f 6e 73 74 61 6e 74 20 62 65 63 61  ** constant beca
6950: 75 73 65 20 74 68 65 79 20 61 72 65 20 63 6f 6e  use they are con
6960: 73 74 61 6e 74 20 66 6f 72 20 74 68 65 20 64 75  stant for the du
6970: 72 61 74 69 6f 6e 20 6f 66 20 6f 6e 65 20 71 75  ration of one qu
6980: 65 72 79 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ery */.         
6990: 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79   ExprSetProperty
69a0: 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74 46  (pExpr,EP_ConstF
69b0: 75 6e 63 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  unc);.        }.
69c0: 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65          if( (pDe
69d0: 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
69e0: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
69f0: 41 4e 54 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ANT)==0 ){.     
6a00: 20 20 20 20 20 2f 2a 20 44 61 74 65 2f 74 69 6d       /* Date/tim
6a10: 65 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61 74  e functions that
6a20: 20 75 73 65 20 27 6e 6f 77 27 2c 20 61 6e 64 20   use 'now', and 
6a30: 6f 74 68 65 72 20 66 75 6e 63 74 69 6f 6e 73 20  other functions 
6a40: 6c 69 6b 65 0a 20 20 20 20 20 20 20 20 20 20 2a  like.          *
6a50: 2a 20 73 71 6c 69 74 65 5f 76 65 72 73 69 6f 6e  * sqlite_version
6a60: 28 29 20 74 68 61 74 20 6d 69 67 68 74 20 63 68  () that might ch
6a70: 61 6e 67 65 20 6f 76 65 72 20 74 69 6d 65 20 63  ange over time c
6a80: 61 6e 6e 6f 74 20 62 65 20 75 73 65 64 0a 20 20  annot be used.  
6a90: 20 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 61 6e          ** in an
6aa0: 20 69 6e 64 65 78 2e 20 2a 2f 0a 20 20 20 20 20   index. */.     
6ab0: 20 20 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50       notValid(pP
6ac0: 61 72 73 65 2c 20 70 4e 43 2c 20 22 6e 6f 6e 2d  arse, pNC, "non-
6ad0: 64 65 74 65 72 6d 69 6e 69 73 74 69 63 20 66 75  deterministic fu
6ae0: 6e 63 74 69 6f 6e 73 22 2c 0a 20 20 20 20 20 20  nctions",.      
6af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4e 43 5f               NC_
6b00: 49 64 78 45 78 70 72 7c 4e 43 5f 50 61 72 74 49  IdxExpr|NC_PartI
6b10: 64 78 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  dx);.        }. 
6b20: 20 20 20 20 20 20 20 69 66 28 20 28 70 44 65 66         if( (pDef
6b30: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
6b40: 4c 49 54 45 5f 46 55 4e 43 5f 49 4e 54 45 52 4e  LITE_FUNC_INTERN
6b50: 41 4c 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20  AL)!=0.         
6b60: 26 26 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65  && pParse->neste
6b70: 64 3d 3d 30 0a 20 20 20 20 20 20 20 20 20 26 26  d==0.         &&
6b80: 20 73 71 6c 69 74 65 33 43 6f 6e 66 69 67 2e 62   sqlite3Config.b
6b90: 49 6e 74 65 72 6e 61 6c 46 75 6e 63 74 69 6f 6e  InternalFunction
6ba0: 73 3d 3d 30 0a 20 20 20 20 20 20 20 20 29 7b 0a  s==0.        ){.
6bb0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 74            /* Int
6bc0: 65 72 6e 61 6c 2d 75 73 65 2d 6f 6e 6c 79 20 66  ernal-use-only f
6bd0: 75 6e 63 74 69 6f 6e 73 20 61 72 65 20 64 69 73  unctions are dis
6be0: 61 6c 6c 6f 77 65 64 20 75 6e 6c 65 73 73 20 74  allowed unless t
6bf0: 68 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  he.          ** 
6c00: 53 51 4c 20 69 73 20 62 65 69 6e 67 20 63 6f 6d  SQL is being com
6c10: 70 69 6c 65 64 20 75 73 69 6e 67 20 73 71 6c 69  piled using sqli
6c20: 74 65 33 4e 65 73 74 65 64 50 61 72 73 65 28 29  te3NestedParse()
6c30: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   */.          no
6c40: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
6c50: 20 20 20 20 20 20 20 20 20 20 70 44 65 66 20 3d            pDef =
6c60: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
6c70: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28      }..      if(
6c80: 20 30 3d 3d 49 4e 5f 52 45 4e 41 4d 45 5f 4f 42   0==IN_RENAME_OB
6c90: 4a 45 43 54 20 29 7b 0a 23 69 66 6e 64 65 66 20  JECT ){.#ifndef 
6ca0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
6cb0: 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20 61  OWFUNC.        a
6cc0: 73 73 65 72 74 28 20 69 73 5f 61 67 67 3d 3d 30  ssert( is_agg==0
6cd0: 20 7c 7c 20 28 70 44 65 66 2d 3e 66 75 6e 63 46   || (pDef->funcF
6ce0: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
6cf0: 4e 43 5f 4d 49 4e 4d 41 58 29 0a 20 20 20 20 20  NC_MINMAX).     
6d00: 20 20 20 20 20 7c 7c 20 28 70 44 65 66 2d 3e 78       || (pDef->x
6d10: 56 61 6c 75 65 3d 3d 30 20 26 26 20 70 44 65 66  Value==0 && pDef
6d20: 2d 3e 78 49 6e 76 65 72 73 65 3d 3d 30 29 0a 20  ->xInverse==0). 
6d30: 20 20 20 20 20 20 20 20 20 7c 7c 20 28 70 44 65           || (pDe
6d40: 66 2d 3e 78 56 61 6c 75 65 20 26 26 20 70 44 65  f->xValue && pDe
6d50: 66 2d 3e 78 49 6e 76 65 72 73 65 20 26 26 20 70  f->xInverse && p
6d60: 44 65 66 2d 3e 78 53 46 75 6e 63 20 26 26 20 70  Def->xSFunc && p
6d70: 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 29 0a  Def->xFinalize).
6d80: 20 20 20 20 20 20 20 20 29 3b 0a 20 20 20 20 20          );.     
6d90: 20 20 20 69 66 28 20 70 44 65 66 20 26 26 20 70     if( pDef && p
6da0: 44 65 66 2d 3e 78 56 61 6c 75 65 3d 3d 30 20 26  Def->xValue==0 &
6db0: 26 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  & ExprHasPropert
6dc0: 79 28 70 45 78 70 72 2c 20 45 50 5f 57 69 6e 46  y(pExpr, EP_WinF
6dd0: 75 6e 63 29 20 29 7b 0a 20 20 20 20 20 20 20 20  unc) ){.        
6de0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
6df0: 67 28 70 50 61 72 73 65 2c 20 0a 20 20 20 20 20  g(pParse, .     
6e00: 20 20 20 20 20 20 20 20 20 22 25 2e 2a 73 28 29           "%.*s()
6e10: 20 6d 61 79 20 6e 6f 74 20 62 65 20 75 73 65 64   may not be used
6e20: 20 61 73 20 61 20 77 69 6e 64 6f 77 20 66 75 6e   as a window fun
6e30: 63 74 69 6f 6e 22 2c 20 6e 49 64 2c 20 7a 49 64  ction", nId, zId
6e40: 0a 20 20 20 20 20 20 20 20 20 20 29 3b 0a 20 20  .          );.  
6e50: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
6e60: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  r++;.        }el
6e70: 73 65 20 69 66 28 20 0a 20 20 20 20 20 20 20 20  se if( .        
6e80: 20 20 20 20 20 20 28 69 73 5f 61 67 67 20 26 26        (is_agg &&
6e90: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
6ea0: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30   NC_AllowAgg)==0
6eb0: 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  ).           || 
6ec0: 28 69 73 5f 61 67 67 20 26 26 20 28 70 44 65 66  (is_agg && (pDef
6ed0: 2d 3e 66 75 6e 63 46 6c 61 67 73 26 53 51 4c 49  ->funcFlags&SQLI
6ee0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 29 20  TE_FUNC_WINDOW) 
6ef0: 26 26 20 21 70 45 78 70 72 2d 3e 79 2e 70 57 69  && !pExpr->y.pWi
6f00: 6e 29 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c  n).           ||
6f10: 20 28 69 73 5f 61 67 67 20 26 26 20 70 45 78 70   (is_agg && pExp
6f20: 72 2d 3e 79 2e 70 57 69 6e 20 26 26 20 28 70 4e  r->y.pWin && (pN
6f30: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
6f40: 41 6c 6c 6f 77 57 69 6e 29 3d 3d 30 29 0a 20 20  AllowWin)==0).  
6f50: 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20        ){.       
6f60: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
6f70: 54 79 70 65 3b 0a 20 20 20 20 20 20 20 20 20 20  Type;.          
6f80: 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63 46  if( (pDef->funcF
6f90: 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46 55  lags & SQLITE_FU
6fa0: 4e 43 5f 57 49 4e 44 4f 57 29 20 7c 7c 20 70 45  NC_WINDOW) || pE
6fb0: 78 70 72 2d 3e 79 2e 70 57 69 6e 20 29 7b 0a 20  xpr->y.pWin ){. 
6fc0: 20 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65             zType
6fd0: 20 3d 20 22 77 69 6e 64 6f 77 22 3b 0a 20 20 20   = "window";.   
6fe0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6ff0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 20            zType 
7000: 3d 20 22 61 67 67 72 65 67 61 74 65 22 3b 0a 20  = "aggregate";. 
7010: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7020: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7030: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
7040: 73 75 73 65 20 6f 66 20 25 73 20 66 75 6e 63 74  suse of %s funct
7050: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 7a 54 79 70  ion %.*s()",zTyp
7060: 65 2c 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20 20  e,nId,zId);.    
7070: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
7080: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73 5f  +;.          is_
7090: 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  agg = 0;.       
70a0: 20 7d 0a 23 65 6c 73 65 0a 20 20 20 20 20 20 20   }.#else.       
70b0: 20 69 66 28 20 28 69 73 5f 61 67 67 20 26 26 20   if( (is_agg && 
70c0: 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20  (pNC->ncFlags & 
70d0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30 29  NC_AllowAgg)==0)
70e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
70f0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7100: 61 72 73 65 2c 22 6d 69 73 75 73 65 20 6f 66 20  arse,"misuse of 
7110: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7120: 6f 6e 20 25 2e 2a 73 28 29 22 2c 6e 49 64 2c 7a  on %.*s()",nId,z
7130: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  Id);.          p
7140: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
7150: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30        is_agg = 0
7160: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
7170: 69 66 0a 20 20 20 20 20 20 20 20 65 6c 73 65 20  if.        else 
7180: 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  if( no_such_func
7190: 20 26 26 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e   && pParse->db->
71a0: 69 6e 69 74 2e 62 75 73 79 3d 3d 30 0a 23 69 66  init.busy==0.#if
71b0: 64 65 66 20 53 51 4c 49 54 45 5f 45 4e 41 42 4c  def SQLITE_ENABL
71c0: 45 5f 55 4e 4b 4e 4f 57 4e 5f 53 51 4c 5f 46 55  E_UNKNOWN_SQL_FU
71d0: 4e 43 54 49 4f 4e 0a 20 20 20 20 20 20 20 20 20  NCTION.         
71e0: 20 20 20 20 20 20 20 20 20 26 26 20 70 50 61 72           && pPar
71f0: 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d 30 0a 23  se->explain==0.#
7200: 65 6e 64 69 66 0a 20 20 20 20 20 20 20 20 29 7b  endif.        ){
7210: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
7220: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
7230: 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75 6e 63  e, "no such func
7240: 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64  tion: %.*s", nId
7250: 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20  , zId);.        
7260: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
7270: 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28         }else if(
7280: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
7290: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
72a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
72b0: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
72c0: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
72d0: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
72e0: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
72f0: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
7300: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
7310: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  r++;.        }. 
7320: 20 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67         if( is_ag
7330: 67 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c  g ){.#ifndef SQL
7340: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
7350: 55 4e 43 0a 20 20 20 20 20 20 20 20 20 20 70 4e  UNC.          pN
7360: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 28  C->ncFlags &= ~(
7370: 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 20 3f 20  pExpr->y.pWin ? 
7380: 4e 43 5f 41 6c 6c 6f 77 57 69 6e 20 3a 20 4e 43  NC_AllowWin : NC
7390: 5f 41 6c 6c 6f 77 41 67 67 29 3b 0a 23 65 6c 73  _AllowAgg);.#els
73a0: 65 0a 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d  e.          pNC-
73b0: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  >ncFlags &= ~NC_
73c0: 41 6c 6c 6f 77 41 67 67 3b 0a 23 65 6e 64 69 66  AllowAgg;.#endif
73d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
73e0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
73f0: 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61  WalkExprList(pWa
7400: 6c 6b 65 72 2c 20 70 4c 69 73 74 29 3b 0a 20 20  lker, pList);.  
7410: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
7420: 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  {.#ifndef SQLITE
7430: 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43  _OMIT_WINDOWFUNC
7440: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
7450: 70 72 2d 3e 79 2e 70 57 69 6e 20 29 7b 0a 20 20  pr->y.pWin ){.  
7460: 20 20 20 20 20 20 20 20 53 65 6c 65 63 74 20 2a          Select *
7470: 70 53 65 6c 20 3d 20 70 4e 43 2d 3e 70 57 69 6e  pSel = pNC->pWin
7480: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
7490: 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 45 78 70    sqlite3WalkExp
74a0: 72 4c 69 73 74 28 70 57 61 6c 6b 65 72 2c 20 70  rList(pWalker, p
74b0: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 50  Expr->y.pWin->pP
74c0: 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20 20 20  artition);.     
74d0: 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c 6b       sqlite3Walk
74e0: 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65 72  ExprList(pWalker
74f0: 2c 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d  , pExpr->y.pWin-
7500: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
7510: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
7520: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
7530: 45 78 70 72 2d 3e 79 2e 70 57 69 6e 2d 3e 70 46  Expr->y.pWin->pF
7540: 69 6c 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20  ilter);.        
7550: 20 20 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55    sqlite3WindowU
7560: 70 64 61 74 65 28 70 50 61 72 73 65 2c 20 70 53  pdate(pParse, pS
7570: 65 6c 2d 3e 70 57 69 6e 44 65 66 6e 2c 20 70 45  el->pWinDefn, pE
7580: 78 70 72 2d 3e 79 2e 70 57 69 6e 2c 20 70 44 65  xpr->y.pWin, pDe
7590: 66 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  f);.          if
75a0: 28 20 30 3d 3d 70 53 65 6c 2d 3e 70 57 69 6e 20  ( 0==pSel->pWin 
75b0: 0a 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20 30  .           || 0
75c0: 3d 3d 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 43  ==sqlite3WindowC
75d0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
75e0: 53 65 6c 2d 3e 70 57 69 6e 2c 20 70 45 78 70 72  Sel->pWin, pExpr
75f0: 2d 3e 79 2e 70 57 69 6e 29 20 0a 20 20 20 20 20  ->y.pWin) .     
7600: 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20       ){.        
7610: 20 20 20 20 70 45 78 70 72 2d 3e 79 2e 70 57 69      pExpr->y.pWi
7620: 6e 2d 3e 70 4e 65 78 74 57 69 6e 20 3d 20 70 53  n->pNextWin = pS
7630: 65 6c 2d 3e 70 57 69 6e 3b 0a 20 20 20 20 20 20  el->pWin;.      
7640: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 57 69 6e        pSel->pWin
7650: 20 3d 20 70 45 78 70 72 2d 3e 79 2e 70 57 69 6e   = pExpr->y.pWin
7660: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
7670: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46          pNC->ncF
7680: 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77  lags |= NC_Allow
7690: 57 69 6e 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  Win;.        }el
76a0: 73 65 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c  se.#endif /* SQL
76b0: 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57 46  ITE_OMIT_WINDOWF
76c0: 55 4e 43 20 2a 2f 0a 20 20 20 20 20 20 20 20 7b  UNC */.        {
76d0: 0a 20 20 20 20 20 20 20 20 20 20 4e 61 6d 65 43  .          NameC
76e0: 6f 6e 74 65 78 74 20 2a 70 4e 43 32 20 3d 20 70  ontext *pNC2 = p
76f0: 4e 43 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45  NC;.          pE
7700: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
7710: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
7720: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20       pExpr->op2 
7730: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20 77  = 0;.          w
7740: 68 69 6c 65 28 20 70 4e 43 32 20 26 26 20 21 73  hile( pNC2 && !s
7750: 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55 73  qlite3FunctionUs
7760: 65 73 54 68 69 73 53 72 63 28 70 45 78 70 72 2c  esThisSrc(pExpr,
7770: 20 70 4e 43 32 2d 3e 70 53 72 63 4c 69 73 74 29   pNC2->pSrcList)
7780: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
7790: 70 45 78 70 72 2d 3e 6f 70 32 2b 2b 3b 0a 20 20  pExpr->op2++;.  
77a0: 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 20 3d            pNC2 =
77b0: 20 70 4e 43 32 2d 3e 70 4e 65 78 74 3b 0a 20 20   pNC2->pNext;.  
77c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
77d0: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
77e0: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  !=0 );.         
77f0: 20 69 66 28 20 70 4e 43 32 20 29 7b 0a 20 20 20   if( pNC2 ){.   
7800: 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
7810: 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e   SQLITE_FUNC_MIN
7820: 4d 41 58 3d 3d 4e 43 5f 4d 69 6e 4d 61 78 41 67  MAX==NC_MinMaxAg
7830: 67 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  g );.           
7840: 20 74 65 73 74 63 61 73 65 28 20 28 70 44 65 66   testcase( (pDef
7850: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
7860: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
7870: 29 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  )!=0 );.        
7880: 20 20 20 20 70 4e 43 32 2d 3e 6e 63 46 6c 61 67      pNC2->ncFlag
7890: 73 20 7c 3d 20 4e 43 5f 48 61 73 41 67 67 20 7c  s |= NC_HasAgg |
78a0: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
78b0: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
78c0: 4d 49 4e 4d 41 58 29 3b 0a 0a 20 20 20 20 20 20  MINMAX);..      
78d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
78e0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20  pNC->ncFlags |= 
78f0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  NC_AllowAgg;.   
7900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
7910: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
7920: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
7930: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
7940: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
7950: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
7960: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
7970: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
7980: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50      return WRC_P
7990: 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 23 69 66 6e  rune;.    }.#ifn
79a0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
79b0: 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61 73  SUBQUERY.    cas
79c0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20  e TK_SELECT:.   
79d0: 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a   case TK_EXISTS:
79e0: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
79f0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53  r->op==TK_EXISTS
7a00: 20 29 3b 0a 23 65 6e 64 69 66 0a 20 20 20 20 63   );.#endif.    c
7a10: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
7a20: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7a30: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 29 3b  pr->op==TK_IN );
7a40: 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48  .      if( ExprH
7a50: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
7a60: 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
7a70: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
7a80: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
7a90: 0a 20 20 20 20 20 20 20 20 6e 6f 74 56 61 6c 69  .        notVali
7aa0: 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  d(pParse, pNC, "
7ab0: 73 75 62 71 75 65 72 69 65 73 22 2c 20 4e 43 5f  subqueries", NC_
7ac0: 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49  IsCheck|NC_PartI
7ad0: 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a  dx|NC_IdxExpr);.
7ae0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57          sqlite3W
7af0: 61 6c 6b 53 65 6c 65 63 74 28 70 57 61 6c 6b 65  alkSelect(pWalke
7b00: 72 2c 20 70 45 78 70 72 2d 3e 78 2e 70 53 65 6c  r, pExpr->x.pSel
7b10: 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20 61 73  ect);.        as
7b20: 73 65 72 74 28 20 70 4e 43 2d 3e 6e 52 65 66 3e  sert( pNC->nRef>
7b30: 3d 6e 52 65 66 20 29 3b 0a 20 20 20 20 20 20 20  =nRef );.       
7b40: 20 69 66 28 20 6e 52 65 66 21 3d 70 4e 43 2d 3e   if( nRef!=pNC->
7b50: 6e 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20  nRef ){.        
7b60: 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72 74    ExprSetPropert
7b70: 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72 53  y(pExpr, EP_VarS
7b80: 65 6c 65 63 74 29 3b 0a 20 20 20 20 20 20 20 20  elect);.        
7b90: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 7c    pNC->ncFlags |
7ba0: 3d 20 4e 43 5f 56 61 72 53 65 6c 65 63 74 3b 0a  = NC_VarSelect;.
7bb0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
7bc0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7bd0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7be0: 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20  _VARIABLE: {.   
7bf0: 20 20 20 6e 6f 74 56 61 6c 69 64 28 70 50 61 72     notValid(pPar
7c00: 73 65 2c 20 70 4e 43 2c 20 22 70 61 72 61 6d 65  se, pNC, "parame
7c10: 74 65 72 73 22 2c 20 4e 43 5f 49 73 43 68 65 63  ters", NC_IsChec
7c20: 6b 7c 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f  k|NC_PartIdx|NC_
7c30: 49 64 78 45 78 70 72 29 3b 0a 20 20 20 20 20 20  IdxExpr);.      
7c40: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7c50: 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20 20   case TK_IS:.   
7c60: 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a 20   case TK_ISNOT: 
7c70: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  {.      Expr *pR
7c80: 69 67 68 74 3b 0a 20 20 20 20 20 20 61 73 73 65  ight;.      asse
7c90: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
7ca0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
7cb0: 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20 20 20  educed) );.     
7cc0: 20 2f 2a 20 48 61 6e 64 6c 65 20 73 70 65 63 69   /* Handle speci
7cd0: 61 6c 20 63 61 73 65 73 20 6f 66 20 22 78 20 49  al cases of "x I
7ce0: 53 20 54 52 55 45 22 2c 20 22 78 20 49 53 20 46  S TRUE", "x IS F
7cf0: 41 4c 53 45 22 2c 20 22 78 20 49 53 20 4e 4f 54  ALSE", "x IS NOT
7d00: 20 54 52 55 45 22 2c 0a 20 20 20 20 20 20 2a 2a   TRUE",.      **
7d10: 20 61 6e 64 20 22 78 20 49 53 20 4e 4f 54 20 46   and "x IS NOT F
7d20: 41 4c 53 45 22 2e 20 2a 2f 0a 20 20 20 20 20 20  ALSE". */.      
7d30: 69 66 28 20 28 70 52 69 67 68 74 20 3d 20 70 45  if( (pRight = pE
7d40: 78 70 72 2d 3e 70 52 69 67 68 74 29 2d 3e 6f 70  xpr->pRight)->op
7d50: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
7d60: 20 20 20 69 6e 74 20 72 63 20 3d 20 72 65 73 6f     int rc = reso
7d70: 6c 76 65 45 78 70 72 53 74 65 70 28 70 57 61 6c  lveExprStep(pWal
7d80: 6b 65 72 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  ker, pRight);.  
7d90: 20 20 20 20 20 20 69 66 28 20 72 63 3d 3d 57 52        if( rc==WR
7da0: 43 5f 41 62 6f 72 74 20 29 20 72 65 74 75 72 6e  C_Abort ) return
7db0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
7dc0: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
7dd0: 6f 70 3d 3d 54 4b 5f 54 52 55 45 46 41 4c 53 45  op==TK_TRUEFALSE
7de0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
7df0: 78 70 72 2d 3e 6f 70 32 20 3d 20 70 45 78 70 72  xpr->op2 = pExpr
7e00: 2d 3e 6f 70 3b 0a 20 20 20 20 20 20 20 20 20 20  ->op;.          
7e10: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 54  pExpr->op = TK_T
7e20: 52 55 54 48 3b 0a 20 20 20 20 20 20 20 20 20 20  RUTH;.          
7e30: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
7e40: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
7e50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
7e60: 46 61 6c 6c 20 74 68 72 75 20 2a 2f 0a 20 20 20  Fall thru */.   
7e70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
7e80: 45 54 57 45 45 4e 3a 0a 20 20 20 20 63 61 73 65  ETWEEN:.    case
7e90: 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65   TK_EQ:.    case
7ea0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
7eb0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
7ec0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
7ed0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
7ee0: 20 54 4b 5f 47 45 3a 20 7b 0a 20 20 20 20 20 20   TK_GE: {.      
7ef0: 69 6e 74 20 6e 4c 65 66 74 2c 20 6e 52 69 67 68  int nLeft, nRigh
7f00: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61  t;.      if( pPa
7f10: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
7f20: 61 69 6c 65 64 20 29 20 62 72 65 61 6b 3b 0a 20  ailed ) break;. 
7f30: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
7f40: 70 72 2d 3e 70 4c 65 66 74 21 3d 30 20 29 3b 0a  pr->pLeft!=0 );.
7f50: 20 20 20 20 20 20 6e 4c 65 66 74 20 3d 20 73 71        nLeft = sq
7f60: 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53  lite3ExprVectorS
7f70: 69 7a 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ize(pExpr->pLeft
7f80: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
7f90: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
7fa0: 45 4e 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 52  EN ){.        nR
7fb0: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
7fc0: 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70 45 78  prVectorSize(pEx
7fd0: 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 30  pr->x.pList->a[0
7fe0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
7ff0: 20 20 69 66 28 20 6e 52 69 67 68 74 3d 3d 6e 4c    if( nRight==nL
8000: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
8010: 20 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65   nRight = sqlite
8020: 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28  3ExprVectorSize(
8030: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
8040: 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
8050: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
8060: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
8070: 72 74 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  rt( pExpr->pRigh
8080: 74 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  t!=0 );.        
8090: 6e 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  nRight = sqlite3
80a0: 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65 28 70  ExprVectorSize(p
80b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
80c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
80d0: 20 6e 4c 65 66 74 21 3d 6e 52 69 67 68 74 20 29   nLeft!=nRight )
80e0: 7b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  {.        testca
80f0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
8100: 4b 5f 45 51 20 29 3b 0a 20 20 20 20 20 20 20 20  K_EQ );.        
8110: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
8120: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
8130: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
8140: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
8150: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
8160: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
8170: 3d 54 4b 5f 4c 45 20 29 3b 0a 20 20 20 20 20 20  =TK_LE );.      
8180: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
8190: 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 29 3b 0a  r->op==TK_GT );.
81a0: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
81b0: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
81c0: 47 45 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  GE );.        te
81d0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
81e0: 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20 20 20  p==TK_IS );.    
81f0: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
8200: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
8210: 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  T );.        tes
8220: 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70  tcase( pExpr->op
8230: 3d 3d 54 4b 5f 42 45 54 57 45 45 4e 20 29 3b 0a  ==TK_BETWEEN );.
8240: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8250: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
8260: 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73 75 73  "row value misus
8270: 65 64 22 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ed");.      }.  
8280: 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20      break; .    
8290: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 28  }.  }.  return (
82a0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20  pParse->nErr || 
82b0: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c  pParse->db->mall
82c0: 6f 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f  ocFailed) ? WRC_
82d0: 41 62 6f 72 74 20 3a 20 57 52 43 5f 43 6f 6e 74  Abort : WRC_Cont
82e0: 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  inue;.}../*.** p
82f0: 45 4c 69 73 74 20 69 73 20 61 20 6c 69 73 74 20  EList is a list 
8300: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 77  of expressions w
8310: 68 69 63 68 20 61 72 65 20 72 65 61 6c 6c 79 20  hich are really 
8320: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6f  the result set o
8330: 66 20 74 68 65 0a 2a 2a 20 61 20 53 45 4c 45 43  f the.** a SELEC
8340: 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 70 45  T statement.  pE
8350: 20 69 73 20 61 20 74 65 72 6d 20 69 6e 20 61 6e   is a term in an
8360: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
8370: 55 50 20 42 59 20 63 6c 61 75 73 65 2e 0a 2a 2a  UP BY clause..**
8380: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 63 68   This routine ch
8390: 65 63 6b 73 20 74 6f 20 73 65 65 20 69 66 20 70  ecks to see if p
83a0: 45 20 69 73 20 61 20 73 69 6d 70 6c 65 20 69 64  E is a simple id
83b0: 65 6e 74 69 66 69 65 72 20 77 68 69 63 68 20 63  entifier which c
83c0: 6f 72 72 65 73 70 6f 6e 64 73 0a 2a 2a 20 74 6f  orresponds.** to
83d0: 20 74 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 20   the AS-name of 
83e0: 6f 6e 65 20 6f 66 20 74 68 65 20 74 65 72 6d 73  one of the terms
83f0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
8400: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 69 74 20  on list.  If it 
8410: 69 73 2c 0a 2a 2a 20 74 68 69 73 20 72 6f 75 74  is,.** this rout
8420: 69 6e 65 20 72 65 74 75 72 6e 20 61 6e 20 69 6e  ine return an in
8430: 74 65 67 65 72 20 62 65 74 77 65 65 6e 20 31 20  teger between 1 
8440: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
8450: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 0a 2a   the number of.*
8460: 2a 20 65 6c 65 6d 65 6e 74 73 20 69 6e 20 70 45  * elements in pE
8470: 4c 69 73 74 2c 20 63 6f 72 72 65 73 70 6f 6e 64  List, correspond
8480: 69 6e 67 20 74 6f 20 74 68 65 20 6d 61 74 63 68  ing to the match
8490: 69 6e 67 20 65 6e 74 72 79 2e 20 20 49 66 20 74  ing entry.  If t
84a0: 68 65 72 65 20 69 73 0a 2a 2a 20 6e 6f 20 6d 61  here is.** no ma
84b0: 74 63 68 2c 20 6f 72 20 69 66 20 70 45 20 69 73  tch, or if pE is
84c0: 20 6e 6f 74 20 61 20 73 69 6d 70 6c 65 20 69 64   not a simple id
84d0: 65 6e 74 69 66 69 65 72 2c 20 74 68 65 6e 20 74  entifier, then t
84e0: 68 69 73 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 72  his routine.** r
84f0: 65 74 75 72 6e 20 30 2e 0a 2a 2a 0a 2a 2a 20 70  eturn 0..**.** p
8500: 45 4c 69 73 74 20 68 61 73 20 62 65 65 6e 20 72  EList has been r
8510: 65 73 6f 6c 76 65 64 2e 20 20 70 45 20 68 61 73  esolved.  pE has
8520: 20 6e 6f 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20   not..*/.static 
8530: 69 6e 74 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d  int resolveAsNam
8540: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
8550: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
8560: 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 65  ng context for e
8570: 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a 2f  rror messages */
8580: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
8590: 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66  ist,  /* List of
85a0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 6f 20   expressions to 
85b0: 73 63 61 6e 20 2a 2f 0a 20 20 45 78 70 72 20 2a  scan */.  Expr *
85c0: 70 45 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  pE           /* 
85d0: 45 78 70 72 65 73 73 69 6f 6e 20 77 65 20 61 72  Expression we ar
85e0: 65 20 74 72 79 69 6e 67 20 74 6f 20 6d 61 74 63  e trying to matc
85f0: 68 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  h */.){.  int i;
8600: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8610: 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a  Loop counter */.
8620: 0a 20 20 55 4e 55 53 45 44 5f 50 41 52 41 4d 45  .  UNUSED_PARAME
8630: 54 45 52 28 70 50 61 72 73 65 29 3b 0a 0a 20 20  TER(pParse);..  
8640: 69 66 28 20 70 45 2d 3e 6f 70 3d 3d 54 4b 5f 49  if( pE->op==TK_I
8650: 44 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  D ){.    char *z
8660: 43 6f 6c 20 3d 20 70 45 2d 3e 75 2e 7a 54 6f 6b  Col = pE->u.zTok
8670: 65 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  en;.    for(i=0;
8680: 20 69 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72   i<pEList->nExpr
8690: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68  ; i++){.      ch
86a0: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
86b0: 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[i].zName;.  
86c0: 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26      if( zAs!=0 &
86d0: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
86e0: 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  (zAs, zCol)==0 )
86f0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
8700: 20 69 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   i+1;.      }.  
8710: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
8720: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 20   0;.}../*.** pE 
8730: 69 73 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  is a pointer to 
8740: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 68  an expression wh
8750: 69 63 68 20 69 73 20 61 20 73 69 6e 67 6c 65 20  ich is a single 
8760: 74 65 72 6d 20 69 6e 20 74 68 65 0a 2a 2a 20 4f  term in the.** O
8770: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
8780: 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 20 20 54  pound SELECT.  T
8790: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
87a0: 73 20 6e 6f 74 20 62 65 65 6e 0a 2a 2a 20 6e 61  s not been.** na
87b0: 6d 65 20 72 65 73 6f 6c 76 65 64 2e 0a 2a 2a 0a  me resolved..**.
87c0: 2a 2a 20 41 74 20 74 68 65 20 70 6f 69 6e 74 20  ** At the point 
87d0: 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20  this routine is 
87e0: 63 61 6c 6c 65 64 2c 20 77 65 20 61 6c 72 65 61  called, we alrea
87f0: 64 79 20 6b 6e 6f 77 20 74 68 61 74 20 74 68 65  dy know that the
8800: 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65 72  .** ORDER BY ter
8810: 6d 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65  m is not an inte
8820: 67 65 72 20 69 6e 64 65 78 20 69 6e 74 6f 20 74  ger index into t
8830: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8840: 54 68 61 74 0a 2a 2a 20 63 61 73 65 20 69 73 20  That.** case is 
8850: 68 61 6e 64 6c 65 64 20 62 79 20 74 68 65 20 63  handled by the c
8860: 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e 65 2e 0a  alling routine..
8870: 2a 2a 0a 2a 2a 20 41 74 74 65 6d 70 74 20 74 6f  **.** Attempt to
8880: 20 6d 61 74 63 68 20 70 45 20 61 67 61 69 6e 73   match pE agains
8890: 74 20 72 65 73 75 6c 74 20 73 65 74 20 63 6f 6c  t result set col
88a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 6c 65 66 74  umns in the left
88b0: 2d 6d 6f 73 74 0a 2a 2a 20 53 45 4c 45 43 54 20  -most.** SELECT 
88c0: 73 74 61 74 65 6d 65 6e 74 2e 20 20 52 65 74 75  statement.  Retu
88d0: 72 6e 20 74 68 65 20 69 6e 64 65 78 20 69 20 6f  rn the index i o
88e0: 66 20 74 68 65 20 6d 61 74 63 68 69 6e 67 20 63  f the matching c
88f0: 6f 6c 75 6d 6e 2c 0a 2a 2a 20 61 73 20 61 6e 20  olumn,.** as an 
8900: 69 6e 64 69 63 61 74 69 6f 6e 20 74 6f 20 74 68  indication to th
8910: 65 20 63 61 6c 6c 65 72 20 74 68 61 74 20 69 74  e caller that it
8920: 20 73 68 6f 75 6c 64 20 73 6f 72 74 20 62 79 20   should sort by 
8930: 74 68 65 20 69 2d 74 68 20 63 6f 6c 75 6d 6e 2e  the i-th column.
8940: 0a 2a 2a 20 54 68 65 20 6c 65 66 74 2d 6d 6f 73  .** The left-mos
8950: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 31 2e 20 20  t column is 1.  
8960: 49 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 2c 20  In other words, 
8970: 74 68 65 20 76 61 6c 75 65 20 72 65 74 75 72 6e  the value return
8980: 65 64 20 69 73 20 74 68 65 0a 2a 2a 20 73 61 6d  ed is the.** sam
8990: 65 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 20  e integer value 
89a0: 74 68 61 74 20 77 6f 75 6c 64 20 62 65 20 75 73  that would be us
89b0: 65 64 20 69 6e 20 74 68 65 20 53 51 4c 20 73 74  ed in the SQL st
89c0: 61 74 65 6d 65 6e 74 20 74 6f 20 69 6e 64 69 63  atement to indic
89d0: 61 74 65 0a 2a 2a 20 74 68 65 20 63 6f 6c 75 6d  ate.** the colum
89e0: 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 72  n..**.** If ther
89f0: 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 2c 20 72  e is no match, r
8a00: 65 74 75 72 6e 20 30 2e 20 20 52 65 74 75 72 6e  eturn 0.  Return
8a10: 20 2d 31 20 69 66 20 61 6e 20 65 72 72 6f 72 20   -1 if an error 
8a20: 6f 63 63 75 72 73 2e 0a 2a 2f 0a 73 74 61 74 69  occurs..*/.stati
8a30: 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64  c int resolveOrd
8a40: 65 72 42 79 54 65 72 6d 54 6f 45 78 70 72 4c 69  erByTermToExprLi
8a50: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
8a60: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
8a70: 69 6e 67 20 63 6f 6e 74 65 78 74 20 66 6f 72 20  ing context for 
8a80: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 73 20 2a  error messages *
8a90: 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c  /.  Select *pSel
8aa0: 65 63 74 2c 20 20 20 2f 2a 20 54 68 65 20 53 45  ect,   /* The SE
8ab0: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 77  LECT statement w
8ac0: 69 74 68 20 74 68 65 20 4f 52 44 45 52 20 42 59  ith the ORDER BY
8ad0: 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 45 78 70   clause */.  Exp
8ae0: 72 20 2a 70 45 20 20 20 20 20 20 20 20 20 20 20  r *pE           
8af0: 2f 2a 20 54 68 65 20 73 70 65 63 69 66 69 63 20  /* The specific 
8b00: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 2a 2f  ORDER BY term */
8b10: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 20 20 20 20  .){.  int i;    
8b20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
8b30: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
8b40: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 20  prList *pEList; 
8b50: 20 2f 2a 20 54 68 65 20 63 6f 6c 75 6d 6e 73 20   /* The columns 
8b60: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  of the result se
8b70: 74 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  t */.  NameConte
8b80: 78 74 20 6e 63 3b 20 20 20 20 2f 2a 20 4e 61 6d  xt nc;    /* Nam
8b90: 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 72 65  e context for re
8ba0: 73 6f 6c 76 69 6e 67 20 70 45 20 2a 2f 0a 20 20  solving pE */.  
8bb0: 73 71 6c 69 74 65 33 20 2a 64 62 3b 20 20 20 20  sqlite3 *db;    
8bc0: 20 20 20 2f 2a 20 44 61 74 61 62 61 73 65 20 63     /* Database c
8bd0: 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a 20 20 69  onnection */.  i
8be0: 6e 74 20 72 63 3b 20 20 20 20 20 20 20 20 20 20  nt rc;          
8bf0: 20 20 2f 2a 20 52 65 74 75 72 6e 20 63 6f 64 65    /* Return code
8c00: 20 66 72 6f 6d 20 73 75 62 70 72 6f 63 65 64 75   from subprocedu
8c10: 72 65 73 20 2a 2f 0a 20 20 75 38 20 73 61 76 65  res */.  u8 save
8c20: 64 53 75 70 70 45 72 72 3b 20 20 20 2f 2a 20 53  dSuppErr;   /* S
8c30: 61 76 65 64 20 76 61 6c 75 65 20 6f 66 20 64 62  aved value of db
8c40: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 20 2a 2f  ->suppressErr */
8c50: 0a 0a 20 20 61 73 73 65 72 74 28 20 73 71 6c 69  ..  assert( sqli
8c60: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
8c70: 28 70 45 2c 20 26 69 29 3d 3d 30 20 29 3b 0a 20  (pE, &i)==0 );. 
8c80: 20 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63   pEList = pSelec
8c90: 74 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20 2f 2a  t->pEList;..  /*
8ca0: 20 52 65 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d   Resolve all nam
8cb0: 65 73 20 69 6e 20 74 68 65 20 4f 52 44 45 52 20  es in the ORDER 
8cc0: 42 59 20 74 65 72 6d 20 65 78 70 72 65 73 73 69  BY term expressi
8cd0: 6f 6e 0a 20 20 2a 2f 0a 20 20 6d 65 6d 73 65 74  on.  */.  memset
8ce0: 28 26 6e 63 2c 20 30 2c 20 73 69 7a 65 6f 66 28  (&nc, 0, sizeof(
8cf0: 6e 63 29 29 3b 0a 20 20 6e 63 2e 70 50 61 72 73  nc));.  nc.pPars
8d00: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 6e 63  e = pParse;.  nc
8d10: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 53 65 6c  .pSrcList = pSel
8d20: 65 63 74 2d 3e 70 53 72 63 3b 0a 20 20 6e 63 2e  ect->pSrc;.  nc.
8d30: 75 4e 43 2e 70 45 4c 69 73 74 20 3d 20 70 45 4c  uNC.pEList = pEL
8d40: 69 73 74 3b 0a 20 20 6e 63 2e 6e 63 46 6c 61 67  ist;.  nc.ncFlag
8d50: 73 20 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c  s = NC_AllowAgg|
8d60: 4e 43 5f 55 45 4c 69 73 74 3b 0a 20 20 6e 63 2e  NC_UEList;.  nc.
8d70: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 64 62 20 3d  nErr = 0;.  db =
8d80: 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20 73   pParse->db;.  s
8d90: 61 76 65 64 53 75 70 70 45 72 72 20 3d 20 64 62  avedSuppErr = db
8da0: 2d 3e 73 75 70 70 72 65 73 73 45 72 72 3b 0a 20  ->suppressErr;. 
8db0: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
8dc0: 20 3d 20 31 3b 0a 20 20 72 63 20 3d 20 73 71 6c   = 1;.  rc = sql
8dd0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
8de0: 61 6d 65 73 28 26 6e 63 2c 20 70 45 29 3b 0a 20  ames(&nc, pE);. 
8df0: 20 64 62 2d 3e 73 75 70 70 72 65 73 73 45 72 72   db->suppressErr
8e00: 20 3d 20 73 61 76 65 64 53 75 70 70 45 72 72 3b   = savedSuppErr;
8e10: 0a 20 20 69 66 28 20 72 63 20 29 20 72 65 74 75  .  if( rc ) retu
8e20: 72 6e 20 30 3b 0a 0a 20 20 2f 2a 20 54 72 79 20  rn 0;..  /* Try 
8e30: 74 6f 20 6d 61 74 63 68 20 74 68 65 20 4f 52 44  to match the ORD
8e40: 45 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e  ER BY expression
8e50: 20 61 67 61 69 6e 73 74 20 61 6e 20 65 78 70 72   against an expr
8e60: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 69 6e 20 74  ession.  ** in t
8e70: 68 65 20 72 65 73 75 6c 74 20 73 65 74 2e 20 20  he result set.  
8e80: 52 65 74 75 72 6e 20 61 6e 20 31 2d 62 61 73 65  Return an 1-base
8e90: 64 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 6d  d index of the m
8ea0: 61 74 63 68 69 6e 67 0a 20 20 2a 2a 20 72 65 73  atching.  ** res
8eb0: 75 6c 74 2d 73 65 74 20 65 6e 74 72 79 2e 0a 20  ult-set entry.. 
8ec0: 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   */.  for(i=0; i
8ed0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
8ee0: 69 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 73 71  i++){.    if( sq
8ef0: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
8f00: 28 30 2c 20 70 45 4c 69 73 74 2d 3e 61 5b 69 5d  (0, pEList->a[i]
8f10: 2e 70 45 78 70 72 2c 20 70 45 2c 20 2d 31 29 3c  .pExpr, pE, -1)<
8f20: 32 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  2 ){.      retur
8f30: 6e 20 69 2b 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  n i+1;.    }.  }
8f40: 0a 0a 20 20 2f 2a 20 49 66 20 6e 6f 20 6d 61 74  ..  /* If no mat
8f50: 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 2a 2f  ch, return 0. */
8f60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
8f70: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
8f80: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
8f90: 4f 55 50 20 42 59 20 74 65 72 6d 20 6f 75 74 2d  OUP BY term out-
8fa0: 6f 66 2d 72 61 6e 67 65 20 65 72 72 6f 72 2e 0a  of-range error..
8fb0: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 72  */.static void r
8fc0: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
8fd0: 45 72 72 6f 72 28 0a 20 20 50 61 72 73 65 20 2a  Error(.  Parse *
8fe0: 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 20  pParse,         
8ff0: 2f 2a 20 54 68 65 20 65 72 72 6f 72 20 63 6f 6e  /* The error con
9000: 74 65 78 74 20 69 6e 74 6f 20 77 68 69 63 68 20  text into which 
9010: 74 6f 20 77 72 69 74 65 20 74 68 65 20 65 72 72  to write the err
9020: 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  or */.  const ch
9030: 61 72 20 2a 7a 54 79 70 65 2c 20 20 20 20 20 2f  ar *zType,     /
9040: 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52  * "ORDER" or "GR
9050: 4f 55 50 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c  OUP" */.  int i,
9060: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9070: 20 2f 2a 20 54 68 65 20 69 6e 64 65 78 20 28 31   /* The index (1
9080: 2d 62 61 73 65 64 29 20 6f 66 20 74 68 65 20 74  -based) of the t
9090: 65 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65  erm out of range
90a0: 20 2a 2f 0a 20 20 69 6e 74 20 6d 78 20 20 20 20   */.  int mx    
90b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
90c0: 4c 61 72 67 65 73 74 20 70 65 72 6d 69 73 73 69  Largest permissi
90d0: 62 6c 65 20 76 61 6c 75 65 20 6f 66 20 69 20 2a  ble value of i *
90e0: 2f 0a 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 72  /.){.  sqlite3Er
90f0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 0a  rorMsg(pParse, .
9100: 20 20 20 20 22 25 72 20 25 73 20 42 59 20 74 65      "%r %s BY te
9110: 72 6d 20 6f 75 74 20 6f 66 20 72 61 6e 67 65 20  rm out of range 
9120: 2d 20 73 68 6f 75 6c 64 20 62 65 20 22 0a 20 20  - should be ".  
9130: 20 20 22 62 65 74 77 65 65 6e 20 31 20 61 6e 64    "between 1 and
9140: 20 25 64 22 2c 20 69 2c 20 7a 54 79 70 65 2c 20   %d", i, zType, 
9150: 6d 78 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  mx);.}../*.** An
9160: 61 6c 79 7a 65 20 74 68 65 20 4f 52 44 45 52 20  alyze the ORDER 
9170: 42 59 20 63 6c 61 75 73 65 20 69 6e 20 61 20 63  BY clause in a c
9180: 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 20 73  ompound SELECT s
9190: 74 61 74 65 6d 65 6e 74 2e 20 20 20 4d 6f 64 69  tatement.   Modi
91a0: 66 79 0a 2a 2a 20 65 61 63 68 20 74 65 72 6d 20  fy.** each term 
91b0: 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  of the ORDER BY 
91c0: 63 6c 61 75 73 65 20 69 73 20 61 20 63 6f 6e 73  clause is a cons
91d0: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 62 65 74  tant integer bet
91e0: 77 65 65 6e 20 31 0a 2a 2a 20 61 6e 64 20 4e 20  ween 1.** and N 
91f0: 77 68 65 72 65 20 4e 20 69 73 20 74 68 65 20 6e  where N is the n
9200: 75 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73  umber of columns
9210: 20 69 6e 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64   in the compound
9220: 20 53 45 4c 45 43 54 2e 0a 2a 2a 0a 2a 2a 20 4f   SELECT..**.** O
9230: 52 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68  RDER BY terms th
9240: 61 74 20 61 72 65 20 61 6c 72 65 61 64 79 20 61  at are already a
9250: 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77 65 65  n integer betwee
9260: 6e 20 31 20 61 6e 64 20 4e 20 61 72 65 0a 2a 2a  n 1 and N are.**
9270: 20 75 6e 6d 6f 64 69 66 69 65 64 2e 20 20 4f 52   unmodified.  OR
9280: 44 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61  DER BY terms tha
9290: 74 20 61 72 65 20 69 6e 74 65 67 65 72 73 20 6f  t are integers o
92a0: 75 74 73 69 64 65 20 74 68 65 20 72 61 6e 67 65  utside the range
92b0: 20 6f 66 0a 2a 2a 20 31 20 74 68 72 6f 75 67 68   of.** 1 through
92c0: 20 4e 20 67 65 6e 65 72 61 74 65 20 61 6e 20 65   N generate an e
92d0: 72 72 6f 72 2e 20 20 4f 52 44 45 52 20 42 59 20  rror.  ORDER BY 
92e0: 74 65 72 6d 73 20 74 68 61 74 20 61 72 65 20 65  terms that are e
92f0: 78 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 61 72  xpressions.** ar
9300: 65 20 6d 61 74 63 68 65 64 20 61 67 61 69 6e 73  e matched agains
9310: 74 20 72 65 73 75 6c 74 20 73 65 74 20 65 78 70  t result set exp
9320: 72 65 73 73 69 6f 6e 73 20 6f 66 20 63 6f 6d 70  ressions of comp
9330: 6f 75 6e 64 20 53 45 4c 45 43 54 0a 2a 2a 20 62  ound SELECT.** b
9340: 65 67 69 6e 6e 69 6e 67 20 77 69 74 68 20 74 68  eginning with th
9350: 65 20 6c 65 66 74 2d 6d 6f 73 74 20 53 45 4c 45  e left-most SELE
9360: 43 54 20 61 6e 64 20 77 6f 72 6b 69 6e 67 20 74  CT and working t
9370: 6f 77 61 72 64 20 74 68 65 20 72 69 67 68 74 2e  oward the right.
9380: 0a 2a 2a 20 41 74 20 74 68 65 20 66 69 72 73 74  .** At the first
9390: 20 6d 61 74 63 68 2c 20 74 68 65 20 4f 52 44 45   match, the ORDE
93a0: 52 20 42 59 20 65 78 70 72 65 73 73 69 6f 6e 20  R BY expression 
93b0: 69 73 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 69  is transformed i
93c0: 6e 74 6f 0a 2a 2a 20 74 68 65 20 69 6e 74 65 67  nto.** the integ
93d0: 65 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  er column number
93e0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
93f0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
9400: 6f 72 73 20 73 65 65 6e 2e 0a 2a 2f 0a 73 74 61  ors seen..*/.sta
9410: 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65 43  tic int resolveC
9420: 6f 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 0a  ompoundOrderBy(.
9430: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
9440: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
9450: 6e 67 20 63 6f 6e 74 65 78 74 2e 20 20 4c 65 61  ng context.  Lea
9460: 76 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  ve error message
9470: 73 20 68 65 72 65 20 2a 2f 0a 20 20 53 65 6c 65  s here */.  Sele
9480: 63 74 20 2a 70 53 65 6c 65 63 74 20 20 20 20 20  ct *pSelect     
9490: 20 20 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20    /* The SELECT 
94a0: 73 74 61 74 65 6d 65 6e 74 20 63 6f 6e 74 61 69  statement contai
94b0: 6e 69 6e 67 20 74 68 65 20 4f 52 44 45 52 20 42  ning the ORDER B
94c0: 59 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  Y */.){.  int i;
94d0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4f 72  .  ExprList *pOr
94e0: 64 65 72 42 79 3b 0a 20 20 45 78 70 72 4c 69 73  derBy;.  ExprLis
94f0: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 73 71 6c  t *pEList;.  sql
9500: 69 74 65 33 20 2a 64 62 3b 0a 20 20 69 6e 74 20  ite3 *db;.  int 
9510: 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b 0a 0a 20  moreToDo = 1;.. 
9520: 20 70 4f 72 64 65 72 42 79 20 3d 20 70 53 65 6c   pOrderBy = pSel
9530: 65 63 74 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20  ect->pOrderBy;. 
9540: 20 69 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30   if( pOrderBy==0
9550: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 64   ) return 0;.  d
9560: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a  b = pParse->db;.
9570: 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d 3e    if( pOrderBy->
9580: 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74  nExpr>db->aLimit
9590: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f  [SQLITE_LIMIT_CO
95a0: 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c  LUMN] ){.    sql
95b0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
95c0: 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74  rse, "too many t
95d0: 65 72 6d 73 20 69 6e 20 4f 52 44 45 52 20 42 59  erms in ORDER BY
95e0: 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 72   clause");.    r
95f0: 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 66  eturn 1;.  }.  f
9600: 6f 72 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72  or(i=0; i<pOrder
9610: 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  By->nExpr; i++){
9620: 0a 20 20 20 20 70 4f 72 64 65 72 42 79 2d 3e 61  .    pOrderBy->a
9630: 5b 69 5d 2e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  [i].done = 0;.  
9640: 7d 0a 20 20 70 53 65 6c 65 63 74 2d 3e 70 4e 65  }.  pSelect->pNe
9650: 78 74 20 3d 20 30 3b 0a 20 20 77 68 69 6c 65 28  xt = 0;.  while(
9660: 20 70 53 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72   pSelect->pPrior
9670: 20 29 7b 0a 20 20 20 20 70 53 65 6c 65 63 74 2d   ){.    pSelect-
9680: 3e 70 50 72 69 6f 72 2d 3e 70 4e 65 78 74 20 3d  >pPrior->pNext =
9690: 20 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 70 53   pSelect;.    pS
96a0: 65 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d  elect = pSelect-
96b0: 3e 70 50 72 69 6f 72 3b 0a 20 20 7d 0a 20 20 77  >pPrior;.  }.  w
96c0: 68 69 6c 65 28 20 70 53 65 6c 65 63 74 20 26 26  hile( pSelect &&
96d0: 20 6d 6f 72 65 54 6f 44 6f 20 29 7b 0a 20 20 20   moreToDo ){.   
96e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
96f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
9700: 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 30 3b 0a    moreToDo = 0;.
9710: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 53 65      pEList = pSe
9720: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20  lect->pEList;.  
9730: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
9740: 21 3d 30 20 29 3b 0a 20 20 20 20 66 6f 72 28 69  !=0 );.    for(i
9750: 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72  =0, pItem=pOrder
9760: 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42  By->a; i<pOrderB
9770: 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  y->nExpr; i++, p
9780: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 69  Item++){.      i
9790: 6e 74 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20  nt iCol = -1;.  
97a0: 20 20 20 20 45 78 70 72 20 2a 70 45 2c 20 2a 70      Expr *pE, *p
97b0: 44 75 70 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Dup;.      if( p
97c0: 49 74 65 6d 2d 3e 64 6f 6e 65 20 29 20 63 6f 6e  Item->done ) con
97d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 70 45 20  tinue;.      pE 
97e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69  = sqlite3ExprSki
97f0: 70 43 6f 6c 6c 61 74 65 28 70 49 74 65 6d 2d 3e  pCollate(pItem->
9800: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 69 66  pExpr);.      if
9810: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
9820: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 43 6f 6c  nteger(pE, &iCol
9830: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ) ){.        if(
9840: 20 69 43 6f 6c 3c 3d 30 20 7c 7c 20 69 43 6f 6c   iCol<=0 || iCol
9850: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  >pEList->nExpr )
9860: 7b 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 6f  {.          reso
9870: 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72 72  lveOutOfRangeErr
9880: 6f 72 28 70 50 61 72 73 65 2c 20 22 4f 52 44 45  or(pParse, "ORDE
9890: 52 22 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d  R", i+1, pEList-
98a0: 3e 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  >nExpr);.       
98b0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
98c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c       }.      }el
98d0: 73 65 7b 0a 20 20 20 20 20 20 20 20 69 43 6f 6c  se{.        iCol
98e0: 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65   = resolveAsName
98f0: 28 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c  (pParse, pEList,
9900: 20 70 45 29 3b 0a 20 20 20 20 20 20 20 20 69 66   pE);.        if
9910: 28 20 69 43 6f 6c 3d 3d 30 20 29 7b 0a 20 20 20  ( iCol==0 ){.   
9920: 20 20 20 20 20 20 20 70 44 75 70 20 3d 20 73 71         pDup = sq
9930: 6c 69 74 65 33 45 78 70 72 44 75 70 28 64 62 2c  lite3ExprDup(db,
9940: 20 70 45 2c 20 30 29 3b 0a 20 20 20 20 20 20 20   pE, 0);.       
9950: 20 20 20 69 66 28 20 21 64 62 2d 3e 6d 61 6c 6c     if( !db->mall
9960: 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  ocFailed ){.    
9970: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 70          assert(p
9980: 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20  Dup);.          
9990: 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65    iCol = resolve
99a0: 4f 72 64 65 72 42 79 54 65 72 6d 54 6f 45 78 70  OrderByTermToExp
99b0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 53  rList(pParse, pS
99c0: 65 6c 65 63 74 2c 20 70 44 75 70 29 3b 0a 20 20  elect, pDup);.  
99d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
99e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
99f0: 65 6c 65 74 65 28 64 62 2c 20 70 44 75 70 29 3b  elete(db, pDup);
9a00: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9a10: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f   }.      if( iCo
9a20: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  l>0 ){.        /
9a30: 2a 20 43 6f 6e 76 65 72 74 20 74 68 65 20 4f 52  * Convert the OR
9a40: 44 45 52 20 42 59 20 74 65 72 6d 20 69 6e 74 6f  DER BY term into
9a50: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6c 75   an integer colu
9a60: 6d 6e 20 6e 75 6d 62 65 72 20 69 43 6f 6c 2c 0a  mn number iCol,.
9a70: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 6b 69 6e          ** takin
9a80: 67 20 63 61 72 65 20 74 6f 20 70 72 65 73 65 72  g care to preser
9a90: 76 65 20 74 68 65 20 43 4f 4c 4c 41 54 45 20 63  ve the COLLATE c
9aa0: 6c 61 75 73 65 20 69 66 20 69 74 20 65 78 69 73  lause if it exis
9ab0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 45 78  ts */.        Ex
9ac0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
9ad0: 65 33 45 78 70 72 28 64 62 2c 20 54 4b 5f 49 4e  e3Expr(db, TK_IN
9ae0: 54 45 47 45 52 2c 20 30 29 3b 0a 20 20 20 20 20  TEGER, 0);.     
9af0: 20 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29     if( pNew==0 )
9b00: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
9b10: 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c     pNew->flags |
9b20: 3d 20 45 50 5f 49 6e 74 56 61 6c 75 65 3b 0a 20  = EP_IntValue;. 
9b30: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 75 2e 69         pNew->u.i
9b40: 56 61 6c 75 65 20 3d 20 69 43 6f 6c 3b 0a 20 20  Value = iCol;.  
9b50: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
9b60: 3e 70 45 78 70 72 3d 3d 70 45 20 29 7b 0a 20 20  >pExpr==pE ){.  
9b70: 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 70          pItem->p
9b80: 45 78 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20  Expr = pNew;.   
9b90: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9ba0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 50 61 72        Expr *pPar
9bb0: 65 6e 74 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  ent = pItem->pEx
9bc0: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  pr;.          as
9bd0: 73 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 6f  sert( pParent->o
9be0: 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 29 3b  p==TK_COLLATE );
9bf0: 0a 20 20 20 20 20 20 20 20 20 20 77 68 69 6c 65  .          while
9c00: 28 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74  ( pParent->pLeft
9c10: 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45  ->op==TK_COLLATE
9c20: 20 29 20 70 50 61 72 65 6e 74 20 3d 20 70 50 61   ) pParent = pPa
9c30: 72 65 6e 74 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  rent->pLeft;.   
9c40: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
9c50: 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 3d 3d 70  Parent->pLeft==p
9c60: 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70  E );.          p
9c70: 50 61 72 65 6e 74 2d 3e 70 4c 65 66 74 20 3d 20  Parent->pLeft = 
9c80: 70 4e 65 77 3b 0a 20 20 20 20 20 20 20 20 7d 0a  pNew;.        }.
9c90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
9ca0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45  xprDelete(db, pE
9cb0: 29 3b 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d  );.        pItem
9cc0: 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f  ->u.x.iOrderByCo
9cd0: 6c 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20  l = (u16)iCol;. 
9ce0: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f         pItem->do
9cf0: 6e 65 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 65  ne = 1;.      }e
9d00: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 6d 6f 72  lse{.        mor
9d10: 65 54 6f 44 6f 20 3d 20 31 3b 0a 20 20 20 20 20  eToDo = 1;.     
9d20: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 70 53 65   }.    }.    pSe
9d30: 6c 65 63 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  lect = pSelect->
9d40: 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 66 6f 72  pNext;.  }.  for
9d50: 28 69 3d 30 3b 20 69 3c 70 4f 72 64 65 72 42 79  (i=0; i<pOrderBy
9d60: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
9d70: 20 20 20 69 66 28 20 70 4f 72 64 65 72 42 79 2d     if( pOrderBy-
9d80: 3e 61 5b 69 5d 2e 64 6f 6e 65 3d 3d 30 20 29 7b  >a[i].done==0 ){
9d90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
9da0: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
9db0: 25 72 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d  %r ORDER BY term
9dc0: 20 64 6f 65 73 20 6e 6f 74 20 6d 61 74 63 68 20   does not match 
9dd0: 61 6e 79 20 22 0a 20 20 20 20 20 20 20 20 20 20  any ".          
9de0: 20 20 22 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65    "column in the
9df0: 20 72 65 73 75 6c 74 20 73 65 74 22 2c 20 69 2b   result set", i+
9e00: 31 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  1);.      return
9e10: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
9e20: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
9e30: 2a 2a 20 43 68 65 63 6b 20 65 76 65 72 79 20 74  ** Check every t
9e40: 65 72 6d 20 69 6e 20 74 68 65 20 4f 52 44 45 52  erm in the ORDER
9e50: 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42 59 20   BY or GROUP BY 
9e60: 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79 20  clause pOrderBy 
9e70: 6f 66 0a 2a 2a 20 74 68 65 20 53 45 4c 45 43 54  of.** the SELECT
9e80: 20 73 74 61 74 65 6d 65 6e 74 20 70 53 65 6c 65   statement pSele
9e90: 63 74 2e 20 20 49 66 20 61 6e 79 20 74 65 72 6d  ct.  If any term
9ea0: 20 69 73 20 72 65 66 65 72 65 6e 63 65 20 74 6f   is reference to
9eb0: 20 61 0a 2a 2a 20 72 65 73 75 6c 74 20 73 65 74   a.** result set
9ec0: 20 65 78 70 72 65 73 73 69 6f 6e 20 28 61 73 20   expression (as 
9ed0: 64 65 74 65 72 6d 69 6e 65 64 20 62 79 20 74 68  determined by th
9ee0: 65 20 45 78 70 72 4c 69 73 74 2e 61 2e 75 2e 78  e ExprList.a.u.x
9ef0: 2e 69 4f 72 64 65 72 42 79 43 6f 6c 0a 2a 2a 20  .iOrderByCol.** 
9f00: 66 69 65 6c 64 29 20 74 68 65 6e 20 63 6f 6e 76  field) then conv
9f10: 65 72 74 20 74 68 61 74 20 74 65 72 6d 20 69 6e  ert that term in
9f20: 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
9f30: 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 20 72   corresponding r
9f40: 65 73 75 6c 74 20 73 65 74 0a 2a 2a 20 63 6f 6c  esult set.** col
9f50: 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e  umn..**.** If an
9f60: 79 20 65 72 72 6f 72 73 20 61 72 65 20 64 65 74  y errors are det
9f70: 65 63 74 65 64 2c 20 61 64 64 20 61 6e 20 65 72  ected, add an er
9f80: 72 6f 72 20 6d 65 73 73 61 67 65 20 74 6f 20 70  ror message to p
9f90: 50 61 72 73 65 20 61 6e 64 0a 2a 2a 20 72 65 74  Parse and.** ret
9fa0: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52  urn non-zero.  R
9fb0: 65 74 75 72 6e 20 7a 65 72 6f 20 69 66 20 6e 6f  eturn zero if no
9fc0: 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
9fd0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
9fe0: 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75  ResolveOrderGrou
9ff0: 70 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70 50  pBy(.  Parse *pP
a000: 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
a010: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 2e  Parsing context.
a020: 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d 65    Leave error me
a030: 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a 20  ssages here */. 
a040: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63 74   Select *pSelect
a050: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53 45  ,      /* The SE
a060: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 63  LECT statement c
a070: 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 63 6c  ontaining the cl
a080: 61 75 73 65 20 2a 2f 0a 20 20 45 78 70 72 4c 69  ause */.  ExprLi
a090: 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20 20 20  st *pOrderBy,   
a0a0: 2f 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20  /* The ORDER BY 
a0b0: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
a0c0: 73 65 20 74 6f 20 62 65 20 70 72 6f 63 65 73 73  se to be process
a0d0: 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
a0e0: 61 72 20 2a 7a 54 79 70 65 20 20 20 20 20 2f 2a  ar *zType     /*
a0f0: 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47 52 4f   "ORDER" or "GRO
a100: 55 50 22 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  UP" */.){.  int 
a110: 69 3b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  i;.  sqlite3 *db
a120: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
a130: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
a140: 74 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72  t;.  struct Expr
a150: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
a160: 3b 0a 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  ;..  if( pOrderB
a170: 79 3d 3d 30 20 7c 7c 20 70 50 61 72 73 65 2d 3e  y==0 || pParse->
a180: 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64  db->mallocFailed
a190: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
a1a0: 66 28 20 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78  f( pOrderBy->nEx
a1b0: 70 72 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b 53 51  pr>db->aLimit[SQ
a1c0: 4c 49 54 45 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d  LITE_LIMIT_COLUM
a1d0: 4e 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  N] ){.    sqlite
a1e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a1f0: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 74 65 72 6d  , "too many term
a200: 73 20 69 6e 20 25 73 20 42 59 20 63 6c 61 75 73  s in %s BY claus
a210: 65 22 2c 20 7a 54 79 70 65 29 3b 0a 20 20 20 20  e", zType);.    
a220: 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20  return 1;.  }.  
a230: 70 45 4c 69 73 74 20 3d 20 70 53 65 6c 65 63 74  pEList = pSelect
a240: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 61 73 73 65  ->pEList;.  asse
a250: 72 74 28 20 70 45 4c 69 73 74 21 3d 30 20 29 3b  rt( pEList!=0 );
a260: 20 20 2f 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    /* sqlite3Sele
a270: 63 74 4e 65 77 28 29 20 67 75 61 72 61 6e 74 65  ctNew() guarante
a280: 65 73 20 74 68 69 73 20 2a 2f 0a 20 20 66 6f 72  es this */.  for
a290: 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 4f 72 64  (i=0, pItem=pOrd
a2a0: 65 72 42 79 2d 3e 61 3b 20 69 3c 70 4f 72 64 65  erBy->a; i<pOrde
a2b0: 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  rBy->nExpr; i++,
a2c0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 69   pItem++){.    i
a2d0: 66 28 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f  f( pItem->u.x.iO
a2e0: 72 64 65 72 42 79 43 6f 6c 20 29 7b 0a 20 20 20  rderByCol ){.   
a2f0: 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 75 2e     if( pItem->u.
a300: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 3e 70 45  x.iOrderByCol>pE
a310: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
a320: 20 20 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75         resolveOu
a330: 74 4f 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50  tOfRangeError(pP
a340: 61 72 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31  arse, zType, i+1
a350: 2c 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29  , pEList->nExpr)
a360: 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  ;.        return
a370: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
a380: 20 20 72 65 73 6f 6c 76 65 41 6c 69 61 73 28 70    resolveAlias(p
a390: 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2c 20 70  Parse, pEList, p
a3a0: 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72  Item->u.x.iOrder
a3b0: 42 79 43 6f 6c 2d 31 2c 20 70 49 74 65 6d 2d 3e  ByCol-1, pItem->
a3c0: 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20  pExpr,.         
a3d0: 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65 2c            zType,
a3e0: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
a3f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
a400: 2a 2a 20 70 4f 72 64 65 72 42 79 20 69 73 20 61  ** pOrderBy is a
a410: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
a420: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 69 6e  OUP BY clause in
a430: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
a440: 74 20 70 53 65 6c 65 63 74 2e 0a 2a 2a 20 54 68  t pSelect..** Th
a450: 65 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 6f  e Name context o
a460: 66 20 74 68 65 20 53 45 4c 45 43 54 20 73 74 61  f the SELECT sta
a470: 74 65 6d 65 6e 74 20 69 73 20 70 4e 43 2e 20 20  tement is pNC.  
a480: 7a 54 79 70 65 20 69 73 20 65 69 74 68 65 72 0a  zType is either.
a490: 2a 2a 20 22 4f 52 44 45 52 22 20 6f 72 20 22 47  ** "ORDER" or "G
a4a0: 52 4f 55 50 22 20 64 65 70 65 6e 64 69 6e 67 20  ROUP" depending 
a4b0: 6f 6e 20 77 68 69 63 68 20 74 79 70 65 20 6f 66  on which type of
a4c0: 20 63 6c 61 75 73 65 20 70 4f 72 64 65 72 42 79   clause pOrderBy
a4d0: 20 69 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20   is..**.** This 
a4e0: 72 6f 75 74 69 6e 65 20 72 65 73 6f 6c 76 65 73  routine resolves
a4f0: 20 65 61 63 68 20 74 65 72 6d 20 6f 66 20 74 68   each term of th
a500: 65 20 63 6c 61 75 73 65 20 69 6e 74 6f 20 61 6e  e clause into an
a510: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
a520: 49 66 20 74 68 65 20 6f 72 64 65 72 2d 62 79 20  If the order-by 
a530: 74 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67  term is an integ
a540: 65 72 20 49 20 62 65 74 77 65 65 6e 20 31 20 61  er I between 1 a
a550: 6e 64 20 4e 20 28 77 68 65 72 65 20 4e 20 69 73  nd N (where N is
a560: 20 74 68 65 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f   the.** number o
a570: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
a580: 20 72 65 73 75 6c 74 20 73 65 74 20 6f 66 20 74   result set of t
a590: 68 65 20 53 45 4c 45 43 54 29 20 74 68 65 6e 20  he SELECT) then 
a5a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
a5b0: 2a 20 69 6e 20 74 68 65 20 72 65 73 6f 6c 75 74  * in the resolut
a5c0: 69 6f 6e 20 69 73 20 61 20 63 6f 70 79 20 6f 66  ion is a copy of
a5d0: 20 74 68 65 20 49 2d 74 68 20 72 65 73 75 6c 74   the I-th result
a5e0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  -set expression.
a5f0: 20 20 49 66 0a 2a 2a 20 74 68 65 20 6f 72 64 65    If.** the orde
a600: 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e 20  r-by term is an 
a610: 69 64 65 6e 74 69 66 69 65 72 20 74 68 61 74 20  identifier that 
a620: 63 6f 72 72 65 73 70 6f 6e 64 73 20 74 6f 20 74  corresponds to t
a630: 68 65 20 41 53 2d 6e 61 6d 65 20 6f 66 0a 2a 2a  he AS-name of.**
a640: 20 61 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78   a result-set ex
a650: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 74  pression, then t
a660: 68 65 20 74 65 72 6d 20 72 65 73 6f 6c 76 65 73  he term resolves
a670: 20 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68   to a copy of th
a680: 65 0a 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20  e.** result-set 
a690: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4f 74 68  expression.  Oth
a6a0: 65 72 77 69 73 65 2c 20 74 68 65 20 65 78 70 72  erwise, the expr
a6b0: 65 73 73 69 6f 6e 20 69 73 20 72 65 73 6f 6c 76  ession is resolv
a6c0: 65 64 20 69 6e 0a 2a 2a 20 74 68 65 20 75 73 75  ed in.** the usu
a6d0: 61 6c 20 77 61 79 20 2d 20 75 73 69 6e 67 20 73  al way - using s
a6e0: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
a6f0: 72 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a 2a 20  rNames()..**.** 
a700: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74  This routine ret
a710: 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20  urns the number 
a720: 6f 66 20 65 72 72 6f 72 73 2e 20 20 49 66 20 65  of errors.  If e
a730: 72 72 6f 72 73 20 6f 63 63 75 72 2c 20 74 68 65  rrors occur, the
a740: 6e 0a 2a 2a 20 61 6e 20 61 70 70 72 6f 70 72 69  n.** an appropri
a750: 61 74 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67  ate error messag
a760: 65 20 6d 69 67 68 74 20 62 65 20 6c 65 66 74 20  e might be left 
a770: 69 6e 20 70 50 61 72 73 65 2e 20 20 28 4f 4f 4d  in pParse.  (OOM
a780: 20 65 72 72 6f 72 73 0a 2a 2a 20 65 78 63 65 70   errors.** excep
a790: 74 65 64 2e 29 0a 2a 2f 0a 73 74 61 74 69 63 20  ted.).*/.static 
a7a0: 69 6e 74 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  int resolveOrder
a7b0: 47 72 6f 75 70 42 79 28 0a 20 20 4e 61 6d 65 43  GroupBy(.  NameC
a7c0: 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20  ontext *pNC,    
a7d0: 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e   /* The name con
a7e0: 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
a7f0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
a800: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
a810: 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t,      /* The S
a820: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
a830: 68 6f 6c 64 69 6e 67 20 70 4f 72 64 65 72 42 79  holding pOrderBy
a840: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
a850: 70 4f 72 64 65 72 42 79 2c 20 20 20 2f 2a 20 41  pOrderBy,   /* A
a860: 6e 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52  n ORDER BY or GR
a870: 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20 74 6f  OUP BY clause to
a880: 20 72 65 73 6f 6c 76 65 20 2a 2f 0a 20 20 63 6f   resolve */.  co
a890: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
a8a0: 20 20 20 20 2f 2a 20 45 69 74 68 65 72 20 22 4f      /* Either "O
a8b0: 52 44 45 52 22 20 6f 72 20 22 47 52 4f 55 50 22  RDER" or "GROUP"
a8c0: 2c 20 61 73 20 61 70 70 72 6f 70 72 69 61 74 65  , as appropriate
a8d0: 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20   */.){.  int i, 
a8e0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  j;              
a8f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
a900: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
a910: 74 20 69 43 6f 6c 3b 20 20 20 20 20 20 20 20 20  t iCol;         
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a930: 43 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 2a 2f  Column number */
a940: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
a950: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20  st_item *pItem; 
a960: 20 20 2f 2a 20 41 20 74 65 72 6d 20 6f 66 20 74    /* A term of t
a970: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
a980: 73 65 20 2a 2f 0a 20 20 50 61 72 73 65 20 2a 70  se */.  Parse *p
a990: 50 61 72 73 65 3b 20 20 20 20 20 20 20 20 20 20  Parse;          
a9a0: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e         /* Parsin
a9b0: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 69  g context */.  i
a9c0: 6e 74 20 6e 52 65 73 75 6c 74 3b 20 20 20 20 20  nt nResult;     
a9d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a9e0: 20 4e 75 6d 62 65 72 20 6f 66 20 74 65 72 6d 73   Number of terms
a9f0: 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73   in the result s
aa00: 65 74 20 2a 2f 0a 0a 20 20 69 66 28 20 70 4f 72  et */..  if( pOr
aa10: 64 65 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72  derBy==0 ) retur
aa20: 6e 20 30 3b 0a 20 20 6e 52 65 73 75 6c 74 20 3d  n 0;.  nResult =
aa30: 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74   pSelect->pEList
aa40: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 50 61 72 73  ->nExpr;.  pPars
aa50: 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b  e = pNC->pParse;
aa60: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65  .  for(i=0, pIte
aa70: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
aa80: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
aa90: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
aaa0: 0a 20 20 20 20 45 78 70 72 20 2a 70 45 20 3d 20  .    Expr *pE = 
aab0: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
aac0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 73 71    Expr *pE2 = sq
aad0: 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f 6c  lite3ExprSkipCol
aae0: 6c 61 74 65 28 70 45 29 3b 0a 20 20 20 20 69 66  late(pE);.    if
aaf0: 28 20 7a 54 79 70 65 5b 30 5d 21 3d 27 47 27 20  ( zType[0]!='G' 
ab00: 29 7b 0a 20 20 20 20 20 20 69 43 6f 6c 20 3d 20  ){.      iCol = 
ab10: 72 65 73 6f 6c 76 65 41 73 4e 61 6d 65 28 70 50  resolveAsName(pP
ab20: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2d 3e 70  arse, pSelect->p
ab30: 45 4c 69 73 74 2c 20 70 45 32 29 3b 0a 20 20 20  EList, pE2);.   
ab40: 20 20 20 69 66 28 20 69 43 6f 6c 3e 30 20 29 7b     if( iCol>0 ){
ab50: 0a 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 61  .        /* If a
ab60: 6e 20 41 53 2d 6e 61 6d 65 20 6d 61 74 63 68 20  n AS-name match 
ab70: 69 73 20 66 6f 75 6e 64 2c 20 6d 61 72 6b 20 74  is found, mark t
ab80: 68 69 73 20 4f 52 44 45 52 20 42 59 20 63 6f 6c  his ORDER BY col
ab90: 75 6d 6e 20 61 73 20 62 65 69 6e 67 0a 20 20 20  umn as being.   
aba0: 20 20 20 20 20 2a 2a 20 61 20 63 6f 70 79 20 6f       ** a copy o
abb0: 66 20 74 68 65 20 69 43 6f 6c 2d 74 68 20 72 65  f the iCol-th re
abc0: 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e 2e  sult-set column.
abd0: 20 20 54 68 65 20 73 75 62 73 65 71 75 65 6e 74    The subsequent
abe0: 20 63 61 6c 6c 20 74 6f 0a 20 20 20 20 20 20 20   call to.       
abf0: 20 2a 2a 20 73 71 6c 69 74 65 33 52 65 73 6f 6c   ** sqlite3Resol
ac00: 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 29  veOrderGroupBy()
ac10: 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74 68   will convert th
ac20: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
ac30: 61 0a 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 70  a.        ** cop
ac40: 79 20 6f 66 20 74 68 65 20 69 43 6f 6c 2d 74 68  y of the iCol-th
ac50: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
ac60: 65 73 73 69 6f 6e 2e 20 2a 2f 0a 20 20 20 20 20  ession. */.     
ac70: 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f     pItem->u.x.iO
ac80: 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36  rderByCol = (u16
ac90: 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 63  )iCol;.        c
aca0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
acb0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 73  .    }.    if( s
acc0: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
acd0: 67 65 72 28 70 45 32 2c 20 26 69 43 6f 6c 29 20  ger(pE2, &iCol) 
ace0: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ){.      /* The 
acf0: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 69 73  ORDER BY term is
ad00: 20 61 6e 20 69 6e 74 65 67 65 72 20 63 6f 6e 73   an integer cons
ad10: 74 61 6e 74 2e 20 20 41 67 61 69 6e 2c 20 73 65  tant.  Again, se
ad20: 74 20 74 68 65 20 63 6f 6c 75 6d 6e 0a 20 20 20  t the column.   
ad30: 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 73 6f 20     ** number so 
ad40: 74 68 61 74 20 73 71 6c 69 74 65 33 52 65 73 6f  that sqlite3Reso
ad50: 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28  lveOrderGroupBy(
ad60: 29 20 77 69 6c 6c 20 63 6f 6e 76 65 72 74 20 74  ) will convert t
ad70: 68 65 0a 20 20 20 20 20 20 2a 2a 20 6f 72 64 65  he.      ** orde
ad80: 72 2d 62 79 20 74 65 72 6d 20 74 6f 20 61 20 63  r-by term to a c
ad90: 6f 70 79 20 6f 66 20 74 68 65 20 72 65 73 75 6c  opy of the resul
ada0: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
adb0: 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 69 43   */.      if( iC
adc0: 6f 6c 3c 31 20 7c 7c 20 69 43 6f 6c 3e 30 78 66  ol<1 || iCol>0xf
add0: 66 66 66 20 29 7b 0a 20 20 20 20 20 20 20 20 72  fff ){.        r
ade0: 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65  esolveOutOfRange
adf0: 45 72 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54  Error(pParse, zT
ae00: 79 70 65 2c 20 69 2b 31 2c 20 6e 52 65 73 75 6c  ype, i+1, nResul
ae10: 74 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  t);.        retu
ae20: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
ae30: 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69      pItem->u.x.i
ae40: 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20 28 75 31  OrderByCol = (u1
ae50: 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20 20 63 6f  6)iCol;.      co
ae60: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d 0a 0a 20  ntinue;.    }.. 
ae70: 20 20 20 2f 2a 20 4f 74 68 65 72 77 69 73 65 2c     /* Otherwise,
ae80: 20 74 72 65 61 74 20 74 68 65 20 4f 52 44 45 52   treat the ORDER
ae90: 20 42 59 20 74 65 72 6d 20 61 73 20 61 6e 20 6f   BY term as an o
aea0: 72 64 69 6e 61 72 79 20 65 78 70 72 65 73 73 69  rdinary expressi
aeb0: 6f 6e 20 2a 2f 0a 20 20 20 20 70 49 74 65 6d 2d  on */.    pItem-
aec0: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
aed0: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71   = 0;.    if( sq
aee0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
aef0: 4e 61 6d 65 73 28 70 4e 43 2c 20 70 45 29 20 29  Names(pNC, pE) )
af00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  {.      return 1
af10: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28  ;.    }.    for(
af20: 6a 3d 30 3b 20 6a 3c 70 53 65 6c 65 63 74 2d 3e  j=0; j<pSelect->
af30: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
af40: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
af50: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
af60: 65 28 30 2c 20 70 45 2c 20 70 53 65 6c 65 63 74  e(0, pE, pSelect
af70: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  ->pEList->a[j].p
af80: 45 78 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a  Expr, -1)==0 ){.
af90: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
afa0: 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a 20  MIT_WINDOWFUNC. 
afb0: 20 20 20 20 20 20 20 69 66 28 20 45 78 70 72 48         if( ExprH
afc0: 61 73 50 72 6f 70 65 72 74 79 28 70 45 2c 20 45  asProperty(pE, E
afd0: 50 5f 57 69 6e 46 75 6e 63 29 20 29 7b 0a 20 20  P_WinFunc) ){.  
afe0: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65          /* Since
aff0: 20 74 68 69 73 20 77 69 6e 64 6f 77 20 66 75 6e   this window fun
b000: 63 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63  ction is being c
b010: 68 61 6e 67 65 64 20 69 6e 74 6f 20 61 20 72 65  hanged into a re
b020: 66 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20 20  ference.        
b030: 20 20 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d 65    ** to the same
b040: 20 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e   window function
b050: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c   the result set,
b060: 20 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 73 74   remove the inst
b070: 61 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a  ance.          *
b080: 2a 20 6f 66 20 74 68 69 73 20 77 69 6e 64 6f 77  * of this window
b090: 20 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74   function from t
b0a0: 68 65 20 53 65 6c 65 63 74 2e 70 57 69 6e 20 6c  he Select.pWin l
b0b0: 69 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  ist. */.        
b0c0: 20 20 57 69 6e 64 6f 77 20 2a 2a 70 70 3b 0a 20    Window **pp;. 
b0d0: 20 20 20 20 20 20 20 20 20 66 6f 72 28 70 70 3d           for(pp=
b0e0: 26 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 20  &pSelect->pWin; 
b0f0: 2a 70 70 3b 20 70 70 3d 26 28 2a 70 70 29 2d 3e  *pp; pp=&(*pp)->
b100: 70 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20  pNextWin){.     
b110: 20 20 20 20 20 20 20 69 66 28 20 2a 70 70 3d 3d         if( *pp==
b120: 70 45 2d 3e 79 2e 70 57 69 6e 20 29 7b 0a 20 20  pE->y.pWin ){.  
b130: 20 20 20 20 20 20 20 20 20 20 20 20 2a 70 70 20              *pp 
b140: 3d 20 28 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69  = (*pp)->pNextWi
b150: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d  n;.            }
b160: 20 20 20 20 0a 20 20 20 20 20 20 20 20 20 20 7d      .          }
b170: 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69  .        }.#endi
b180: 66 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d  f.        pItem-
b190: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
b1a0: 20 3d 20 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a   = j+1;.      }.
b1b0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
b1c0: 72 6e 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76  rn sqlite3Resolv
b1d0: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 70 50  eOrderGroupBy(pP
b1e0: 61 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70  arse, pSelect, p
b1f0: 4f 72 64 65 72 42 79 2c 20 7a 54 79 70 65 29 3b  OrderBy, zType);
b200: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
b210: 65 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 53  e names in the S
b220: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
b230: 70 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73  p and all of its
b240: 20 64 65 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f   descendants..*/
b250: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
b260: 6c 76 65 53 65 6c 65 63 74 53 74 65 70 28 57 61  lveSelectStep(Wa
b270: 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53  lker *pWalker, S
b280: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d  elect *p){.  Nam
b290: 65 43 6f 6e 74 65 78 74 20 2a 70 4f 75 74 65 72  eContext *pOuter
b2a0: 4e 43 3b 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20  NC;  /* Context 
b2b0: 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 74 68  that contains th
b2c0: 69 73 20 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e  is SELECT */.  N
b2d0: 61 6d 65 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20  ameContext sNC; 
b2e0: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63         /* Name c
b2f0: 6f 6e 74 65 78 74 20 6f 66 20 74 68 69 73 20 53  ontext of this S
b300: 45 4c 45 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69  ELECT */.  int i
b310: 73 43 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20  sCompound;      
b320: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 70 20     /* True if p 
b330: 69 73 20 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65  is a compound se
b340: 6c 65 63 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43  lect */.  int nC
b350: 6f 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20  ompound;        
b360: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
b370: 6f 6d 70 6f 75 6e 64 20 74 65 72 6d 73 20 70 72  ompound terms pr
b380: 6f 63 65 73 73 65 64 20 73 6f 20 66 61 72 20 2a  ocessed so far *
b390: 2f 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  /.  Parse *pPars
b3a0: 65 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e;          /* P
b3b0: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
b3c0: 2f 0a 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20  /.  int i;      
b3d0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
b3e0: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
b3f0: 20 45 78 70 72 4c 69 73 74 20 2a 70 47 72 6f 75   ExprList *pGrou
b400: 70 42 79 3b 20 20 20 20 20 2f 2a 20 54 68 65 20  pBy;     /* The 
b410: 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65 20  GROUP BY clause 
b420: 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 4c 65  */.  Select *pLe
b430: 66 74 6d 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20  ftmost;      /* 
b440: 4c 65 66 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c  Left-most of SEL
b450: 45 43 54 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  ECT of a compoun
b460: 64 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  d */.  sqlite3 *
b470: 64 62 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  db;            /
b480: 2a 20 44 61 74 61 62 61 73 65 20 63 6f 6e 6e 65  * Database conne
b490: 63 74 69 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61  ction */.  ..  a
b4a0: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
b4b0: 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73   if( p->selFlags
b4c0: 20 26 20 53 46 5f 52 65 73 6f 6c 76 65 64 20 29   & SF_Resolved )
b4d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
b4e0: 5f 50 72 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f  _Prune;.  }.  pO
b4f0: 75 74 65 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72  uterNC = pWalker
b500: 2d 3e 75 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73  ->u.pNC;.  pPars
b510: 65 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61  e = pWalker->pPa
b520: 72 73 65 3b 0a 20 20 64 62 20 3d 20 70 50 61 72  rse;.  db = pPar
b530: 73 65 2d 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f  se->db;..  /* No
b540: 72 6d 61 6c 6c 79 20 73 71 6c 69 74 65 33 53 65  rmally sqlite3Se
b550: 6c 65 63 74 45 78 70 61 6e 64 28 29 20 77 69 6c  lectExpand() wil
b560: 6c 20 62 65 20 63 61 6c 6c 65 64 20 66 69 72 73  l be called firs
b570: 74 20 61 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a  t and will have.
b580: 20 20 2a 2a 20 61 6c 72 65 61 64 79 20 65 78 70    ** already exp
b590: 61 6e 64 65 64 20 74 68 69 73 20 53 45 4c 45 43  anded this SELEC
b5a0: 54 2e 20 20 48 6f 77 65 76 65 72 2c 20 69 66 20  T.  However, if 
b5b0: 74 68 69 73 20 69 73 20 61 20 73 75 62 71 75 65  this is a subque
b5c0: 72 79 20 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61  ry within.  ** a
b5d0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 73 71  n expression, sq
b5e0: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
b5f0: 4e 61 6d 65 73 28 29 20 77 69 6c 6c 20 62 65 20  Names() will be 
b600: 63 61 6c 6c 65 64 20 77 69 74 68 6f 75 74 20 61  called without a
b610: 0a 20 20 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c  .  ** prior call
b620: 20 74 6f 20 73 71 6c 69 74 65 33 53 65 6c 65 63   to sqlite3Selec
b630: 74 45 78 70 61 6e 64 28 29 2e 20 20 57 68 65 6e  tExpand().  When
b640: 20 74 68 61 74 20 68 61 70 70 65 6e 73 2c 20 6c   that happens, l
b650: 65 74 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53  et.  ** sqlite3S
b660: 65 6c 65 63 74 50 72 65 70 28 29 20 64 6f 20 61  electPrep() do a
b670: 6c 6c 20 6f 66 20 74 68 65 20 70 72 6f 63 65 73  ll of the proces
b680: 73 69 6e 67 20 66 6f 72 20 74 68 69 73 20 53 45  sing for this SE
b690: 4c 45 43 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74  LECT..  ** sqlit
b6a0: 65 33 53 65 6c 65 63 74 50 72 65 70 28 29 20 77  e3SelectPrep() w
b6b0: 69 6c 6c 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20  ill invoke both 
b6c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78 70  sqlite3SelectExp
b6d0: 61 6e 64 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74  and() and.  ** t
b6e0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 6e 20 74  his routine in t
b6f0: 68 65 20 63 6f 72 72 65 63 74 20 6f 72 64 65 72  he correct order
b700: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d  ..  */.  if( (p-
b710: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  >selFlags & SF_E
b720: 78 70 61 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20  xpanded)==0 ){. 
b730: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
b740: 50 72 65 70 28 70 50 61 72 73 65 2c 20 70 2c 20  Prep(pParse, p, 
b750: 70 4f 75 74 65 72 4e 43 29 3b 0a 20 20 20 20 72  pOuterNC);.    r
b760: 65 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e  eturn (pParse->n
b770: 45 72 72 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  Err || db->mallo
b780: 63 46 61 69 6c 65 64 29 20 3f 20 57 52 43 5f 41  cFailed) ? WRC_A
b790: 62 6f 72 74 20 3a 20 57 52 43 5f 50 72 75 6e 65  bort : WRC_Prune
b7a0: 3b 0a 20 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f  ;.  }..  isCompo
b7b0: 75 6e 64 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21  und = p->pPrior!
b7c0: 3d 30 3b 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20  =0;.  nCompound 
b7d0: 3d 20 30 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74  = 0;.  pLeftmost
b7e0: 20 3d 20 70 3b 0a 20 20 77 68 69 6c 65 28 20 70   = p;.  while( p
b7f0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
b800: 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53  (p->selFlags & S
b810: 46 5f 45 78 70 61 6e 64 65 64 29 21 3d 30 20 29  F_Expanded)!=0 )
b820: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70  ;.    assert( (p
b830: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
b840: 52 65 73 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a  Resolved)==0 );.
b850: 20 20 20 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20      p->selFlags 
b860: 7c 3d 20 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a  |= SF_Resolved;.
b870: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
b880: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20  the expressions 
b890: 69 6e 20 74 68 65 20 4c 49 4d 49 54 20 61 6e 64  in the LIMIT and
b8a0: 20 4f 46 46 53 45 54 20 63 6c 61 75 73 65 73 2e   OFFSET clauses.
b8b0: 20 54 68 65 73 65 0a 20 20 20 20 2a 2a 20 61 72   These.    ** ar
b8c0: 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f  e not allowed to
b8d0: 20 72 65 66 65 72 20 74 6f 20 61 6e 79 20 6e 61   refer to any na
b8e0: 6d 65 73 2c 20 73 6f 20 70 61 73 73 20 61 6e 20  mes, so pass an 
b8f0: 65 6d 70 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78  empty NameContex
b900: 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65  t..    */.    me
b910: 6d 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69  mset(&sNC, 0, si
b920: 7a 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 20 20  zeof(sNC));.    
b930: 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61  sNC.pParse = pPa
b940: 72 73 65 3b 0a 20 20 20 20 73 4e 43 2e 70 57 69  rse;.    sNC.pWi
b950: 6e 53 65 6c 65 63 74 20 3d 20 70 3b 0a 20 20 20  nSelect = p;.   
b960: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
b970: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 26 73 4e  lveExprNames(&sN
b980: 43 2c 20 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b  C, p->pLimit) ){
b990: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
b9a0: 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a  C_Abort;.    }..
b9b0: 20 20 20 20 2f 2a 20 49 66 20 74 68 65 20 53 46      /* If the SF
b9c0: 5f 43 6f 6e 76 65 72 74 65 64 20 66 6c 61 67 73  _Converted flags
b9d0: 20 69 73 20 73 65 74 2c 20 74 68 65 6e 20 74 68   is set, then th
b9e0: 69 73 20 53 65 6c 65 63 74 20 6f 62 6a 65 63 74  is Select object
b9f0: 20 77 61 73 0a 20 20 20 20 2a 2a 20 77 61 73 20   was.    ** was 
ba00: 63 72 65 61 74 65 64 20 62 79 20 74 68 65 20 63  created by the c
ba10: 6f 6e 76 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65  onvertCompoundSe
ba20: 6c 65 63 74 54 6f 53 75 62 71 75 65 72 79 28 29  lectToSubquery()
ba30: 20 66 75 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a   function..    *
ba40: 2a 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 74  * In this case t
ba50: 68 65 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  he ORDER BY clau
ba60: 73 65 20 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  se (p->pOrderBy)
ba70: 20 73 68 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c   should be resol
ba80: 76 65 64 0a 20 20 20 20 2a 2a 20 61 73 20 69 66  ved.    ** as if
ba90: 20 69 74 20 77 65 72 65 20 70 61 72 74 20 6f 66   it were part of
baa0: 20 74 68 65 20 73 75 62 2d 71 75 65 72 79 2c 20   the sub-query, 
bab0: 6e 6f 74 20 74 68 65 20 70 61 72 65 6e 74 2e 20  not the parent. 
bac0: 54 68 69 73 20 62 6c 6f 63 6b 0a 20 20 20 20 2a  This block.    *
bad0: 2a 20 6d 6f 76 65 73 20 74 68 65 20 70 4f 72 64  * moves the pOrd
bae0: 65 72 42 79 20 64 6f 77 6e 20 74 6f 20 74 68 65  erBy down to the
baf0: 20 73 75 62 2d 71 75 65 72 79 2e 20 49 74 20 77   sub-query. It w
bb00: 69 6c 6c 20 62 65 20 6d 6f 76 65 64 20 62 61 63  ill be moved bac
bb10: 6b 0a 20 20 20 20 2a 2a 20 61 66 74 65 72 20 74  k.    ** after t
bb20: 68 65 20 6e 61 6d 65 73 20 68 61 76 65 20 62 65  he names have be
bb30: 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20 2a 2f  en resolved.  */
bb40: 0a 20 20 20 20 69 66 28 20 70 2d 3e 73 65 6c 46  .    if( p->selF
bb50: 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e 76 65 72  lags & SF_Conver
bb60: 74 65 64 20 29 7b 0a 20 20 20 20 20 20 53 65 6c  ted ){.      Sel
bb70: 65 63 74 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70  ect *pSub = p->p
bb80: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
bb90: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
bba0: 20 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d   p->pSrc->nSrc==
bbb0: 31 20 26 26 20 70 2d 3e 70 4f 72 64 65 72 42 79  1 && p->pOrderBy
bbc0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bbd0: 28 20 70 53 75 62 2d 3e 70 50 72 69 6f 72 20 26  ( pSub->pPrior &
bbe0: 26 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79  & pSub->pOrderBy
bbf0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 53 75  ==0 );.      pSu
bc00: 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 2d  b->pOrderBy = p-
bc10: 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20  >pOrderBy;.     
bc20: 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 30   p->pOrderBy = 0
bc30: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
bc40: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 72 65  * Recursively re
bc50: 73 6f 6c 76 65 20 6e 61 6d 65 73 20 69 6e 20 61  solve names in a
bc60: 6c 6c 20 73 75 62 71 75 65 72 69 65 73 0a 20 20  ll subqueries.  
bc70: 20 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30    */.    for(i=0
bc80: 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72  ; i<p->pSrc->nSr
bc90: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73  c; i++){.      s
bca0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
bcb0: 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e  em *pItem = &p->
bcc0: 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pSrc->a[i];.    
bcd0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 70 53 65    if( pItem->pSe
bce0: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
bcf0: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
bd00: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 55 73 65  ;         /* Use
bd10: 64 20 74 6f 20 69 74 65 72 61 74 65 20 6e 61 6d  d to iterate nam
bd20: 65 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20  e contexts */.  
bd30: 20 20 20 20 20 20 69 6e 74 20 6e 52 65 66 20 3d        int nRef =
bd40: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
bd50: 2f 2a 20 52 65 66 63 6f 75 6e 74 20 66 6f 72 20  /* Refcount for 
bd60: 70 4f 75 74 65 72 4e 43 20 61 6e 64 20 6f 75 74  pOuterNC and out
bd70: 65 72 20 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20  er contexts */. 
bd80: 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61         const cha
bd90: 72 20 2a 7a 53 61 76 65 64 43 6f 6e 74 65 78 74  r *zSavedContext
bda0: 20 3d 20 70 50 61 72 73 65 2d 3e 7a 41 75 74 68   = pParse->zAuth
bdb0: 43 6f 6e 74 65 78 74 3b 0a 0a 20 20 20 20 20 20  Context;..      
bdc0: 20 20 2f 2a 20 43 6f 75 6e 74 20 74 68 65 20 74    /* Count the t
bdd0: 6f 74 61 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72  otal number of r
bde0: 65 66 65 72 65 6e 63 65 73 20 74 6f 20 70 4f 75  eferences to pOu
bdf0: 74 65 72 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66  terNC and all of
be00: 20 69 74 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   its.        ** 
be10: 70 61 72 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e  parent contexts.
be20: 20 41 66 74 65 72 20 72 65 73 6f 6c 76 69 6e 67   After resolving
be30: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 65   references to e
be40: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20  xpressions in.  
be50: 20 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e        ** pItem->
be60: 70 53 65 6c 65 63 74 2c 20 63 68 65 63 6b 20 69  pSelect, check i
be70: 66 20 74 68 69 73 20 76 61 6c 75 65 20 68 61 73  f this value has
be80: 20 63 68 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c   changed. If so,
be90: 20 74 68 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a   then.        **
bea0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
beb0: 74 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  t pItem->pSelect
bec0: 20 6d 75 73 74 20 62 65 20 63 6f 72 72 65 6c 61   must be correla
bed0: 74 65 64 2e 20 53 65 74 20 74 68 65 0a 20 20 20  ted. Set the.   
bee0: 20 20 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66       ** pItem->f
bef0: 67 2e 69 73 43 6f 72 72 65 6c 61 74 65 64 20 66  g.isCorrelated f
bf00: 6c 61 67 20 69 66 20 74 68 69 73 20 69 73 20 74  lag if this is t
bf10: 68 65 20 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20  he case. */.    
bf20: 20 20 20 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74      for(pNC=pOut
bf30: 65 72 4e 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70  erNC; pNC; pNC=p
bf40: 4e 43 2d 3e 70 4e 65 78 74 29 20 6e 52 65 66 20  NC->pNext) nRef 
bf50: 2b 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20  += pNC->nRef;.. 
bf60: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
bf70: 2d 3e 7a 4e 61 6d 65 20 29 20 70 50 61 72 73 65  ->zName ) pParse
bf80: 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d  ->zAuthContext =
bf90: 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20   pItem->zName;. 
bfa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65         sqlite3Re
bfb0: 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
bfc0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
bfd0: 70 53 65 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e  pSelect, pOuterN
bfe0: 43 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72  C);.        pPar
bff0: 73 65 2d 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74  se->zAuthContext
c000: 20 3d 20 7a 53 61 76 65 64 43 6f 6e 74 65 78 74   = zSavedContext
c010: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 50  ;.        if( pP
c020: 61 72 73 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62  arse->nErr || db
c030: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
c040: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
c050: 74 3b 0a 0a 20 20 20 20 20 20 20 20 66 6f 72 28  t;..        for(
c060: 70 4e 43 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e  pNC=pOuterNC; pN
c070: 43 3b 20 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78  C; pNC=pNC->pNex
c080: 74 29 20 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e  t) nRef -= pNC->
c090: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 61 73  nRef;.        as
c0a0: 73 65 72 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e  sert( pItem->fg.
c0b0: 69 73 43 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20  isCorrelated==0 
c0c0: 26 26 20 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20  && nRef<=0 );.  
c0d0: 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e        pItem->fg.
c0e0: 69 73 43 6f 72 72 65 6c 61 74 65 64 20 3d 20 28  isCorrelated = (
c0f0: 6e 52 65 66 21 3d 30 29 3b 0a 20 20 20 20 20 20  nRef!=0);.      
c100: 7d 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  }.    }.  .    /
c110: 2a 20 53 65 74 20 75 70 20 74 68 65 20 6c 6f 63  * Set up the loc
c120: 61 6c 20 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20  al name-context 
c130: 74 6f 20 70 61 73 73 20 74 6f 20 73 71 6c 69 74  to pass to sqlit
c140: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
c150: 65 73 28 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72  es() to.    ** r
c160: 65 73 6f 6c 76 65 20 74 68 65 20 72 65 73 75 6c  esolve the resul
c170: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
c180: 20 6c 69 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20   list..    */.  
c190: 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20    sNC.ncFlags = 
c1a0: 4e 43 5f 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 41  NC_AllowAgg|NC_A
c1b0: 6c 6c 6f 77 57 69 6e 3b 0a 20 20 20 20 73 4e 43  llowWin;.    sNC
c1c0: 2e 70 53 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70  .pSrcList = p->p
c1d0: 53 72 63 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65  Src;.    sNC.pNe
c1e0: 78 74 20 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20  xt = pOuterNC;. 
c1f0: 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65   .    /* Resolve
c200: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 72 65   names in the re
c210: 73 75 6c 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20  sult set. */.   
c220: 20 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f   if( sqlite3Reso
c230: 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d 65 73  lveExprListNames
c240: 28 26 73 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74  (&sNC, p->pEList
c250: 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41  ) ) return WRC_A
c260: 62 6f 72 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63  bort;.    sNC.nc
c270: 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c  Flags &= ~NC_All
c280: 6f 77 57 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a  owWin;.  .    /*
c290: 20 49 66 20 74 68 65 72 65 20 61 72 65 20 6e 6f   If there are no
c2a0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
c2b0: 69 6f 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  ions in the resu
c2c0: 6c 74 2d 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47  lt-set, and no G
c2d0: 52 4f 55 50 20 42 59 20 0a 20 20 20 20 2a 2a 20  ROUP BY .    ** 
c2e0: 65 78 70 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e  expression, do n
c2f0: 6f 74 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61  ot allow aggrega
c300: 74 65 73 20 69 6e 20 61 6e 79 20 6f 66 20 74 68  tes in any of th
c310: 65 20 6f 74 68 65 72 20 65 78 70 72 65 73 73 69  e other expressi
c320: 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ons..    */.    
c330: 61 73 73 65 72 74 28 20 28 70 2d 3e 73 65 6c 46  assert( (p->selF
c340: 6c 61 67 73 20 26 20 53 46 5f 41 67 67 72 65 67  lags & SF_Aggreg
c350: 61 74 65 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70  ate)==0 );.    p
c360: 47 72 6f 75 70 42 79 20 3d 20 70 2d 3e 70 47 72  GroupBy = p->pGr
c370: 6f 75 70 42 79 3b 0a 20 20 20 20 69 66 28 20 70  oupBy;.    if( p
c380: 47 72 6f 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e  GroupBy || (sNC.
c390: 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 48 61 73  ncFlags & NC_Has
c3a0: 41 67 67 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  Agg)!=0 ){.     
c3b0: 20 61 73 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d   assert( NC_MinM
c3c0: 61 78 41 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78  axAgg==SF_MinMax
c3d0: 41 67 67 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e  Agg );.      p->
c3e0: 73 65 6c 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41  selFlags |= SF_A
c3f0: 67 67 72 65 67 61 74 65 20 7c 20 28 73 4e 43 2e  ggregate | (sNC.
c400: 6e 63 46 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61  ncFlags&NC_MinMa
c410: 78 41 67 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65  xAgg);.    }else
c420: 7b 0a 20 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c  {.      sNC.ncFl
c430: 61 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77  ags &= ~NC_Allow
c440: 41 67 67 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  Agg;.    }.  .  
c450: 20 20 2f 2a 20 49 66 20 61 20 48 41 56 49 4e 47    /* If a HAVING
c460: 20 63 6c 61 75 73 65 20 69 73 20 70 72 65 73 65   clause is prese
c470: 6e 74 2c 20 74 68 65 6e 20 74 68 65 72 65 20 6d  nt, then there m
c480: 75 73 74 20 62 65 20 61 20 47 52 4f 55 50 20 42  ust be a GROUP B
c490: 59 20 63 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f  Y clause..    */
c4a0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 48 61 76  .    if( p->pHav
c4b0: 69 6e 67 20 26 26 20 21 70 47 72 6f 75 70 42 79  ing && !pGroupBy
c4c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
c4d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
c4e0: 2c 20 22 61 20 47 52 4f 55 50 20 42 59 20 63 6c  , "a GROUP BY cl
c4f0: 61 75 73 65 20 69 73 20 72 65 71 75 69 72 65 64  ause is required
c500: 20 62 65 66 6f 72 65 20 48 41 56 49 4e 47 22 29   before HAVING")
c510: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  ;.      return W
c520: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
c530: 20 20 0a 20 20 20 20 2f 2a 20 41 64 64 20 74 68    .    /* Add th
c540: 65 20 6f 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20  e output column 
c550: 6c 69 73 74 20 74 6f 20 74 68 65 20 6e 61 6d 65  list to the name
c560: 2d 63 6f 6e 74 65 78 74 20 62 65 66 6f 72 65 20  -context before 
c570: 70 61 72 73 69 6e 67 20 74 68 65 0a 20 20 20 20  parsing the.    
c580: 2a 2a 20 6f 74 68 65 72 20 65 78 70 72 65 73 73  ** other express
c590: 69 6f 6e 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ions in the SELE
c5a0: 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20 54 68  CT statement. Th
c5b0: 69 73 20 69 73 20 73 6f 20 74 68 61 74 0a 20 20  is is so that.  
c5c0: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73    ** expressions
c5d0: 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c   in the WHERE cl
c5e0: 61 75 73 65 20 28 65 74 63 2e 29 20 63 61 6e 20  ause (etc.) can 
c5f0: 72 65 66 65 72 20 74 6f 20 65 78 70 72 65 73 73  refer to express
c600: 69 6f 6e 73 20 62 79 0a 20 20 20 20 2a 2a 20 61  ions by.    ** a
c610: 6c 69 61 73 65 73 20 69 6e 20 74 68 65 20 72 65  liases in the re
c620: 73 75 6c 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a  sult set..    **
c630: 0a 20 20 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f  .    ** Minor po
c640: 69 6e 74 3a 20 49 66 20 74 68 69 73 20 69 73 20  int: If this is 
c650: 74 68 65 20 63 61 73 65 2c 20 74 68 65 6e 20 74  the case, then t
c660: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69  he expression wi
c670: 6c 6c 20 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d  ll be.    ** re-
c680: 65 76 61 6c 75 61 74 65 64 20 66 6f 72 20 65 61  evaluated for ea
c690: 63 68 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20  ch reference to 
c6a0: 69 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61  it..    */.    a
c6b0: 73 73 65 72 74 28 20 28 73 4e 43 2e 6e 63 46 6c  ssert( (sNC.ncFl
c6c0: 61 67 73 20 26 20 28 4e 43 5f 55 41 67 67 49 6e  ags & (NC_UAggIn
c6d0: 66 6f 7c 4e 43 5f 55 55 70 73 65 72 74 29 29 3d  fo|NC_UUpsert))=
c6e0: 3d 30 20 29 3b 0a 20 20 20 20 73 4e 43 2e 75 4e  =0 );.    sNC.uN
c6f0: 43 2e 70 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45  C.pEList = p->pE
c700: 4c 69 73 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63  List;.    sNC.nc
c710: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 55 45 4c 69  Flags |= NC_UELi
c720: 73 74 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69  st;.    if( sqli
c730: 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61  te3ResolveExprNa
c740: 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61  mes(&sNC, p->pHa
c750: 76 69 6e 67 29 20 29 20 72 65 74 75 72 6e 20 57  ving) ) return W
c760: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 69 66  RC_Abort;.    if
c770: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
c780: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
c790: 70 2d 3e 70 57 68 65 72 65 29 20 29 20 72 65 74  p->pWhere) ) ret
c7a0: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a  urn WRC_Abort;..
c7b0: 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e      /* Resolve n
c7c0: 61 6d 65 73 20 69 6e 20 74 61 62 6c 65 2d 76 61  ames in table-va
c7d0: 6c 75 65 64 2d 66 75 6e 63 74 69 6f 6e 20 61 72  lued-function ar
c7e0: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66  guments */.    f
c7f0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72  or(i=0; i<p->pSr
c800: 63 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  c->nSrc; i++){. 
c810: 20 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c       struct SrcL
c820: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20  ist_item *pItem 
c830: 3d 20 26 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d  = &p->pSrc->a[i]
c840: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65  ;.      if( pIte
c850: 6d 2d 3e 66 67 2e 69 73 54 61 62 46 75 6e 63 0a  m->fg.isTabFunc.
c860: 20 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65         && sqlite
c870: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
c880: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 49 74 65  Names(&sNC, pIte
c890: 6d 2d 3e 75 31 2e 70 46 75 6e 63 41 72 67 29 20  m->u1.pFuncArg) 
c8a0: 0a 20 20 20 20 20 20 29 7b 0a 20 20 20 20 20 20  .      ){.      
c8b0: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
c8c0: 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  rt;.      }.    
c8d0: 7d 0a 0a 20 20 20 20 2f 2a 20 54 68 65 20 4f 52  }..    /* The OR
c8e0: 44 45 52 20 42 59 20 61 6e 64 20 47 52 4f 55 50  DER BY and GROUP
c8f0: 20 42 59 20 63 6c 61 75 73 65 73 20 6d 61 79 20   BY clauses may 
c900: 6e 6f 74 20 72 65 66 65 72 20 74 6f 20 74 65 72  not refer to ter
c910: 6d 73 20 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74  ms in.    ** out
c920: 65 72 20 71 75 65 72 69 65 73 20 0a 20 20 20 20  er queries .    
c930: 2a 2f 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74  */.    sNC.pNext
c940: 20 3d 20 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63   = 0;.    sNC.nc
c950: 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f  Flags |= NC_Allo
c960: 77 41 67 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e  wAgg|NC_AllowWin
c970: 3b 0a 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 69  ;..    /* If thi
c980: 73 20 69 73 20 61 20 63 6f 6e 76 65 72 74 65 64  s is a converted
c990: 20 63 6f 6d 70 6f 75 6e 64 20 71 75 65 72 79 2c   compound query,
c9a0: 20 6d 6f 76 65 20 74 68 65 20 4f 52 44 45 52 20   move the ORDER 
c9b0: 42 59 20 63 6c 61 75 73 65 20 66 72 6f 6d 20 0a  BY clause from .
c9c0: 20 20 20 20 2a 2a 20 74 68 65 20 73 75 62 2d 71      ** the sub-q
c9d0: 75 65 72 79 20 62 61 63 6b 20 74 6f 20 74 68 65  uery back to the
c9e0: 20 70 61 72 65 6e 74 20 71 75 65 72 79 2e 20 41   parent query. A
c9f0: 74 20 74 68 69 73 20 70 6f 69 6e 74 20 65 61 63  t this point eac
ca00: 68 20 74 65 72 6d 0a 20 20 20 20 2a 2a 20 77 69  h term.    ** wi
ca10: 74 68 69 6e 20 74 68 65 20 4f 52 44 45 52 20 42  thin the ORDER B
ca20: 59 20 63 6c 61 75 73 65 20 68 61 73 20 62 65 65  Y clause has bee
ca30: 6e 20 74 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f  n transformed to
ca40: 20 61 6e 20 69 6e 74 65 67 65 72 20 76 61 6c 75   an integer valu
ca50: 65 2e 0a 20 20 20 20 2a 2a 20 54 68 65 73 65 20  e..    ** These 
ca60: 69 6e 74 65 67 65 72 73 20 77 69 6c 6c 20 62 65  integers will be
ca70: 20 72 65 70 6c 61 63 65 64 20 62 79 20 63 6f 70   replaced by cop
ca80: 69 65 73 20 6f 66 20 74 68 65 20 63 6f 72 72 65  ies of the corre
ca90: 73 70 6f 6e 64 69 6e 67 20 72 65 73 75 6c 74 0a  sponding result.
caa0: 20 20 20 20 2a 2a 20 73 65 74 20 65 78 70 72 65      ** set expre
cab0: 73 73 69 6f 6e 73 20 62 79 20 74 68 65 20 63 61  ssions by the ca
cac0: 6c 6c 20 74 6f 20 72 65 73 6f 6c 76 65 4f 72 64  ll to resolveOrd
cad0: 65 72 47 72 6f 75 70 42 79 28 29 20 62 65 6c 6f  erGroupBy() belo
cae0: 77 2e 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70  w.  */.    if( p
caf0: 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f  ->selFlags & SF_
cb00: 43 6f 6e 76 65 72 74 65 64 20 29 7b 0a 20 20 20  Converted ){.   
cb10: 20 20 20 53 65 6c 65 63 74 20 2a 70 53 75 62 20     Select *pSub 
cb20: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
cb30: 70 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 70  pSelect;.      p
cb40: 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20 70 53 75  ->pOrderBy = pSu
cb50: 62 2d 3e 70 4f 72 64 65 72 42 79 3b 0a 20 20 20  b->pOrderBy;.   
cb60: 20 20 20 70 53 75 62 2d 3e 70 4f 72 64 65 72 42     pSub->pOrderB
cb70: 79 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20  y = 0;.    }..  
cb80: 20 20 2f 2a 20 50 72 6f 63 65 73 73 20 74 68 65    /* Process the
cb90: 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65   ORDER BY clause
cba0: 20 66 6f 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53   for singleton S
cbb0: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 73  ELECT statements
cbc0: 2e 0a 20 20 20 20 2a 2a 20 54 68 65 20 4f 52 44  ..    ** The ORD
cbd0: 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f 72  ER BY clause for
cbe0: 20 63 6f 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43   compounds SELEC
cbf0: 54 20 73 74 61 74 65 6d 65 6e 74 73 20 69 73 20  T statements is 
cc00: 68 61 6e 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62  handled.    ** b
cc10: 65 6c 6f 77 2c 20 61 66 74 65 72 20 61 6c 6c 20  elow, after all 
cc20: 6f 66 20 74 68 65 20 72 65 73 75 6c 74 2d 73 65  of the result-se
cc30: 74 73 20 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68  ts for all of th
cc40: 65 20 65 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20  e elements of.  
cc50: 20 20 2a 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e    ** the compoun
cc60: 64 20 68 61 76 65 20 62 65 65 6e 20 72 65 73 6f  d have been reso
cc70: 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20  lved..    **.   
cc80: 20 2a 2a 20 49 66 20 74 68 65 72 65 20 69 73 20   ** If there is 
cc90: 61 6e 20 4f 52 44 45 52 20 42 59 20 63 6c 61 75  an ORDER BY clau
cca0: 73 65 20 6f 6e 20 61 20 74 65 72 6d 20 6f 66 20  se on a term of 
ccb0: 61 20 63 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63  a compound-selec
ccc0: 74 20 6f 74 68 65 72 0a 20 20 20 20 2a 2a 20 74  t other.    ** t
ccd0: 68 61 6e 20 74 68 65 20 72 69 67 68 74 2d 6d 6f  han the right-mo
cce0: 73 74 20 74 65 72 6d 2c 20 74 68 65 6e 20 74 68  st term, then th
ccf0: 61 74 20 69 73 20 61 20 73 79 6e 74 61 78 20 65  at is a syntax e
cd00: 72 72 6f 72 2e 20 20 42 75 74 20 74 68 65 20 65  rror.  But the e
cd10: 72 72 6f 72 0a 20 20 20 20 2a 2a 20 69 73 20 6e  rror.    ** is n
cd20: 6f 74 20 64 65 74 65 63 74 65 64 20 75 6e 74 69  ot detected unti
cd30: 6c 20 6d 75 63 68 20 6c 61 74 65 72 2c 20 61 6e  l much later, an
cd40: 64 20 73 6f 20 77 65 20 6e 65 65 64 20 74 6f 20  d so we need to 
cd50: 67 6f 20 61 68 65 61 64 20 61 6e 64 0a 20 20 20  go ahead and.   
cd60: 20 2a 2a 20 72 65 73 6f 6c 76 65 20 74 68 6f 73   ** resolve thos
cd70: 65 20 73 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65  e symbols on the
cd80: 20 69 6e 63 6f 72 72 65 63 74 20 4f 52 44 45 52   incorrect ORDER
cd90: 20 42 59 20 66 6f 72 20 63 6f 6e 73 69 73 74 65   BY for consiste
cda0: 6e 63 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ncy..    */.    
cdb0: 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64 3c 3d  if( isCompound<=
cdc0: 6e 43 6f 6d 70 6f 75 6e 64 20 20 2f 2a 20 44 65  nCompound  /* De
cdd0: 66 65 72 20 72 69 67 68 74 2d 6d 6f 73 74 20 4f  fer right-most O
cde0: 52 44 45 52 20 42 59 20 6f 66 20 61 20 63 6f 6d  RDER BY of a com
cdf0: 70 6f 75 6e 64 20 2a 2f 0a 20 20 20 20 20 26 26  pound */.     &&
ce00: 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f   resolveOrderGro
ce10: 75 70 42 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d  upBy(&sNC, p, p-
ce20: 3e 70 4f 72 64 65 72 42 79 2c 20 22 4f 52 44 45  >pOrderBy, "ORDE
ce30: 52 22 29 0a 20 20 20 20 29 7b 0a 20 20 20 20 20  R").    ){.     
ce40: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
ce50: 74 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28  t;.    }.    if(
ce60: 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65   db->mallocFaile
ce70: 64 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  d ){.      retur
ce80: 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20  n WRC_Abort;.   
ce90: 20 7d 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61   }.    sNC.ncFla
cea0: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57  gs &= ~NC_AllowW
ceb0: 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65  in;.  .    /* Re
cec0: 73 6f 6c 76 65 20 74 68 65 20 47 52 4f 55 50 20  solve the GROUP 
ced0: 42 59 20 63 6c 61 75 73 65 2e 20 20 41 74 20 74  BY clause.  At t
cee0: 68 65 20 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61  he same time, ma
cef0: 6b 65 20 73 75 72 65 20 0a 20 20 20 20 2a 2a 20  ke sure .    ** 
cf00: 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c 61  the GROUP BY cla
cf10: 75 73 65 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e  use does not con
cf20: 74 61 69 6e 20 61 67 67 72 65 67 61 74 65 20 66  tain aggregate f
cf30: 75 6e 63 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f  unctions..    */
cf40: 0a 20 20 20 20 69 66 28 20 70 47 72 6f 75 70 42  .    if( pGroupB
cf50: 79 20 29 7b 0a 20 20 20 20 20 20 73 74 72 75 63  y ){.      struc
cf60: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
cf70: 2a 70 49 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20  *pItem;.    .   
cf80: 20 20 20 69 66 28 20 72 65 73 6f 6c 76 65 4f 72     if( resolveOr
cf90: 64 65 72 47 72 6f 75 70 42 79 28 26 73 4e 43 2c  derGroupBy(&sNC,
cfa0: 20 70 2c 20 70 47 72 6f 75 70 42 79 2c 20 22 47   p, pGroupBy, "G
cfb0: 52 4f 55 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61  ROUP") || db->ma
cfc0: 6c 6c 6f 63 46 61 69 6c 65 64 20 29 7b 0a 20 20  llocFailed ){.  
cfd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
cfe0: 5f 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a  _Abort;.      }.
cff0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70        for(i=0, p
d000: 49 74 65 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61  Item=pGroupBy->a
d010: 3b 20 69 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45  ; i<pGroupBy->nE
d020: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
d030: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
d040: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
d050: 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50  pItem->pExpr, EP
d060: 5f 41 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20  _Agg) ){.       
d070: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
d080: 73 67 28 70 50 61 72 73 65 2c 20 22 61 67 67 72  sg(pParse, "aggr
d090: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
d0a0: 61 72 65 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20  are not allowed 
d0b0: 69 6e 20 22 0a 20 20 20 20 20 20 20 20 20 20 20  in ".           
d0c0: 20 20 20 22 74 68 65 20 47 52 4f 55 50 20 42 59     "the GROUP BY
d0d0: 20 63 6c 61 75 73 65 22 29 3b 0a 20 20 20 20 20   clause");.     
d0e0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
d0f0: 41 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 7d  Abort;.        }
d100: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
d110: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
d120: 73 20 70 61 72 74 20 6f 66 20 61 20 63 6f 6d 70  s part of a comp
d130: 6f 75 6e 64 20 53 45 4c 45 43 54 2c 20 63 68 65  ound SELECT, che
d140: 63 6b 20 74 68 61 74 20 69 74 20 68 61 73 20 74  ck that it has t
d150: 68 65 20 72 69 67 68 74 0a 20 20 20 20 2a 2a 20  he right.    ** 
d160: 6e 75 6d 62 65 72 20 6f 66 20 65 78 70 72 65 73  number of expres
d170: 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 73 65 6c  sions in the sel
d180: 65 63 74 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20  ect list. */.   
d190: 20 69 66 28 20 70 2d 3e 70 4e 65 78 74 20 26 26   if( p->pNext &&
d1a0: 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70   p->pEList->nExp
d1b0: 72 21 3d 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c  r!=p->pNext->pEL
d1c0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
d1d0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
d1e0: 74 57 72 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72  tWrongNumTermsEr
d1f0: 72 6f 72 28 70 50 61 72 73 65 2c 20 70 2d 3e 70  ror(pParse, p->p
d200: 4e 65 78 74 29 3b 0a 20 20 20 20 20 20 72 65 74  Next);.      ret
d210: 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20  urn WRC_Abort;. 
d220: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
d230: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
d240: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d   term of the com
d250: 70 6f 75 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20  pound.    */.   
d260: 20 70 20 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a   p = p->pPrior;.
d270: 20 20 20 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b      nCompound++;
d280: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c  .  }..  /* Resol
d290: 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ve the ORDER BY 
d2a0: 6f 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  on a compound SE
d2b0: 4c 45 43 54 20 61 66 74 65 72 20 61 6c 6c 20 74  LECT after all t
d2c0: 65 72 6d 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65  erms of.  ** the
d2d0: 20 63 6f 6d 70 6f 75 6e 64 20 68 61 76 65 20 62   compound have b
d2e0: 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20  een resolved..  
d2f0: 2a 2f 0a 20 20 69 66 28 20 69 73 43 6f 6d 70 6f  */.  if( isCompo
d300: 75 6e 64 20 26 26 20 72 65 73 6f 6c 76 65 43 6f  und && resolveCo
d310: 6d 70 6f 75 6e 64 4f 72 64 65 72 42 79 28 70 50  mpoundOrderBy(pP
d320: 61 72 73 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29  arse, pLeftmost)
d330: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57   ){.    return W
d340: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20  RC_Abort;.  }.. 
d350: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
d360: 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  e;.}../*.** This
d370: 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61   routine walks a
d380: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
d390: 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72  e and resolves r
d3a0: 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20  eferences to.** 
d3b0: 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e  table columns an
d3c0: 64 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  d result-set col
d3d0: 75 6d 6e 73 2e 20 20 41 74 20 74 68 65 20 73 61  umns.  At the sa
d3e0: 6d 65 20 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f  me time, do erro
d3f0: 72 0a 2a 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e  r.** checking on
d400: 20 66 75 6e 63 74 69 6f 6e 20 75 73 61 67 65 20   function usage 
d410: 61 6e 64 20 73 65 74 20 61 20 66 6c 61 67 20 69  and set a flag i
d420: 66 20 61 6e 79 20 61 67 67 72 65 67 61 74 65 20  f any aggregate 
d430: 66 75 6e 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65  functions.** are
d440: 20 73 65 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20   seen..**.** To 
d450: 72 65 73 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f  resolve table co
d460: 6c 75 6d 6e 73 20 72 65 66 65 72 65 6e 63 65 73  lumns references
d470: 20 77 65 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64   we look for nod
d480: 65 73 20 28 6f 72 20 73 75 62 74 72 65 65 73 29  es (or subtrees)
d490: 20 6f 66 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d   of the .** form
d4a0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72   X.Y.Z or Y.Z or
d4b0: 20 6a 75 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a   just Z where.**
d4c0: 0a 2a 2a 20 20 20 20 20 20 58 3a 20 20 20 54 68  .**      X:   Th
d4d0: 65 20 6e 61 6d 65 20 6f 66 20 61 20 64 61 74 61  e name of a data
d4e0: 62 61 73 65 2e 20 20 45 78 3a 20 20 22 6d 61 69  base.  Ex:  "mai
d4f0: 6e 22 20 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a  n" or "temp" or.
d500: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 74 68 65  **           the
d510: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61   symbolic name a
d520: 73 73 69 67 6e 65 64 20 74 6f 20 61 6e 20 41 54  ssigned to an AT
d530: 54 41 43 48 2d 65 64 20 64 61 74 61 62 61 73 65  TACH-ed database
d540: 2e 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20  ..**.**      Y: 
d550: 20 20 54 68 65 20 6e 61 6d 65 20 6f 66 20 61 20    The name of a 
d560: 74 61 62 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20  table in a FROM 
d570: 63 6c 61 75 73 65 2e 20 20 4f 72 20 69 6e 20 61  clause.  Or in a
d580: 20 74 72 69 67 67 65 72 0a 2a 2a 20 20 20 20 20   trigger.**     
d590: 20 20 20 20 20 20 6f 6e 65 20 6f 66 20 74 68 65        one of the
d5a0: 20 73 70 65 63 69 61 6c 20 6e 61 6d 65 73 20 22   special names "
d5b0: 6f 6c 64 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a  old" or "new"..*
d5c0: 2a 0a 2a 2a 20 20 20 20 20 20 5a 3a 20 20 20 54  *.**      Z:   T
d5d0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
d5e0: 75 6d 6e 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a  umn in table Y..
d5f0: 2a 2a 0a 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61  **.** The node a
d600: 74 20 74 68 65 20 72 6f 6f 74 20 6f 66 20 74 68  t the root of th
d610: 65 20 73 75 62 74 72 65 65 20 69 73 20 6d 6f 64  e subtree is mod
d620: 69 66 69 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  ified as follows
d630: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e  :.**.**    Expr.
d640: 6f 70 20 20 20 20 20 20 20 20 43 68 61 6e 67 65  op        Change
d650: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a  d to TK_COLUMN.*
d660: 2a 20 20 20 20 45 78 70 72 2e 70 54 61 62 20 20  *    Expr.pTab  
d670: 20 20 20 20 50 6f 69 6e 74 73 20 74 6f 20 74 68      Points to th
d680: 65 20 54 61 62 6c 65 20 6f 62 6a 65 63 74 20 66  e Table object f
d690: 6f 72 20 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70  or X.Y.**    Exp
d6a0: 72 2e 69 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20  r.iColumn   The 
d6b0: 63 6f 6c 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20  column index in 
d6c0: 58 2e 59 2e 20 20 2d 31 20 66 6f 72 20 74 68 65  X.Y.  -1 for the
d6d0: 20 72 6f 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78   rowid..**    Ex
d6e0: 70 72 2e 69 54 61 62 6c 65 20 20 20 20 54 68 65  pr.iTable    The
d6f0: 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d   VDBE cursor num
d700: 62 65 72 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a  ber for X.Y.**.*
d710: 2a 0a 2a 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20  *.** To resolve 
d720: 72 65 73 75 6c 74 2d 73 65 74 20 72 65 66 65 72  result-set refer
d730: 65 6e 63 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20  ences, look for 
d740: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73  expression nodes
d750: 20 6f 66 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20   of the.** form 
d760: 5a 20 28 77 69 74 68 20 6e 6f 20 58 20 61 6e 64  Z (with no X and
d770: 20 59 20 70 72 65 66 69 78 29 20 77 68 65 72 65   Y prefix) where
d780: 20 74 68 65 20 5a 20 6d 61 74 63 68 65 73 20 74   the Z matches t
d790: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a  he right-hand.**
d7a0: 20 73 69 7a 65 20 6f 66 20 61 6e 20 41 53 20 63   size of an AS c
d7b0: 6c 61 75 73 65 20 69 6e 20 74 68 65 20 72 65 73  lause in the res
d7c0: 75 6c 74 2d 73 65 74 20 6f 66 20 61 20 53 45 4c  ult-set of a SEL
d7d0: 45 43 54 2e 20 20 54 68 65 20 5a 20 65 78 70 72  ECT.  The Z expr
d7e0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70  ession.** is rep
d7f0: 6c 61 63 65 64 20 62 79 20 61 20 63 6f 70 79 20  laced by a copy 
d800: 6f 66 20 74 68 65 20 6c 65 66 74 2d 68 61 6e 64  of the left-hand
d810: 20 73 69 64 65 20 6f 66 20 74 68 65 20 72 65 73   side of the res
d820: 75 6c 74 2d 73 65 74 20 65 78 70 72 65 73 73 69  ult-set expressi
d830: 6f 6e 2e 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d  on..** Table-nam
d840: 65 20 61 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72  e and function r
d850: 65 73 6f 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73  esolution occurs
d860: 20 6f 6e 20 74 68 65 20 73 75 62 73 74 69 74 75   on the substitu
d870: 74 65 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  ted expression.*
d880: 2a 20 74 72 65 65 2e 20 20 46 6f 72 20 65 78 61  * tree.  For exa
d890: 6d 70 6c 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20  mple, in:.**.** 
d8a0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
d8b0: 41 53 20 78 2c 20 63 2b 64 20 41 53 20 79 20 46  AS x, c+d AS y F
d8c0: 52 4f 4d 20 74 31 20 4f 52 44 45 52 20 42 59 20  ROM t1 ORDER BY 
d8d0: 78 3b 0a 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22  x;.**.** The "x"
d8e0: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 6f 72 64   term of the ord
d8f0: 65 72 20 62 79 20 69 73 20 72 65 70 6c 61 63 65  er by is replace
d900: 64 20 62 79 20 22 61 2b 62 22 20 74 6f 20 72 65  d by "a+b" to re
d910: 6e 64 65 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  nder:.**.**     
d920: 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78   SELECT a+b AS x
d930: 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d 20  , c+d AS y FROM 
d940: 74 31 20 4f 52 44 45 52 20 42 59 20 61 2b 62 3b  t1 ORDER BY a+b;
d950: 0a 2a 2a 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20  .**.** Function 
d960: 63 61 6c 6c 73 20 61 72 65 20 63 68 65 63 6b 65  calls are checke
d970: 64 20 74 6f 20 6d 61 6b 65 20 73 75 72 65 20 74  d to make sure t
d980: 68 61 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  hat the function
d990: 20 69 73 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20   is .** defined 
d9a0: 61 6e 64 20 74 68 61 74 20 74 68 65 20 63 6f 72  and that the cor
d9b0: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
d9c0: 72 67 75 6d 65 6e 74 73 20 61 72 65 20 73 70 65  rguments are spe
d9d0: 63 69 66 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68  cified..** If th
d9e0: 65 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e  e function is an
d9f0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
da00: 69 6f 6e 2c 20 74 68 65 6e 20 74 68 65 20 4e 43  ion, then the NC
da10: 5f 48 61 73 41 67 67 20 66 6c 61 67 20 69 73 0a  _HasAgg flag is.
da20: 2a 2a 20 73 65 74 20 61 6e 64 20 74 68 65 20 6f  ** set and the o
da30: 70 63 6f 64 65 20 69 73 20 63 68 61 6e 67 65 64  pcode is changed
da40: 20 66 72 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f   from TK_FUNCTIO
da50: 4e 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43  N to TK_AGG_FUNC
da60: 54 49 4f 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65  TION..** If an e
da70: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
da80: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
da90: 63 74 69 6f 6e 73 20 74 68 65 6e 20 74 68 65 20  ctions then the 
daa0: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
dab0: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
dac0: 73 69 6f 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a  sion is set..**.
dad0: 2a 2a 20 41 6e 20 65 72 72 6f 72 20 6d 65 73 73  ** An error mess
dae0: 61 67 65 20 69 73 20 6c 65 66 74 20 69 6e 20 70  age is left in p
daf0: 50 61 72 73 65 20 69 66 20 61 6e 79 74 68 69 6e  Parse if anythin
db00: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 54 68 65  g is amiss.  The
db10: 20 6e 75 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72   number.** if er
db20: 72 6f 72 73 20 69 73 20 72 65 74 75 72 6e 65 64  rors is returned
db30: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
db40: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
db50: 28 20 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  ( .  NameContext
db60: 20 2a 70 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20   *pNC,       /* 
db70: 4e 61 6d 65 73 70 61 63 65 20 74 6f 20 72 65 73  Namespace to res
db80: 6f 6c 76 65 20 65 78 70 72 65 73 73 69 6f 6e 73  olve expressions
db90: 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a   in. */.  Expr *
dba0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20  pExpr           
dbb0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
dbc0: 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a  ion to be analyz
dbd0: 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20  ed. */.){.  u16 
dbe0: 73 61 76 65 64 48 61 73 41 67 67 3b 0a 20 20 57  savedHasAgg;.  W
dbf0: 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 69 66 28 20  alker w;..  if( 
dc00: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
dc10: 6e 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73  n SQLITE_OK;.  s
dc20: 61 76 65 64 48 61 73 41 67 67 20 3d 20 70 4e 43  avedHasAgg = pNC
dc30: 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28 4e 43 5f  ->ncFlags & (NC_
dc40: 48 61 73 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78  HasAgg|NC_MinMax
dc50: 41 67 67 29 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46  Agg);.  pNC->ncF
dc60: 6c 61 67 73 20 26 3d 20 7e 28 4e 43 5f 48 61 73  lags &= ~(NC_Has
dc70: 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67  Agg|NC_MinMaxAgg
dc80: 29 3b 0a 20 20 77 2e 70 50 61 72 73 65 20 3d 20  );.  w.pParse = 
dc90: 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77  pNC->pParse;.  w
dca0: 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d  .xExprCallback =
dcb0: 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70   resolveExprStep
dcc0: 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c  ;.  w.xSelectCal
dcd0: 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53  lback = resolveS
dce0: 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77 2e 78  electStep;.  w.x
dcf0: 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b 32 20  SelectCallback2 
dd00: 3d 20 30 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d  = 0;.  w.u.pNC =
dd10: 20 70 4e 43 3b 0a 23 69 66 20 53 51 4c 49 54 45   pNC;.#if SQLITE
dd20: 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e  _MAX_EXPR_DEPTH>
dd30: 30 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48  0.  w.pParse->nH
dd40: 65 69 67 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e  eight += pExpr->
dd50: 6e 48 65 69 67 68 74 3b 0a 20 20 69 66 28 20 73  nHeight;.  if( s
dd60: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 48  qlite3ExprCheckH
dd70: 65 69 67 68 74 28 77 2e 70 50 61 72 73 65 2c 20  eight(w.pParse, 
dd80: 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67 68  w.pParse->nHeigh
dd90: 74 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  t) ){.    return
dda0: 20 53 51 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20   SQLITE_ERROR;. 
ddb0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73 71 6c 69   }.#endif.  sqli
ddc0: 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20  te3WalkExpr(&w, 
ddd0: 70 45 78 70 72 29 3b 0a 23 69 66 20 53 51 4c 49  pExpr);.#if SQLI
dde0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
ddf0: 48 3e 30 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e  H>0.  w.pParse->
de00: 6e 48 65 69 67 68 74 20 2d 3d 20 70 45 78 70 72  nHeight -= pExpr
de10: 2d 3e 6e 48 65 69 67 68 74 3b 0a 23 65 6e 64 69  ->nHeight;.#endi
de20: 66 0a 20 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46  f.  if( pNC->ncF
de30: 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67  lags & NC_HasAgg
de40: 20 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50   ){.    ExprSetP
de50: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
de60: 50 5f 41 67 67 29 3b 0a 20 20 7d 0a 20 20 70 4e  P_Agg);.  }.  pN
de70: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61  C->ncFlags |= sa
de80: 76 65 64 48 61 73 41 67 67 3b 0a 20 20 72 65 74  vedHasAgg;.  ret
de90: 75 72 6e 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20  urn pNC->nErr>0 
dea0: 7c 7c 20 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72  || w.pParse->nEr
deb0: 72 3e 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  r>0;.}../*.** Re
dec0: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20  solve all names 
ded0: 66 6f 72 20 61 6c 6c 20 65 78 70 72 65 73 73 69  for all expressi
dee0: 6f 6e 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  on in an express
def0: 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 69 73 20  ion list.  This 
df00: 69 73 0a 2a 2a 20 6a 75 73 74 20 6c 69 6b 65 20  is.** just like 
df10: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
df20: 70 72 4e 61 6d 65 73 28 29 20 65 78 63 65 70 74  prNames() except
df30: 20 74 68 61 74 20 69 74 20 77 6f 72 6b 73 20 66   that it works f
df40: 6f 72 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  or an expression
df50: 0a 2a 2a 20 6c 69 73 74 20 72 61 74 68 65 72 20  .** list rather 
df60: 74 68 61 6e 20 61 20 73 69 6e 67 6c 65 20 65 78  than a single ex
df70: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
df80: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45   sqlite3ResolveE
df90: 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 20 0a 20  xprListNames( . 
dfa0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
dfb0: 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65  C,       /* Name
dfc0: 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76 65  space to resolve
dfd0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e   expressions in.
dfe0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
dff0: 70 4c 69 73 74 20 20 20 20 20 20 20 20 20 2f 2a  pList         /*
e000: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
e010: 6c 69 73 74 20 74 6f 20 62 65 20 61 6e 61 6c 79  list to be analy
e020: 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74  zed. */.){.  int
e030: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20   i;.  if( pList 
e040: 29 7b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  ){.    for(i=0; 
e050: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
e060: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
e070: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78  sqlite3ResolveEx
e080: 70 72 4e 61 6d 65 73 28 70 4e 43 2c 20 70 4c 69  prNames(pNC, pLi
e090: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
e0a0: 29 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f  ) return WRC_Abo
e0b0: 72 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  rt;.    }.  }.  
e0c0: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
e0d0: 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  nue;.}../*.** Re
e0e0: 73 6f 6c 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20  solve all names 
e0f0: 69 6e 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f  in all expressio
e100: 6e 73 20 6f 66 20 61 20 53 45 4c 45 43 54 20 61  ns of a SELECT a
e110: 6e 64 20 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63  nd in all.** dec
e120: 65 6e 64 65 6e 74 73 20 6f 66 20 74 68 65 20 53  endents of the S
e130: 45 4c 45 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67  ELECT, including
e140: 20 63 6f 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f   compounds off o
e150: 66 20 70 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20  f p->pPrior,.** 
e160: 73 75 62 71 75 65 72 69 65 73 20 69 6e 20 65 78  subqueries in ex
e170: 70 72 65 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73  pressions, and s
e180: 75 62 71 75 65 72 69 65 73 20 75 73 65 64 20 61  ubqueries used a
e190: 73 20 46 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a  s FROM clause.**
e1a0: 20 74 65 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65   terms..**.** Se
e1b0: 65 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  e sqlite3Resolve
e1c0: 45 78 70 72 4e 61 6d 65 73 28 29 20 66 6f 72 20  ExprNames() for 
e1d0: 61 20 64 65 73 63 72 69 70 74 69 6f 6e 20 6f 66  a description of
e1e0: 20 74 68 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a   the kinds of.**
e1f0: 20 74 72 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73   transformations
e200: 20 74 68 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a   that occur..**.
e210: 2a 2a 20 41 6c 6c 20 53 45 4c 45 43 54 20 73 74  ** All SELECT st
e220: 61 74 65 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20  atements should 
e230: 68 61 76 65 20 62 65 65 6e 20 65 78 70 61 6e 64  have been expand
e240: 65 64 20 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69  ed using.** sqli
e250: 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64 28  te3SelectExpand(
e260: 29 20 70 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b  ) prior to invok
e270: 69 6e 67 20 74 68 69 73 20 72 6f 75 74 69 6e 65  ing this routine
e280: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
e290: 33 52 65 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61  3ResolveSelectNa
e2a0: 6d 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50  mes(.  Parse *pP
e2b0: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  arse,         /*
e2c0: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
e2d0: 65 78 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20  ext */.  Select 
e2e0: 2a 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20  *p,             
e2f0: 2f 2a 20 54 68 65 20 53 45 4c 45 43 54 20 73 74  /* The SELECT st
e300: 61 74 65 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f  atement being co
e310: 64 65 64 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f  ded. */.  NameCo
e320: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 20  ntext *pOuterNC 
e330: 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74   /* Name context
e340: 20 66 6f 72 20 70 61 72 65 6e 74 20 53 45 4c 45   for parent SELE
e350: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a  CT statement */.
e360: 29 7b 0a 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a  ){.  Walker w;..
e370: 20 20 61 73 73 65 72 74 28 20 70 21 3d 30 20 29    assert( p!=0 )
e380: 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c 62  ;.  w.xExprCallb
e390: 61 63 6b 20 3d 20 72 65 73 6f 6c 76 65 45 78 70  ack = resolveExp
e3a0: 72 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65  rStep;.  w.xSele
e3b0: 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73  ctCallback = res
e3c0: 6f 6c 76 65 53 65 6c 65 63 74 53 74 65 70 3b 0a  olveSelectStep;.
e3d0: 20 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62    w.xSelectCallb
e3e0: 61 63 6b 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50  ack2 = 0;.  w.pP
e3f0: 61 72 73 65 20 3d 20 70 50 61 72 73 65 3b 0a 20  arse = pParse;. 
e400: 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4f 75 74 65   w.u.pNC = pOute
e410: 72 4e 43 3b 0a 20 20 73 71 6c 69 74 65 33 57 61  rNC;.  sqlite3Wa
e420: 6c 6b 53 65 6c 65 63 74 28 26 77 2c 20 70 29 3b  lkSelect(&w, p);
e430: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76  .}../*.** Resolv
e440: 65 20 6e 61 6d 65 73 20 69 6e 20 65 78 70 72 65  e names in expre
e450: 73 73 69 6f 6e 73 20 74 68 61 74 20 63 61 6e 20  ssions that can 
e460: 6f 6e 6c 79 20 72 65 66 65 72 65 6e 63 65 20 61  only reference a
e470: 20 73 69 6e 67 6c 65 20 74 61 62 6c 65 3a 0a 2a   single table:.*
e480: 2a 0a 2a 2a 20 20 20 20 2a 20 20 20 43 48 45 43  *.**    *   CHEC
e490: 4b 20 63 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a  K constraints.**
e4a0: 20 20 20 20 2a 20 20 20 57 48 45 52 45 20 63 6c      *   WHERE cl
e4b0: 61 75 73 65 73 20 6f 6e 20 70 61 72 74 69 61 6c  auses on partial
e4c0: 20 69 6e 64 69 63 65 73 0a 2a 2a 0a 2a 2a 20 54   indices.**.** T
e4d0: 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 20 76  he Expr.iTable v
e4e0: 61 6c 75 65 20 66 6f 72 20 45 78 70 72 2e 6f 70  alue for Expr.op
e4f0: 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65  ==TK_COLUMN node
e500: 73 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  s of the express
e510: 69 6f 6e 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f  ion.** is set to
e520: 20 2d 31 20 61 6e 64 20 74 68 65 20 45 78 70 72   -1 and the Expr
e530: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69  .iColumn value i
e540: 73 20 73 65 74 20 74 6f 20 74 68 65 20 63 6f 6c  s set to the col
e550: 75 6d 6e 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a  umn number..**.*
e560: 2a 20 41 6e 79 20 65 72 72 6f 72 73 20 63 61 75  * Any errors cau
e570: 73 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  se an error mess
e580: 61 67 65 20 74 6f 20 62 65 20 73 65 74 20 69 6e  age to be set in
e590: 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64   pParse..*/.void
e5a0: 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 53   sqlite3ResolveS
e5b0: 65 6c 66 52 65 66 65 72 65 6e 63 65 28 0a 20 20  elfReference(.  
e5c0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
e5d0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
e5e0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c  ontext */.  Tabl
e5f0: 65 20 2a 70 54 61 62 2c 20 20 20 20 20 20 20 20  e *pTab,        
e600: 2f 2a 20 54 68 65 20 74 61 62 6c 65 20 62 65 69  /* The table bei
e610: 6e 67 20 72 65 66 65 72 65 6e 63 65 64 20 2a 2f  ng referenced */
e620: 0a 20 20 69 6e 74 20 74 79 70 65 2c 20 20 20 20  .  int type,    
e630: 20 20 20 20 20 20 20 2f 2a 20 4e 43 5f 49 73 43         /* NC_IsC
e640: 68 65 63 6b 20 6f 72 20 4e 43 5f 50 61 72 74 49  heck or NC_PartI
e650: 64 78 20 6f 72 20 4e 43 5f 49 64 78 45 78 70 72  dx or NC_IdxExpr
e660: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
e670: 72 2c 20 20 20 20 20 20 20 20 2f 2a 20 45 78 70  r,        /* Exp
e680: 72 65 73 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c  ression to resol
e690: 76 65 2e 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c  ve.  May be NULL
e6a0: 2e 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  . */.  ExprList 
e6b0: 2a 70 4c 69 73 74 20 20 20 20 20 2f 2a 20 45 78  *pList     /* Ex
e6c0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
e6d0: 20 72 65 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62   resolve.  May b
e6e0: 65 20 4e 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20  e NULL. */.){.  
e6f0: 53 72 63 4c 69 73 74 20 73 53 72 63 3b 20 20 20  SrcList sSrc;   
e700: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e710: 2f 2a 20 46 61 6b 65 20 53 72 63 4c 69 73 74 20  /* Fake SrcList 
e720: 66 6f 72 20 70 50 61 72 73 65 2d 3e 70 4e 65 77  for pParse->pNew
e730: 54 61 62 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43  Table */.  NameC
e740: 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20 20  ontext sNC;     
e750: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 61             /* Na
e760: 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f 72 20 70  me context for p
e770: 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65  Parse->pNewTable
e780: 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 74   */..  assert( t
e790: 79 70 65 3d 3d 4e 43 5f 49 73 43 68 65 63 6b 20  ype==NC_IsCheck 
e7a0: 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 50 61 72 74  || type==NC_Part
e7b0: 49 64 78 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f  Idx || type==NC_
e7c0: 49 64 78 45 78 70 72 20 29 3b 0a 20 20 6d 65 6d  IdxExpr );.  mem
e7d0: 73 65 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a  set(&sNC, 0, siz
e7e0: 65 6f 66 28 73 4e 43 29 29 3b 0a 20 20 6d 65 6d  eof(sNC));.  mem
e7f0: 73 65 74 28 26 73 53 72 63 2c 20 30 2c 20 73 69  set(&sSrc, 0, si
e800: 7a 65 6f 66 28 73 53 72 63 29 29 3b 0a 20 20 73  zeof(sSrc));.  s
e810: 53 72 63 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20  Src.nSrc = 1;.  
e820: 73 53 72 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20  sSrc.a[0].zName 
e830: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
e840: 20 73 53 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20   sSrc.a[0].pTab 
e850: 3d 20 70 54 61 62 3b 0a 20 20 73 53 72 63 2e 61  = pTab;.  sSrc.a
e860: 5b 30 5d 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31  [0].iCursor = -1
e870: 3b 0a 20 20 73 4e 43 2e 70 50 61 72 73 65 20 3d  ;.  sNC.pParse =
e880: 20 70 50 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70   pParse;.  sNC.p
e890: 53 72 63 4c 69 73 74 20 3d 20 26 73 53 72 63 3b  SrcList = &sSrc;
e8a0: 0a 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d  .  sNC.ncFlags =
e8b0: 20 74 79 70 65 3b 0a 20 20 69 66 28 20 73 71 6c   type;.  if( sql
e8c0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
e8d0: 61 6d 65 73 28 26 73 4e 43 2c 20 70 45 78 70 72  ames(&sNC, pExpr
e8e0: 29 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66  ) ) return;.  if
e8f0: 28 20 70 4c 69 73 74 20 29 20 73 71 6c 69 74 65  ( pList ) sqlite
e900: 33 52 65 73 6f 6c 76 65 45 78 70 72 4c 69 73 74  3ResolveExprList
e910: 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 4c 69 73  Names(&sNC, pLis
e920: 74 29 3b 0a 7d 0a                                t);.}.