/ Hex Artifact Content
Login

Artifact 797088662ed61102485e3070ba3b3f7828bd5ef6a588223ba6865d77d52f6cea:


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 20 20 20 20 45  en);.    }.    E
0b80: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
0b90: 44 75 70 2c 20 45 50 5f 41 6c 69 61 73 29 3b 0a  Dup, EP_Alias);.
0ba0: 0a 20 20 20 20 2f 2a 20 42 65 66 6f 72 65 20 63  .    /* Before c
0bb0: 61 6c 6c 69 6e 67 20 73 71 6c 69 74 65 33 45 78  alling sqlite3Ex
0bc0: 70 72 44 65 6c 65 74 65 28 29 2c 20 73 65 74 20  prDelete(), set 
0bd0: 74 68 65 20 45 50 5f 53 74 61 74 69 63 20 66 6c  the EP_Static fl
0be0: 61 67 2e 20 54 68 69 73 20 0a 20 20 20 20 2a 2a  ag. This .    **
0bf0: 20 70 72 65 76 65 6e 74 73 20 45 78 70 72 44 65   prevents ExprDe
0c00: 6c 65 74 65 28 29 20 66 72 6f 6d 20 64 65 6c 65  lete() from dele
0c10: 74 69 6e 67 20 74 68 65 20 45 78 70 72 20 73 74  ting the Expr st
0c20: 72 75 63 74 75 72 65 20 69 74 73 65 6c 66 2c 0a  ructure itself,.
0c30: 20 20 20 20 2a 2a 20 61 6c 6c 6f 77 69 6e 67 20      ** allowing 
0c40: 69 74 20 74 6f 20 62 65 20 72 65 70 6f 70 75 6c  it to be repopul
0c50: 61 74 65 64 20 62 79 20 74 68 65 20 6d 65 6d 63  ated by the memc
0c60: 70 79 28 29 20 6f 6e 20 74 68 65 20 66 6f 6c 6c  py() on the foll
0c70: 6f 77 69 6e 67 20 6c 69 6e 65 2e 0a 20 20 20 20  owing line..    
0c80: 2a 2a 20 54 68 65 20 70 45 78 70 72 2d 3e 75 2e  ** The pExpr->u.
0c90: 7a 54 6f 6b 65 6e 20 6d 69 67 68 74 20 70 6f 69  zToken might poi
0ca0: 6e 74 20 69 6e 74 6f 20 6d 65 6d 6f 72 79 20 74  nt into memory t
0cb0: 68 61 74 20 77 69 6c 6c 20 62 65 20 66 72 65 65  hat will be free
0cc0: 64 20 62 79 20 74 68 65 0a 20 20 20 20 2a 2a 20  d by the.    ** 
0cd0: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
0ce0: 2c 20 70 44 75 70 29 20 6f 6e 20 74 68 65 20 6c  , pDup) on the l
0cf0: 61 73 74 20 6c 69 6e 65 20 6f 66 20 74 68 69 73  ast line of this
0d00: 20 62 6c 6f 63 6b 2c 20 73 6f 20 62 65 20 73 75   block, so be su
0d10: 72 65 20 74 6f 0a 20 20 20 20 2a 2a 20 6d 61 6b  re to.    ** mak
0d20: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
0d30: 74 6f 6b 65 6e 20 62 65 66 6f 72 65 20 64 6f 69  token before doi
0d40: 6e 67 20 74 68 65 20 73 71 6c 69 74 65 33 44 62  ng the sqlite3Db
0d50: 46 72 65 65 28 29 2e 0a 20 20 20 20 2a 2f 0a 20  Free()..    */. 
0d60: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
0d70: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 53 74 61  ty(pExpr, EP_Sta
0d80: 74 69 63 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  tic);.    sqlite
0d90: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
0da0: 70 45 78 70 72 29 3b 0a 20 20 20 20 6d 65 6d 63  pExpr);.    memc
0db0: 70 79 28 70 45 78 70 72 2c 20 70 44 75 70 2c 20  py(pExpr, pDup, 
0dc0: 73 69 7a 65 6f 66 28 2a 70 45 78 70 72 29 29 3b  sizeof(*pExpr));
0dd0: 0a 20 20 20 20 69 66 28 20 21 45 78 70 72 48 61  .    if( !ExprHa
0de0: 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
0df0: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 26 26   EP_IntValue) &&
0e00: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
0e10: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73 73  !=0 ){.      ass
0e20: 65 72 74 28 20 28 70 45 78 70 72 2d 3e 66 6c 61  ert( (pExpr->fla
0e30: 67 73 20 26 20 28 45 50 5f 52 65 64 75 63 65 64  gs & (EP_Reduced
0e40: 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d  |EP_TokenOnly))=
0e50: 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 45 78 70  =0 );.      pExp
0e60: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 73 71  r->u.zToken = sq
0e70: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
0e80: 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65  , pExpr->u.zToke
0e90: 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
0ea0: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 4d 65 6d  >flags |= EP_Mem
0eb0: 54 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 20  Token;.    }.   
0ec0: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
0ed0: 62 2c 20 70 44 75 70 29 3b 0a 20 20 7d 0a 20 20  b, pDup);.  }.  
0ee0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
0ef0: 70 45 78 70 72 2c 20 45 50 5f 41 6c 69 61 73 29  pExpr, EP_Alias)
0f00: 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  ;.}.../*.** Retu
0f10: 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 6e  rn TRUE if the n
0f20: 61 6d 65 20 7a 43 6f 6c 20 6f 63 63 75 72 73 20  ame zCol occurs 
0f30: 61 6e 79 77 68 65 72 65 20 69 6e 20 74 68 65 20  anywhere in the 
0f40: 55 53 49 4e 47 20 63 6c 61 75 73 65 2e 0a 2a 2a  USING clause..**
0f50: 0a 2a 2a 20 52 65 74 75 72 6e 20 46 41 4c 53 45  .** Return FALSE
0f60: 20 69 66 20 74 68 65 20 55 53 49 4e 47 20 63 6c   if the USING cl
0f70: 61 75 73 65 20 69 73 20 4e 55 4c 4c 20 6f 72 20  ause is NULL or 
0f80: 69 66 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 63  if it does not c
0f90: 6f 6e 74 61 69 6e 0a 2a 2a 20 7a 43 6f 6c 2e 0a  ontain.** zCol..
0fa0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61  */.static int na
0fb0: 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28  meInUsingClause(
0fc0: 49 64 4c 69 73 74 20 2a 70 55 73 69 6e 67 2c 20  IdList *pUsing, 
0fd0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c  const char *zCol
0fe0: 29 7b 0a 20 20 69 66 28 20 70 55 73 69 6e 67 20  ){.  if( pUsing 
0ff0: 29 7b 0a 20 20 20 20 69 6e 74 20 6b 3b 0a 20 20  ){.    int k;.  
1000: 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73    for(k=0; k<pUs
1010: 69 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a  ing->nId; k++){.
1020: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
1030: 33 53 74 72 49 43 6d 70 28 70 55 73 69 6e 67 2d  3StrICmp(pUsing-
1040: 3e 61 5b 6b 5d 2e 7a 4e 61 6d 65 2c 20 7a 43 6f  >a[k].zName, zCo
1050: 6c 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  l)==0 ) return 1
1060: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1070: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
1080: 20 53 75 62 71 75 65 72 69 65 73 20 73 74 6f 72   Subqueries stor
1090: 65 73 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20  es the original 
10a0: 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20  database, table 
10b0: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  and column names
10c0: 20 66 6f 72 20 74 68 65 69 72 0a 2a 2a 20 72 65   for their.** re
10d0: 73 75 6c 74 20 73 65 74 73 20 69 6e 20 45 78 70  sult sets in Exp
10e0: 72 4c 69 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 2c  rList.a[].zSpan,
10f0: 20 69 6e 20 74 68 65 20 66 6f 72 6d 20 22 44 41   in the form "DA
1100: 54 41 42 41 53 45 2e 54 41 42 4c 45 2e 43 4f 4c  TABASE.TABLE.COL
1110: 55 4d 4e 22 2e 0a 2a 2a 20 43 68 65 63 6b 20 74  UMN"..** Check t
1120: 6f 20 73 65 65 20 69 66 20 74 68 65 20 7a 53 70  o see if the zSp
1130: 61 6e 20 67 69 76 65 6e 20 74 6f 20 74 68 69 73  an given to this
1140: 20 72 6f 75 74 69 6e 65 20 6d 61 74 63 68 65 73   routine matches
1150: 20 74 68 65 20 7a 44 62 2c 20 7a 54 61 62 2c 0a   the zDb, zTab,.
1160: 2a 2a 20 61 6e 64 20 7a 43 6f 6c 2e 20 20 49 66  ** and zCol.  If
1170: 20 61 6e 79 20 6f 66 20 7a 44 62 2c 20 7a 54 61   any of zDb, zTa
1180: 62 2c 20 61 6e 64 20 7a 43 6f 6c 20 61 72 65 20  b, and zCol are 
1190: 4e 55 4c 4c 20 74 68 65 6e 20 74 68 6f 73 65 20  NULL then those 
11a0: 66 69 65 6c 64 73 20 77 69 6c 6c 0a 2a 2a 20 6d  fields will.** m
11b0: 61 74 63 68 20 61 6e 79 74 68 69 6e 67 2e 0a 2a  atch anything..*
11c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 4d 61 74  /.int sqlite3Mat
11d0: 63 68 53 70 61 6e 4e 61 6d 65 28 0a 20 20 63 6f  chSpanName(.  co
11e0: 6e 73 74 20 63 68 61 72 20 2a 7a 53 70 61 6e 2c  nst char *zSpan,
11f0: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
1200: 43 6f 6c 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61  Col,.  const cha
1210: 72 20 2a 7a 54 61 62 2c 0a 20 20 63 6f 6e 73 74  r *zTab,.  const
1220: 20 63 68 61 72 20 2a 7a 44 62 0a 29 7b 0a 20 20   char *zDb.){.  
1230: 69 6e 74 20 6e 3b 0a 20 20 66 6f 72 28 6e 3d 30  int n;.  for(n=0
1240: 3b 20 41 4c 57 41 59 53 28 7a 53 70 61 6e 5b 6e  ; ALWAYS(zSpan[n
1250: 5d 29 20 26 26 20 7a 53 70 61 6e 5b 6e 5d 21 3d  ]) && zSpan[n]!=
1260: 27 2e 27 3b 20 6e 2b 2b 29 7b 7d 0a 20 20 69 66  '.'; n++){}.  if
1270: 28 20 7a 44 62 20 26 26 20 28 73 71 6c 69 74 65  ( zDb && (sqlite
1280: 33 53 74 72 4e 49 43 6d 70 28 7a 53 70 61 6e 2c  3StrNICmp(zSpan,
1290: 20 7a 44 62 2c 20 6e 29 21 3d 30 20 7c 7c 20 7a   zDb, n)!=0 || z
12a0: 44 62 5b 6e 5d 21 3d 30 29 20 29 7b 0a 20 20 20  Db[n]!=0) ){.   
12b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
12c0: 20 7a 53 70 61 6e 20 2b 3d 20 6e 2b 31 3b 0a 20   zSpan += n+1;. 
12d0: 20 66 6f 72 28 6e 3d 30 3b 20 41 4c 57 41 59 53   for(n=0; ALWAYS
12e0: 28 7a 53 70 61 6e 5b 6e 5d 29 20 26 26 20 7a 53  (zSpan[n]) && zS
12f0: 70 61 6e 5b 6e 5d 21 3d 27 2e 27 3b 20 6e 2b 2b  pan[n]!='.'; n++
1300: 29 7b 7d 0a 20 20 69 66 28 20 7a 54 61 62 20 26  ){}.  if( zTab &
1310: 26 20 28 73 71 6c 69 74 65 33 53 74 72 4e 49 43  & (sqlite3StrNIC
1320: 6d 70 28 7a 53 70 61 6e 2c 20 7a 54 61 62 2c 20  mp(zSpan, zTab, 
1330: 6e 29 21 3d 30 20 7c 7c 20 7a 54 61 62 5b 6e 5d  n)!=0 || zTab[n]
1340: 21 3d 30 29 20 29 7b 0a 20 20 20 20 72 65 74 75  !=0) ){.    retu
1350: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 7a 53 70 61  rn 0;.  }.  zSpa
1360: 6e 20 2b 3d 20 6e 2b 31 3b 0a 20 20 69 66 28 20  n += n+1;.  if( 
1370: 7a 43 6f 6c 20 26 26 20 73 71 6c 69 74 65 33 53  zCol && sqlite3S
1380: 74 72 49 43 6d 70 28 7a 53 70 61 6e 2c 20 7a 43  trICmp(zSpan, zC
1390: 6f 6c 29 21 3d 30 20 29 7b 0a 20 20 20 20 72 65  ol)!=0 ){.    re
13a0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
13b0: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
13c0: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
13d0: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
13e0: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
13f0: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
1400: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
1410: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
1420: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
1430: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
1440: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
1450: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
1460: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
1470: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
1480: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
1490: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
14a0: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
14b0: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
14c0: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
14d0: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
14e0: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
14f0: 68 65 20 64 61 74 61 62 61 73 65 20 58 0a 2a 2a  he database X.**
1500: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1510: 20 20 20 20 20 20 20 20 20 28 65 76 65 6e 20 69           (even i
1520: 66 20 58 20 69 73 20 69 6d 70 6c 69 65 64 29 2e  f X is implied).
1530: 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .**    pExpr->iT
1540: 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74 20  able        Set 
1550: 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75  to the cursor nu
1560: 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61 62  mber for the tab
1570: 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20  le 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 66 72 6f 6d 20 70 53 72 63         from pSrc
15a0: 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70  List..**    pExp
15b0: 72 2d 3e 70 54 61 62 20 20 20 20 20 20 20 20 20  r->pTab         
15c0: 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54   Points to the T
15d0: 61 62 6c 65 20 73 74 72 75 63 74 75 72 65 20 6f  able structure o
15e0: 66 20 58 2e 59 20 28 65 76 65 6e 20 69 66 0a 2a  f X.Y (even if.*
15f0: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
1600: 20 20 20 20 20 20 20 20 20 20 58 20 61 6e 64 2f            X and/
1610: 6f 72 20 59 20 61 72 65 20 69 6d 70 6c 69 65 64  or Y are implied
1620: 2e 29 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  .).**    pExpr->
1630: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
1640: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
1650: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
1660: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
1670: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
1680: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
1690: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
16a0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
16b0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
16c0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
16d0: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
16e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
16f0: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
1700: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
1710: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
1720: 2a 0a 2a 2a 20 54 68 65 20 7a 44 62 20 76 61 72  *.** The zDb var
1730: 69 61 62 6c 65 20 69 73 20 74 68 65 20 6e 61 6d  iable is the nam
1740: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
1750: 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68  e (the "X").  Th
1760: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
1770: 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  ** NULL meaning 
1780: 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20  that name is of 
1790: 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20  the form Y.Z or 
17a0: 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c  Z.  Any availabl
17b0: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61  e database.** ca
17c0: 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20  n be used.  The 
17d0: 7a 54 61 62 6c 65 20 76 61 72 69 61 62 6c 65 20  zTable variable 
17e0: 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  is the name of t
17f0: 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22 59  he table (the "Y
1800: 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c  ").  This.** val
1810: 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69  ue can be NULL i
1820: 66 20 7a 44 62 20 69 73 20 61 6c 73 6f 20 4e 55  f zDb is also NU
1830: 4c 4c 2e 20 20 49 66 20 7a 54 61 62 6c 65 20 69  LL.  If zTable i
1840: 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61  s NULL it.** mea
1850: 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d  ns that the form
1860: 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20   of the name is 
1870: 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d  Z and that colum
1880: 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c  ns from any tabl
1890: 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64  e.** can be used
18a0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e  ..**.** If the n
18b0: 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65  ame cannot be re
18c0: 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f  solved unambiguo
18d0: 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65  usly, leave an e
18e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20  rror message.** 
18f0: 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65  in pParse and re
1900: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 2e 20  turn WRC_Abort. 
1910: 20 52 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   Return WRC_Prun
1920: 65 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  e on success..*/
1930: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b  .static int look
1940: 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  upName(.  Parse 
1950: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20 2f  *pParse,       /
1960: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
1970: 6e 74 65 78 74 20 2a 2f 0a 20 20 63 6f 6e 73 74  ntext */.  const
1980: 20 63 68 61 72 20 2a 7a 44 62 2c 20 20 20 20 20   char *zDb,     
1990: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64  /* Name of the d
19a0: 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69  atabase containi
19b0: 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c  ng table, or NUL
19c0: 4c 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61  L */.  const cha
19d0: 72 20 2a 7a 54 61 62 2c 20 20 20 20 2f 2a 20 4e  r *zTab,    /* N
19e0: 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e  ame of table con
19f0: 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20  taining column, 
1a00: 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 63 6f 6e  or NULL */.  con
1a10: 73 74 20 63 68 61 72 20 2a 7a 43 6f 6c 2c 20 20  st char *zCol,  
1a20: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
1a30: 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e 61   column. */.  Na
1a40: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
1a50: 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20 63     /* The name c
1a60: 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20 72  ontext used to r
1a70: 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65 20  esolve the name 
1a80: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72  */.  Expr *pExpr
1a90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b            /* Mak
1aa0: 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65  e this EXPR node
1ab0: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65   point to the se
1ac0: 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f  lected column */
1ad0: 0a 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20  .){.  int i, j; 
1ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1af0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1b00: 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e  counters */.  in
1b10: 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20  t cnt = 0;      
1b20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b30: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
1b40: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
1b50: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
1b60: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ab = 0;         
1b70: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
1b80: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
1b90: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
1ba0: 20 69 6e 74 20 6e 53 75 62 71 75 65 72 79 20 3d   int nSubquery =
1bb0: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
1bc0: 20 20 20 2f 2a 20 48 6f 77 20 6d 61 6e 79 20 6c     /* How many l
1bd0: 65 76 65 6c 73 20 6f 66 20 73 75 62 71 75 65 72  evels of subquer
1be0: 79 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a  y */.  sqlite3 *
1bf0: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
1c00: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1c10: 64 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74  database connect
1c20: 69 6f 6e 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ion */.  struct 
1c30: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
1c40: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
1c50: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
1c60: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
1c70: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
1c80: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
1c90: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
1ca0: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
1cb0: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
1cc0: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
1cd0: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
1ce0: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
1cf0: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
1d00: 2f 0a 20 20 53 63 68 65 6d 61 20 2a 70 53 63 68  /.  Schema *pSch
1d10: 65 6d 61 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ema = 0;        
1d20: 20 20 20 20 20 20 2f 2a 20 53 63 68 65 6d 61 20        /* Schema 
1d30: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
1d40: 6e 20 2a 2f 0a 20 20 69 6e 74 20 65 4e 65 77 45  n */.  int eNewE
1d50: 78 70 72 4f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  xprOp = TK_COLUM
1d60: 4e 3b 20 20 20 20 20 20 20 2f 2a 20 4e 65 77 20  N;       /* New 
1d70: 76 61 6c 75 65 20 66 6f 72 20 70 45 78 70 72 2d  value for pExpr-
1d80: 3e 6f 70 20 6f 6e 20 73 75 63 63 65 73 73 20 2a  >op on success *
1d90: 2f 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20  /.  Table *pTab 
1da0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
1db0: 20 20 20 20 20 20 2f 2a 20 54 61 62 6c 65 20 68        /* Table h
1dc0: 6f 6c 64 20 74 68 65 20 72 6f 77 20 2a 2f 0a 20  old the row */. 
1dd0: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 20 20   Column *pCol;  
1de0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1df0: 20 20 20 2f 2a 20 41 20 63 6f 6c 75 6d 6e 20 6f     /* A column o
1e00: 66 20 70 54 61 62 20 2a 2f 0a 0a 20 20 61 73 73  f pTab */..  ass
1e10: 65 72 74 28 20 70 4e 43 20 29 3b 20 20 20 20 20  ert( pNC );     
1e20: 2f 2a 20 74 68 65 20 6e 61 6d 65 20 63 6f 6e 74  /* the name cont
1e30: 65 78 74 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55  ext cannot be NU
1e40: 4c 4c 2e 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  LL. */.  assert(
1e50: 20 7a 43 6f 6c 20 29 3b 20 20 20 20 2f 2a 20 54   zCol );    /* T
1e60: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
1e70: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
1e80: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
1e90: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
1ea0: 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45  , EP_TokenOnly|E
1eb0: 50 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 0a 20  P_Reduced) );.. 
1ec0: 20 2f 2a 20 49 6e 69 74 69 61 6c 69 7a 65 20 74   /* Initialize t
1ed0: 68 65 20 6e 6f 64 65 20 74 6f 20 6e 6f 2d 6d 61  he node to no-ma
1ee0: 74 63 68 20 2a 2f 0a 20 20 70 45 78 70 72 2d 3e  tch */.  pExpr->
1ef0: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 70  iTable = -1;.  p
1f00: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b 0a  Expr->pTab = 0;.
1f10: 20 20 45 78 70 72 53 65 74 56 56 41 50 72 6f 70    ExprSetVVAProp
1f20: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 4e  erty(pExpr, EP_N
1f30: 6f 52 65 64 75 63 65 29 3b 0a 0a 20 20 2f 2a 20  oReduce);..  /* 
1f40: 54 72 61 6e 73 6c 61 74 65 20 74 68 65 20 73 63  Translate the sc
1f50: 68 65 6d 61 20 6e 61 6d 65 20 69 6e 20 7a 44 62  hema name in zDb
1f60: 20 69 6e 74 6f 20 61 20 70 6f 69 6e 74 65 72 20   into a pointer 
1f70: 74 6f 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  to the correspon
1f80: 64 69 6e 67 0a 20 20 2a 2a 20 73 63 68 65 6d 61  ding.  ** schema
1f90: 2e 20 20 49 66 20 6e 6f 74 20 66 6f 75 6e 64 2c  .  If not found,
1fa0: 20 70 53 63 68 65 6d 61 20 77 69 6c 6c 20 72 65   pSchema will re
1fb0: 6d 61 69 6e 20 4e 55 4c 4c 20 61 6e 64 20 6e 6f  main NULL and no
1fc0: 74 68 69 6e 67 20 77 69 6c 6c 20 6d 61 74 63 68  thing will match
1fd0: 0a 20 20 2a 2a 20 72 65 73 75 6c 74 69 6e 67 20  .  ** resulting 
1fe0: 69 6e 20 61 6e 20 61 70 70 72 6f 70 72 69 61 74  in an appropriat
1ff0: 65 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  e error message 
2000: 74 6f 77 61 72 64 20 74 68 65 20 65 6e 64 20 6f  toward the end o
2010: 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a 20  f this routine. 
2020: 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 20 29 7b   */.  if( zDb ){
2030: 0a 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70  .    testcase( p
2040: 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43  NC->ncFlags & NC
2050: 5f 50 61 72 74 49 64 78 20 29 3b 0a 20 20 20 20  _PartIdx );.    
2060: 74 65 73 74 63 61 73 65 28 20 70 4e 43 2d 3e 6e  testcase( pNC->n
2070: 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 73 43 68  cFlags & NC_IsCh
2080: 65 63 6b 20 29 3b 0a 20 20 20 20 69 66 28 20 28  eck );.    if( (
2090: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 28  pNC->ncFlags & (
20a0: 4e 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 73  NC_PartIdx|NC_Is
20b0: 43 68 65 63 6b 29 29 21 3d 30 20 29 7b 0a 20 20  Check))!=0 ){.  
20c0: 20 20 20 20 2f 2a 20 53 69 6c 65 6e 74 6c 79 20      /* Silently 
20d0: 69 67 6e 6f 72 65 20 64 61 74 61 62 61 73 65 20  ignore database 
20e0: 71 75 61 6c 69 66 69 65 72 73 20 69 6e 73 69 64  qualifiers insid
20f0: 65 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69  e CHECK constrai
2100: 6e 74 73 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a  nts and.      **
2110: 20 70 61 72 74 69 61 6c 20 69 6e 64 69 63 65 73   partial indices
2120: 2e 20 20 44 6f 20 6e 6f 74 20 72 61 69 73 65 20  .  Do not raise 
2130: 65 72 72 6f 72 73 20 62 65 63 61 75 73 65 20 74  errors because t
2140: 68 61 74 20 6d 69 67 68 74 20 62 72 65 61 6b 0a  hat might break.
2150: 20 20 20 20 20 20 2a 2a 20 6c 65 67 61 63 79 20        ** legacy 
2160: 61 6e 64 20 62 65 63 61 75 73 65 20 69 74 20 64  and because it d
2170: 6f 65 73 20 6e 6f 74 20 68 75 72 74 20 61 6e 79  oes not hurt any
2180: 74 68 69 6e 67 20 74 6f 20 6a 75 73 74 20 69 67  thing to just ig
2190: 6e 6f 72 65 20 74 68 65 0a 20 20 20 20 20 20 2a  nore the.      *
21a0: 2a 20 64 61 74 61 62 61 73 65 20 6e 61 6d 65 2e  * database name.
21b0: 20 2a 2f 0a 20 20 20 20 20 20 7a 44 62 20 3d 20   */.      zDb = 
21c0: 30 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  0;.    }else{.  
21d0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 64      for(i=0; i<d
21e0: 62 2d 3e 6e 44 62 3b 20 69 2b 2b 29 7b 0a 20 20  b->nDb; i++){.  
21f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 64 62        assert( db
2200: 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e 61 6d  ->aDb[i].zDbSNam
2210: 65 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  e );.        if(
2220: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
2230: 64 62 2d 3e 61 44 62 5b 69 5d 2e 7a 44 62 53 4e  db->aDb[i].zDbSN
2240: 61 6d 65 2c 7a 44 62 29 3d 3d 30 20 29 7b 0a 20  ame,zDb)==0 ){. 
2250: 20 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61           pSchema
2260: 20 3d 20 64 62 2d 3e 61 44 62 5b 69 5d 2e 70 53   = db->aDb[i].pS
2270: 63 68 65 6d 61 3b 0a 20 20 20 20 20 20 20 20 20  chema;.         
2280: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2290: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
22a0: 20 20 7d 0a 0a 20 20 2f 2a 20 53 74 61 72 74 20    }..  /* Start 
22b0: 61 74 20 74 68 65 20 69 6e 6e 65 72 2d 6d 6f 73  at the inner-mos
22c0: 74 20 63 6f 6e 74 65 78 74 20 61 6e 64 20 6d 6f  t context and mo
22d0: 76 65 20 6f 75 74 77 61 72 64 20 75 6e 74 69 6c  ve outward until
22e0: 20 61 20 6d 61 74 63 68 20 69 73 20 66 6f 75 6e   a match is foun
22f0: 64 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70  d */.  assert( p
2300: 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29 3b 0a  NC && cnt==0 );.
2310: 20 20 64 6f 7b 0a 20 20 20 20 45 78 70 72 4c 69    do{.    ExprLi
2320: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
2330: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
2340: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
2350: 74 3b 0a 0a 20 20 20 20 69 66 28 20 70 53 72 63  t;..    if( pSrc
2360: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 66 6f  List ){.      fo
2370: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
2380: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
2390: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
23a0: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
23b0: 20 20 20 70 54 61 62 20 3d 20 70 49 74 65 6d 2d     pTab = pItem-
23c0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 61  >pTab;.        a
23d0: 73 73 65 72 74 28 20 70 54 61 62 21 3d 30 20 26  ssert( pTab!=0 &
23e0: 26 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 21 3d 30  & pTab->zName!=0
23f0: 20 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65   );.        asse
2400: 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30  rt( pTab->nCol>0
2410: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
2420: 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 26  pItem->pSelect &
2430: 26 20 28 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  & (pItem->pSelec
2440: 74 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46  t->selFlags & SF
2450: 5f 4e 65 73 74 65 64 46 72 6f 6d 29 21 3d 30 20  _NestedFrom)!=0 
2460: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74  ){.          int
2470: 20 68 69 74 20 3d 20 30 3b 0a 20 20 20 20 20 20   hit = 0;.      
2480: 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 49 74      pEList = pIt
2490: 65 6d 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  em->pSelect->pEL
24a0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 20 20 66  ist;.          f
24b0: 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74  or(j=0; j<pEList
24c0: 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20  ->nExpr; j++){. 
24d0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
24e0: 71 6c 69 74 65 33 4d 61 74 63 68 53 70 61 6e 4e  qlite3MatchSpanN
24f0: 61 6d 65 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  ame(pEList->a[j]
2500: 2e 7a 53 70 61 6e 2c 20 7a 43 6f 6c 2c 20 7a 54  .zSpan, zCol, zT
2510: 61 62 2c 20 7a 44 62 29 20 29 7b 0a 20 20 20 20  ab, zDb) ){.    
2520: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
2530: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63  .              c
2540: 6e 74 54 61 62 20 3d 20 32 3b 0a 20 20 20 20 20  ntTab = 2;.     
2550: 20 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20           pMatch 
2560: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20  = pItem;.       
2570: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
2580: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
2590: 20 20 20 20 20 20 20 20 20 68 69 74 20 3d 20 31           hit = 1
25a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
25b0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
25c0: 20 20 20 20 20 20 69 66 28 20 68 69 74 20 7c 7c        if( hit ||
25d0: 20 7a 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   zTab==0 ) conti
25e0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  nue;.        }. 
25f0: 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 20 26         if( zDb &
2600: 26 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 21  & pTab->pSchema!
2610: 3d 70 53 63 68 65 6d 61 20 29 7b 0a 20 20 20 20  =pSchema ){.    
2620: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
2630: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2640: 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20    if( zTab ){.  
2650: 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68          const ch
2660: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
2670: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3f 20 70  Item->zAlias ? p
2680: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3a 20 70  Item->zAlias : p
2690: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
26a0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
26b0: 61 62 4e 61 6d 65 21 3d 30 20 29 3b 0a 20 20 20  abName!=0 );.   
26c0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
26d0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
26e0: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 7b 0a  me, zTab)!=0 ){.
26f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
2700: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
2710: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
2720: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
2730: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
2740: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
2750: 6d 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  m;.        }.   
2760: 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43       for(j=0, pC
2770: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
2780: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
2790: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
27a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
27b0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
27c0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
27d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  .            /* 
27e0: 49 66 20 74 68 65 72 65 20 68 61 73 20 62 65 65  If there has bee
27f0: 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20 70 72  n exactly one pr
2800: 69 6f 72 20 6d 61 74 63 68 20 61 6e 64 20 74 68  ior match and th
2810: 69 73 20 6d 61 74 63 68 0a 20 20 20 20 20 20 20  is match.       
2820: 20 20 20 20 20 2a 2a 20 69 73 20 66 6f 72 20 74       ** is for t
2830: 68 65 20 72 69 67 68 74 2d 68 61 6e 64 20 74 61  he right-hand ta
2840: 62 6c 65 20 6f 66 20 61 20 4e 41 54 55 52 41 4c  ble of a NATURAL
2850: 20 4a 4f 49 4e 20 6f 72 20 69 73 20 69 6e 20 61   JOIN or is in a
2860: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a   .            **
2870: 20 55 53 49 4e 47 20 63 6c 61 75 73 65 2c 20 74   USING clause, t
2880: 68 65 6e 20 73 6b 69 70 20 74 68 69 73 20 6d 61  hen skip this ma
2890: 74 63 68 2e 0a 20 20 20 20 20 20 20 20 20 20 20  tch..           
28a0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20   */.            
28b0: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
28c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
28d0: 70 49 74 65 6d 2d 3e 66 67 2e 6a 6f 69 6e 74 79  pItem->fg.jointy
28e0: 70 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20  pe & JT_NATURAL 
28f0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
2900: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e 61            if( na
2910: 6d 65 49 6e 55 73 69 6e 67 43 6c 61 75 73 65 28  meInUsingClause(
2920: 70 49 74 65 6d 2d 3e 70 55 73 69 6e 67 2c 20 7a  pItem->pUsing, z
2930: 43 6f 6c 29 20 29 20 63 6f 6e 74 69 6e 75 65 3b  Col) ) continue;
2940: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
2950: 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b             cnt++
2960: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 4d  ;.            pM
2970: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
2980: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62            /* Sub
2990: 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69  stitute the rowi
29a0: 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f  d (column -1) fo
29b0: 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52  r the INTEGER PR
29c0: 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20  IMARY KEY */.   
29d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
29e0: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
29f0: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
2a00: 28 69 31 36 29 6a 3b 0a 20 20 20 20 20 20 20 20  (i16)j;.        
2a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
2a20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
2a30: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
2a40: 66 28 20 70 4d 61 74 63 68 20 29 7b 0a 20 20 20  f( pMatch ){.   
2a50: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2a60: 6c 65 20 3d 20 70 4d 61 74 63 68 2d 3e 69 43 75  le = pMatch->iCu
2a70: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45  rsor;.        pE
2a80: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d 61 74  xpr->pTab = pMat
2a90: 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ch->pTab;.      
2aa0: 20 20 2f 2a 20 52 49 47 48 54 20 4a 4f 49 4e 20    /* RIGHT JOIN 
2ab0: 6e 6f 74 20 28 79 65 74 29 20 73 75 70 70 6f 72  not (yet) suppor
2ac0: 74 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 61  ted */.        a
2ad0: 73 73 65 72 74 28 20 28 70 4d 61 74 63 68 2d 3e  ssert( (pMatch->
2ae0: 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26 20 4a 54  fg.jointype & JT
2af0: 5f 52 49 47 48 54 29 3d 3d 30 20 29 3b 0a 20 20  _RIGHT)==0 );.  
2b00: 20 20 20 20 20 20 69 66 28 20 28 70 4d 61 74 63        if( (pMatc
2b10: 68 2d 3e 66 67 2e 6a 6f 69 6e 74 79 70 65 20 26  h->fg.jointype &
2b20: 20 4a 54 5f 4c 45 46 54 29 21 3d 30 20 29 7b 0a   JT_LEFT)!=0 ){.
2b30: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
2b40: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
2b50: 20 45 50 5f 43 61 6e 42 65 4e 75 6c 6c 29 3b 0a   EP_CanBeNull);.
2b60: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
2b70: 20 20 70 53 63 68 65 6d 61 20 3d 20 70 45 78 70    pSchema = pExp
2b80: 72 2d 3e 70 54 61 62 2d 3e 70 53 63 68 65 6d 61  r->pTab->pSchema
2b90: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
2ba0: 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 20  /* if( pSrcList 
2bb0: 29 20 2a 2f 0a 0a 23 69 66 20 21 64 65 66 69 6e  ) */..#if !defin
2bc0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
2bd0: 52 49 47 47 45 52 29 20 7c 7c 20 21 64 65 66 69  RIGGER) || !defi
2be0: 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  ned(SQLITE_OMIT_
2bf0: 55 50 53 45 52 54 29 0a 20 20 20 20 2f 2a 20 49  UPSERT).    /* I
2c00: 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c  f we have not al
2c10: 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74  ready resolved t
2c20: 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61  he name, then ma
2c30: 79 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69  ybe .    ** it i
2c40: 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64  s a new.* or old
2c50: 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d  .* trigger argum
2c60: 65 6e 74 20 72 65 66 65 72 65 6e 63 65 2e 20 20  ent reference.  
2c70: 4f 72 0a 20 20 20 20 2a 2a 20 6d 61 79 62 65 20  Or.    ** maybe 
2c80: 69 74 20 69 73 20 61 6e 20 65 78 63 6c 75 64 65  it is an exclude
2c90: 64 2e 2a 20 66 72 6f 6d 20 61 6e 20 75 70 73 65  d.* from an upse
2ca0: 72 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  rt..    */.    i
2cb0: 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61  f( zDb==0 && zTa
2cc0: 62 21 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d  b!=0 && cntTab==
2cd0: 30 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62 20  0 ){.      pTab 
2ce0: 3d 20 30 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  = 0;.#ifndef SQL
2cf0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
2d00: 0a 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73  .      if( pPars
2d10: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 21 3d  e->pTriggerTab!=
2d20: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  0 ){.        int
2d30: 20 6f 70 20 3d 20 70 50 61 72 73 65 2d 3e 65 54   op = pParse->eT
2d40: 72 69 67 67 65 72 4f 70 3b 0a 20 20 20 20 20 20  riggerOp;.      
2d50: 20 20 61 73 73 65 72 74 28 20 6f 70 3d 3d 54 4b    assert( op==TK
2d60: 5f 44 45 4c 45 54 45 20 7c 7c 20 6f 70 3d 3d 54  _DELETE || op==T
2d70: 4b 5f 55 50 44 41 54 45 20 7c 7c 20 6f 70 3d 3d  K_UPDATE || op==
2d80: 54 4b 5f 49 4e 53 45 52 54 20 29 3b 0a 20 20 20  TK_INSERT );.   
2d90: 20 20 20 20 20 69 66 28 20 6f 70 21 3d 54 4b 5f       if( op!=TK_
2da0: 44 45 4c 45 54 45 20 26 26 20 73 71 6c 69 74 65  DELETE && sqlite
2db0: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 7a  3StrICmp("new",z
2dc0: 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20  Tab) == 0 ){.   
2dd0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2de0: 61 62 6c 65 20 3d 20 31 3b 0a 20 20 20 20 20 20  able = 1;.      
2df0: 20 20 20 20 70 54 61 62 20 3d 20 70 50 61 72 73      pTab = pPars
2e00: 65 2d 3e 70 54 72 69 67 67 65 72 54 61 62 3b 0a  e->pTriggerTab;.
2e10: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66          }else if
2e20: 28 20 6f 70 21 3d 54 4b 5f 49 4e 53 45 52 54 20  ( op!=TK_INSERT 
2e30: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
2e40: 70 28 22 6f 6c 64 22 2c 7a 54 61 62 29 3d 3d 30  p("old",zTab)==0
2e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 45   ){.          pE
2e60: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 30 3b  xpr->iTable = 0;
2e70: 0a 20 20 20 20 20 20 20 20 20 20 70 54 61 62 20  .          pTab 
2e80: 3d 20 70 50 61 72 73 65 2d 3e 70 54 72 69 67 67  = pParse->pTrigg
2e90: 65 72 54 61 62 3b 0a 20 20 20 20 20 20 20 20 7d  erTab;.        }
2ea0: 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 20  .      }.#endif 
2eb0: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  /* SQLITE_OMIT_T
2ec0: 52 49 47 47 45 52 20 2a 2f 0a 23 69 66 6e 64 65  RIGGER */.#ifnde
2ed0: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50  f SQLITE_OMIT_UP
2ee0: 53 45 52 54 0a 20 20 20 20 20 20 69 66 28 20 28  SERT.      if( (
2ef0: 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e  pNC->ncFlags & N
2f00: 43 5f 55 55 70 73 65 72 74 29 21 3d 30 20 29 7b  C_UUpsert)!=0 ){
2f10: 0a 20 20 20 20 20 20 20 20 55 70 73 65 72 74 20  .        Upsert 
2f20: 2a 70 55 70 73 65 72 74 20 3d 20 70 4e 43 2d 3e  *pUpsert = pNC->
2f30: 75 4e 43 2e 70 55 70 73 65 72 74 3b 0a 20 20 20  uNC.pUpsert;.   
2f40: 20 20 20 20 20 69 66 28 20 70 55 70 73 65 72 74       if( pUpsert
2f50: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
2f60: 6d 70 28 22 65 78 63 6c 75 64 65 64 22 2c 7a 54  mp("excluded",zT
2f70: 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ab)==0 ){.      
2f80: 20 20 20 20 70 54 61 62 20 3d 20 70 55 70 73 65      pTab = pUpse
2f90: 72 74 2d 3e 70 55 70 73 65 72 74 53 72 63 2d 3e  rt->pUpsertSrc->
2fa0: 61 5b 30 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20  a[0].pTab;.     
2fb0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2fc0: 6c 65 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  le = 2;.        
2fd0: 7d 0a 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66  }.      }.#endif
2fe0: 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f   /* SQLITE_OMIT_
2ff0: 55 50 53 45 52 54 20 2a 2f 0a 0a 20 20 20 20 20  UPSERT */..     
3000: 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20   if( pTab ){ .  
3010: 20 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 3b 0a        int iCol;.
3020: 20 20 20 20 20 20 20 20 70 53 63 68 65 6d 61 20          pSchema 
3030: 3d 20 70 54 61 62 2d 3e 70 53 63 68 65 6d 61 3b  = pTab->pSchema;
3040: 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62 2b  .        cntTab+
3050: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
3060: 43 6f 6c 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  Col=0, pCol=pTab
3070: 2d 3e 61 43 6f 6c 3b 20 69 43 6f 6c 3c 70 54 61  ->aCol; iCol<pTa
3080: 62 2d 3e 6e 43 6f 6c 3b 20 69 43 6f 6c 2b 2b 2c  b->nCol; iCol++,
3090: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
30a0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
30b0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
30c0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
30d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
30e0: 69 43 6f 6c 3d 3d 70 54 61 62 2d 3e 69 50 4b 65  iCol==pTab->iPKe
30f0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  y ){.           
3100: 20 20 20 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20     iCol = -1;.  
3110: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
3120: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
3130: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
3140: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
3150: 20 69 43 6f 6c 3e 3d 70 54 61 62 2d 3e 6e 43 6f   iCol>=pTab->nCo
3160: 6c 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f  l && sqlite3IsRo
3170: 77 69 64 28 7a 43 6f 6c 29 20 26 26 20 56 69 73  wid(zCol) && Vis
3180: 69 62 6c 65 52 6f 77 69 64 28 70 54 61 62 29 20  ibleRowid(pTab) 
3190: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ){.          /* 
31a0: 49 4d 50 3a 20 52 2d 35 31 34 31 34 2d 33 32 39  IMP: R-51414-329
31b0: 31 30 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  10 */.          
31c0: 69 43 6f 6c 20 3d 20 2d 31 3b 0a 20 20 20 20 20  iCol = -1;.     
31d0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28     }.        if(
31e0: 20 69 43 6f 6c 3c 70 54 61 62 2d 3e 6e 43 6f 6c   iCol<pTab->nCol
31f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e   ){.          cn
3200: 74 2b 2b 3b 0a 23 69 66 6e 64 65 66 20 53 51 4c  t++;.#ifndef SQL
3210: 49 54 45 5f 4f 4d 49 54 5f 55 50 53 45 52 54 0a  ITE_OMIT_UPSERT.
3220: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 45            if( pE
3230: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 32 20 29  xpr->iTable==2 )
3240: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 74 65  {.            te
3250: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 28 2d  stcase( iCol==(-
3260: 31 29 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  1) );.          
3270: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
3280: 3d 20 70 4e 43 2d 3e 75 4e 43 2e 70 55 70 73 65  = pNC->uNC.pUpse
3290: 72 74 2d 3e 72 65 67 44 61 74 61 20 2b 20 69 43  rt->regData + iC
32a0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ol;.            
32b0: 65 4e 65 77 45 78 70 72 4f 70 20 3d 20 54 4b 5f  eNewExprOp = TK_
32c0: 52 45 47 49 53 54 45 52 3b 0a 20 20 20 20 20 20  REGISTER;.      
32d0: 20 20 20 20 20 20 45 78 70 72 53 65 74 50 72 6f        ExprSetPro
32e0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
32f0: 41 6c 69 61 73 29 3b 0a 20 20 20 20 20 20 20 20  Alias);.        
3300: 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20 2f    }else.#endif /
3310: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 55 50  * SQLITE_OMIT_UP
3320: 53 45 52 54 20 2a 2f 0a 20 20 20 20 20 20 20 20  SERT */.        
3330: 20 20 7b 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    {.#ifndef SQLI
3340: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
3350: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
3360: 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20 20 20 20  iCol<0 ){.      
3370: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
3380: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
3390: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
33a0: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 20            }else 
33b0: 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
33c0: 65 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e==0 ){.        
33d0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
33e0: 69 43 6f 6c 3d 3d 33 31 20 29 3b 0a 20 20 20 20  iCol==31 );.    
33f0: 20 20 20 20 20 20 20 20 20 20 74 65 73 74 63 61            testca
3400: 73 65 28 20 69 43 6f 6c 3d 3d 33 32 20 29 3b 0a  se( iCol==32 );.
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50                pP
3420: 61 72 73 65 2d 3e 6f 6c 64 6d 61 73 6b 20 7c 3d  arse->oldmask |=
3430: 20 28 69 43 6f 6c 3e 3d 33 32 20 3f 20 30 78 66   (iCol>=32 ? 0xf
3440: 66 66 66 66 66 66 66 20 3a 20 28 28 28 75 33 32  fffffff : (((u32
3450: 29 31 29 3c 3c 69 43 6f 6c 29 29 3b 0a 20 20 20  )1)<<iCol));.   
3460: 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a           }else{.
3470: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74 65                te
3480: 73 74 63 61 73 65 28 20 69 43 6f 6c 3d 3d 33 31  stcase( iCol==31
3490: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
34a0: 20 20 74 65 73 74 63 61 73 65 28 20 69 43 6f 6c    testcase( iCol
34b0: 3d 3d 33 32 20 29 3b 0a 20 20 20 20 20 20 20 20  ==32 );.        
34c0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 65        pParse->ne
34d0: 77 6d 61 73 6b 20 7c 3d 20 28 69 43 6f 6c 3e 3d  wmask |= (iCol>=
34e0: 33 32 20 3f 20 30 78 66 66 66 66 66 66 66 66 20  32 ? 0xffffffff 
34f0: 3a 20 28 28 28 75 33 32 29 31 29 3c 3c 69 43 6f  : (((u32)1)<<iCo
3500: 6c 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  l));.           
3510: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 70   }.            p
3520: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61  Expr->pTab = pTa
3530: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  b;.            p
3540: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
3550: 28 69 31 36 29 69 43 6f 6c 3b 0a 20 20 20 20 20  (i16)iCol;.     
3560: 20 20 20 20 20 20 20 65 4e 65 77 45 78 70 72 4f         eNewExprO
3570: 70 20 3d 20 54 4b 5f 54 52 49 47 47 45 52 3b 0a  p = TK_TRIGGER;.
3580: 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45  #endif /* SQLITE
3590: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 20 2a 2f  _OMIT_TRIGGER */
35a0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
35b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
35c0: 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21     }.#endif /* !
35d0: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
35e0: 4d 49 54 5f 54 52 49 47 47 45 52 29 20 7c 7c 20  MIT_TRIGGER) || 
35f0: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3600: 4f 4d 49 54 5f 55 50 53 45 52 54 29 20 2a 2f 0a  OMIT_UPSERT) */.
3610: 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50  .    /*.    ** P
3620: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
3630: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
3640: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20  o the ROWID.    
3650: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
3660: 30 0a 20 20 20 20 20 26 26 20 63 6e 74 54 61 62  0.     && cntTab
3670: 3d 3d 31 0a 20 20 20 20 20 26 26 20 70 4d 61 74  ==1.     && pMat
3680: 63 68 0a 20 20 20 20 20 26 26 20 28 70 4e 43 2d  ch.     && (pNC-
3690: 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f 49 64  >ncFlags & NC_Id
36a0: 78 45 78 70 72 29 3d 3d 30 0a 20 20 20 20 20 26  xExpr)==0.     &
36b0: 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  & sqlite3IsRowid
36c0: 28 7a 43 6f 6c 29 0a 20 20 20 20 20 26 26 20 56  (zCol).     && V
36d0: 69 73 69 62 6c 65 52 6f 77 69 64 28 70 4d 61 74  isibleRowid(pMat
36e0: 63 68 2d 3e 70 54 61 62 29 0a 20 20 20 20 29 7b  ch->pTab).    ){
36f0: 0a 20 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  .      cnt = 1;.
3700: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
3710: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20  lumn = -1;.     
3720: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
3730: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
3740: 54 45 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20  TEGER;.    }..  
3750: 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74    /*.    ** If t
3760: 68 65 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74  he input is of t
3770: 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59  he form Z (not Y
3780: 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65  .Z or X.Y.Z) the
3790: 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20  n the name Z.   
37a0: 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20   ** might refer 
37b0: 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74  to an result-set
37c0: 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61   alias.  This ha
37d0: 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70  ppens, for examp
37e0: 6c 65 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20  le, when.    ** 
37f0: 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67  we are resolving
3800: 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48   names in the WH
3810: 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68  ERE clause of th
3820: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d  e following comm
3830: 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  and:.    **.    
3840: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
3850: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
3860: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
3870: 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63    **.    ** In c
3880: 61 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20  ases like this, 
3890: 72 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69  replace pExpr wi
38a0: 74 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  th a copy of the
38b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
38c0: 0a 20 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68  .    ** forms th
38d0: 65 20 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74  e result set ent
38e0: 72 79 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65  ry ("a+b" in the
38f0: 20 65 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65   example) and re
3900: 74 75 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79  turn immediately
3910: 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68  ..    ** Note th
3920: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
3930: 6e 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  n in the result 
3940: 73 65 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20  set should have 
3950: 61 6c 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20  already been.   
3960: 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20   ** resolved by 
3970: 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48 45  the time the WHE
3980: 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65 73  RE clause is res
3990: 6f 6c 76 65 64 2e 0a 20 20 20 20 2a 2a 0a 20 20  olved..    **.  
39a0: 20 20 2a 2a 20 54 68 65 20 61 62 69 6c 69 74 79    ** The ability
39b0: 20 74 6f 20 75 73 65 20 61 6e 20 6f 75 74 70 75   to use an outpu
39c0: 74 20 72 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c  t result-set col
39d0: 75 6d 6e 20 69 6e 20 74 68 65 20 57 48 45 52 45  umn in the WHERE
39e0: 2c 20 47 52 4f 55 50 20 42 59 2c 0a 20 20 20 20  , GROUP BY,.    
39f0: 2a 2a 20 6f 72 20 48 41 56 49 4e 47 20 63 6c 61  ** or HAVING cla
3a00: 75 73 65 73 2c 20 6f 72 20 61 73 20 70 61 72 74  uses, or as part
3a10: 20 6f 66 20 61 20 6c 61 72 67 65 72 20 65 78 70   of a larger exp
3a20: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 4f  ression in the O
3a30: 52 44 45 52 20 42 59 0a 20 20 20 20 2a 2a 20 63  RDER BY.    ** c
3a40: 6c 61 75 73 65 20 69 73 20 6e 6f 74 20 73 74 61  lause is not sta
3a50: 6e 64 61 72 64 20 53 51 4c 2e 20 20 54 68 69 73  ndard SQL.  This
3a60: 20 69 73 20 61 20 28 67 6f 6f 66 79 29 20 53 51   is a (goofy) SQ
3a70: 4c 69 74 65 20 65 78 74 65 6e 73 69 6f 6e 2c 20  Lite extension, 
3a80: 74 68 61 74 0a 20 20 20 20 2a 2a 20 69 73 20 73  that.    ** is s
3a90: 75 70 70 6f 72 74 65 64 20 66 6f 72 20 62 61 63  upported for bac
3aa0: 6b 77 61 72 64 73 20 63 6f 6d 70 61 74 69 62 69  kwards compatibi
3ab0: 6c 69 74 79 20 6f 6e 6c 79 2e 20 48 65 6e 63 65  lity only. Hence
3ac0: 2c 20 77 65 20 69 73 73 75 65 20 61 20 77 61 72  , we issue a war
3ad0: 6e 69 6e 67 0a 20 20 20 20 2a 2a 20 6f 6e 20 73  ning.    ** on s
3ae0: 71 6c 69 74 65 33 5f 6c 6f 67 28 29 20 77 68 65  qlite3_log() whe
3af0: 6e 65 76 65 72 20 74 68 65 20 63 61 70 61 62 69  never the capabi
3b00: 6c 69 74 79 20 69 73 20 75 73 65 64 2e 0a 20 20  lity is used..  
3b10: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 28 70 4e    */.    if( (pN
3b20: 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20 4e 43 5f  C->ncFlags & NC_
3b30: 55 45 4c 69 73 74 29 21 3d 30 0a 20 20 20 20 20  UEList)!=0.     
3b40: 26 26 20 63 6e 74 3d 3d 30 0a 20 20 20 20 20 26  && cnt==0.     &
3b50: 26 20 7a 54 61 62 3d 3d 30 0a 20 20 20 20 29 7b  & zTab==0.    ){
3b60: 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20  .      pEList = 
3b70: 70 4e 43 2d 3e 75 4e 43 2e 70 45 4c 69 73 74 3b  pNC->uNC.pEList;
3b80: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
3b90: 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20  EList!=0 );.    
3ba0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
3bb0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
3bc0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
3bd0: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
3be0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
3bf0: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
3c00: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3c10: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
3c20: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
3c30: 70 4f 72 69 67 3b 0a 20 20 20 20 20 20 20 20 20  pOrig;.         
3c40: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3c50: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
3c60: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
3c70: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
3c80: 28 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  ( pExpr->x.pList
3c90: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ==0 );.         
3ca0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
3cb0: 78 2e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  x.pSelect==0 );.
3cc0: 20 20 20 20 20 20 20 20 20 20 70 4f 72 69 67 20            pOrig 
3cd0: 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  = pEList->a[j].p
3ce0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
3cf0: 69 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67  if( (pNC->ncFlag
3d00: 73 26 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d  s&NC_AllowAgg)==
3d10: 30 20 26 26 20 45 78 70 72 48 61 73 50 72 6f 70  0 && ExprHasProp
3d20: 65 72 74 79 28 70 4f 72 69 67 2c 20 45 50 5f 41  erty(pOrig, EP_A
3d30: 67 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  gg) ){.         
3d40: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
3d50: 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75  sg(pParse, "misu
3d60: 73 65 20 6f 66 20 61 6c 69 61 73 65 64 20 61 67  se of aliased ag
3d70: 67 72 65 67 61 74 65 20 25 73 22 2c 20 7a 41 73  gregate %s", zAs
3d80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72  );.            r
3d90: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
3da0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
3db0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
3dc0: 65 33 45 78 70 72 56 65 63 74 6f 72 53 69 7a 65  e3ExprVectorSize
3dd0: 28 70 4f 72 69 67 29 21 3d 31 20 29 7b 0a 20 20  (pOrig)!=1 ){.  
3de0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
3df0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
3e00: 2c 20 22 72 6f 77 20 76 61 6c 75 65 20 6d 69 73  , "row value mis
3e10: 75 73 65 64 22 29 3b 0a 20 20 20 20 20 20 20 20  used");.        
3e20: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
3e30: 62 6f 72 74 3b 0a 20 20 20 20 20 20 20 20 20 20  bort;.          
3e40: 7d 0a 20 20 20 20 20 20 20 20 20 20 72 65 73 6f  }.          reso
3e50: 6c 76 65 41 6c 69 61 73 28 70 50 61 72 73 65 2c  lveAlias(pParse,
3e60: 20 70 45 4c 69 73 74 2c 20 6a 2c 20 70 45 78 70   pEList, j, pExp
3e70: 72 2c 20 22 22 2c 20 6e 53 75 62 71 75 65 72 79  r, "", nSubquery
3e80: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74  );.          cnt
3e90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
3ea0: 70 4d 61 74 63 68 20 3d 20 30 3b 0a 20 20 20 20  pMatch = 0;.    
3eb0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
3ec0: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
3ed0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f 74  );.          got
3ee0: 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64  o lookupname_end
3ef0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
3f00: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
3f10: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
3f20: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
3f30: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
3f40: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
3f50: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
3f60: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
3f70: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
3f80: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
3f90: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
3fa0: 20 20 20 20 69 66 28 20 63 6e 74 20 29 20 62 72      if( cnt ) br
3fb0: 65 61 6b 3b 0a 20 20 20 20 70 4e 43 20 3d 20 70  eak;.    pNC = p
3fc0: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 6e  NC->pNext;.    n
3fd0: 53 75 62 71 75 65 72 79 2b 2b 3b 0a 20 20 7d 77  Subquery++;.  }w
3fe0: 68 69 6c 65 28 20 70 4e 43 20 29 3b 0a 0a 0a 20  hile( pNC );... 
3ff0: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e   /*.  ** If X an
4000: 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e  d Y are NULL (in
4010: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
4020: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
4030: 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73  name Z is.  ** s
4040: 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65  upplied) and the
4050: 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65   value of Z is e
4060: 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c  nclosed in doubl
4070: 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20  e-quotes, then. 
4080: 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e   ** Z is a strin
4090: 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20  g literal if it 
40a0: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e  doesn't match an
40b0: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  y column names. 
40c0: 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61   In that.  ** ca
40d0: 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  se, we need to r
40e0: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
40f0: 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e   and not make an
4100: 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a  y changes to.  *
4110: 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2a 0a 20 20  * pExpr..  **.  
4120: 2a 2a 20 42 65 63 61 75 73 65 20 6e 6f 20 72 65  ** Because no re
4130: 66 65 72 65 6e 63 65 20 77 61 73 20 6d 61 64 65  ference was made
4140: 20 74 6f 20 6f 75 74 65 72 20 63 6f 6e 74 65 78   to outer contex
4150: 74 73 2c 20 74 68 65 20 70 4e 43 2d 3e 6e 52 65  ts, the pNC->nRe
4160: 66 0a 20 20 2a 2a 20 66 69 65 6c 64 73 20 61 72  f.  ** fields ar
4170: 65 20 6e 6f 74 20 63 68 61 6e 67 65 64 20 69 6e  e not changed in
4180: 20 61 6e 79 20 63 6f 6e 74 65 78 74 2e 0a 20 20   any context..  
4190: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
41a0: 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20  && zTab==0 ){.  
41b0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
41c0: 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a 20 20  >op==TK_ID );.  
41d0: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
41e0: 70 65 72 74 79 28 70 45 78 70 72 2c 45 50 5f 44  perty(pExpr,EP_D
41f0: 62 6c 51 75 6f 74 65 64 29 20 29 7b 0a 20 20 20  blQuoted) ){.   
4200: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
4210: 4b 5f 53 54 52 49 4e 47 3b 0a 20 20 20 20 20 20  K_STRING;.      
4220: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 30 3b  pExpr->pTab = 0;
4230: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
4240: 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20 7d 0a 20  C_Prune;.    }. 
4250: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
4260: 70 72 49 64 54 6f 54 72 75 65 46 61 6c 73 65 28  prIdToTrueFalse(
4270: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
4280: 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65  return WRC_Prune
4290: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f  ;.    }.  }..  /
42a0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
42b0: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
42c0: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
42d0: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
42e0: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
42f0: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
4300: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
4310: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
4320: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
4330: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
4340: 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20  Err;.    zErr = 
4350: 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63  cnt==0 ? "no suc
4360: 68 20 63 6f 6c 75 6d 6e 22 20 3a 20 22 61 6d 62  h column" : "amb
4370: 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61  iguous column na
4380: 6d 65 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  me";.    if( zDb
4390: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
43a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
43b0: 2c 20 22 25 73 3a 20 25 73 2e 25 73 2e 25 73 22  , "%s: %s.%s.%s"
43c0: 2c 20 7a 45 72 72 2c 20 7a 44 62 2c 20 7a 54 61  , zErr, zDb, zTa
43d0: 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 65  b, zCol);.    }e
43e0: 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a  lse if( zTab ){.
43f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
4400: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4410: 73 3a 20 25 73 2e 25 73 22 2c 20 7a 45 72 72 2c  s: %s.%s", zErr,
4420: 20 7a 54 61 62 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zTab, zCol);.  
4430: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 73    }else{.      s
4440: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
4450: 50 61 72 73 65 2c 20 22 25 73 3a 20 25 73 22 2c  Parse, "%s: %s",
4460: 20 7a 45 72 72 2c 20 7a 43 6f 6c 29 3b 0a 20 20   zErr, zCol);.  
4470: 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e    }.    pParse->
4480: 63 68 65 63 6b 53 63 68 65 6d 61 20 3d 20 31 3b  checkSchema = 1;
4490: 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72  .    pTopNC->nEr
44a0: 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49  r++;.  }..  /* I
44b0: 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20  f a column from 
44c0: 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c  a table in pSrcL
44d0: 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63 65  ist is reference
44e0: 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20  d, then record. 
44f0: 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e   ** this fact in
4500: 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b   the pSrcList.a[
4510: 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73  ].colUsed bitmas
4520: 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75  k.  Column 0 cau
4530: 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74  ses.  ** bit 0 t
4540: 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d  o be set.  Colum
4550: 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e 20  n 1 sets bit 1. 
4560: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20   And so forth.  
4570: 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75  If the.  ** colu
4580: 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65  mn number is gre
4590: 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75  ater than the nu
45a0: 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20  mber of bits in 
45b0: 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a  the bitmask.  **
45c0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68 69   then set the hi
45d0: 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20  gh-order bit of 
45e0: 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a  the bitmask..  *
45f0: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69  /.  if( pExpr->i
4600: 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61  Column>=0 && pMa
4610: 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e  tch!=0 ){.    in
4620: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f  t n = pExpr->iCo
4630: 6c 75 6d 6e 3b 0a 20 20 20 20 74 65 73 74 63 61  lumn;.    testca
4640: 73 65 28 20 6e 3d 3d 42 4d 53 2d 31 20 29 3b 0a  se( n==BMS-1 );.
4650: 20 20 20 20 69 66 28 20 6e 3e 3d 42 4d 53 20 29      if( n>=BMS )
4660: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 42 4d 53 2d  {.      n = BMS-
4670: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
4680: 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75  ert( pMatch->iCu
4690: 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  rsor==pExpr->iTa
46a0: 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63  ble );.    pMatc
46b0: 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 28 28  h->colUsed |= ((
46c0: 42 69 74 6d 61 73 6b 29 31 29 3c 3c 6e 3b 0a 20  Bitmask)1)<<n;. 
46d0: 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75   }..  /* Clean u
46e0: 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a  p and return.  *
46f0: 2f 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  /.  sqlite3ExprD
4700: 65 6c 65 74 65 28 64 62 2c 20 70 45 78 70 72 2d  elete(db, pExpr-
4710: 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72  >pLeft);.  pExpr
4720: 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73  ->pLeft = 0;.  s
4730: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4740: 28 64 62 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  (db, pExpr->pRig
4750: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
4760: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
4770: 72 2d 3e 6f 70 20 3d 20 65 4e 65 77 45 78 70 72  r->op = eNewExpr
4780: 4f 70 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f  Op;.  ExprSetPro
4790: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
47a0: 4c 65 61 66 29 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d  Leaf);.lookupnam
47b0: 65 5f 65 6e 64 3a 0a 20 20 69 66 28 20 63 6e 74  e_end:.  if( cnt
47c0: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
47d0: 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  t( pNC!=0 );.   
47e0: 20 69 66 28 20 21 45 78 70 72 48 61 73 50 72 6f   if( !ExprHasPro
47f0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
4800: 41 6c 69 61 73 29 20 29 7b 0a 20 20 20 20 20 20  Alias) ){.      
4810: 73 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28  sqlite3AuthRead(
4820: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70  pParse, pExpr, p
4830: 53 63 68 65 6d 61 2c 20 70 4e 43 2d 3e 70 53 72  Schema, pNC->pSr
4840: 63 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a 20 20  cList);.    }.  
4850: 20 20 2f 2a 20 49 6e 63 72 65 6d 65 6e 74 20 74    /* Increment t
4860: 68 65 20 6e 52 65 66 20 76 61 6c 75 65 20 6f 6e  he nRef value on
4870: 20 61 6c 6c 20 6e 61 6d 65 20 63 6f 6e 74 65 78   all name contex
4880: 74 73 20 66 72 6f 6d 20 54 6f 70 4e 43 20 75 70  ts from TopNC up
4890: 20 74 6f 0a 20 20 20 20 2a 2a 20 74 68 65 20 70   to.    ** the p
48a0: 6f 69 6e 74 20 77 68 65 72 65 20 74 68 65 20 6e  oint where the n
48b0: 61 6d 65 20 6d 61 74 63 68 65 64 2e 20 2a 2f 0a  ame matched. */.
48c0: 20 20 20 20 66 6f 72 28 3b 3b 29 7b 0a 20 20 20      for(;;){.   
48d0: 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 70 4e     assert( pTopN
48e0: 43 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 70 54  C!=0 );.      pT
48f0: 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20  opNC->nRef++;.  
4900: 20 20 20 20 69 66 28 20 70 54 6f 70 4e 43 3d 3d      if( pTopNC==
4910: 70 4e 43 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  pNC ) break;.   
4920: 20 20 20 70 54 6f 70 4e 43 20 3d 20 70 54 6f 70     pTopNC = pTop
4930: 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d  NC->pNext;.    }
4940: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
4950: 50 72 75 6e 65 3b 0a 20 20 7d 20 65 6c 73 65 20  Prune;.  } else 
4960: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43  {.    return WRC
4970: 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 7d 0a 0a 2f  _Abort;.  }.}../
4980: 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 61 6e  *.** Allocate an
4990: 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  d return a point
49a0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
49b0: 69 6f 6e 20 74 6f 20 6c 6f 61 64 20 74 68 65 20  ion to load the 
49c0: 63 6f 6c 75 6d 6e 20 69 43 6f 6c 0a 2a 2a 20 66  column iCol.** f
49d0: 72 6f 6d 20 64 61 74 61 73 6f 75 72 63 65 20 69  rom datasource i
49e0: 53 72 63 20 69 6e 20 53 72 63 4c 69 73 74 20 70  Src in SrcList p
49f0: 53 72 63 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  Src..*/.Expr *sq
4a00: 6c 69 74 65 33 43 72 65 61 74 65 43 6f 6c 75 6d  lite3CreateColum
4a10: 6e 45 78 70 72 28 73 71 6c 69 74 65 33 20 2a 64  nExpr(sqlite3 *d
4a20: 62 2c 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  b, SrcList *pSrc
4a30: 2c 20 69 6e 74 20 69 53 72 63 2c 20 69 6e 74 20  , int iSrc, int 
4a40: 69 43 6f 6c 29 7b 0a 20 20 45 78 70 72 20 2a 70  iCol){.  Expr *p
4a50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4a60: 6c 6f 63 28 64 62 2c 20 54 4b 5f 43 4f 4c 55 4d  loc(db, TK_COLUM
4a70: 4e 2c 20 30 2c 20 30 29 3b 0a 20 20 69 66 28 20  N, 0, 0);.  if( 
4a80: 70 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  p ){.    struct 
4a90: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
4aa0: 74 65 6d 20 3d 20 26 70 53 72 63 2d 3e 61 5b 69  tem = &pSrc->a[i
4ab0: 53 72 63 5d 3b 0a 20 20 20 20 70 2d 3e 70 54 61  Src];.    p->pTa
4ac0: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
4ad0: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
4ae0: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
4af0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 70 54 61 62  .    if( p->pTab
4b00: 2d 3e 69 50 4b 65 79 3d 3d 69 43 6f 6c 20 29 7b  ->iPKey==iCol ){
4b10: 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c 75 6d  .      p->iColum
4b20: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 7d 65 6c 73  n = -1;.    }els
4b30: 65 7b 0a 20 20 20 20 20 20 70 2d 3e 69 43 6f 6c  e{.      p->iCol
4b40: 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 69 43 6f  umn = (ynVar)iCo
4b50: 6c 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  l;.      testcas
4b60: 65 28 20 69 43 6f 6c 3d 3d 42 4d 53 20 29 3b 0a  e( iCol==BMS );.
4b70: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
4b80: 69 43 6f 6c 3d 3d 42 4d 53 2d 31 20 29 3b 0a 20  iCol==BMS-1 );. 
4b90: 20 20 20 20 20 70 49 74 65 6d 2d 3e 63 6f 6c 55       pItem->colU
4ba0: 73 65 64 20 7c 3d 20 28 28 42 69 74 6d 61 73 6b  sed |= ((Bitmask
4bb0: 29 31 29 3c 3c 28 69 43 6f 6c 3e 3d 42 4d 53 20  )1)<<(iCol>=BMS 
4bc0: 3f 20 42 4d 53 2d 31 20 3a 20 69 43 6f 6c 29 3b  ? BMS-1 : iCol);
4bd0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4be0: 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn p;.}../*.** 
4bf0: 52 65 70 6f 72 74 20 61 6e 20 65 72 72 6f 72 20  Report an error 
4c00: 74 68 61 74 20 61 6e 20 65 78 70 72 65 73 73 69  that an expressi
4c10: 6f 6e 20 69 73 20 6e 6f 74 20 76 61 6c 69 64 20  on is not valid 
4c20: 66 6f 72 20 73 6f 6d 65 20 73 65 74 20 6f 66 0a  for some set of.
4c30: 2a 2a 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  ** pNC->ncFlags 
4c40: 76 61 6c 75 65 73 20 64 65 74 65 72 6d 69 6e 65  values determine
4c50: 64 20 62 79 20 76 61 6c 69 64 4d 61 73 6b 2e 0a  d by validMask..
4c60: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 6e  */.static void n
4c70: 6f 74 56 61 6c 69 64 28 0a 20 20 50 61 72 73 65  otValid(.  Parse
4c80: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
4c90: 2f 2a 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  /* Leave error m
4ca0: 65 73 73 61 67 65 20 68 65 72 65 20 2a 2f 0a 20  essage here */. 
4cb0: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
4cc0: 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d  C,    /* The nam
4cd0: 65 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 63  e context */.  c
4ce0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4d 73 67 2c  onst char *zMsg,
4cf0: 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66 20 65      /* Type of e
4d00: 72 72 6f 72 20 2a 2f 0a 20 20 69 6e 74 20 76 61  rror */.  int va
4d10: 6c 69 64 4d 61 73 6b 20 20 20 20 20 20 20 20 2f  lidMask        /
4d20: 2a 20 53 65 74 20 6f 66 20 63 6f 6e 74 65 78 74  * Set of context
4d30: 73 20 66 6f 72 20 77 68 69 63 68 20 70 72 6f 68  s for which proh
4d40: 69 62 69 74 65 64 20 2a 2f 0a 29 7b 0a 20 20 61  ibited */.){.  a
4d50: 73 73 65 72 74 28 20 28 76 61 6c 69 64 4d 61 73  ssert( (validMas
4d60: 6b 26 7e 28 4e 43 5f 49 73 43 68 65 63 6b 7c 4e  k&~(NC_IsCheck|N
4d70: 43 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78  C_PartIdx|NC_Idx
4d80: 45 78 70 72 29 29 3d 3d 30 20 29 3b 0a 20 20 69  Expr))==0 );.  i
4d90: 66 28 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  f( (pNC->ncFlags
4da0: 20 26 20 76 61 6c 69 64 4d 61 73 6b 29 21 3d 30   & validMask)!=0
4db0: 20 29 7b 0a 20 20 20 20 63 6f 6e 73 74 20 63 68   ){.    const ch
4dc0: 61 72 20 2a 7a 49 6e 20 3d 20 22 70 61 72 74 69  ar *zIn = "parti
4dd0: 61 6c 20 69 6e 64 65 78 20 57 48 45 52 45 20 63  al index WHERE c
4de0: 6c 61 75 73 65 73 22 3b 0a 20 20 20 20 69 66 28  lauses";.    if(
4df0: 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26 20   pNC->ncFlags & 
4e00: 4e 43 5f 49 64 78 45 78 70 72 20 29 20 20 20 20  NC_IdxExpr )    
4e10: 20 20 7a 49 6e 20 3d 20 22 69 6e 64 65 78 20 65    zIn = "index e
4e20: 78 70 72 65 73 73 69 6f 6e 73 22 3b 0a 23 69 66  xpressions";.#if
4e30: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
4e40: 5f 43 48 45 43 4b 0a 20 20 20 20 65 6c 73 65 20  _CHECK.    else 
4e50: 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73  if( pNC->ncFlags
4e60: 20 26 20 4e 43 5f 49 73 43 68 65 63 6b 20 29 20   & NC_IsCheck ) 
4e70: 7a 49 6e 20 3d 20 22 43 48 45 43 4b 20 63 6f 6e  zIn = "CHECK con
4e80: 73 74 72 61 69 6e 74 73 22 3b 0a 23 65 6e 64 69  straints";.#endi
4e90: 66 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  f.    sqlite3Err
4ea0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 25  orMsg(pParse, "%
4eb0: 73 20 70 72 6f 68 69 62 69 74 65 64 20 69 6e 20  s prohibited in 
4ec0: 25 73 22 2c 20 7a 4d 73 67 2c 20 7a 49 6e 29 3b  %s", zMsg, zIn);
4ed0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 78  .  }.}../*.** Ex
4ee0: 70 72 65 73 73 69 6f 6e 20 70 20 73 68 6f 75 6c  pression p shoul
4ef0: 64 20 65 6e 63 6f 64 65 20 61 20 66 6c 6f 61 74  d encode a float
4f00: 69 6e 67 20 70 6f 69 6e 74 20 76 61 6c 75 65 20  ing point value 
4f10: 62 65 74 77 65 65 6e 20 31 2e 30 20 61 6e 64 20  between 1.0 and 
4f20: 30 2e 30 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 31  0.0..** Return 1
4f30: 30 32 34 20 74 69 6d 65 73 20 74 68 69 73 20 76  024 times this v
4f40: 61 6c 75 65 2e 20 20 4f 72 20 72 65 74 75 72 6e  alue.  Or return
4f50: 20 2d 31 20 69 66 20 70 20 69 73 20 6e 6f 74 20   -1 if p is not 
4f60: 61 20 66 6c 6f 61 74 69 6e 67 20 70 6f 69 6e 74  a floating point
4f70: 0a 2a 2a 20 76 61 6c 75 65 20 62 65 74 77 65 65  .** value betwee
4f80: 6e 20 31 2e 30 20 61 6e 64 20 30 2e 30 2e 0a 2a  n 1.0 and 0.0..*
4f90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
4fa0: 72 50 72 6f 62 61 62 69 6c 69 74 79 28 45 78 70  rProbability(Exp
4fb0: 72 20 2a 70 29 7b 0a 20 20 64 6f 75 62 6c 65 20  r *p){.  double 
4fc0: 72 20 3d 20 2d 31 2e 30 3b 0a 20 20 69 66 28 20  r = -1.0;.  if( 
4fd0: 70 2d 3e 6f 70 21 3d 54 4b 5f 46 4c 4f 41 54 20  p->op!=TK_FLOAT 
4fe0: 29 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 73  ) return -1;.  s
4ff0: 71 6c 69 74 65 33 41 74 6f 46 28 70 2d 3e 75 2e  qlite3AtoF(p->u.
5000: 7a 54 6f 6b 65 6e 2c 20 26 72 2c 20 73 71 6c 69  zToken, &r, sqli
5010: 74 65 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75  te3Strlen30(p->u
5020: 2e 7a 54 6f 6b 65 6e 29 2c 20 53 51 4c 49 54 45  .zToken), SQLITE
5030: 5f 55 54 46 38 29 3b 0a 20 20 61 73 73 65 72 74  _UTF8);.  assert
5040: 28 20 72 3e 3d 30 2e 30 20 29 3b 0a 20 20 69 66  ( r>=0.0 );.  if
5050: 28 20 72 3e 31 2e 30 20 29 20 72 65 74 75 72 6e  ( r>1.0 ) return
5060: 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 28 69   -1;.  return (i
5070: 6e 74 29 28 72 2a 31 33 34 32 31 37 37 32 38 2e  nt)(r*134217728.
5080: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  0);.}../*.** Thi
5090: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
50a0: 6c 62 61 63 6b 20 66 6f 72 20 73 71 6c 69 74 65  lback for sqlite
50b0: 33 57 61 6c 6b 45 78 70 72 28 29 2e 0a 2a 2a 0a  3WalkExpr()..**.
50c0: 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f  ** Resolve symbo
50d0: 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54  lic names into T
50e0: 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f  K_COLUMN operato
50f0: 72 73 20 66 6f 72 20 74 68 65 20 63 75 72 72 65  rs for the curre
5100: 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68  nt.** node in th
5110: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  e expression tre
5120: 65 2e 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20  e.  Return 0 to 
5130: 63 6f 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61  continue the sea
5140: 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20  rch down.** the 
5150: 74 72 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f  tree or 2 to abo
5160: 72 74 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  rt the tree walk
5170: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
5180: 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65  tine also does e
5190: 72 72 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e  rror checking an
51a0: 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f  d name resolutio
51b0: 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f  n for.** functio
51c0: 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70  n names.  The op
51d0: 65 72 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65  erator for aggre
51e0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69  gate functions i
51f0: 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20  s changed.** to 
5200: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e  TK_AGG_FUNCTION.
5210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72  .*/.static int r
5220: 65 73 6f 6c 76 65 45 78 70 72 53 74 65 70 28 57  esolveExprStep(W
5230: 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20  alker *pWalker, 
5240: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
5250: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
5260: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
5270: 65 3b 0a 0a 20 20 70 4e 43 20 3d 20 70 57 61 6c  e;..  pNC = pWal
5280: 6b 65 72 2d 3e 75 2e 70 4e 43 3b 0a 20 20 61 73  ker->u.pNC;.  as
5290: 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a  sert( pNC!=0 );.
52a0: 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e    pParse = pNC->
52b0: 70 50 61 72 73 65 3b 0a 20 20 61 73 73 65 72 74  pParse;.  assert
52c0: 28 20 70 50 61 72 73 65 3d 3d 70 57 61 6c 6b 65  ( pParse==pWalke
52d0: 72 2d 3e 70 50 61 72 73 65 20 29 3b 0a 0a 23 69  r->pParse );..#i
52e0: 66 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69  fndef NDEBUG.  i
52f0: 66 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74  f( pNC->pSrcList
5300: 20 26 26 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73   && pNC->pSrcLis
5310: 74 2d 3e 6e 41 6c 6c 6f 63 3e 30 20 29 7b 0a 20  t->nAlloc>0 ){. 
5320: 20 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63     SrcList *pSrc
5330: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
5340: 4c 69 73 74 3b 0a 20 20 20 20 69 6e 74 20 69 3b  List;.    int i;
5350: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
5360: 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 2d 3e 6e  pNC->pSrcList->n
5370: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Src; i++){.     
5380: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
5390: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e  t->a[i].iCursor>
53a0: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  =0 && pSrcList->
53b0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61  a[i].iCursor<pPa
53c0: 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20 20  rse->nTab);.    
53d0: 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 73  }.  }.#endif.  s
53e0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
53f0: 20 29 7b 0a 0a 23 69 66 20 64 65 66 69 6e 65 64   ){..#if defined
5400: 28 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55  (SQLITE_ENABLE_U
5410: 50 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d  PDATE_DELETE_LIM
5420: 49 54 29 20 26 26 20 21 64 65 66 69 6e 65 64 28  IT) && !defined(
5430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
5440: 55 45 52 59 29 0a 20 20 20 20 2f 2a 20 54 68 65  UERY).    /* The
5450: 20 73 70 65 63 69 61 6c 20 6f 70 65 72 61 74 6f   special operato
5460: 72 20 54 4b 5f 52 4f 57 20 6d 65 61 6e 73 20 75  r TK_ROW means u
5470: 73 65 20 74 68 65 20 72 6f 77 69 64 20 66 6f 72  se the rowid for
5480: 20 74 68 65 20 66 69 72 73 74 0a 20 20 20 20 2a   the first.    *
5490: 2a 20 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20  * column in the 
54a0: 46 52 4f 4d 20 63 6c 61 75 73 65 2e 20 20 54 68  FROM clause.  Th
54b0: 69 73 20 69 73 20 75 73 65 64 20 62 79 20 74 68  is is used by th
54c0: 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 52 44 45  e LIMIT and ORDE
54d0: 52 20 42 59 0a 20 20 20 20 2a 2a 20 63 6c 61 75  R BY.    ** clau
54e0: 73 65 20 70 72 6f 63 65 73 73 69 6e 67 20 6f 6e  se processing on
54f0: 20 55 50 44 41 54 45 20 61 6e 64 20 44 45 4c 45   UPDATE and DELE
5500: 54 45 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  TE statements.. 
5510: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
5520: 4b 5f 52 4f 57 3a 20 7b 0a 20 20 20 20 20 20 53  K_ROW: {.      S
5530: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
5540: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
5550: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 53  ;.      struct S
5560: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
5570: 65 6d 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  em;.      assert
5580: 28 20 70 53 72 63 4c 69 73 74 20 26 26 20 70 53  ( pSrcList && pS
5590: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3d 3d 31 20  rcList->nSrc==1 
55a0: 29 3b 0a 20 20 20 20 20 20 70 49 74 65 6d 20 3d  );.      pItem =
55b0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b 0a 20 20   pSrcList->a;.  
55c0: 20 20 20 20 61 73 73 65 72 74 28 20 48 61 73 52      assert( HasR
55d0: 6f 77 69 64 28 70 49 74 65 6d 2d 3e 70 54 61 62  owid(pItem->pTab
55e0: 29 20 26 26 20 70 49 74 65 6d 2d 3e 70 54 61 62  ) && pItem->pTab
55f0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 0a  ->pSelect==0 );.
5600: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
5610: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20  = TK_COLUMN;.   
5620: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
5630: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
5640: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5650: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
5660: 6f 72 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  or;.      pExpr-
5670: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
5680: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
5690: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
56a0: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 20  F_INTEGER;.     
56b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
56c0: 6e 64 69 66 20 2f 2a 20 64 65 66 69 6e 65 64 28  ndif /* defined(
56d0: 53 51 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 50  SQLITE_ENABLE_UP
56e0: 44 41 54 45 5f 44 45 4c 45 54 45 5f 4c 49 4d 49  DATE_DELETE_LIMI
56f0: 54 29 0a 20 20 20 20 20 20 20 20 20 20 26 26 20  T).          && 
5700: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
5710: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 20 2a  OMIT_SUBQUERY) *
5720: 2f 0a 0a 20 20 20 20 2f 2a 20 41 20 63 6f 6c 75  /..    /* A colu
5730: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 20 20 20  mn name:        
5740: 20 20 20 20 20 20 20 20 20 20 20 20 49 44 0a 20              ID. 
5750: 20 20 20 2a 2a 20 4f 72 20 74 61 62 6c 65 20 6e     ** Or table n
5760: 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e  ame and column n
5770: 61 6d 65 3a 20 20 20 20 49 44 2e 49 44 0a 20 20  ame:    ID.ID.  
5780: 20 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61    ** Or a databa
5790: 73 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f  se, table and co
57a0: 6c 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a  lumn:  ID.ID.ID.
57b0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68      **.    ** Th
57c0: 65 20 54 4b 5f 49 44 20 61 6e 64 20 54 4b 5f 4f  e TK_ID and TK_O
57d0: 55 54 20 63 61 73 65 73 20 61 72 65 20 63 6f 6d  UT cases are com
57e0: 62 69 6e 65 64 20 73 6f 20 74 68 61 74 20 74 68  bined so that th
57f0: 65 72 65 20 77 69 6c 6c 20 6f 6e 6c 79 0a 20 20  ere will only.  
5800: 20 20 2a 2a 20 62 65 20 6f 6e 65 20 63 61 6c 6c    ** be one call
5810: 20 74 6f 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 29   to lookupName()
5820: 2e 20 20 54 68 65 6e 20 74 68 65 20 63 6f 6d 70  .  Then the comp
5830: 69 6c 65 72 20 77 69 6c 6c 20 69 6e 2d 6c 69 6e  iler will in-lin
5840: 65 20 0a 20 20 20 20 2a 2a 20 6c 6f 6f 6b 75 70  e .    ** lookup
5850: 4e 61 6d 65 28 29 20 66 6f 72 20 61 20 73 69 7a  Name() for a siz
5860: 65 20 72 65 64 75 63 74 69 6f 6e 20 61 6e 64 20  e reduction and 
5870: 70 65 72 66 6f 72 6d 61 6e 63 65 20 69 6e 63 72  performance incr
5880: 65 61 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  ease..    */.   
5890: 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20   case TK_ID:.   
58a0: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a   case TK_DOT: {.
58b0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
58c0: 20 2a 7a 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20   *zColumn;.     
58d0: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 61   const char *zTa
58e0: 62 6c 65 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74  ble;.      const
58f0: 20 63 68 61 72 20 2a 7a 44 62 3b 0a 20 20 20 20   char *zDb;.    
5900: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a    Expr *pRight;.
5910: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
5920: 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20  ->op==TK_ID ){. 
5930: 20 20 20 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a         zDb = 0;.
5940: 20 20 20 20 20 20 20 20 7a 54 61 62 6c 65 20 3d          zTable =
5950: 20 30 3b 0a 20 20 20 20 20 20 20 20 7a 43 6f 6c   0;.        zCol
5960: 75 6d 6e 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a  umn = pExpr->u.z
5970: 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  Token;.      }el
5980: 73 65 7b 0a 20 20 20 20 20 20 20 20 6e 6f 74 56  se{.        notV
5990: 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70 4e 43  alid(pParse, pNC
59a0: 2c 20 22 74 68 65 20 5c 22 2e 5c 22 20 6f 70 65  , "the \".\" ope
59b0: 72 61 74 6f 72 22 2c 20 4e 43 5f 49 64 78 45 78  rator", NC_IdxEx
59c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 70 52 69  pr);.        pRi
59d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
59e0: 67 68 74 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ght;.        if(
59f0: 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f   pRight->op==TK_
5a00: 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ID ){.          
5a10: 7a 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20  zDb = 0;.       
5a20: 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 45 78 70     zTable = pExp
5a30: 72 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f 6b  r->pLeft->u.zTok
5a40: 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7a 43  en;.          zC
5a50: 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d 3e  olumn = pRight->
5a60: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  u.zToken;.      
5a70: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
5a80: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
5a90: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
5aa0: 0a 20 20 20 20 20 20 20 20 20 20 7a 44 62 20 3d  .          zDb =
5ab0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 75   pExpr->pLeft->u
5ac0: 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  .zToken;.       
5ad0: 20 20 20 7a 54 61 62 6c 65 20 3d 20 70 52 69 67     zTable = pRig
5ae0: 68 74 2d 3e 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  ht->pLeft->u.zTo
5af0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7a  ken;.          z
5b00: 43 6f 6c 75 6d 6e 20 3d 20 70 52 69 67 68 74 2d  Column = pRight-
5b10: 3e 70 52 69 67 68 74 2d 3e 75 2e 7a 54 6f 6b 65  >pRight->u.zToke
5b20: 6e 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  n;.        }.   
5b30: 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72     }.      retur
5b40: 6e 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61  n lookupName(pPa
5b50: 72 73 65 2c 20 7a 44 62 2c 20 7a 54 61 62 6c 65  rse, zDb, zTable
5b60: 2c 20 7a 43 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20  , zColumn, pNC, 
5b70: 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 0a 20  pExpr);.    }.. 
5b80: 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 66 75     /* Resolve fu
5b90: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20 20 20  nction names.   
5ba0: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
5bb0: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
5bc0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
5bd0: 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  t = pExpr->x.pLi
5be0: 73 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72  st;    /* The ar
5bf0: 67 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20  gument list */. 
5c00: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69       int n = pLi
5c10: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
5c20: 72 20 3a 20 30 3b 20 20 20 20 2f 2a 20 4e 75 6d  r : 0;    /* Num
5c30: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
5c40: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
5c50: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20  _such_func = 0; 
5c60: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
5c70: 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f   no such functio
5c80: 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  n exists */.    
5c90: 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f    int wrong_num_
5ca0: 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a  args = 0;     /*
5cb0: 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e   True if wrong n
5cc0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
5cd0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
5ce0: 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20  is_agg = 0;     
5cf0: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
5d00: 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  if is an aggrega
5d10: 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
5d20: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
5d30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5d40: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
5d50: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
5d60: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
5d70: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
5d80: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
5d90: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
5da0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
5db0: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
5dc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
5dd0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
5de0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
5df0: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 45 4e       u8 enc = EN
5e00: 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b 20 20  C(pParse->db);  
5e10: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
5e20: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
5e30: 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78 70      assert( !Exp
5e40: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
5e50: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
5e60: 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64 20 3d  ) );.      zId =
5e70: 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
5e80: 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20 73 71  ;.      nId = sq
5e90: 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 49  lite3Strlen30(zI
5ea0: 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d  d);.      pDef =
5eb0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
5ec0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
5ed0: 20 7a 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29   zId, n, enc, 0)
5ee0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  ;.      if( pDef
5ef0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
5f00: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
5f10: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
5f20: 2d 3e 64 62 2c 20 7a 49 64 2c 20 2d 32 2c 20 65  ->db, zId, -2, e
5f30: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
5f40: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
5f50: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
5f60: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
5f70: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
5f80: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
5f90: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
5fa0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
5fb0: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
5fc0: 70 44 65 66 2d 3e 78 46 69 6e 61 6c 69 7a 65 21  pDef->xFinalize!
5fd0: 3d 30 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  =0;.        if( 
5fe0: 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20  pDef->funcFlags 
5ff0: 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e  & SQLITE_FUNC_UN
6000: 4c 49 4b 45 4c 59 20 29 7b 0a 20 20 20 20 20 20  LIKELY ){.      
6010: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
6020: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e  rty(pExpr, EP_Un
6030: 6c 69 6b 65 6c 79 7c 45 50 5f 53 6b 69 70 29 3b  likely|EP_Skip);
6040: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 6e  .          if( n
6050: 3d 3d 32 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==2 ){.         
6060: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6070: 20 3d 20 65 78 70 72 50 72 6f 62 61 62 69 6c 69   = exprProbabili
6080: 74 79 28 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  ty(pList->a[1].p
6090: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20  Expr);.         
60a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54     if( pExpr->iT
60b0: 61 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20  able<0 ){.      
60c0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
60d0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a  rrorMsg(pParse,.
60e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
60f0: 22 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74  "second argument
6100: 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   to likelihood()
6110: 20 6d 75 73 74 20 62 65 20 61 20 22 0a 20 20 20   must be a ".   
6120: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 63 6f               "co
6130: 6e 73 74 61 6e 74 20 62 65 74 77 65 65 6e 20 30  nstant between 0
6140: 2e 30 20 61 6e 64 20 31 2e 30 22 29 3b 0a 20 20  .0 and 1.0");.  
6150: 20 20 20 20 20 20 20 20 20 20 20 20 70 4e 43 2d              pNC-
6160: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20  >nErr++;.       
6170: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6180: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
6190: 20 20 20 20 2f 2a 20 45 56 49 44 45 4e 43 45 2d      /* EVIDENCE-
61a0: 4f 46 3a 20 52 2d 36 31 33 30 34 2d 32 39 34 34  OF: R-61304-2944
61b0: 39 20 54 68 65 20 75 6e 6c 69 6b 65 6c 79 28 58  9 The unlikely(X
61c0: 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 20 20  ) function is.  
61d0: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 65 71 75            ** equ
61e0: 69 76 61 6c 65 6e 74 20 74 6f 20 6c 69 6b 65 6c  ivalent to likel
61f0: 69 68 6f 6f 64 28 58 2c 20 30 2e 30 36 32 35 29  ihood(X, 0.0625)
6200: 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a  ..            **
6210: 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20 52 2d   EVIDENCE-OF: R-
6220: 30 31 32 38 33 2d 31 31 36 33 36 20 54 68 65 20  01283-11636 The 
6230: 75 6e 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63  unlikely(X) func
6240: 74 69 6f 6e 20 69 73 0a 20 20 20 20 20 20 20 20  tion is.        
6250: 20 20 20 20 2a 2a 20 73 68 6f 72 74 2d 68 61 6e      ** short-han
6260: 64 20 66 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64  d for likelihood
6270: 28 58 2c 30 2e 30 36 32 35 29 2e 0a 20 20 20 20  (X,0.0625)..    
6280: 20 20 20 20 20 20 20 20 2a 2a 20 45 56 49 44 45          ** EVIDE
6290: 4e 43 45 2d 4f 46 3a 20 52 2d 33 36 38 35 30 2d  NCE-OF: R-36850-
62a0: 33 34 31 32 37 20 54 68 65 20 6c 69 6b 65 6c 79  34127 The likely
62b0: 28 58 29 20 66 75 6e 63 74 69 6f 6e 20 69 73 20  (X) function is 
62c0: 73 68 6f 72 74 2d 68 61 6e 64 0a 20 20 20 20 20  short-hand.     
62d0: 20 20 20 20 20 20 20 2a 2a 20 66 6f 72 20 6c 69         ** for li
62e0: 6b 65 6c 69 68 6f 6f 64 28 58 2c 30 2e 39 33 37  kelihood(X,0.937
62f0: 35 29 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20  5)..            
6300: 2a 2a 20 45 56 49 44 45 4e 43 45 2d 4f 46 3a 20  ** EVIDENCE-OF: 
6310: 52 2d 35 33 34 33 36 2d 34 30 39 37 33 20 54 68  R-53436-40973 Th
6320: 65 20 6c 69 6b 65 6c 79 28 58 29 20 66 75 6e 63  e likely(X) func
6330: 74 69 6f 6e 20 69 73 20 65 71 75 69 76 61 6c 65  tion is equivale
6340: 6e 74 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  nt.            *
6350: 2a 20 74 6f 20 6c 69 6b 65 6c 69 68 6f 6f 64 28  * to likelihood(
6360: 58 2c 30 2e 39 33 37 35 29 2e 20 2a 2f 0a 20 20  X,0.9375). */.  
6370: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 55 4e            /* TUN
6380: 49 4e 47 3a 20 75 6e 6c 69 6b 65 6c 79 28 29 20  ING: unlikely() 
6390: 70 72 6f 62 61 62 69 6c 69 74 79 20 69 73 20 30  probability is 0
63a0: 2e 30 36 32 35 2e 20 20 6c 69 6b 65 6c 79 28 29  .0625.  likely()
63b0: 20 69 73 20 30 2e 39 33 37 35 20 2a 2f 0a 20 20   is 0.9375 */.  
63c0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
63d0: 3e 69 54 61 62 6c 65 20 3d 20 70 44 65 66 2d 3e  >iTable = pDef->
63e0: 7a 4e 61 6d 65 5b 30 5d 3d 3d 27 75 27 20 3f 20  zName[0]=='u' ? 
63f0: 38 33 38 38 36 30 38 20 3a 20 31 32 35 38 32 39  8388608 : 125829
6400: 31 32 30 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  120;.          }
6410: 20 20 20 20 20 20 20 20 20 20 20 20 20 0a 20 20               .  
6420: 20 20 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20        }.#ifndef 
6430: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 41 55 54 48  SQLITE_OMIT_AUTH
6440: 4f 52 49 5a 41 54 49 4f 4e 0a 20 20 20 20 20 20  ORIZATION.      
6450: 20 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e    {.          in
6460: 74 20 61 75 74 68 20 3d 20 73 71 6c 69 74 65 33  t auth = sqlite3
6470: 41 75 74 68 43 68 65 63 6b 28 70 50 61 72 73 65  AuthCheck(pParse
6480: 2c 20 53 51 4c 49 54 45 5f 46 55 4e 43 54 49 4f  , SQLITE_FUNCTIO
6490: 4e 2c 20 30 2c 70 44 65 66 2d 3e 7a 4e 61 6d 65  N, 0,pDef->zName
64a0: 2c 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  ,0);.          i
64b0: 66 28 20 61 75 74 68 21 3d 53 51 4c 49 54 45 5f  f( auth!=SQLITE_
64c0: 4f 4b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  OK ){.          
64d0: 20 20 69 66 28 20 61 75 74 68 3d 3d 53 51 4c 49    if( auth==SQLI
64e0: 54 45 5f 44 45 4e 59 20 29 7b 0a 20 20 20 20 20  TE_DENY ){.     
64f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
6500: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
6510: 20 22 6e 6f 74 20 61 75 74 68 6f 72 69 7a 65 64   "not authorized
6520: 20 74 6f 20 75 73 65 20 66 75 6e 63 74 69 6f 6e   to use function
6530: 3a 20 25 73 22 2c 0a 20 20 20 20 20 20 20 20 20  : %s",.         
6540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
6550: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 44 65               pDe
6560: 66 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  f->zName);.     
6570: 20 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45           pNC->nE
6580: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  rr++;.          
6590: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
65a0: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 4e  pExpr->op = TK_N
65b0: 55 4c 4c 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ULL;.           
65c0: 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72 75 6e   return WRC_Prun
65d0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  e;.          }. 
65e0: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
65f0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
6600: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 28 53  ->funcFlags & (S
6610: 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54  QLITE_FUNC_CONST
6620: 41 4e 54 7c 53 51 4c 49 54 45 5f 46 55 4e 43 5f  ANT|SQLITE_FUNC_
6630: 53 4c 4f 43 48 4e 47 29 20 29 7b 0a 20 20 20 20  SLOCHNG) ){.    
6640: 20 20 20 20 20 20 2f 2a 20 46 6f 72 20 74 68 65        /* For the
6650: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 65   purposes of the
6660: 20 45 50 5f 43 6f 6e 73 74 46 75 6e 63 20 66 6c   EP_ConstFunc fl
6670: 61 67 2c 20 64 61 74 65 20 61 6e 64 20 74 69 6d  ag, date and tim
6680: 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20 66  e.          ** f
6690: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 20 6f 74 68  unctions and oth
66a0: 65 72 20 66 75 6e 63 74 69 6f 6e 73 20 74 68 61  er functions tha
66b0: 74 20 63 68 61 6e 67 65 20 73 6c 6f 77 6c 79 20  t change slowly 
66c0: 61 72 65 20 63 6f 6e 73 69 64 65 72 65 64 0a 20  are considered. 
66d0: 20 20 20 20 20 20 20 20 20 2a 2a 20 63 6f 6e 73           ** cons
66e0: 74 61 6e 74 20 62 65 63 61 75 73 65 20 74 68 65  tant because the
66f0: 79 20 61 72 65 20 63 6f 6e 73 74 61 6e 74 20 66  y are constant f
6700: 6f 72 20 74 68 65 20 64 75 72 61 74 69 6f 6e 20  or the duration 
6710: 6f 66 20 6f 6e 65 20 71 75 65 72 79 20 2a 2f 0a  of one query */.
6720: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65            ExprSe
6730: 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  tProperty(pExpr,
6740: 45 50 5f 43 6f 6e 73 74 46 75 6e 63 29 3b 0a 20  EP_ConstFunc);. 
6750: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6760: 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75 6e 63   if( (pDef->func
6770: 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 46  Flags & SQLITE_F
6780: 55 4e 43 5f 43 4f 4e 53 54 41 4e 54 29 3d 3d 30  UNC_CONSTANT)==0
6790: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
67a0: 20 44 61 74 65 2f 74 69 6d 65 20 66 75 6e 63 74   Date/time funct
67b0: 69 6f 6e 73 20 74 68 61 74 20 75 73 65 20 27 6e  ions that use 'n
67c0: 6f 77 27 2c 20 61 6e 64 20 6f 74 68 65 72 20 66  ow', and other f
67d0: 75 6e 63 74 69 6f 6e 73 20 6c 69 6b 65 0a 20 20  unctions like.  
67e0: 20 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74          ** sqlit
67f0: 65 5f 76 65 72 73 69 6f 6e 28 29 20 74 68 61 74  e_version() that
6800: 20 6d 69 67 68 74 20 63 68 61 6e 67 65 20 6f 76   might change ov
6810: 65 72 20 74 69 6d 65 20 63 61 6e 6e 6f 74 20 62  er time cannot b
6820: 65 20 75 73 65 64 0a 20 20 20 20 20 20 20 20 20  e used.         
6830: 20 2a 2a 20 69 6e 20 61 6e 20 69 6e 64 65 78 2e   ** in an index.
6840: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   */.          no
6850: 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20 70  tValid(pParse, p
6860: 4e 43 2c 20 22 6e 6f 6e 2d 64 65 74 65 72 6d 69  NC, "non-determi
6870: 6e 69 73 74 69 63 20 66 75 6e 63 74 69 6f 6e 73  nistic functions
6880: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
6890: 20 20 20 20 20 20 4e 43 5f 49 64 78 45 78 70 72        NC_IdxExpr
68a0: 7c 4e 43 5f 50 61 72 74 49 64 78 29 3b 0a 20 20  |NC_PartIdx);.  
68b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
68c0: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
68d0: 4f 4d 49 54 5f 57 49 4e 44 4f 57 46 55 4e 43 0a  OMIT_WINDOWFUNC.
68e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 69 73        assert( is
68f0: 5f 61 67 67 3d 3d 30 20 7c 7c 20 28 70 44 65 66  _agg==0 || (pDef
6900: 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51  ->funcFlags & SQ
6910: 4c 49 54 45 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58  LITE_FUNC_MINMAX
6920: 29 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 28  ).          || (
6930: 70 44 65 66 2d 3e 78 56 61 6c 75 65 3d 3d 30 20  pDef->xValue==0 
6940: 26 26 20 70 44 65 66 2d 3e 78 49 6e 76 65 72 73  && pDef->xInvers
6950: 65 3d 3d 30 29 0a 20 20 20 20 20 20 20 20 20 20  e==0).          
6960: 7c 7c 20 28 70 44 65 66 2d 3e 78 56 61 6c 75 65  || (pDef->xValue
6970: 20 26 26 20 70 44 65 66 2d 3e 78 49 6e 76 65 72   && pDef->xInver
6980: 73 65 20 26 26 20 70 44 65 66 2d 3e 78 53 46 75  se && pDef->xSFu
6990: 6e 63 20 26 26 20 70 44 65 66 2d 3e 78 46 69 6e  nc && pDef->xFin
69a0: 61 6c 69 7a 65 29 0a 20 20 20 20 20 20 29 3b 0a  alize).      );.
69b0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 20 26        if( pDef &
69c0: 26 20 70 44 65 66 2d 3e 78 56 61 6c 75 65 3d 3d  & pDef->xValue==
69d0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 57 69 6e  0 && pExpr->pWin
69e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
69f0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6a00: 73 65 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20  se, .           
6a10: 20 22 25 2e 2a 73 28 29 20 6d 61 79 20 6e 6f 74   "%.*s() may not
6a20: 20 62 65 20 75 73 65 64 20 61 73 20 61 20 77 69   be used as a wi
6a30: 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 22 2c 20  ndow function", 
6a40: 6e 49 64 2c 20 7a 49 64 0a 20 20 20 20 20 20 20  nId, zId.       
6a50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d   );.        pNC-
6a60: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d  >nErr++;.      }
6a70: 65 6c 73 65 20 69 66 28 20 0a 20 20 20 20 20 20  else if( .      
6a80: 20 20 20 20 20 20 28 69 73 5f 61 67 67 20 26 26        (is_agg &&
6a90: 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
6aa0: 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d 30   NC_AllowAgg)==0
6ab0: 29 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69  ).         || (i
6ac0: 73 5f 61 67 67 20 26 26 20 28 70 44 65 66 2d 3e  s_agg && (pDef->
6ad0: 66 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49  funcFlags & SQLI
6ae0: 54 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 29 20  TE_FUNC_WINDOW) 
6af0: 26 26 20 21 70 45 78 70 72 2d 3e 70 57 69 6e 29  && !pExpr->pWin)
6b00: 0a 20 20 20 20 20 20 20 20 20 7c 7c 20 28 69 73  .         || (is
6b10: 5f 61 67 67 20 26 26 20 70 45 78 70 72 2d 3e 70  _agg && pExpr->p
6b20: 57 69 6e 20 26 26 20 28 70 4e 43 2d 3e 6e 63 46  Win && (pNC->ncF
6b30: 6c 61 67 73 20 26 20 4e 43 5f 41 6c 6c 6f 77 57  lags & NC_AllowW
6b40: 69 6e 29 3d 3d 30 29 0a 20 20 20 20 20 20 29 7b  in)==0).      ){
6b50: 0a 20 20 20 20 20 20 20 20 63 6f 6e 73 74 20 63  .        const c
6b60: 68 61 72 20 2a 7a 54 79 70 65 3b 0a 20 20 20 20  har *zType;.    
6b70: 20 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66      if( (pDef->f
6b80: 75 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54  uncFlags & SQLIT
6b90: 45 5f 46 55 4e 43 5f 57 49 4e 44 4f 57 29 20 7c  E_FUNC_WINDOW) |
6ba0: 7c 20 70 45 78 70 72 2d 3e 70 57 69 6e 20 29 7b  | pExpr->pWin ){
6bb0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 79 70 65  .          zType
6bc0: 20 3d 20 22 77 69 6e 64 6f 77 22 3b 0a 20 20 20   = "window";.   
6bd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6be0: 20 20 20 20 20 20 7a 54 79 70 65 20 3d 20 22 61        zType = "a
6bf0: 67 67 72 65 67 61 74 65 22 3b 0a 20 20 20 20 20  ggregate";.     
6c00: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
6c10: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
6c20: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
6c30: 25 73 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  %s function %.*s
6c40: 28 29 22 2c 20 7a 54 79 70 65 2c 20 6e 49 64 2c  ()", zType, nId,
6c50: 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e  zId);.        pN
6c60: 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  C->nErr++;.     
6c70: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
6c80: 20 20 20 20 20 7d 0a 23 65 6c 73 65 0a 20 20 20       }.#else.   
6c90: 20 20 20 69 66 28 20 28 69 73 5f 61 67 67 20 26     if( (is_agg &
6ca0: 26 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20  & (pNC->ncFlags 
6cb0: 26 20 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3d 3d  & NC_AllowAgg)==
6cc0: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  0) ){.        sq
6cd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6ce0: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
6cf0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
6d00: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  ion %.*s()", nId
6d10: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70  ,zId);.        p
6d20: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
6d30: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
6d40: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
6d50: 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 6e 6f       else if( no
6d60: 5f 73 75 63 68 5f 66 75 6e 63 20 26 26 20 70 50  _such_func && pP
6d70: 61 72 73 65 2d 3e 64 62 2d 3e 69 6e 69 74 2e 62  arse->db->init.b
6d80: 75 73 79 3d 3d 30 0a 23 69 66 64 65 66 20 53 51  usy==0.#ifdef SQ
6d90: 4c 49 54 45 5f 45 4e 41 42 4c 45 5f 55 4e 4b 4e  LITE_ENABLE_UNKN
6da0: 4f 57 4e 5f 53 51 4c 5f 46 55 4e 43 54 49 4f 4e  OWN_SQL_FUNCTION
6db0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6dc0: 20 26 26 20 70 50 61 72 73 65 2d 3e 65 78 70 6c   && pParse->expl
6dd0: 61 69 6e 3d 3d 30 0a 23 65 6e 64 69 66 0a 20 20  ain==0.#endif.  
6de0: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 73      ){.        s
6df0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
6e00: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
6e10: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
6e20: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
6e30: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
6e40: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6e50: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
6e60: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
6e70: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6e80: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
6e90: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
6ea0: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
6eb0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
6ec0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
6ed0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
6ee0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6ef0: 20 69 73 5f 61 67 67 20 29 7b 0a 23 69 66 6e 64   is_agg ){.#ifnd
6f00: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  ef SQLITE_OMIT_W
6f10: 49 4e 44 4f 57 46 55 4e 43 0a 20 20 20 20 20 20  INDOWFUNC.      
6f20: 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26    pNC->ncFlags &
6f30: 3d 20 7e 28 70 45 78 70 72 2d 3e 70 57 69 6e 20  = ~(pExpr->pWin 
6f40: 3f 20 4e 43 5f 41 6c 6c 6f 77 57 69 6e 20 3a 20  ? NC_AllowWin : 
6f50: 4e 43 5f 41 6c 6c 6f 77 41 67 67 29 3b 0a 23 65  NC_AllowAgg);.#e
6f60: 6c 73 65 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  lse.        pNC-
6f70: 3e 6e 63 46 6c 61 67 73 20 26 3d 20 7e 4e 43 5f  >ncFlags &= ~NC_
6f80: 41 6c 6c 6f 77 41 67 67 3b 0a 23 65 6e 64 69 66  AllowAgg;.#endif
6f90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
6fa0: 71 6c 69 74 65 33 57 61 6c 6b 45 78 70 72 4c 69  qlite3WalkExprLi
6fb0: 73 74 28 70 57 61 6c 6b 65 72 2c 20 70 4c 69 73  st(pWalker, pLis
6fc0: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 73  t);.      if( is
6fd0: 5f 61 67 67 20 29 7b 0a 23 69 66 6e 64 65 66 20  _agg ){.#ifndef 
6fe0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44  SQLITE_OMIT_WIND
6ff0: 4f 57 46 55 4e 43 0a 20 20 20 20 20 20 20 20 69  OWFUNC.        i
7000: 66 28 20 70 45 78 70 72 2d 3e 70 57 69 6e 20 29  f( pExpr->pWin )
7010: 7b 0a 20 20 20 20 20 20 20 20 20 20 53 65 6c 65  {.          Sele
7020: 63 74 20 2a 70 53 65 6c 20 3d 20 70 4e 43 2d 3e  ct *pSel = pNC->
7030: 70 57 69 6e 53 65 6c 65 63 74 3b 0a 20 20 20 20  pWinSelect;.    
7040: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
7050: 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b 65  kExprList(pWalke
7060: 72 2c 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d 3e  r, pExpr->pWin->
7070: 70 50 61 72 74 69 74 69 6f 6e 29 3b 0a 20 20 20  pPartition);.   
7080: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61         sqlite3Wa
7090: 6c 6b 45 78 70 72 4c 69 73 74 28 70 57 61 6c 6b  lkExprList(pWalk
70a0: 65 72 2c 20 70 45 78 70 72 2d 3e 70 57 69 6e 2d  er, pExpr->pWin-
70b0: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 20 20  >pOrderBy);.    
70c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 57 61 6c        sqlite3Wal
70d0: 6b 45 78 70 72 28 70 57 61 6c 6b 65 72 2c 20 70  kExpr(pWalker, p
70e0: 45 78 70 72 2d 3e 70 57 69 6e 2d 3e 70 46 69 6c  Expr->pWin->pFil
70f0: 74 65 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ter);.          
7100: 73 71 6c 69 74 65 33 57 69 6e 64 6f 77 55 70 64  sqlite3WindowUpd
7110: 61 74 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ate(pParse, pSel
7120: 2d 3e 70 57 69 6e 44 65 66 6e 2c 20 70 45 78 70  ->pWinDefn, pExp
7130: 72 2d 3e 70 57 69 6e 2c 20 70 44 65 66 29 3b 0a  r->pWin, pDef);.
7140: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 30 3d            if( 0=
7150: 3d 70 53 65 6c 2d 3e 70 57 69 6e 20 0a 20 20 20  =pSel->pWin .   
7160: 20 20 20 20 20 20 20 20 7c 7c 20 30 3d 3d 73 71          || 0==sq
7170: 6c 69 74 65 33 57 69 6e 64 6f 77 43 6f 6d 70 61  lite3WindowCompa
7180: 72 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2d  re(pParse, pSel-
7190: 3e 70 57 69 6e 2c 20 70 45 78 70 72 2d 3e 70 57  >pWin, pExpr->pW
71a0: 69 6e 29 20 0a 20 20 20 20 20 20 20 20 20 20 29  in) .          )
71b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  {.            pE
71c0: 78 70 72 2d 3e 70 57 69 6e 2d 3e 70 4e 65 78 74  xpr->pWin->pNext
71d0: 57 69 6e 20 3d 20 70 53 65 6c 2d 3e 70 57 69 6e  Win = pSel->pWin
71e0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 53  ;.            pS
71f0: 65 6c 2d 3e 70 57 69 6e 20 3d 20 70 45 78 70 72  el->pWin = pExpr
7200: 2d 3e 70 57 69 6e 3b 0a 20 20 20 20 20 20 20 20  ->pWin;.        
7210: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70 4e    }.          pN
7220: 43 2d 3e 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43  C->ncFlags |= NC
7230: 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 20 20 20 20 20  _AllowWin;.     
7240: 20 20 20 7d 65 6c 73 65 0a 23 65 6e 64 69 66 20     }else.#endif 
7250: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 57  /* SQLITE_OMIT_W
7260: 49 4e 44 4f 57 46 55 4e 43 20 2a 2f 0a 20 20 20  INDOWFUNC */.   
7270: 20 20 20 20 20 7b 0a 20 20 20 20 20 20 20 20 20       {.         
7280: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7290: 43 32 20 3d 20 70 4e 43 3b 0a 20 20 20 20 20 20  C2 = pNC;.      
72a0: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
72b0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
72c0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
72d0: 2d 3e 6f 70 32 20 3d 20 30 3b 0a 20 20 20 20 20  ->op2 = 0;.     
72e0: 20 20 20 20 20 77 68 69 6c 65 28 20 70 4e 43 32       while( pNC2
72f0: 20 26 26 20 21 73 71 6c 69 74 65 33 46 75 6e 63   && !sqlite3Func
7300: 74 69 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28  tionUsesThisSrc(
7310: 70 45 78 70 72 2c 20 70 4e 43 32 2d 3e 70 53 72  pExpr, pNC2->pSr
7320: 63 4c 69 73 74 29 20 29 7b 0a 20 20 20 20 20 20  cList) ){.      
7330: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32        pExpr->op2
7340: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
7350: 70 4e 43 32 20 3d 20 70 4e 43 32 2d 3e 70 4e 65  pNC2 = pNC2->pNe
7360: 78 74 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  xt;.          }.
7370: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
7380: 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20  ( pDef!=0 );.   
7390: 20 20 20 20 20 20 20 69 66 28 20 70 4e 43 32 20         if( pNC2 
73a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61  ){.            a
73b0: 73 73 65 72 74 28 20 53 51 4c 49 54 45 5f 46 55  ssert( SQLITE_FU
73c0: 4e 43 5f 4d 49 4e 4d 41 58 3d 3d 4e 43 5f 4d 69  NC_MINMAX==NC_Mi
73d0: 6e 4d 61 78 41 67 67 20 29 3b 0a 20 20 20 20 20  nMaxAgg );.     
73e0: 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
73f0: 20 28 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67   (pDef->funcFlag
7400: 73 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f  s & SQLITE_FUNC_
7410: 4d 49 4e 4d 41 58 29 21 3d 30 20 29 3b 0a 20 20  MINMAX)!=0 );.  
7420: 20 20 20 20 20 20 20 20 20 20 70 4e 43 32 2d 3e            pNC2->
7430: 6e 63 46 6c 61 67 73 20 7c 3d 20 4e 43 5f 48 61  ncFlags |= NC_Ha
7440: 73 41 67 67 20 7c 20 28 70 44 65 66 2d 3e 66 75  sAgg | (pDef->fu
7450: 6e 63 46 6c 61 67 73 20 26 20 53 51 4c 49 54 45  ncFlags & SQLITE
7460: 5f 46 55 4e 43 5f 4d 49 4e 4d 41 58 29 3b 0a 0a  _FUNC_MINMAX);..
7470: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7480: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46 6c 61        pNC->ncFla
7490: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
74a0: 67 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  g;.        }.   
74b0: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49     }.      /* FI
74c0: 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70  X ME:  Compute p
74d0: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62  Expr->affinity b
74e0: 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65  ased on the expe
74f0: 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20  cted return.    
7500: 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65    ** type of the
7510: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20   function .     
7520: 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e   */.      return
7530: 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20 20 20 20   WRC_Prune;.    
7540: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
7550: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20  _OMIT_SUBQUERY. 
7560: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
7570: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  T:.    case TK_E
7580: 58 49 53 54 53 3a 20 20 74 65 73 74 63 61 73 65  XISTS:  testcase
7590: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
75a0: 45 58 49 53 54 53 20 29 3b 0a 23 65 6e 64 69 66  EXISTS );.#endif
75b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
75c0: 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
75d0: 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
75e0: 5f 49 4e 20 29 3b 0a 20 20 20 20 20 20 69 66 28  _IN );.      if(
75f0: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
7600: 28 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65  (pExpr, EP_xIsSe
7610: 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20  lect) ){.       
7620: 20 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d   int nRef = pNC-
7630: 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 6e  >nRef;.        n
7640: 6f 74 56 61 6c 69 64 28 70 50 61 72 73 65 2c 20  otValid(pParse, 
7650: 70 4e 43 2c 20 22 73 75 62 71 75 65 72 69 65 73  pNC, "subqueries
7660: 22 2c 20 4e 43 5f 49 73 43 68 65 63 6b 7c 4e 43  ", NC_IsCheck|NC
7670: 5f 50 61 72 74 49 64 78 7c 4e 43 5f 49 64 78 45  _PartIdx|NC_IdxE
7680: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
7690: 6c 69 74 65 33 57 61 6c 6b 53 65 6c 65 63 74 28  lite3WalkSelect(
76a0: 70 57 61 6c 6b 65 72 2c 20 70 45 78 70 72 2d 3e  pWalker, pExpr->
76b0: 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20  x.pSelect);.    
76c0: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d      assert( pNC-
76d0: 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20  >nRef>=nRef );. 
76e0: 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21         if( nRef!
76f0: 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20  =pNC->nRef ){.  
7700: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
7710: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
7720: 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20  P_VarSelect);.  
7730: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 63 46          pNC->ncF
7740: 6c 61 67 73 20 7c 3d 20 4e 43 5f 56 61 72 53 65  lags |= NC_VarSe
7750: 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a  lect;.        }.
7760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
7770: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7780: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
7790: 20 7b 0a 20 20 20 20 20 20 6e 6f 74 56 61 6c 69   {.      notVali
77a0: 64 28 70 50 61 72 73 65 2c 20 70 4e 43 2c 20 22  d(pParse, pNC, "
77b0: 70 61 72 61 6d 65 74 65 72 73 22 2c 20 4e 43 5f  parameters", NC_
77c0: 49 73 43 68 65 63 6b 7c 4e 43 5f 50 61 72 74 49  IsCheck|NC_PartI
77d0: 64 78 7c 4e 43 5f 49 64 78 45 78 70 72 29 3b 0a  dx|NC_IdxExpr);.
77e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
77f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
7800: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  S:.    case TK_I
7810: 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 45 78  SNOT: {.      Ex
7820: 70 72 20 2a 70 52 69 67 68 74 3b 0a 20 20 20 20  pr *pRight;.    
7830: 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
7840: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
7850: 2c 20 45 50 5f 52 65 64 75 63 65 64 29 20 29 3b  , EP_Reduced) );
7860: 0a 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65  .      /* Handle
7870: 20 73 70 65 63 69 61 6c 20 63 61 73 65 73 20 6f   special cases o
7880: 66 20 22 78 20 49 53 20 54 52 55 45 22 2c 20 22  f "x IS TRUE", "
7890: 78 20 49 53 20 46 41 4c 53 45 22 2c 20 22 78 20  x IS FALSE", "x 
78a0: 49 53 20 4e 4f 54 20 54 52 55 45 22 2c 0a 20 20  IS NOT TRUE",.  
78b0: 20 20 20 20 2a 2a 20 61 6e 64 20 22 78 20 49 53      ** and "x IS
78c0: 20 4e 4f 54 20 46 41 4c 53 45 22 2e 20 2a 2f 0a   NOT FALSE". */.
78d0: 20 20 20 20 20 20 69 66 28 20 28 70 52 69 67 68        if( (pRigh
78e0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
78f0: 74 29 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b  t)->op==TK_ID ){
7900: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 72 63 20  .        int rc 
7910: 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74 65  = resolveExprSte
7920: 70 28 70 57 61 6c 6b 65 72 2c 20 70 52 69 67 68  p(pWalker, pRigh
7930: 74 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  t);.        if( 
7940: 72 63 3d 3d 57 52 43 5f 41 62 6f 72 74 20 29 20  rc==WRC_Abort ) 
7950: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
7960: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 52  ;.        if( pR
7970: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 54 52 55  ight->op==TK_TRU
7980: 45 46 41 4c 53 45 20 29 7b 0a 20 20 20 20 20 20  EFALSE ){.      
7990: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 20 3d      pExpr->op2 =
79a0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 20 20   pExpr->op;.    
79b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
79c0: 3d 20 54 4b 5f 54 52 55 54 48 3b 0a 20 20 20 20  = TK_TRUTH;.    
79d0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43        return WRC
79e0: 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20  _Continue;.     
79f0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
7a00: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
7a10: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
7a20: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 0a 20 20  e TK_BETWEEN:.  
7a30: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
7a40: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
7a50: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
7a60: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
7a70: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
7a80: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 7b 0a    case TK_GE: {.
7a90: 20 20 20 20 20 20 69 6e 74 20 6e 4c 65 66 74 2c        int nLeft,
7aa0: 20 6e 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69   nRight;.      i
7ab0: 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d  f( pParse->db->m
7ac0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 62 72  allocFailed ) br
7ad0: 65 61 6b 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eak;.      asser
7ae0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 21  t( pExpr->pLeft!
7af0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 4c 65 66  =0 );.      nLef
7b00: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 56  t = sqlite3ExprV
7b10: 65 63 74 6f 72 53 69 7a 65 28 70 45 78 70 72 2d  ectorSize(pExpr-
7b20: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 69  >pLeft);.      i
7b30: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
7b40: 5f 42 45 54 57 45 45 4e 20 29 7b 0a 20 20 20 20  _BETWEEN ){.    
7b50: 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73 71 6c      nRight = sql
7b60: 69 74 65 33 45 78 70 72 56 65 63 74 6f 72 53 69  ite3ExprVectorSi
7b70: 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  ze(pExpr->x.pLis
7b80: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
7b90: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 69 67          if( nRig
7ba0: 68 74 3d 3d 6e 4c 65 66 74 20 29 7b 0a 20 20 20  ht==nLeft ){.   
7bb0: 20 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20         nRight = 
7bc0: 73 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f  sqlite3ExprVecto
7bd0: 72 53 69 7a 65 28 70 45 78 70 72 2d 3e 78 2e 70  rSize(pExpr->x.p
7be0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
7bf0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7c00: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
7c10: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
7c20: 3e 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20  >pRight!=0 );.  
7c30: 20 20 20 20 20 20 6e 52 69 67 68 74 20 3d 20 73        nRight = s
7c40: 71 6c 69 74 65 33 45 78 70 72 56 65 63 74 6f 72  qlite3ExprVector
7c50: 53 69 7a 65 28 70 45 78 70 72 2d 3e 70 52 69 67  Size(pExpr->pRig
7c60: 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ht);.      }.   
7c70: 20 20 20 69 66 28 20 6e 4c 65 66 74 21 3d 6e 52     if( nLeft!=nR
7c80: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
7c90: 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
7ca0: 3e 6f 70 3d 3d 54 4b 5f 45 51 20 29 3b 0a 20 20  >op==TK_EQ );.  
7cb0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
7cc0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
7cd0: 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74   );.        test
7ce0: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
7cf0: 3d 54 4b 5f 4c 54 20 29 3b 0a 20 20 20 20 20 20  =TK_LT );.      
7d00: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
7d10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 29 3b 0a  r->op==TK_LE );.
7d20: 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
7d30: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
7d40: 47 54 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  GT );.        te
7d50: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
7d60: 70 3d 3d 54 4b 5f 47 45 20 29 3b 0a 20 20 20 20  p==TK_GE );.    
7d70: 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
7d80: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29  xpr->op==TK_IS )
7d90: 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
7da0: 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
7db0: 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20 20 20 20 20  K_ISNOT );.     
7dc0: 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78     testcase( pEx
7dd0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 42 45 54 57 45  pr->op==TK_BETWE
7de0: 45 4e 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  EN );.        sq
7df0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7e00: 61 72 73 65 2c 20 22 72 6f 77 20 76 61 6c 75 65  arse, "row value
7e10: 20 6d 69 73 75 73 65 64 22 29 3b 0a 20 20 20 20   misused");.    
7e20: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7e30: 20 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65   .    }.  }.  re
7e40: 74 75 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45  turn (pParse->nE
7e50: 72 72 20 7c 7c 20 70 50 61 72 73 65 2d 3e 64 62  rr || pParse->db
7e60: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 29 20  ->mallocFailed) 
7e70: 3f 20 57 52 43 5f 41 62 6f 72 74 20 3a 20 57 52  ? WRC_Abort : WR
7e80: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f  C_Continue;.}../
7e90: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 69 73 20 61  *.** pEList is a
7ea0: 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73   list of express
7eb0: 69 6f 6e 73 20 77 68 69 63 68 20 61 72 65 20 72  ions which are r
7ec0: 65 61 6c 6c 79 20 74 68 65 20 72 65 73 75 6c 74  eally the result
7ed0: 20 73 65 74 20 6f 66 20 74 68 65 0a 2a 2a 20 61   set of the.** a
7ee0: 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e   SELECT statemen
7ef0: 74 2e 20 20 70 45 20 69 73 20 61 20 74 65 72 6d  t.  pE is a term
7f00: 20 69 6e 20 61 6e 20 4f 52 44 45 52 20 42 59 20   in an ORDER BY 
7f10: 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75  or GROUP BY clau
7f20: 73 65 2e 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  se..** This rout
7f30: 69 6e 65 20 63 68 65 63 6b 73 20 74 6f 20 73 65  ine checks to se
7f40: 65 20 69 66 20 70 45 20 69 73 20 61 20 73 69 6d  e if pE is a sim
7f50: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 20 77  ple identifier w
7f60: 68 69 63 68 20 63 6f 72 72 65 73 70 6f 6e 64 73  hich corresponds
7f70: 0a 2a 2a 20 74 6f 20 74 68 65 20 41 53 2d 6e 61  .** to the AS-na
7f80: 6d 65 20 6f 66 20 6f 6e 65 20 6f 66 20 74 68 65  me of one of the
7f90: 20 74 65 72 6d 73 20 6f 66 20 74 68 65 20 65 78   terms of the ex
7fa0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
7fb0: 49 66 20 69 74 20 69 73 2c 0a 2a 2a 20 74 68 69  If it is,.** thi
7fc0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
7fd0: 20 61 6e 20 69 6e 74 65 67 65 72 20 62 65 74 77   an integer betw
7fe0: 65 65 6e 20 31 20 61 6e 64 20 4e 20 77 68 65 72  een 1 and N wher
7ff0: 65 20 4e 20 69 73 20 74 68 65 20 6e 75 6d 62 65  e N is the numbe
8000: 72 20 6f 66 0a 2a 2a 20 65 6c 65 6d 65 6e 74 73  r of.** elements
8010: 20 69 6e 20 70 45 4c 69 73 74 2c 20 63 6f 72 72   in pEList, corr
8020: 65 73 70 6f 6e 64 69 6e 67 20 74 6f 20 74 68 65  esponding to the
8030: 20 6d 61 74 63 68 69 6e 67 20 65 6e 74 72 79 2e   matching entry.
8040: 20 20 49 66 20 74 68 65 72 65 20 69 73 0a 2a 2a    If there is.**
8050: 20 6e 6f 20 6d 61 74 63 68 2c 20 6f 72 20 69 66   no match, or if
8060: 20 70 45 20 69 73 20 6e 6f 74 20 61 20 73 69 6d   pE is not a sim
8070: 70 6c 65 20 69 64 65 6e 74 69 66 69 65 72 2c 20  ple identifier, 
8080: 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74 69 6e  then this routin
8090: 65 0a 2a 2a 20 72 65 74 75 72 6e 20 30 2e 0a 2a  e.** return 0..*
80a0: 2a 0a 2a 2a 20 70 45 4c 69 73 74 20 68 61 73 20  *.** pEList has 
80b0: 62 65 65 6e 20 72 65 73 6f 6c 76 65 64 2e 20 20  been resolved.  
80c0: 70 45 20 68 61 73 20 6e 6f 74 2e 0a 2a 2f 0a 73  pE has not..*/.s
80d0: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
80e0: 65 41 73 4e 61 6d 65 28 0a 20 20 50 61 72 73 65  eAsName(.  Parse
80f0: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
8100: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
8110: 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73 61   for error messa
8120: 67 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  ges */.  ExprLis
8130: 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c  t *pEList,  /* L
8140: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
8150: 6e 73 20 74 6f 20 73 63 61 6e 20 2a 2f 0a 20 20  ns to scan */.  
8160: 45 78 70 72 20 2a 70 45 20 20 20 20 20 20 20 20  Expr *pE        
8170: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
8180: 20 77 65 20 61 72 65 20 74 72 79 69 6e 67 20 74   we are trying t
8190: 6f 20 6d 61 74 63 68 20 2a 2f 0a 29 7b 0a 20 20  o match */.){.  
81a0: 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20  int i;          
81b0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
81c0: 65 72 20 2a 2f 0a 0a 20 20 55 4e 55 53 45 44 5f  er */..  UNUSED_
81d0: 50 41 52 41 4d 45 54 45 52 28 70 50 61 72 73 65  PARAMETER(pParse
81e0: 29 3b 0a 0a 20 20 69 66 28 20 70 45 2d 3e 6f 70  );..  if( pE->op
81f0: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 63  ==TK_ID ){.    c
8200: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 70 45 2d 3e  har *zCol = pE->
8210: 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20 66 6f  u.zToken;.    fo
8220: 72 28 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d  r(i=0; i<pEList-
8230: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
8240: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
8250: 70 45 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  pEList->a[i].zNa
8260: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
8270: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
8280: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
8290: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
82a0: 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20 20  return i+1;.    
82b0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
82c0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
82d0: 2a 2a 20 70 45 20 69 73 20 61 20 70 6f 69 6e 74  ** pE is a point
82e0: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
82f0: 69 6f 6e 20 77 68 69 63 68 20 69 73 20 61 20 73  ion which is a s
8300: 69 6e 67 6c 65 20 74 65 72 6d 20 69 6e 20 74 68  ingle term in th
8310: 65 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 6f 66  e.** ORDER BY of
8320: 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45   a compound SELE
8330: 43 54 2e 20 20 54 68 65 20 65 78 70 72 65 73 73  CT.  The express
8340: 69 6f 6e 20 68 61 73 20 6e 6f 74 20 62 65 65 6e  ion has not been
8350: 0a 2a 2a 20 6e 61 6d 65 20 72 65 73 6f 6c 76 65  .** name resolve
8360: 64 2e 0a 2a 2a 0a 2a 2a 20 41 74 20 74 68 65 20  d..**.** At the 
8370: 70 6f 69 6e 74 20 74 68 69 73 20 72 6f 75 74 69  point this routi
8380: 6e 65 20 69 73 20 63 61 6c 6c 65 64 2c 20 77 65  ne is called, we
8390: 20 61 6c 72 65 61 64 79 20 6b 6e 6f 77 20 74 68   already know th
83a0: 61 74 20 74 68 65 0a 2a 2a 20 4f 52 44 45 52 20  at the.** ORDER 
83b0: 42 59 20 74 65 72 6d 20 69 73 20 6e 6f 74 20 61  BY term is not a
83c0: 6e 20 69 6e 74 65 67 65 72 20 69 6e 64 65 78 20  n integer index 
83d0: 69 6e 74 6f 20 74 68 65 20 72 65 73 75 6c 74 20  into the result 
83e0: 73 65 74 2e 20 20 54 68 61 74 0a 2a 2a 20 63 61  set.  That.** ca
83f0: 73 65 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  se is handled by
8400: 20 74 68 65 20 63 61 6c 6c 69 6e 67 20 72 6f 75   the calling rou
8410: 74 69 6e 65 2e 0a 2a 2a 0a 2a 2a 20 41 74 74 65  tine..**.** Atte
8420: 6d 70 74 20 74 6f 20 6d 61 74 63 68 20 70 45 20  mpt to match pE 
8430: 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73  against result s
8440: 65 74 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  et columns in th
8450: 65 20 6c 65 66 74 2d 6d 6f 73 74 0a 2a 2a 20 53  e left-most.** S
8460: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e  ELECT statement.
8470: 20 20 52 65 74 75 72 6e 20 74 68 65 20 69 6e 64    Return the ind
8480: 65 78 20 69 20 6f 66 20 74 68 65 20 6d 61 74 63  ex i of the matc
8490: 68 69 6e 67 20 63 6f 6c 75 6d 6e 2c 0a 2a 2a 20  hing column,.** 
84a0: 61 73 20 61 6e 20 69 6e 64 69 63 61 74 69 6f 6e  as an indication
84b0: 20 74 6f 20 74 68 65 20 63 61 6c 6c 65 72 20 74   to the caller t
84c0: 68 61 74 20 69 74 20 73 68 6f 75 6c 64 20 73 6f  hat it should so
84d0: 72 74 20 62 79 20 74 68 65 20 69 2d 74 68 20 63  rt by the i-th c
84e0: 6f 6c 75 6d 6e 2e 0a 2a 2a 20 54 68 65 20 6c 65  olumn..** The le
84f0: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 69  ft-most column i
8500: 73 20 31 2e 20 20 49 6e 20 6f 74 68 65 72 20 77  s 1.  In other w
8510: 6f 72 64 73 2c 20 74 68 65 20 76 61 6c 75 65 20  ords, the value 
8520: 72 65 74 75 72 6e 65 64 20 69 73 20 74 68 65 0a  returned is the.
8530: 2a 2a 20 73 61 6d 65 20 69 6e 74 65 67 65 72 20  ** same integer 
8540: 76 61 6c 75 65 20 74 68 61 74 20 77 6f 75 6c 64  value that would
8550: 20 62 65 20 75 73 65 64 20 69 6e 20 74 68 65 20   be used in the 
8560: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 74 6f  SQL statement to
8570: 20 69 6e 64 69 63 61 74 65 0a 2a 2a 20 74 68 65   indicate.** the
8580: 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a 20 49   column..**.** I
8590: 66 20 74 68 65 72 65 20 69 73 20 6e 6f 20 6d 61  f there is no ma
85a0: 74 63 68 2c 20 72 65 74 75 72 6e 20 30 2e 20 20  tch, return 0.  
85b0: 52 65 74 75 72 6e 20 2d 31 20 69 66 20 61 6e 20  Return -1 if an 
85c0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2e 0a 2a 2f  error occurs..*/
85d0: 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f  .static int reso
85e0: 6c 76 65 4f 72 64 65 72 42 79 54 65 72 6d 54 6f  lveOrderByTermTo
85f0: 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72 73  ExprList(.  Pars
8600: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f  e *pParse,     /
8610: 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  * Parsing contex
8620: 74 20 66 6f 72 20 65 72 72 6f 72 20 6d 65 73 73  t for error mess
8630: 61 67 65 73 20 2a 2f 0a 20 20 53 65 6c 65 63 74  ages */.  Select
8640: 20 2a 70 53 65 6c 65 63 74 2c 20 20 20 2f 2a 20   *pSelect,   /* 
8650: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
8660: 6d 65 6e 74 20 77 69 74 68 20 74 68 65 20 4f 52  ment with the OR
8670: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 2a 2f  DER BY clause */
8680: 0a 20 20 45 78 70 72 20 2a 70 45 20 20 20 20 20  .  Expr *pE     
8690: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 73 70 65        /* The spe
86a0: 63 69 66 69 63 20 4f 52 44 45 52 20 42 59 20 74  cific ORDER BY t
86b0: 65 72 6d 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20  erm */.){.  int 
86c0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  i;             /
86d0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a  * Loop counter *
86e0: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
86f0: 4c 69 73 74 3b 20 20 2f 2a 20 54 68 65 20 63 6f  List;  /* The co
8700: 6c 75 6d 6e 73 20 6f 66 20 74 68 65 20 72 65 73  lumns of the res
8710: 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 4e 61 6d  ult set */.  Nam
8720: 65 43 6f 6e 74 65 78 74 20 6e 63 3b 20 20 20 20  eContext nc;    
8730: 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20  /* Name context 
8740: 66 6f 72 20 72 65 73 6f 6c 76 69 6e 67 20 70 45  for resolving pE
8750: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
8760: 62 3b 20 20 20 20 20 20 20 2f 2a 20 44 61 74 61  b;       /* Data
8770: 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20  base connection 
8780: 2a 2f 0a 20 20 69 6e 74 20 72 63 3b 20 20 20 20  */.  int rc;    
8790: 20 20 20 20 20 20 20 20 2f 2a 20 52 65 74 75 72          /* Retur
87a0: 6e 20 63 6f 64 65 20 66 72 6f 6d 20 73 75 62 70  n code from subp
87b0: 72 6f 63 65 64 75 72 65 73 20 2a 2f 0a 20 20 75  rocedures */.  u
87c0: 38 20 73 61 76 65 64 53 75 70 70 45 72 72 3b 20  8 savedSuppErr; 
87d0: 20 20 2f 2a 20 53 61 76 65 64 20 76 61 6c 75 65    /* Saved value
87e0: 20 6f 66 20 64 62 2d 3e 73 75 70 70 72 65 73 73   of db->suppress
87f0: 45 72 72 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74  Err */..  assert
8800: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49  ( sqlite3ExprIsI
8810: 6e 74 65 67 65 72 28 70 45 2c 20 26 69 29 3d 3d  nteger(pE, &i)==
8820: 30 20 29 3b 0a 20 20 70 45 4c 69 73 74 20 3d 20  0 );.  pEList = 
8830: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
8840: 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 61  ..  /* Resolve a
8850: 6c 6c 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ll names in the 
8860: 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 65 78  ORDER BY term ex
8870: 70 72 65 73 73 69 6f 6e 0a 20 20 2a 2f 0a 20 20  pression.  */.  
8880: 6d 65 6d 73 65 74 28 26 6e 63 2c 20 30 2c 20 73  memset(&nc, 0, s
8890: 69 7a 65 6f 66 28 6e 63 29 29 3b 0a 20 20 6e 63  izeof(nc));.  nc
88a0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
88b0: 3b 0a 20 20 6e 63 2e 70 53 72 63 4c 69 73 74 20  ;.  nc.pSrcList 
88c0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 53 72 63 3b  = pSelect->pSrc;
88d0: 0a 20 20 6e 63 2e 75 4e 43 2e 70 45 4c 69 73 74  .  nc.uNC.pEList
88e0: 20 3d 20 70 45 4c 69 73 74 3b 0a 20 20 6e 63 2e   = pEList;.  nc.
88f0: 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f 41 6c 6c  ncFlags = NC_All
8900: 6f 77 41 67 67 7c 4e 43 5f 55 45 4c 69 73 74 3b  owAgg|NC_UEList;
8910: 0a 20 20 6e 63 2e 6e 45 72 72 20 3d 20 30 3b 0a  .  nc.nErr = 0;.
8920: 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64    db = pParse->d
8930: 62 3b 0a 20 20 73 61 76 65 64 53 75 70 70 45 72  b;.  savedSuppEr
8940: 72 20 3d 20 64 62 2d 3e 73 75 70 70 72 65 73 73  r = db->suppress
8950: 45 72 72 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72  Err;.  db->suppr
8960: 65 73 73 45 72 72 20 3d 20 31 3b 0a 20 20 72 63  essErr = 1;.  rc
8970: 20 3d 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76   = sqlite3Resolv
8980: 65 45 78 70 72 4e 61 6d 65 73 28 26 6e 63 2c 20  eExprNames(&nc, 
8990: 70 45 29 3b 0a 20 20 64 62 2d 3e 73 75 70 70 72  pE);.  db->suppr
89a0: 65 73 73 45 72 72 20 3d 20 73 61 76 65 64 53 75  essErr = savedSu
89b0: 70 70 45 72 72 3b 0a 20 20 69 66 28 20 72 63 20  ppErr;.  if( rc 
89c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 0a 20 20 2f  ) return 0;..  /
89d0: 2a 20 54 72 79 20 74 6f 20 6d 61 74 63 68 20 74  * Try to match t
89e0: 68 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72  he ORDER BY expr
89f0: 65 73 73 69 6f 6e 20 61 67 61 69 6e 73 74 20 61  ession against a
8a00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 20 20 2a  n expression.  *
8a10: 2a 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20  * in the result 
8a20: 73 65 74 2e 20 20 52 65 74 75 72 6e 20 61 6e 20  set.  Return an 
8a30: 31 2d 62 61 73 65 64 20 69 6e 64 65 78 20 6f 66  1-based index of
8a40: 20 74 68 65 20 6d 61 74 63 68 69 6e 67 0a 20 20   the matching.  
8a50: 2a 2a 20 72 65 73 75 6c 74 2d 73 65 74 20 65 6e  ** result-set en
8a60: 74 72 79 2e 0a 20 20 2a 2f 0a 20 20 66 6f 72 28  try..  */.  for(
8a70: 69 3d 30 3b 20 69 3c 70 45 4c 69 73 74 2d 3e 6e  i=0; i<pEList->n
8a80: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8a90: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
8aa0: 6f 6d 70 61 72 65 28 30 2c 20 70 45 4c 69 73 74  ompare(0, pEList
8ab0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45  ->a[i].pExpr, pE
8ac0: 2c 20 2d 31 29 3c 32 20 29 7b 0a 20 20 20 20 20  , -1)<2 ){.     
8ad0: 20 72 65 74 75 72 6e 20 69 2b 31 3b 0a 20 20 20   return i+1;.   
8ae0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
8af0: 6e 6f 20 6d 61 74 63 68 2c 20 72 65 74 75 72 6e  no match, return
8b00: 20 30 2e 20 2a 2f 0a 20 20 72 65 74 75 72 6e 20   0. */.  return 
8b10: 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  0;.}../*.** Gene
8b20: 72 61 74 65 20 61 6e 20 4f 52 44 45 52 20 42 59  rate an ORDER BY
8b30: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 74 65 72   or GROUP BY ter
8b40: 6d 20 6f 75 74 2d 6f 66 2d 72 61 6e 67 65 20 65  m out-of-range e
8b50: 72 72 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  rror..*/.static 
8b60: 76 6f 69 64 20 72 65 73 6f 6c 76 65 4f 75 74 4f  void resolveOutO
8b70: 66 52 61 6e 67 65 45 72 72 6f 72 28 0a 20 20 50  fRangeError(.  P
8b80: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
8b90: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 72 72        /* The err
8ba0: 6f 72 20 63 6f 6e 74 65 78 74 20 69 6e 74 6f 20  or context into 
8bb0: 77 68 69 63 68 20 74 6f 20 77 72 69 74 65 20 74  which to write t
8bc0: 68 65 20 65 72 72 6f 72 20 2a 2f 0a 20 20 63 6f  he error */.  co
8bd0: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 2c  nst char *zType,
8be0: 20 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20       /* "ORDER" 
8bf0: 6f 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 20 20  or "GROUP" */.  
8c00: 69 6e 74 20 69 2c 20 20 20 20 20 20 20 20 20 20  int i,          
8c10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 69 6e         /* The in
8c20: 64 65 78 20 28 31 2d 62 61 73 65 64 29 20 6f 66  dex (1-based) of
8c30: 20 74 68 65 20 74 65 72 6d 20 6f 75 74 20 6f 66   the term out of
8c40: 20 72 61 6e 67 65 20 2a 2f 0a 20 20 69 6e 74 20   range */.  int 
8c50: 6d 78 20 20 20 20 20 20 20 20 20 20 20 20 20 20  mx              
8c60: 20 20 20 2f 2a 20 4c 61 72 67 65 73 74 20 70 65     /* Largest pe
8c70: 72 6d 69 73 73 69 62 6c 65 20 76 61 6c 75 65 20  rmissible value 
8c80: 6f 66 20 69 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c  of i */.){.  sql
8c90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8ca0: 72 73 65 2c 20 0a 20 20 20 20 22 25 72 20 25 73  rse, .    "%r %s
8cb0: 20 42 59 20 74 65 72 6d 20 6f 75 74 20 6f 66 20   BY term out of 
8cc0: 72 61 6e 67 65 20 2d 20 73 68 6f 75 6c 64 20 62  range - should b
8cd0: 65 20 22 0a 20 20 20 20 22 62 65 74 77 65 65 6e  e ".    "between
8ce0: 20 31 20 61 6e 64 20 25 64 22 2c 20 69 2c 20 7a   1 and %d", i, z
8cf0: 54 79 70 65 2c 20 6d 78 29 3b 0a 7d 0a 0a 2f 2a  Type, mx);.}../*
8d00: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
8d10: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
8d20: 69 6e 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  in a compound SE
8d30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 2e 20  LECT statement. 
8d40: 20 20 4d 6f 64 69 66 79 0a 2a 2a 20 65 61 63 68    Modify.** each
8d50: 20 74 65 72 6d 20 6f 66 20 74 68 65 20 4f 52 44   term of the ORD
8d60: 45 52 20 42 59 20 63 6c 61 75 73 65 20 69 73 20  ER BY clause is 
8d70: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
8d80: 65 72 20 62 65 74 77 65 65 6e 20 31 0a 2a 2a 20  er between 1.** 
8d90: 61 6e 64 20 4e 20 77 68 65 72 65 20 4e 20 69 73  and N where N is
8da0: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
8db0: 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 63 6f  olumns in the co
8dc0: 6d 70 6f 75 6e 64 20 53 45 4c 45 43 54 2e 0a 2a  mpound SELECT..*
8dd0: 2a 0a 2a 2a 20 4f 52 44 45 52 20 42 59 20 74 65  *.** ORDER BY te
8de0: 72 6d 73 20 74 68 61 74 20 61 72 65 20 61 6c 72  rms that are alr
8df0: 65 61 64 79 20 61 6e 20 69 6e 74 65 67 65 72 20  eady an integer 
8e00: 62 65 74 77 65 65 6e 20 31 20 61 6e 64 20 4e 20  between 1 and N 
8e10: 61 72 65 0a 2a 2a 20 75 6e 6d 6f 64 69 66 69 65  are.** unmodifie
8e20: 64 2e 20 20 4f 52 44 45 52 20 42 59 20 74 65 72  d.  ORDER BY ter
8e30: 6d 73 20 74 68 61 74 20 61 72 65 20 69 6e 74 65  ms that are inte
8e40: 67 65 72 73 20 6f 75 74 73 69 64 65 20 74 68 65  gers outside the
8e50: 20 72 61 6e 67 65 20 6f 66 0a 2a 2a 20 31 20 74   range of.** 1 t
8e60: 68 72 6f 75 67 68 20 4e 20 67 65 6e 65 72 61 74  hrough N generat
8e70: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 4f 52 44  e an error.  ORD
8e80: 45 52 20 42 59 20 74 65 72 6d 73 20 74 68 61 74  ER BY terms that
8e90: 20 61 72 65 20 65 78 70 72 65 73 73 69 6f 6e 73   are expressions
8ea0: 0a 2a 2a 20 61 72 65 20 6d 61 74 63 68 65 64 20  .** are matched 
8eb0: 61 67 61 69 6e 73 74 20 72 65 73 75 6c 74 20 73  against result s
8ec0: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 73 20 6f  et expressions o
8ed0: 66 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  f compound SELEC
8ee0: 54 0a 2a 2a 20 62 65 67 69 6e 6e 69 6e 67 20 77  T.** beginning w
8ef0: 69 74 68 20 74 68 65 20 6c 65 66 74 2d 6d 6f 73  ith the left-mos
8f00: 74 20 53 45 4c 45 43 54 20 61 6e 64 20 77 6f 72  t SELECT and wor
8f10: 6b 69 6e 67 20 74 6f 77 61 72 64 20 74 68 65 20  king toward the 
8f20: 72 69 67 68 74 2e 0a 2a 2a 20 41 74 20 74 68 65  right..** At the
8f30: 20 66 69 72 73 74 20 6d 61 74 63 68 2c 20 74 68   first match, th
8f40: 65 20 4f 52 44 45 52 20 42 59 20 65 78 70 72 65  e ORDER BY expre
8f50: 73 73 69 6f 6e 20 69 73 20 74 72 61 6e 73 66 6f  ssion is transfo
8f60: 72 6d 65 64 20 69 6e 74 6f 0a 2a 2a 20 74 68 65  rmed into.** the
8f70: 20 69 6e 74 65 67 65 72 20 63 6f 6c 75 6d 6e 20   integer column 
8f80: 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 52 65  number..**.** Re
8f90: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
8fa0: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 2e 0a  of errors seen..
8fb0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 72 65  */.static int re
8fc0: 73 6f 6c 76 65 43 6f 6d 70 6f 75 6e 64 4f 72 64  solveCompoundOrd
8fd0: 65 72 42 79 28 0a 20 20 50 61 72 73 65 20 2a 70  erBy(.  Parse *p
8fe0: 50 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a  Parse,        /*
8ff0: 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   Parsing context
9000: 2e 20 20 4c 65 61 76 65 20 65 72 72 6f 72 20 6d  .  Leave error m
9010: 65 73 73 61 67 65 73 20 68 65 72 65 20 2a 2f 0a  essages here */.
9020: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 65 63    Select *pSelec
9030: 74 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 53  t       /* The S
9040: 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20  ELECT statement 
9050: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 68 65 20 4f  containing the O
9060: 52 44 45 52 20 42 59 20 2a 2f 0a 29 7b 0a 20 20  RDER BY */.){.  
9070: 69 6e 74 20 69 3b 0a 20 20 45 78 70 72 4c 69 73  int i;.  ExprLis
9080: 74 20 2a 70 4f 72 64 65 72 42 79 3b 0a 20 20 45  t *pOrderBy;.  E
9090: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
90a0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b 0a  .  sqlite3 *db;.
90b0: 20 20 69 6e 74 20 6d 6f 72 65 54 6f 44 6f 20 3d    int moreToDo =
90c0: 20 31 3b 0a 0a 20 20 70 4f 72 64 65 72 42 79 20   1;..  pOrderBy 
90d0: 3d 20 70 53 65 6c 65 63 74 2d 3e 70 4f 72 64 65  = pSelect->pOrde
90e0: 72 42 79 3b 0a 20 20 69 66 28 20 70 4f 72 64 65  rBy;.  if( pOrde
90f0: 72 42 79 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  rBy==0 ) return 
9100: 30 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65  0;.  db = pParse
9110: 2d 3e 64 62 3b 0a 20 20 69 66 28 20 70 4f 72 64  ->db;.  if( pOrd
9120: 65 72 42 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e  erBy->nExpr>db->
9130: 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49  aLimit[SQLITE_LI
9140: 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20  MIT_COLUMN] ){. 
9150: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
9160: 73 67 28 70 50 61 72 73 65 2c 20 22 74 6f 6f 20  sg(pParse, "too 
9170: 6d 61 6e 79 20 74 65 72 6d 73 20 69 6e 20 4f 52  many terms in OR
9180: 44 45 52 20 42 59 20 63 6c 61 75 73 65 22 29 3b  DER BY clause");
9190: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20  .    return 1;. 
91a0: 20 7d 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c   }.  for(i=0; i<
91b0: 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b  pOrderBy->nExpr;
91c0: 20 69 2b 2b 29 7b 0a 20 20 20 20 70 4f 72 64 65   i++){.    pOrde
91d0: 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65 20 3d  rBy->a[i].done =
91e0: 20 30 3b 0a 20 20 7d 0a 20 20 70 53 65 6c 65 63   0;.  }.  pSelec
91f0: 74 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a 20 20  t->pNext = 0;.  
9200: 77 68 69 6c 65 28 20 70 53 65 6c 65 63 74 2d 3e  while( pSelect->
9210: 70 50 72 69 6f 72 20 29 7b 0a 20 20 20 20 70 53  pPrior ){.    pS
9220: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 2d 3e 70  elect->pPrior->p
9230: 4e 65 78 74 20 3d 20 70 53 65 6c 65 63 74 3b 0a  Next = pSelect;.
9240: 20 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53      pSelect = pS
9250: 65 6c 65 63 74 2d 3e 70 50 72 69 6f 72 3b 0a 20  elect->pPrior;. 
9260: 20 7d 0a 20 20 77 68 69 6c 65 28 20 70 53 65 6c   }.  while( pSel
9270: 65 63 74 20 26 26 20 6d 6f 72 65 54 6f 44 6f 20  ect && moreToDo 
9280: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9290: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
92a0: 65 6d 3b 0a 20 20 20 20 6d 6f 72 65 54 6f 44 6f  em;.    moreToDo
92b0: 20 3d 20 30 3b 0a 20 20 20 20 70 45 4c 69 73 74   = 0;.    pEList
92c0: 20 3d 20 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69   = pSelect->pELi
92d0: 73 74 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  st;.    assert( 
92e0: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
92f0: 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d   for(i=0, pItem=
9300: 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69 3c 70  pOrderBy->a; i<p
9310: 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20  OrderBy->nExpr; 
9320: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9330: 20 20 20 20 20 69 6e 74 20 69 43 6f 6c 20 3d 20       int iCol = 
9340: 2d 31 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  -1;.      Expr *
9350: 70 45 2c 20 2a 70 44 75 70 3b 0a 20 20 20 20 20  pE, *pDup;.     
9360: 20 69 66 28 20 70 49 74 65 6d 2d 3e 64 6f 6e 65   if( pItem->done
9370: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
9380: 20 20 20 70 45 20 3d 20 73 71 6c 69 74 65 33 45     pE = sqlite3E
9390: 78 70 72 53 6b 69 70 43 6f 6c 6c 61 74 65 28 70  xprSkipCollate(p
93a0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
93b0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
93c0: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 45 2c  xprIsInteger(pE,
93d0: 20 26 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20   &iCol) ){.     
93e0: 20 20 20 69 66 28 20 69 43 6f 6c 3c 3d 30 20 7c     if( iCol<=0 |
93f0: 7c 20 69 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e  | iCol>pEList->n
9400: 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 20 20  Expr ){.        
9410: 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f 66 52 61    resolveOutOfRa
9420: 6e 67 65 45 72 72 6f 72 28 70 50 61 72 73 65 2c  ngeError(pParse,
9430: 20 22 4f 52 44 45 52 22 2c 20 69 2b 31 2c 20 70   "ORDER", i+1, p
9440: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 29 3b 0a 20  EList->nExpr);. 
9450: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
9460: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
9470: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
9480: 20 20 69 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65    iCol = resolve
9490: 41 73 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  AsName(pParse, p
94a0: 45 4c 69 73 74 2c 20 70 45 29 3b 0a 20 20 20 20  EList, pE);.    
94b0: 20 20 20 20 69 66 28 20 69 43 6f 6c 3d 3d 30 20      if( iCol==0 
94c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 44 75  ){.          pDu
94d0: 70 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  p = sqlite3ExprD
94e0: 75 70 28 64 62 2c 20 70 45 2c 20 30 29 3b 0a 20  up(db, pE, 0);. 
94f0: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 64 62           if( !db
9500: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
9510: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 61 73  {.            as
9520: 73 65 72 74 28 70 44 75 70 29 3b 0a 20 20 20 20  sert(pDup);.    
9530: 20 20 20 20 20 20 20 20 69 43 6f 6c 20 3d 20 72          iCol = r
9540: 65 73 6f 6c 76 65 4f 72 64 65 72 42 79 54 65 72  esolveOrderByTer
9550: 6d 54 6f 45 78 70 72 4c 69 73 74 28 70 50 61 72  mToExprList(pPar
9560: 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 44 75  se, pSelect, pDu
9570: 70 29 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a  p);.          }.
9580: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
9590: 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20  3ExprDelete(db, 
95a0: 70 44 75 70 29 3b 0a 20 20 20 20 20 20 20 20 7d  pDup);.        }
95b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
95c0: 66 28 20 69 43 6f 6c 3e 30 20 29 7b 0a 20 20 20  f( iCol>0 ){.   
95d0: 20 20 20 20 20 2f 2a 20 43 6f 6e 76 65 72 74 20       /* Convert 
95e0: 74 68 65 20 4f 52 44 45 52 20 42 59 20 74 65 72  the ORDER BY ter
95f0: 6d 20 69 6e 74 6f 20 61 6e 20 69 6e 74 65 67 65  m into an intege
9600: 72 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  r column number 
9610: 69 43 6f 6c 2c 0a 20 20 20 20 20 20 20 20 2a 2a  iCol,.        **
9620: 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74 6f 20   taking care to 
9630: 70 72 65 73 65 72 76 65 20 74 68 65 20 43 4f 4c  preserve the COL
9640: 4c 41 54 45 20 63 6c 61 75 73 65 20 69 66 20 69  LATE clause if i
9650: 74 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  t exists */.    
9660: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 20 3d      Expr *pNew =
9670: 20 73 71 6c 69 74 65 33 45 78 70 72 28 64 62 2c   sqlite3Expr(db,
9680: 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 29 3b   TK_INTEGER, 0);
9690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4e 65  .        if( pNe
96a0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  w==0 ) return 1;
96b0: 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 66  .        pNew->f
96c0: 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74 56 61  lags |= EP_IntVa
96d0: 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70 4e 65  lue;.        pNe
96e0: 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20 69 43  w->u.iValue = iC
96f0: 6f 6c 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ol;.        if( 
9700: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3d 3d 70 45  pItem->pExpr==pE
9710: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 49   ){.          pI
9720: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
9730: 77 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  w;.        }else
9740: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
9750: 20 2a 70 50 61 72 65 6e 74 20 3d 20 70 49 74 65   *pParent = pIte
9760: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
9770: 20 20 20 20 61 73 73 65 72 74 28 20 70 50 61 72      assert( pPar
9780: 65 6e 74 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c  ent->op==TK_COLL
9790: 41 54 45 20 29 3b 0a 20 20 20 20 20 20 20 20 20  ATE );.         
97a0: 20 77 68 69 6c 65 28 20 70 50 61 72 65 6e 74 2d   while( pParent-
97b0: 3e 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 43  >pLeft->op==TK_C
97c0: 4f 4c 4c 41 54 45 20 29 20 70 50 61 72 65 6e 74  OLLATE ) pParent
97d0: 20 3d 20 70 50 61 72 65 6e 74 2d 3e 70 4c 65 66   = pParent->pLef
97e0: 74 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73 73  t;.          ass
97f0: 65 72 74 28 20 70 50 61 72 65 6e 74 2d 3e 70 4c  ert( pParent->pL
9800: 65 66 74 3d 3d 70 45 20 29 3b 0a 20 20 20 20 20  eft==pE );.     
9810: 20 20 20 20 20 70 50 61 72 65 6e 74 2d 3e 70 4c       pParent->pL
9820: 65 66 74 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20  eft = pNew;.    
9830: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
9840: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
9850: 64 62 2c 20 70 45 29 3b 0a 20 20 20 20 20 20 20  db, pE);.       
9860: 20 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64   pItem->u.x.iOrd
9870: 65 72 42 79 43 6f 6c 20 3d 20 28 75 31 36 29 69  erByCol = (u16)i
9880: 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 70 49 74  Col;.        pIt
9890: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 31 3b 0a 20 20  em->done = 1;.  
98a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
98b0: 20 20 20 6d 6f 72 65 54 6f 44 6f 20 3d 20 31 3b     moreToDo = 1;
98c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
98d0: 20 20 20 70 53 65 6c 65 63 74 20 3d 20 70 53 65     pSelect = pSe
98e0: 6c 65 63 74 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d  lect->pNext;.  }
98f0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4f  .  for(i=0; i<pO
9900: 72 64 65 72 42 79 2d 3e 6e 45 78 70 72 3b 20 69  rderBy->nExpr; i
9910: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 4f 72  ++){.    if( pOr
9920: 64 65 72 42 79 2d 3e 61 5b 69 5d 2e 64 6f 6e 65  derBy->a[i].done
9930: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
9940: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
9950: 72 73 65 2c 20 22 25 72 20 4f 52 44 45 52 20 42  rse, "%r ORDER B
9960: 59 20 74 65 72 6d 20 64 6f 65 73 20 6e 6f 74 20  Y term does not 
9970: 6d 61 74 63 68 20 61 6e 79 20 22 0a 20 20 20 20  match any ".    
9980: 20 20 20 20 20 20 20 20 22 63 6f 6c 75 6d 6e 20          "column 
9990: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
99a0: 74 22 2c 20 69 2b 31 29 3b 0a 20 20 20 20 20 20  t", i+1);.      
99b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
99c0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
99d0: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20 65  }../*.** Check e
99e0: 76 65 72 79 20 74 65 72 6d 20 69 6e 20 74 68 65  very term in the
99f0: 20 4f 52 44 45 52 20 42 59 20 6f 72 20 47 52 4f   ORDER BY or GRO
9a00: 55 50 20 42 59 20 63 6c 61 75 73 65 20 70 4f 72  UP BY clause pOr
9a10: 64 65 72 42 79 20 6f 66 0a 2a 2a 20 74 68 65 20  derBy of.** the 
9a20: 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74  SELECT statement
9a30: 20 70 53 65 6c 65 63 74 2e 20 20 49 66 20 61 6e   pSelect.  If an
9a40: 79 20 74 65 72 6d 20 69 73 20 72 65 66 65 72 65  y term is refere
9a50: 6e 63 65 20 74 6f 20 61 0a 2a 2a 20 72 65 73 75  nce to a.** resu
9a60: 6c 74 20 73 65 74 20 65 78 70 72 65 73 73 69 6f  lt set expressio
9a70: 6e 20 28 61 73 20 64 65 74 65 72 6d 69 6e 65 64  n (as determined
9a80: 20 62 79 20 74 68 65 20 45 78 70 72 4c 69 73 74   by the ExprList
9a90: 2e 61 2e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43  .a.u.x.iOrderByC
9aa0: 6f 6c 0a 2a 2a 20 66 69 65 6c 64 29 20 74 68 65  ol.** field) the
9ab0: 6e 20 63 6f 6e 76 65 72 74 20 74 68 61 74 20 74  n convert that t
9ac0: 65 72 6d 20 69 6e 74 6f 20 61 20 63 6f 70 79 20  erm into a copy 
9ad0: 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  of the correspon
9ae0: 64 69 6e 67 20 72 65 73 75 6c 74 20 73 65 74 0a  ding result set.
9af0: 2a 2a 20 63 6f 6c 75 6d 6e 2e 0a 2a 2a 0a 2a 2a  ** column..**.**
9b00: 20 49 66 20 61 6e 79 20 65 72 72 6f 72 73 20 61   If any errors a
9b10: 72 65 20 64 65 74 65 63 74 65 64 2c 20 61 64 64  re detected, add
9b20: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
9b30: 65 20 74 6f 20 70 50 61 72 73 65 20 61 6e 64 0a  e to pParse and.
9b40: 2a 2a 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65  ** return non-ze
9b50: 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f  ro.  Return zero
9b60: 20 69 66 20 6e 6f 20 65 72 72 6f 72 73 20 61 72   if no errors ar
9b70: 65 20 73 65 65 6e 2e 0a 2a 2f 0a 69 6e 74 20 73  e seen..*/.int s
9b80: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72 64  qlite3ResolveOrd
9b90: 65 72 47 72 6f 75 70 42 79 28 0a 20 20 50 61 72  erGroupBy(.  Par
9ba0: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
9bb0: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
9bc0: 6e 74 65 78 74 2e 20 20 4c 65 61 76 65 20 65 72  ntext.  Leave er
9bd0: 72 6f 72 20 6d 65 73 73 61 67 65 73 20 68 65 72  ror messages her
9be0: 65 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70  e */.  Select *p
9bf0: 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a 20  Select,      /* 
9c00: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
9c10: 6d 65 6e 74 20 63 6f 6e 74 61 69 6e 69 6e 67 20  ment containing 
9c20: 74 68 65 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20  the clause */.  
9c30: 45 78 70 72 4c 69 73 74 20 2a 70 4f 72 64 65 72  ExprList *pOrder
9c40: 42 79 2c 20 20 20 2f 2a 20 54 68 65 20 4f 52 44  By,   /* The ORD
9c50: 45 52 20 42 59 20 6f 72 20 47 52 4f 55 50 20 42  ER BY or GROUP B
9c60: 59 20 63 6c 61 75 73 65 20 74 6f 20 62 65 20 70  Y clause to be p
9c70: 72 6f 63 65 73 73 65 64 20 2a 2f 0a 20 20 63 6f  rocessed */.  co
9c80: 6e 73 74 20 63 68 61 72 20 2a 7a 54 79 70 65 20  nst char *zType 
9c90: 20 20 20 20 2f 2a 20 22 4f 52 44 45 52 22 20 6f      /* "ORDER" o
9ca0: 72 20 22 47 52 4f 55 50 22 20 2a 2f 0a 29 7b 0a  r "GROUP" */.){.
9cb0: 20 20 69 6e 74 20 69 3b 0a 20 20 73 71 6c 69 74    int i;.  sqlit
9cc0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
9cd0: 3e 64 62 3b 0a 20 20 45 78 70 72 4c 69 73 74 20  >db;.  ExprList 
9ce0: 2a 70 45 4c 69 73 74 3b 0a 20 20 73 74 72 75 63  *pEList;.  struc
9cf0: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
9d00: 2a 70 49 74 65 6d 3b 0a 0a 20 20 69 66 28 20 70  *pItem;..  if( p
9d10: 4f 72 64 65 72 42 79 3d 3d 30 20 7c 7c 20 70 50  OrderBy==0 || pP
9d20: 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63  arse->db->malloc
9d30: 46 61 69 6c 65 64 20 29 20 72 65 74 75 72 6e 20  Failed ) return 
9d40: 30 3b 0a 20 20 69 66 28 20 70 4f 72 64 65 72 42  0;.  if( pOrderB
9d50: 79 2d 3e 6e 45 78 70 72 3e 64 62 2d 3e 61 4c 69  y->nExpr>db->aLi
9d60: 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54  mit[SQLITE_LIMIT
9d70: 5f 43 4f 4c 55 4d 4e 5d 20 29 7b 0a 20 20 20 20  _COLUMN] ){.    
9d80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9d90: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
9da0: 79 20 74 65 72 6d 73 20 69 6e 20 25 73 20 42 59  y terms in %s BY
9db0: 20 63 6c 61 75 73 65 22 2c 20 7a 54 79 70 65 29   clause", zType)
9dc0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  ;.    return 1;.
9dd0: 20 20 7d 0a 20 20 70 45 4c 69 73 74 20 3d 20 70    }.  pEList = p
9de0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
9df0: 20 20 61 73 73 65 72 74 28 20 70 45 4c 69 73 74    assert( pEList
9e00: 21 3d 30 20 29 3b 20 20 2f 2a 20 73 71 6c 69 74  !=0 );  /* sqlit
9e10: 65 33 53 65 6c 65 63 74 4e 65 77 28 29 20 67 75  e3SelectNew() gu
9e20: 61 72 61 6e 74 65 65 73 20 74 68 69 73 20 2a 2f  arantees this */
9e30: 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65  .  for(i=0, pIte
9e40: 6d 3d 70 4f 72 64 65 72 42 79 2d 3e 61 3b 20 69  m=pOrderBy->a; i
9e50: 3c 70 4f 72 64 65 72 42 79 2d 3e 6e 45 78 70 72  <pOrderBy->nExpr
9e60: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
9e70: 0a 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e  .    if( pItem->
9e80: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
9e90: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 49 74  ){.      if( pIt
9ea0: 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79  em->u.x.iOrderBy
9eb0: 43 6f 6c 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70  Col>pEList->nExp
9ec0: 72 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 73  r ){.        res
9ed0: 6f 6c 76 65 4f 75 74 4f 66 52 61 6e 67 65 45 72  olveOutOfRangeEr
9ee0: 72 6f 72 28 70 50 61 72 73 65 2c 20 7a 54 79 70  ror(pParse, zTyp
9ef0: 65 2c 20 69 2b 31 2c 20 70 45 4c 69 73 74 2d 3e  e, i+1, pEList->
9f00: 6e 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  nExpr);.        
9f10: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
9f20: 7d 0a 20 20 20 20 20 20 72 65 73 6f 6c 76 65 41  }.      resolveA
9f30: 6c 69 61 73 28 70 50 61 72 73 65 2c 20 70 45 4c  lias(pParse, pEL
9f40: 69 73 74 2c 20 70 49 74 65 6d 2d 3e 75 2e 78 2e  ist, pItem->u.x.
9f50: 69 4f 72 64 65 72 42 79 43 6f 6c 2d 31 2c 20 70  iOrderByCol-1, p
9f60: 49 74 65 6d 2d 3e 70 45 78 70 72 2c 0a 20 20 20  Item->pExpr,.   
9f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9f80: 7a 54 79 70 65 2c 30 29 3b 0a 20 20 20 20 7d 0a  zType,0);.    }.
9f90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
9fa0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 4f 72 64 65 72 42  }../*.** pOrderB
9fb0: 79 20 69 73 20 61 6e 20 4f 52 44 45 52 20 42 59  y is an ORDER BY
9fc0: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
9fd0: 75 73 65 20 69 6e 20 53 45 4c 45 43 54 20 73 74  use in SELECT st
9fe0: 61 74 65 6d 65 6e 74 20 70 53 65 6c 65 63 74 2e  atement pSelect.
9ff0: 0a 2a 2a 20 54 68 65 20 4e 61 6d 65 20 63 6f 6e  .** The Name con
a000: 74 65 78 74 20 6f 66 20 74 68 65 20 53 45 4c 45  text of the SELE
a010: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 69 73 20  CT statement is 
a020: 70 4e 43 2e 20 20 7a 54 79 70 65 20 69 73 20 65  pNC.  zType is e
a030: 69 74 68 65 72 0a 2a 2a 20 22 4f 52 44 45 52 22  ither.** "ORDER"
a040: 20 6f 72 20 22 47 52 4f 55 50 22 20 64 65 70 65   or "GROUP" depe
a050: 6e 64 69 6e 67 20 6f 6e 20 77 68 69 63 68 20 74  nding on which t
a060: 79 70 65 20 6f 66 20 63 6c 61 75 73 65 20 70 4f  ype of clause pO
a070: 72 64 65 72 42 79 20 69 73 2e 0a 2a 2a 0a 2a 2a  rderBy is..**.**
a080: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
a090: 73 6f 6c 76 65 73 20 65 61 63 68 20 74 65 72 6d  solves each term
a0a0: 20 6f 66 20 74 68 65 20 63 6c 61 75 73 65 20 69   of the clause i
a0b0: 6e 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f  nto an expressio
a0c0: 6e 2e 0a 2a 2a 20 49 66 20 74 68 65 20 6f 72 64  n..** If the ord
a0d0: 65 72 2d 62 79 20 74 65 72 6d 20 69 73 20 61 6e  er-by term is an
a0e0: 20 69 6e 74 65 67 65 72 20 49 20 62 65 74 77 65   integer I betwe
a0f0: 65 6e 20 31 20 61 6e 64 20 4e 20 28 77 68 65 72  en 1 and N (wher
a100: 65 20 4e 20 69 73 20 74 68 65 0a 2a 2a 20 6e 75  e N is the.** nu
a110: 6d 62 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  mber of columns 
a120: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
a130: 74 20 6f 66 20 74 68 65 20 53 45 4c 45 43 54 29  t of the SELECT)
a140: 20 74 68 65 6e 20 74 68 65 20 65 78 70 72 65 73   then the expres
a150: 73 69 6f 6e 0a 2a 2a 20 69 6e 20 74 68 65 20 72  sion.** in the r
a160: 65 73 6f 6c 75 74 69 6f 6e 20 69 73 20 61 20 63  esolution is a c
a170: 6f 70 79 20 6f 66 20 74 68 65 20 49 2d 74 68 20  opy of the I-th 
a180: 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72 65  result-set expre
a190: 73 73 69 6f 6e 2e 20 20 49 66 0a 2a 2a 20 74 68  ssion.  If.** th
a1a0: 65 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  e order-by term 
a1b0: 69 73 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  is an identifier
a1c0: 20 74 68 61 74 20 63 6f 72 72 65 73 70 6f 6e 64   that correspond
a1d0: 73 20 74 6f 20 74 68 65 20 41 53 2d 6e 61 6d 65  s to the AS-name
a1e0: 20 6f 66 0a 2a 2a 20 61 20 72 65 73 75 6c 74 2d   of.** a result-
a1f0: 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  set expression, 
a200: 74 68 65 6e 20 74 68 65 20 74 65 72 6d 20 72 65  then the term re
a210: 73 6f 6c 76 65 73 20 74 6f 20 61 20 63 6f 70 79  solves to a copy
a220: 20 6f 66 20 74 68 65 0a 2a 2a 20 72 65 73 75 6c   of the.** resul
a230: 74 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e  t-set expression
a240: 2e 20 20 4f 74 68 65 72 77 69 73 65 2c 20 74 68  .  Otherwise, th
a250: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a260: 72 65 73 6f 6c 76 65 64 20 69 6e 0a 2a 2a 20 74  resolved in.** t
a270: 68 65 20 75 73 75 61 6c 20 77 61 79 20 2d 20 75  he usual way - u
a280: 73 69 6e 67 20 73 71 6c 69 74 65 33 52 65 73 6f  sing sqlite3Reso
a290: 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 29 2e 0a  lveExprNames()..
a2a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
a2b0: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 20 6e  ne returns the n
a2c0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
a2d0: 20 20 49 66 20 65 72 72 6f 72 73 20 6f 63 63 75    If errors occu
a2e0: 72 2c 20 74 68 65 6e 0a 2a 2a 20 61 6e 20 61 70  r, then.** an ap
a2f0: 70 72 6f 70 72 69 61 74 65 20 65 72 72 6f 72 20  propriate error 
a300: 6d 65 73 73 61 67 65 20 6d 69 67 68 74 20 62 65  message might be
a310: 20 6c 65 66 74 20 69 6e 20 70 50 61 72 73 65 2e   left in pParse.
a320: 20 20 28 4f 4f 4d 20 65 72 72 6f 72 73 0a 2a 2a    (OOM errors.**
a330: 20 65 78 63 65 70 74 65 64 2e 29 0a 2a 2f 0a 73   excepted.).*/.s
a340: 74 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76  tatic int resolv
a350: 65 4f 72 64 65 72 47 72 6f 75 70 42 79 28 0a 20  eOrderGroupBy(. 
a360: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
a370: 43 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  C,     /* The na
a380: 6d 65 20 63 6f 6e 74 65 78 74 20 6f 66 20 74 68  me context of th
a390: 65 20 53 45 4c 45 43 54 20 73 74 61 74 65 6d 65  e SELECT stateme
a3a0: 6e 74 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a  nt */.  Select *
a3b0: 70 53 65 6c 65 63 74 2c 20 20 20 20 20 20 2f 2a  pSelect,      /*
a3c0: 20 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74   The SELECT stat
a3d0: 65 6d 65 6e 74 20 68 6f 6c 64 69 6e 67 20 70 4f  ement holding pO
a3e0: 72 64 65 72 42 79 20 2a 2f 0a 20 20 45 78 70 72  rderBy */.  Expr
a3f0: 4c 69 73 74 20 2a 70 4f 72 64 65 72 42 79 2c 20  List *pOrderBy, 
a400: 20 20 2f 2a 20 41 6e 20 4f 52 44 45 52 20 42 59    /* An ORDER BY
a410: 20 6f 72 20 47 52 4f 55 50 20 42 59 20 63 6c 61   or GROUP BY cla
a420: 75 73 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 2a  use to resolve *
a430: 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  /.  const char *
a440: 7a 54 79 70 65 20 20 20 20 20 2f 2a 20 45 69 74  zType     /* Eit
a450: 68 65 72 20 22 4f 52 44 45 52 22 20 6f 72 20 22  her "ORDER" or "
a460: 47 52 4f 55 50 22 2c 20 61 73 20 61 70 70 72 6f  GROUP", as appro
a470: 70 72 69 61 74 65 20 2a 2f 0a 29 7b 0a 20 20 69  priate */.){.  i
a480: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
a490: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a4a0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
a4b0: 2f 0a 20 20 69 6e 74 20 69 43 6f 6c 3b 20 20 20  /.  int iCol;   
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 2f 2a 20 43 6f 6c 75 6d 6e 20 6e 75 6d     /* Column num
a4e0: 62 65 72 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ber */.  struct 
a4f0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
a500: 49 74 65 6d 3b 20 20 20 2f 2a 20 41 20 74 65 72  Item;   /* A ter
a510: 6d 20 6f 66 20 74 68 65 20 4f 52 44 45 52 20 42  m of the ORDER B
a520: 59 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 50 61  Y clause */.  Pa
a530: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
a540: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
a550: 50 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  Parsing context 
a560: 2a 2f 0a 20 20 69 6e 74 20 6e 52 65 73 75 6c 74  */.  int nResult
a570: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
a580: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
a590: 20 74 65 72 6d 73 20 69 6e 20 74 68 65 20 72 65   terms in the re
a5a0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 0a 20 20 69  sult set */..  i
a5b0: 66 28 20 70 4f 72 64 65 72 42 79 3d 3d 30 20 29  f( pOrderBy==0 )
a5c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 52 65   return 0;.  nRe
a5d0: 73 75 6c 74 20 3d 20 70 53 65 6c 65 63 74 2d 3e  sult = pSelect->
a5e0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
a5f0: 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70   pParse = pNC->p
a600: 50 61 72 73 65 3b 0a 20 20 66 6f 72 28 69 3d 30  Parse;.  for(i=0
a610: 2c 20 70 49 74 65 6d 3d 70 4f 72 64 65 72 42 79  , pItem=pOrderBy
a620: 2d 3e 61 3b 20 69 3c 70 4f 72 64 65 72 42 79 2d  ->a; i<pOrderBy-
a630: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
a640: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
a650: 2a 70 45 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78  *pE = pItem->pEx
a660: 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
a670: 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  2 = sqlite3ExprS
a680: 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 29 3b 0a  kipCollate(pE);.
a690: 20 20 20 20 69 66 28 20 7a 54 79 70 65 5b 30 5d      if( zType[0]
a6a0: 21 3d 27 47 27 20 29 7b 0a 20 20 20 20 20 20 69  !='G' ){.      i
a6b0: 43 6f 6c 20 3d 20 72 65 73 6f 6c 76 65 41 73 4e  Col = resolveAsN
a6c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 53 65 6c  ame(pParse, pSel
a6d0: 65 63 74 2d 3e 70 45 4c 69 73 74 2c 20 70 45 32  ect->pEList, pE2
a6e0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 69 43 6f  );.      if( iCo
a6f0: 6c 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  l>0 ){.        /
a700: 2a 20 49 66 20 61 6e 20 41 53 2d 6e 61 6d 65 20  * If an AS-name 
a710: 6d 61 74 63 68 20 69 73 20 66 6f 75 6e 64 2c 20  match is found, 
a720: 6d 61 72 6b 20 74 68 69 73 20 4f 52 44 45 52 20  mark this ORDER 
a730: 42 59 20 63 6f 6c 75 6d 6e 20 61 73 20 62 65 69  BY column as bei
a740: 6e 67 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ng.        ** a 
a750: 63 6f 70 79 20 6f 66 20 74 68 65 20 69 43 6f 6c  copy of the iCol
a760: 2d 74 68 20 72 65 73 75 6c 74 2d 73 65 74 20 63  -th result-set c
a770: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 73 75 62 73  olumn.  The subs
a780: 65 71 75 65 6e 74 20 63 61 6c 6c 20 74 6f 0a 20  equent call to. 
a790: 20 20 20 20 20 20 20 2a 2a 20 73 71 6c 69 74 65         ** sqlite
a7a0: 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f  3ResolveOrderGro
a7b0: 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e 76  upBy() will conv
a7c0: 65 72 74 20 74 68 65 20 65 78 70 72 65 73 73 69  ert the expressi
a7d0: 6f 6e 20 74 6f 20 61 0a 20 20 20 20 20 20 20 20  on to a.        
a7e0: 2a 2a 20 63 6f 70 79 20 6f 66 20 74 68 65 20 69  ** copy of the i
a7f0: 43 6f 6c 2d 74 68 20 72 65 73 75 6c 74 2d 73 65  Col-th result-se
a800: 74 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 2a 2f  t expression. */
a810: 0a 20 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e  .        pItem->
a820: 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20  u.x.iOrderByCol 
a830: 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20 20  = (u16)iCol;.   
a840: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
a850: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20       }.    }.   
a860: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
a870: 49 73 49 6e 74 65 67 65 72 28 70 45 32 2c 20 26  IsInteger(pE2, &
a880: 69 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 2f  iCol) ){.      /
a890: 2a 20 54 68 65 20 4f 52 44 45 52 20 42 59 20 74  * The ORDER BY t
a8a0: 65 72 6d 20 69 73 20 61 6e 20 69 6e 74 65 67 65  erm is an intege
a8b0: 72 20 63 6f 6e 73 74 61 6e 74 2e 20 20 41 67 61  r constant.  Aga
a8c0: 69 6e 2c 20 73 65 74 20 74 68 65 20 63 6f 6c 75  in, set the colu
a8d0: 6d 6e 0a 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62  mn.      ** numb
a8e0: 65 72 20 73 6f 20 74 68 61 74 20 73 71 6c 69 74  er so that sqlit
a8f0: 65 33 52 65 73 6f 6c 76 65 4f 72 64 65 72 47 72  e3ResolveOrderGr
a900: 6f 75 70 42 79 28 29 20 77 69 6c 6c 20 63 6f 6e  oupBy() will con
a910: 76 65 72 74 20 74 68 65 0a 20 20 20 20 20 20 2a  vert the.      *
a920: 2a 20 6f 72 64 65 72 2d 62 79 20 74 65 72 6d 20  * order-by term 
a930: 74 6f 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65  to a copy of the
a940: 20 72 65 73 75 6c 74 2d 73 65 74 20 65 78 70 72   result-set expr
a950: 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  ession */.      
a960: 69 66 28 20 69 43 6f 6c 3c 31 20 7c 7c 20 69 43  if( iCol<1 || iC
a970: 6f 6c 3e 30 78 66 66 66 66 20 29 7b 0a 20 20 20  ol>0xffff ){.   
a980: 20 20 20 20 20 72 65 73 6f 6c 76 65 4f 75 74 4f       resolveOutO
a990: 66 52 61 6e 67 65 45 72 72 6f 72 28 70 50 61 72  fRangeError(pPar
a9a0: 73 65 2c 20 7a 54 79 70 65 2c 20 69 2b 31 2c 20  se, zType, i+1, 
a9b0: 6e 52 65 73 75 6c 74 29 3b 0a 20 20 20 20 20 20  nResult);.      
a9c0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
a9d0: 20 20 7d 0a 20 20 20 20 20 20 70 49 74 65 6d 2d    }.      pItem-
a9e0: 3e 75 2e 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c  >u.x.iOrderByCol
a9f0: 20 3d 20 28 75 31 36 29 69 43 6f 6c 3b 0a 20 20   = (u16)iCol;.  
aa00: 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20      continue;.  
aa10: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 4f 74 68 65    }..    /* Othe
aa20: 72 77 69 73 65 2c 20 74 72 65 61 74 20 74 68 65  rwise, treat the
aa30: 20 4f 52 44 45 52 20 42 59 20 74 65 72 6d 20 61   ORDER BY term a
aa40: 73 20 61 6e 20 6f 72 64 69 6e 61 72 79 20 65 78  s an ordinary ex
aa50: 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20 20 20 20  pression */.    
aa60: 70 49 74 65 6d 2d 3e 75 2e 78 2e 69 4f 72 64 65  pItem->u.x.iOrde
aa70: 72 42 79 43 6f 6c 20 3d 20 30 3b 0a 20 20 20 20  rByCol = 0;.    
aa80: 69 66 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c  if( sqlite3Resol
aa90: 76 65 45 78 70 72 4e 61 6d 65 73 28 70 4e 43 2c  veExprNames(pNC,
aaa0: 20 70 45 29 20 29 7b 0a 20 20 20 20 20 20 72 65   pE) ){.      re
aab0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20  turn 1;.    }.  
aac0: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 53 65    for(j=0; j<pSe
aad0: 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45  lect->pEList->nE
aae0: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
aaf0: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
ab00: 43 6f 6d 70 61 72 65 28 30 2c 20 70 45 2c 20 70  Compare(0, pE, p
ab10: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
ab20: 61 5b 6a 5d 2e 70 45 78 70 72 2c 20 2d 31 29 3d  a[j].pExpr, -1)=
ab30: 3d 30 20 29 7b 0a 23 69 66 6e 64 65 66 20 53 51  =0 ){.#ifndef SQ
ab40: 4c 49 54 45 5f 4f 4d 49 54 5f 57 49 4e 44 4f 57  LITE_OMIT_WINDOW
ab50: 46 55 4e 43 0a 20 20 20 20 20 20 20 20 69 66 28  FUNC.        if(
ab60: 20 70 45 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20   pE->pWin ){.   
ab70: 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 63 65 20         /* Since 
ab80: 74 68 69 73 20 77 69 6e 64 6f 77 20 66 75 6e 63  this window func
ab90: 74 69 6f 6e 20 69 73 20 62 65 69 6e 67 20 63 68  tion is being ch
aba0: 61 6e 67 65 64 20 69 6e 74 6f 20 61 20 72 65 66  anged into a ref
abb0: 65 72 65 6e 63 65 0a 20 20 20 20 20 20 20 20 20  erence.         
abc0: 20 2a 2a 20 74 6f 20 74 68 65 20 73 61 6d 65 20   ** to the same 
abd0: 77 69 6e 64 6f 77 20 66 75 6e 63 74 69 6f 6e 20  window function 
abe0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 2c 20  the result set, 
abf0: 72 65 6d 6f 76 65 20 74 68 65 20 69 6e 73 74 61  remove the insta
ac00: 6e 63 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a  nce.          **
ac10: 20 6f 66 20 74 68 69 73 20 77 69 6e 64 6f 77 20   of this window 
ac20: 66 75 6e 63 74 69 6f 6e 20 66 72 6f 6d 20 74 68  function from th
ac30: 65 20 53 65 6c 65 63 74 2e 70 57 69 6e 20 6c 69  e Select.pWin li
ac40: 73 74 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  st. */.         
ac50: 20 57 69 6e 64 6f 77 20 2a 2a 70 70 3b 0a 20 20   Window **pp;.  
ac60: 20 20 20 20 20 20 20 20 66 6f 72 28 70 70 3d 26          for(pp=&
ac70: 70 53 65 6c 65 63 74 2d 3e 70 57 69 6e 3b 20 2a  pSelect->pWin; *
ac80: 70 70 3b 20 70 70 3d 26 28 2a 70 70 29 2d 3e 70  pp; pp=&(*pp)->p
ac90: 4e 65 78 74 57 69 6e 29 7b 0a 20 20 20 20 20 20  NextWin){.      
aca0: 20 20 20 20 20 20 69 66 28 20 2a 70 70 3d 3d 70        if( *pp==p
acb0: 45 2d 3e 70 57 69 6e 20 29 7b 0a 20 20 20 20 20  E->pWin ){.     
acc0: 20 20 20 20 20 20 20 20 20 2a 70 70 20 3d 20 28           *pp = (
acd0: 2a 70 70 29 2d 3e 70 4e 65 78 74 57 69 6e 3b 0a  *pp)->pNextWin;.
ace0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 20 20 20              }   
acf0: 20 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20   .          }.  
ad00: 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20        }.#endif. 
ad10: 20 20 20 20 20 20 20 70 49 74 65 6d 2d 3e 75 2e         pItem->u.
ad20: 78 2e 69 4f 72 64 65 72 42 79 43 6f 6c 20 3d 20  x.iOrderByCol = 
ad30: 6a 2b 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  j+1;.      }.   
ad40: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
ad50: 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 4f 72  sqlite3ResolveOr
ad60: 64 65 72 47 72 6f 75 70 42 79 28 70 50 61 72 73  derGroupBy(pPars
ad70: 65 2c 20 70 53 65 6c 65 63 74 2c 20 70 4f 72 64  e, pSelect, pOrd
ad80: 65 72 42 79 2c 20 7a 54 79 70 65 29 3b 0a 7d 0a  erBy, zType);.}.
ad90: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
ada0: 61 6d 65 73 20 69 6e 20 74 68 65 20 53 45 4c 45  ames in the SELE
adb0: 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70 20 61  CT statement p a
adc0: 6e 64 20 61 6c 6c 20 6f 66 20 69 74 73 20 64 65  nd all of its de
add0: 73 63 65 6e 64 61 6e 74 73 2e 0a 2a 2f 0a 73 74  scendants..*/.st
ade0: 61 74 69 63 20 69 6e 74 20 72 65 73 6f 6c 76 65  atic int resolve
adf0: 53 65 6c 65 63 74 53 74 65 70 28 57 61 6c 6b 65  SelectStep(Walke
ae00: 72 20 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65  r *pWalker, Sele
ae10: 63 74 20 2a 70 29 7b 0a 20 20 4e 61 6d 65 43 6f  ct *p){.  NameCo
ae20: 6e 74 65 78 74 20 2a 70 4f 75 74 65 72 4e 43 3b  ntext *pOuterNC;
ae30: 20 20 2f 2a 20 43 6f 6e 74 65 78 74 20 74 68 61    /* Context tha
ae40: 74 20 63 6f 6e 74 61 69 6e 73 20 74 68 69 73 20  t contains this 
ae50: 53 45 4c 45 43 54 20 2a 2f 0a 20 20 4e 61 6d 65  SELECT */.  Name
ae60: 43 6f 6e 74 65 78 74 20 73 4e 43 3b 20 20 20 20  Context sNC;    
ae70: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 63 6f 6e 74      /* Name cont
ae80: 65 78 74 20 6f 66 20 74 68 69 73 20 53 45 4c 45  ext of this SELE
ae90: 43 54 20 2a 2f 0a 20 20 69 6e 74 20 69 73 43 6f  CT */.  int isCo
aea0: 6d 70 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20  mpound;         
aeb0: 2f 2a 20 54 72 75 65 20 69 66 20 70 20 69 73 20  /* True if p is 
aec0: 61 20 63 6f 6d 70 6f 75 6e 64 20 73 65 6c 65 63  a compound selec
aed0: 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 43 6f 6d 70  t */.  int nComp
aee0: 6f 75 6e 64 3b 20 20 20 20 20 20 20 20 20 20 2f  ound;          /
aef0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 6f 6d 70  * Number of comp
af00: 6f 75 6e 64 20 74 65 72 6d 73 20 70 72 6f 63 65  ound terms proce
af10: 73 73 65 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20  ssed so far */. 
af20: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
af30: 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73           /* Pars
af40: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
af50: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
af60: 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
af70: 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 45 78   counter */.  Ex
af80: 70 72 4c 69 73 74 20 2a 70 47 72 6f 75 70 42 79  prList *pGroupBy
af90: 3b 20 20 20 20 20 2f 2a 20 54 68 65 20 47 52 4f  ;     /* The GRO
afa0: 55 50 20 42 59 20 63 6c 61 75 73 65 20 2a 2f 0a  UP BY clause */.
afb0: 20 20 53 65 6c 65 63 74 20 2a 70 4c 65 66 74 6d    Select *pLeftm
afc0: 6f 73 74 3b 20 20 20 20 20 20 2f 2a 20 4c 65 66  ost;      /* Lef
afd0: 74 2d 6d 6f 73 74 20 6f 66 20 53 45 4c 45 43 54  t-most of SELECT
afe0: 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e 64 20 2a   of a compound *
aff0: 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 3b  /.  sqlite3 *db;
b000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44              /* D
b010: 61 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69  atabase connecti
b020: 6f 6e 20 2a 2f 0a 20 20 0a 0a 20 20 61 73 73 65  on */.  ..  asse
b030: 72 74 28 20 70 21 3d 30 20 29 3b 0a 20 20 69 66  rt( p!=0 );.  if
b040: 28 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20  ( p->selFlags & 
b050: 53 46 5f 52 65 73 6f 6c 76 65 64 20 29 7b 0a 20  SF_Resolved ){. 
b060: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
b070: 75 6e 65 3b 0a 20 20 7d 0a 20 20 70 4f 75 74 65  une;.  }.  pOute
b080: 72 4e 43 20 3d 20 70 57 61 6c 6b 65 72 2d 3e 75  rNC = pWalker->u
b090: 2e 70 4e 43 3b 0a 20 20 70 50 61 72 73 65 20 3d  .pNC;.  pParse =
b0a0: 20 70 57 61 6c 6b 65 72 2d 3e 70 50 61 72 73 65   pWalker->pParse
b0b0: 3b 0a 20 20 64 62 20 3d 20 70 50 61 72 73 65 2d  ;.  db = pParse-
b0c0: 3e 64 62 3b 0a 0a 20 20 2f 2a 20 4e 6f 72 6d 61  >db;..  /* Norma
b0d0: 6c 6c 79 20 73 71 6c 69 74 65 33 53 65 6c 65 63  lly sqlite3Selec
b0e0: 74 45 78 70 61 6e 64 28 29 20 77 69 6c 6c 20 62  tExpand() will b
b0f0: 65 20 63 61 6c 6c 65 64 20 66 69 72 73 74 20 61  e called first a
b100: 6e 64 20 77 69 6c 6c 20 68 61 76 65 0a 20 20 2a  nd will have.  *
b110: 2a 20 61 6c 72 65 61 64 79 20 65 78 70 61 6e 64  * already expand
b120: 65 64 20 74 68 69 73 20 53 45 4c 45 43 54 2e 20  ed this SELECT. 
b130: 20 48 6f 77 65 76 65 72 2c 20 69 66 20 74 68 69   However, if thi
b140: 73 20 69 73 20 61 20 73 75 62 71 75 65 72 79 20  s is a subquery 
b150: 77 69 74 68 69 6e 0a 20 20 2a 2a 20 61 6e 20 65  within.  ** an e
b160: 78 70 72 65 73 73 69 6f 6e 2c 20 73 71 6c 69 74  xpression, sqlit
b170: 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
b180: 65 73 28 29 20 77 69 6c 6c 20 62 65 20 63 61 6c  es() will be cal
b190: 6c 65 64 20 77 69 74 68 6f 75 74 20 61 0a 20 20  led without a.  
b1a0: 2a 2a 20 70 72 69 6f 72 20 63 61 6c 6c 20 74 6f  ** prior call to
b1b0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 45 78   sqlite3SelectEx
b1c0: 70 61 6e 64 28 29 2e 20 20 57 68 65 6e 20 74 68  pand().  When th
b1d0: 61 74 20 68 61 70 70 65 6e 73 2c 20 6c 65 74 0a  at happens, let.
b1e0: 20 20 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65    ** sqlite3Sele
b1f0: 63 74 50 72 65 70 28 29 20 64 6f 20 61 6c 6c 20  ctPrep() do all 
b200: 6f 66 20 74 68 65 20 70 72 6f 63 65 73 73 69 6e  of the processin
b210: 67 20 66 6f 72 20 74 68 69 73 20 53 45 4c 45 43  g for this SELEC
b220: 54 2e 0a 20 20 2a 2a 20 73 71 6c 69 74 65 33 53  T..  ** sqlite3S
b230: 65 6c 65 63 74 50 72 65 70 28 29 20 77 69 6c 6c  electPrep() will
b240: 20 69 6e 76 6f 6b 65 20 62 6f 74 68 20 73 71 6c   invoke both sql
b250: 69 74 65 33 53 65 6c 65 63 74 45 78 70 61 6e 64  ite3SelectExpand
b260: 28 29 20 61 6e 64 0a 20 20 2a 2a 20 74 68 69 73  () and.  ** this
b270: 20 72 6f 75 74 69 6e 65 20 69 6e 20 74 68 65 20   routine in the 
b280: 63 6f 72 72 65 63 74 20 6f 72 64 65 72 2e 0a 20  correct order.. 
b290: 20 2a 2f 0a 20 20 69 66 28 20 28 70 2d 3e 73 65   */.  if( (p->se
b2a0: 6c 46 6c 61 67 73 20 26 20 53 46 5f 45 78 70 61  lFlags & SF_Expa
b2b0: 6e 64 65 64 29 3d 3d 30 20 29 7b 0a 20 20 20 20  nded)==0 ){.    
b2c0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 50 72 65  sqlite3SelectPre
b2d0: 70 28 70 50 61 72 73 65 2c 20 70 2c 20 70 4f 75  p(pParse, p, pOu
b2e0: 74 65 72 4e 43 29 3b 0a 20 20 20 20 72 65 74 75  terNC);.    retu
b2f0: 72 6e 20 28 70 50 61 72 73 65 2d 3e 6e 45 72 72  rn (pParse->nErr
b300: 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61   || db->mallocFa
b310: 69 6c 65 64 29 20 3f 20 57 52 43 5f 41 62 6f 72  iled) ? WRC_Abor
b320: 74 20 3a 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  t : WRC_Prune;. 
b330: 20 7d 0a 0a 20 20 69 73 43 6f 6d 70 6f 75 6e 64   }..  isCompound
b340: 20 3d 20 70 2d 3e 70 50 72 69 6f 72 21 3d 30 3b   = p->pPrior!=0;
b350: 0a 20 20 6e 43 6f 6d 70 6f 75 6e 64 20 3d 20 30  .  nCompound = 0
b360: 3b 0a 20 20 70 4c 65 66 74 6d 6f 73 74 20 3d 20  ;.  pLeftmost = 
b370: 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 20 29 7b  p;.  while( p ){
b380: 0a 20 20 20 20 61 73 73 65 72 74 28 20 28 70 2d  .    assert( (p-
b390: 3e 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 45  >selFlags & SF_E
b3a0: 78 70 61 6e 64 65 64 29 21 3d 30 20 29 3b 0a 20  xpanded)!=0 );. 
b3b0: 20 20 20 61 73 73 65 72 74 28 20 28 70 2d 3e 73     assert( (p->s
b3c0: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 52 65 73  elFlags & SF_Res
b3d0: 6f 6c 76 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20  olved)==0 );.   
b3e0: 20 70 2d 3e 73 65 6c 46 6c 61 67 73 20 7c 3d 20   p->selFlags |= 
b3f0: 53 46 5f 52 65 73 6f 6c 76 65 64 3b 0a 0a 20 20  SF_Resolved;..  
b400: 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 74 68 65    /* Resolve the
b410: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
b420: 74 68 65 20 4c 49 4d 49 54 20 61 6e 64 20 4f 46  the LIMIT and OF
b430: 46 53 45 54 20 63 6c 61 75 73 65 73 2e 20 54 68  FSET clauses. Th
b440: 65 73 65 0a 20 20 20 20 2a 2a 20 61 72 65 20 6e  ese.    ** are n
b450: 6f 74 20 61 6c 6c 6f 77 65 64 20 74 6f 20 72 65  ot allowed to re
b460: 66 65 72 20 74 6f 20 61 6e 79 20 6e 61 6d 65 73  fer to any names
b470: 2c 20 73 6f 20 70 61 73 73 20 61 6e 20 65 6d 70  , so pass an emp
b480: 74 79 20 4e 61 6d 65 43 6f 6e 74 65 78 74 2e 0a  ty NameContext..
b490: 20 20 20 20 2a 2f 0a 20 20 20 20 6d 65 6d 73 65      */.    memse
b4a0: 74 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f  t(&sNC, 0, sizeo
b4b0: 66 28 73 4e 43 29 29 3b 0a 20 20 20 20 73 4e 43  f(sNC));.    sNC
b4c0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
b4d0: 3b 0a 20 20 20 20 73 4e 43 2e 70 57 69 6e 53 65  ;.    sNC.pWinSe
b4e0: 6c 65 63 74 20 3d 20 70 3b 0a 20 20 20 20 69 66  lect = p;.    if
b4f0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
b500: 45 78 70 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20  ExprNames(&sNC, 
b510: 70 2d 3e 70 4c 69 6d 69 74 29 20 29 7b 0a 20 20  p->pLimit) ){.  
b520: 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41      return WRC_A
b530: 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  bort;.    }..   
b540: 20 2f 2a 20 49 66 20 74 68 65 20 53 46 5f 43 6f   /* If the SF_Co
b550: 6e 76 65 72 74 65 64 20 66 6c 61 67 73 20 69 73  nverted flags is
b560: 20 73 65 74 2c 20 74 68 65 6e 20 74 68 69 73 20   set, then this 
b570: 53 65 6c 65 63 74 20 6f 62 6a 65 63 74 20 77 61  Select object wa
b580: 73 0a 20 20 20 20 2a 2a 20 77 61 73 20 63 72 65  s.    ** was cre
b590: 61 74 65 64 20 62 79 20 74 68 65 20 63 6f 6e 76  ated by the conv
b5a0: 65 72 74 43 6f 6d 70 6f 75 6e 64 53 65 6c 65 63  ertCompoundSelec
b5b0: 74 54 6f 53 75 62 71 75 65 72 79 28 29 20 66 75  tToSubquery() fu
b5c0: 6e 63 74 69 6f 6e 2e 0a 20 20 20 20 2a 2a 20 49  nction..    ** I
b5d0: 6e 20 74 68 69 73 20 63 61 73 65 20 74 68 65 20  n this case the 
b5e0: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
b5f0: 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 20 73 68  (p->pOrderBy) sh
b600: 6f 75 6c 64 20 62 65 20 72 65 73 6f 6c 76 65 64  ould be resolved
b610: 0a 20 20 20 20 2a 2a 20 61 73 20 69 66 20 69 74  .    ** as if it
b620: 20 77 65 72 65 20 70 61 72 74 20 6f 66 20 74 68   were part of th
b630: 65 20 73 75 62 2d 71 75 65 72 79 2c 20 6e 6f 74  e sub-query, not
b640: 20 74 68 65 20 70 61 72 65 6e 74 2e 20 54 68 69   the parent. Thi
b650: 73 20 62 6c 6f 63 6b 0a 20 20 20 20 2a 2a 20 6d  s block.    ** m
b660: 6f 76 65 73 20 74 68 65 20 70 4f 72 64 65 72 42  oves the pOrderB
b670: 79 20 64 6f 77 6e 20 74 6f 20 74 68 65 20 73 75  y down to the su
b680: 62 2d 71 75 65 72 79 2e 20 49 74 20 77 69 6c 6c  b-query. It will
b690: 20 62 65 20 6d 6f 76 65 64 20 62 61 63 6b 0a 20   be moved back. 
b6a0: 20 20 20 2a 2a 20 61 66 74 65 72 20 74 68 65 20     ** after the 
b6b0: 6e 61 6d 65 73 20 68 61 76 65 20 62 65 65 6e 20  names have been 
b6c0: 72 65 73 6f 6c 76 65 64 2e 20 20 2a 2f 0a 20 20  resolved.  */.  
b6d0: 20 20 69 66 28 20 70 2d 3e 73 65 6c 46 6c 61 67    if( p->selFlag
b6e0: 73 20 26 20 53 46 5f 43 6f 6e 76 65 72 74 65 64  s & SF_Converted
b6f0: 20 29 7b 0a 20 20 20 20 20 20 53 65 6c 65 63 74   ){.      Select
b700: 20 2a 70 53 75 62 20 3d 20 70 2d 3e 70 53 72 63   *pSub = p->pSrc
b710: 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63 74 3b 0a  ->a[0].pSelect;.
b720: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
b730: 3e 70 53 72 63 2d 3e 6e 53 72 63 3d 3d 31 20 26  >pSrc->nSrc==1 &
b740: 26 20 70 2d 3e 70 4f 72 64 65 72 42 79 20 29 3b  & p->pOrderBy );
b750: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
b760: 53 75 62 2d 3e 70 50 72 69 6f 72 20 26 26 20 70  Sub->pPrior && p
b770: 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 3d 3d 30  Sub->pOrderBy==0
b780: 20 29 3b 0a 20 20 20 20 20 20 70 53 75 62 2d 3e   );.      pSub->
b790: 70 4f 72 64 65 72 42 79 20 3d 20 70 2d 3e 70 4f  pOrderBy = p->pO
b7a0: 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20 70 2d  rderBy;.      p-
b7b0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 30 3b 0a 20  >pOrderBy = 0;. 
b7c0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 52     }.  .    /* R
b7d0: 65 63 75 72 73 69 76 65 6c 79 20 72 65 73 6f 6c  ecursively resol
b7e0: 76 65 20 6e 61 6d 65 73 20 69 6e 20 61 6c 6c 20  ve names in all 
b7f0: 73 75 62 71 75 65 72 69 65 73 0a 20 20 20 20 2a  subqueries.    *
b800: 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  /.    for(i=0; i
b810: 3c 70 2d 3e 70 53 72 63 2d 3e 6e 53 72 63 3b 20  <p->pSrc->nSrc; 
b820: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 73 74 72 75  i++){.      stru
b830: 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20  ct SrcList_item 
b840: 2a 70 49 74 65 6d 20 3d 20 26 70 2d 3e 70 53 72  *pItem = &p->pSr
b850: 63 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 20 20 69  c->a[i];.      i
b860: 66 28 20 70 49 74 65 6d 2d 3e 70 53 65 6c 65 63  f( pItem->pSelec
b870: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 4e 61 6d  t ){.        Nam
b880: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20  eContext *pNC;  
b890: 20 20 20 20 20 20 20 2f 2a 20 55 73 65 64 20 74         /* Used t
b8a0: 6f 20 69 74 65 72 61 74 65 20 6e 61 6d 65 20 63  o iterate name c
b8b0: 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20 20  ontexts */.     
b8c0: 20 20 20 69 6e 74 20 6e 52 65 66 20 3d 20 30 3b     int nRef = 0;
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 52 65 66 63 6f 75 6e 74 20 66 6f 72 20 70 4f 75  Refcount for pOu
b8f0: 74 65 72 4e 43 20 61 6e 64 20 6f 75 74 65 72 20  terNC and outer 
b900: 63 6f 6e 74 65 78 74 73 20 2a 2f 0a 20 20 20 20  contexts */.    
b910: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
b920: 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 20 3d 20  zSavedContext = 
b930: 70 50 61 72 73 65 2d 3e 7a 41 75 74 68 43 6f 6e  pParse->zAuthCon
b940: 74 65 78 74 3b 0a 0a 20 20 20 20 20 20 20 20 2f  text;..        /
b950: 2a 20 43 6f 75 6e 74 20 74 68 65 20 74 6f 74 61  * Count the tota
b960: 6c 20 6e 75 6d 62 65 72 20 6f 66 20 72 65 66 65  l number of refe
b970: 72 65 6e 63 65 73 20 74 6f 20 70 4f 75 74 65 72  rences to pOuter
b980: 4e 43 20 61 6e 64 20 61 6c 6c 20 6f 66 20 69 74  NC and all of it
b990: 73 0a 20 20 20 20 20 20 20 20 2a 2a 20 70 61 72  s.        ** par
b9a0: 65 6e 74 20 63 6f 6e 74 65 78 74 73 2e 20 41 66  ent contexts. Af
b9b0: 74 65 72 20 72 65 73 6f 6c 76 69 6e 67 20 72 65  ter resolving re
b9c0: 66 65 72 65 6e 63 65 73 20 74 6f 20 65 78 70 72  ferences to expr
b9d0: 65 73 73 69 6f 6e 73 20 69 6e 0a 20 20 20 20 20  essions in.     
b9e0: 20 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 70 53 65     ** pItem->pSe
b9f0: 6c 65 63 74 2c 20 63 68 65 63 6b 20 69 66 20 74  lect, check if t
ba00: 68 69 73 20 76 61 6c 75 65 20 68 61 73 20 63 68  his value has ch
ba10: 61 6e 67 65 64 2e 20 49 66 20 73 6f 2c 20 74 68  anged. If so, th
ba20: 65 6e 0a 20 20 20 20 20 20 20 20 2a 2a 20 53 45  en.        ** SE
ba30: 4c 45 43 54 20 73 74 61 74 65 6d 65 6e 74 20 70  LECT statement p
ba40: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20 6d 75  Item->pSelect mu
ba50: 73 74 20 62 65 20 63 6f 72 72 65 6c 61 74 65 64  st be correlated
ba60: 2e 20 53 65 74 20 74 68 65 0a 20 20 20 20 20 20  . Set the.      
ba70: 20 20 2a 2a 20 70 49 74 65 6d 2d 3e 66 67 2e 69    ** pItem->fg.i
ba80: 73 43 6f 72 72 65 6c 61 74 65 64 20 66 6c 61 67  sCorrelated flag
ba90: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
baa0: 63 61 73 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  case. */.       
bab0: 20 66 6f 72 28 70 4e 43 3d 70 4f 75 74 65 72 4e   for(pNC=pOuterN
bac0: 43 3b 20 70 4e 43 3b 20 70 4e 43 3d 70 4e 43 2d  C; pNC; pNC=pNC-
bad0: 3e 70 4e 65 78 74 29 20 6e 52 65 66 20 2b 3d 20  >pNext) nRef += 
bae0: 70 4e 43 2d 3e 6e 52 65 66 3b 0a 0a 20 20 20 20  pNC->nRef;..    
baf0: 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a      if( pItem->z
bb00: 4e 61 6d 65 20 29 20 70 50 61 72 73 65 2d 3e 7a  Name ) pParse->z
bb10: 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20 70 49  AuthContext = pI
bb20: 74 65 6d 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  tem->zName;.    
bb30: 20 20 20 20 73 71 6c 69 74 65 33 52 65 73 6f 6c      sqlite3Resol
bb40: 76 65 53 65 6c 65 63 74 4e 61 6d 65 73 28 70 50  veSelectNames(pP
bb50: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 53 65  arse, pItem->pSe
bb60: 6c 65 63 74 2c 20 70 4f 75 74 65 72 4e 43 29 3b  lect, pOuterNC);
bb70: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
bb80: 3e 7a 41 75 74 68 43 6f 6e 74 65 78 74 20 3d 20  >zAuthContext = 
bb90: 7a 53 61 76 65 64 43 6f 6e 74 65 78 74 3b 0a 20  zSavedContext;. 
bba0: 20 20 20 20 20 20 20 69 66 28 20 70 50 61 72 73         if( pPars
bbb0: 65 2d 3e 6e 45 72 72 20 7c 7c 20 64 62 2d 3e 6d  e->nErr || db->m
bbc0: 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29 20 72 65  allocFailed ) re
bbd0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
bbe0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 70 4e 43  .        for(pNC
bbf0: 3d 70 4f 75 74 65 72 4e 43 3b 20 70 4e 43 3b 20  =pOuterNC; pNC; 
bc00: 70 4e 43 3d 70 4e 43 2d 3e 70 4e 65 78 74 29 20  pNC=pNC->pNext) 
bc10: 6e 52 65 66 20 2d 3d 20 70 4e 43 2d 3e 6e 52 65  nRef -= pNC->nRe
bc20: 66 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  f;.        asser
bc30: 74 28 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43  t( pItem->fg.isC
bc40: 6f 72 72 65 6c 61 74 65 64 3d 3d 30 20 26 26 20  orrelated==0 && 
bc50: 6e 52 65 66 3c 3d 30 20 29 3b 0a 20 20 20 20 20  nRef<=0 );.     
bc60: 20 20 20 70 49 74 65 6d 2d 3e 66 67 2e 69 73 43     pItem->fg.isC
bc70: 6f 72 72 65 6c 61 74 65 64 20 3d 20 28 6e 52 65  orrelated = (nRe
bc80: 66 21 3d 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  f!=0);.      }. 
bc90: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 53     }.  .    /* S
bca0: 65 74 20 75 70 20 74 68 65 20 6c 6f 63 61 6c 20  et up the local 
bcb0: 6e 61 6d 65 2d 63 6f 6e 74 65 78 74 20 74 6f 20  name-context to 
bcc0: 70 61 73 73 20 74 6f 20 73 71 6c 69 74 65 33 52  pass to sqlite3R
bcd0: 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28  esolveExprNames(
bce0: 29 20 74 6f 0a 20 20 20 20 2a 2a 20 72 65 73 6f  ) to.    ** reso
bcf0: 6c 76 65 20 74 68 65 20 72 65 73 75 6c 74 2d 73  lve the result-s
bd00: 65 74 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  et expression li
bd10: 73 74 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 73  st..    */.    s
bd20: 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 4e 43 5f  NC.ncFlags = NC_
bd30: 41 6c 6c 6f 77 41 67 67 7c 4e 43 5f 41 6c 6c 6f  AllowAgg|NC_Allo
bd40: 77 57 69 6e 3b 0a 20 20 20 20 73 4e 43 2e 70 53  wWin;.    sNC.pS
bd50: 72 63 4c 69 73 74 20 3d 20 70 2d 3e 70 53 72 63  rcList = p->pSrc
bd60: 3b 0a 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20  ;.    sNC.pNext 
bd70: 3d 20 70 4f 75 74 65 72 4e 43 3b 0a 20 20 0a 20  = pOuterNC;.  . 
bd80: 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61     /* Resolve na
bd90: 6d 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  mes in the resul
bda0: 74 20 73 65 74 2e 20 2a 2f 0a 20 20 20 20 69 66  t set. */.    if
bdb0: 28 20 73 71 6c 69 74 65 33 52 65 73 6f 6c 76 65  ( sqlite3Resolve
bdc0: 45 78 70 72 4c 69 73 74 4e 61 6d 65 73 28 26 73  ExprListNames(&s
bdd0: 4e 43 2c 20 70 2d 3e 70 45 4c 69 73 74 29 20 29  NC, p->pEList) )
bde0: 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72   return WRC_Abor
bdf0: 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  t;.    sNC.ncFla
be00: 67 73 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57  gs &= ~NC_AllowW
be10: 69 6e 3b 0a 20 20 0a 20 20 20 20 2f 2a 20 49 66  in;.  .    /* If
be20: 20 74 68 65 72 65 20 61 72 65 20 6e 6f 20 61 67   there are no ag
be30: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
be40: 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74 2d  s in the result-
be50: 73 65 74 2c 20 61 6e 64 20 6e 6f 20 47 52 4f 55  set, and no GROU
be60: 50 20 42 59 20 0a 20 20 20 20 2a 2a 20 65 78 70  P BY .    ** exp
be70: 72 65 73 73 69 6f 6e 2c 20 64 6f 20 6e 6f 74 20  ression, do not 
be80: 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65 73  allow aggregates
be90: 20 69 6e 20 61 6e 79 20 6f 66 20 74 68 65 20 6f   in any of the o
bea0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 73  ther expressions
beb0: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73  ..    */.    ass
bec0: 65 72 74 28 20 28 70 2d 3e 73 65 6c 46 6c 61 67  ert( (p->selFlag
bed0: 73 20 26 20 53 46 5f 41 67 67 72 65 67 61 74 65  s & SF_Aggregate
bee0: 29 3d 3d 30 20 29 3b 0a 20 20 20 20 70 47 72 6f  )==0 );.    pGro
bef0: 75 70 42 79 20 3d 20 70 2d 3e 70 47 72 6f 75 70  upBy = p->pGroup
bf00: 42 79 3b 0a 20 20 20 20 69 66 28 20 70 47 72 6f  By;.    if( pGro
bf10: 75 70 42 79 20 7c 7c 20 28 73 4e 43 2e 6e 63 46  upBy || (sNC.ncF
bf20: 6c 61 67 73 20 26 20 4e 43 5f 48 61 73 41 67 67  lags & NC_HasAgg
bf30: 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 61 73  )!=0 ){.      as
bf40: 73 65 72 74 28 20 4e 43 5f 4d 69 6e 4d 61 78 41  sert( NC_MinMaxA
bf50: 67 67 3d 3d 53 46 5f 4d 69 6e 4d 61 78 41 67 67  gg==SF_MinMaxAgg
bf60: 20 29 3b 0a 20 20 20 20 20 20 70 2d 3e 73 65 6c   );.      p->sel
bf70: 46 6c 61 67 73 20 7c 3d 20 53 46 5f 41 67 67 72  Flags |= SF_Aggr
bf80: 65 67 61 74 65 20 7c 20 28 73 4e 43 2e 6e 63 46  egate | (sNC.ncF
bf90: 6c 61 67 73 26 4e 43 5f 4d 69 6e 4d 61 78 41 67  lags&NC_MinMaxAg
bfa0: 67 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  g);.    }else{. 
bfb0: 20 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73       sNC.ncFlags
bfc0: 20 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 41 67 67   &= ~NC_AllowAgg
bfd0: 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f  ;.    }.  .    /
bfe0: 2a 20 49 66 20 61 20 48 41 56 49 4e 47 20 63 6c  * If a HAVING cl
bff0: 61 75 73 65 20 69 73 20 70 72 65 73 65 6e 74 2c  ause is present,
c000: 20 74 68 65 6e 20 74 68 65 72 65 20 6d 75 73 74   then there must
c010: 20 62 65 20 61 20 47 52 4f 55 50 20 42 59 20 63   be a GROUP BY c
c020: 6c 61 75 73 65 2e 0a 20 20 20 20 2a 2f 0a 20 20  lause..    */.  
c030: 20 20 69 66 28 20 70 2d 3e 70 48 61 76 69 6e 67    if( p->pHaving
c040: 20 26 26 20 21 70 47 72 6f 75 70 42 79 20 29 7b   && !pGroupBy ){
c050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72  .      sqlite3Er
c060: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
c070: 61 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73  a GROUP BY claus
c080: 65 20 69 73 20 72 65 71 75 69 72 65 64 20 62 65  e is required be
c090: 66 6f 72 65 20 48 41 56 49 4e 47 22 29 3b 0a 20  fore HAVING");. 
c0a0: 20 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f       return WRC_
c0b0: 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a 20 20 0a  Abort;.    }.  .
c0c0: 20 20 20 20 2f 2a 20 41 64 64 20 74 68 65 20 6f      /* Add the o
c0d0: 75 74 70 75 74 20 63 6f 6c 75 6d 6e 20 6c 69 73  utput column lis
c0e0: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 2d 63 6f  t to the name-co
c0f0: 6e 74 65 78 74 20 62 65 66 6f 72 65 20 70 61 72  ntext before par
c100: 73 69 6e 67 20 74 68 65 0a 20 20 20 20 2a 2a 20  sing the.    ** 
c110: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
c120: 73 20 69 6e 20 74 68 65 20 53 45 4c 45 43 54 20  s in the SELECT 
c130: 73 74 61 74 65 6d 65 6e 74 2e 20 54 68 69 73 20  statement. This 
c140: 69 73 20 73 6f 20 74 68 61 74 0a 20 20 20 20 2a  is so that.    *
c150: 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  * expressions in
c160: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
c170: 65 20 28 65 74 63 2e 29 20 63 61 6e 20 72 65 66  e (etc.) can ref
c180: 65 72 20 74 6f 20 65 78 70 72 65 73 73 69 6f 6e  er to expression
c190: 73 20 62 79 0a 20 20 20 20 2a 2a 20 61 6c 69 61  s by.    ** alia
c1a0: 73 65 73 20 69 6e 20 74 68 65 20 72 65 73 75 6c  ses in the resul
c1b0: 74 20 73 65 74 2e 0a 20 20 20 20 2a 2a 0a 20 20  t set..    **.  
c1c0: 20 20 2a 2a 20 4d 69 6e 6f 72 20 70 6f 69 6e 74    ** Minor point
c1d0: 3a 20 49 66 20 74 68 69 73 20 69 73 20 74 68 65  : If this is the
c1e0: 20 63 61 73 65 2c 20 74 68 65 6e 20 74 68 65 20   case, then the 
c1f0: 65 78 70 72 65 73 73 69 6f 6e 20 77 69 6c 6c 20  expression will 
c200: 62 65 0a 20 20 20 20 2a 2a 20 72 65 2d 65 76 61  be.    ** re-eva
c210: 6c 75 61 74 65 64 20 66 6f 72 20 65 61 63 68 20  luated for each 
c220: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 69 74 2e  reference to it.
c230: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 61 73 73 65  .    */.    asse
c240: 72 74 28 20 28 73 4e 43 2e 6e 63 46 6c 61 67 73  rt( (sNC.ncFlags
c250: 20 26 20 28 4e 43 5f 55 41 67 67 49 6e 66 6f 7c   & (NC_UAggInfo|
c260: 4e 43 5f 55 55 70 73 65 72 74 29 29 3d 3d 30 20  NC_UUpsert))==0 
c270: 29 3b 0a 20 20 20 20 73 4e 43 2e 75 4e 43 2e 70  );.    sNC.uNC.p
c280: 45 4c 69 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73  EList = p->pELis
c290: 74 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  t;.    sNC.ncFla
c2a0: 67 73 20 7c 3d 20 4e 43 5f 55 45 4c 69 73 74 3b  gs |= NC_UEList;
c2b0: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
c2c0: 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73  ResolveExprNames
c2d0: 28 26 73 4e 43 2c 20 70 2d 3e 70 48 61 76 69 6e  (&sNC, p->pHavin
c2e0: 67 29 20 29 20 72 65 74 75 72 6e 20 57 52 43 5f  g) ) return WRC_
c2f0: 41 62 6f 72 74 3b 0a 20 20 20 20 69 66 28 20 73  Abort;.    if( s
c300: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
c310: 72 4e 61 6d 65 73 28 26 73 4e 43 2c 20 70 2d 3e  rNames(&sNC, p->
c320: 70 57 68 65 72 65 29 20 29 20 72 65 74 75 72 6e  pWhere) ) return
c330: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 0a 20 20 20   WRC_Abort;..   
c340: 20 2f 2a 20 52 65 73 6f 6c 76 65 20 6e 61 6d 65   /* Resolve name
c350: 73 20 69 6e 20 74 61 62 6c 65 2d 76 61 6c 75 65  s in table-value
c360: 64 2d 66 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d  d-function argum
c370: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 66 6f 72 28  ents */.    for(
c380: 69 3d 30 3b 20 69 3c 70 2d 3e 70 53 72 63 2d 3e  i=0; i<p->pSrc->
c390: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
c3a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
c3b0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
c3c0: 70 2d 3e 70 53 72 63 2d 3e 61 5b 69 5d 3b 0a 20  p->pSrc->a[i];. 
c3d0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
c3e0: 66 67 2e 69 73 54 61 62 46 75 6e 63 0a 20 20 20  fg.isTabFunc.   
c3f0: 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 52 65      && sqlite3Re
c400: 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d  solveExprListNam
c410: 65 73 28 26 73 4e 43 2c 20 70 49 74 65 6d 2d 3e  es(&sNC, pItem->
c420: 75 31 2e 70 46 75 6e 63 41 72 67 29 20 0a 20 20  u1.pFuncArg) .  
c430: 20 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 72      ){.        r
c440: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
c450: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a  .      }.    }..
c460: 20 20 20 20 2f 2a 20 54 68 65 20 4f 52 44 45 52      /* The ORDER
c470: 20 42 59 20 61 6e 64 20 47 52 4f 55 50 20 42 59   BY and GROUP BY
c480: 20 63 6c 61 75 73 65 73 20 6d 61 79 20 6e 6f 74   clauses may not
c490: 20 72 65 66 65 72 20 74 6f 20 74 65 72 6d 73 20   refer to terms 
c4a0: 69 6e 0a 20 20 20 20 2a 2a 20 6f 75 74 65 72 20  in.    ** outer 
c4b0: 71 75 65 72 69 65 73 20 0a 20 20 20 20 2a 2f 0a  queries .    */.
c4c0: 20 20 20 20 73 4e 43 2e 70 4e 65 78 74 20 3d 20      sNC.pNext = 
c4d0: 30 3b 0a 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61  0;.    sNC.ncFla
c4e0: 67 73 20 7c 3d 20 4e 43 5f 41 6c 6c 6f 77 41 67  gs |= NC_AllowAg
c4f0: 67 7c 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b 0a 0a  g|NC_AllowWin;..
c500: 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 69      /* If this i
c510: 73 20 61 20 63 6f 6e 76 65 72 74 65 64 20 63 6f  s a converted co
c520: 6d 70 6f 75 6e 64 20 71 75 65 72 79 2c 20 6d 6f  mpound query, mo
c530: 76 65 20 74 68 65 20 4f 52 44 45 52 20 42 59 20  ve the ORDER BY 
c540: 63 6c 61 75 73 65 20 66 72 6f 6d 20 0a 20 20 20  clause from .   
c550: 20 2a 2a 20 74 68 65 20 73 75 62 2d 71 75 65 72   ** the sub-quer
c560: 79 20 62 61 63 6b 20 74 6f 20 74 68 65 20 70 61  y back to the pa
c570: 72 65 6e 74 20 71 75 65 72 79 2e 20 41 74 20 74  rent query. At t
c580: 68 69 73 20 70 6f 69 6e 74 20 65 61 63 68 20 74  his point each t
c590: 65 72 6d 0a 20 20 20 20 2a 2a 20 77 69 74 68 69  erm.    ** withi
c5a0: 6e 20 74 68 65 20 4f 52 44 45 52 20 42 59 20 63  n the ORDER BY c
c5b0: 6c 61 75 73 65 20 68 61 73 20 62 65 65 6e 20 74  lause has been t
c5c0: 72 61 6e 73 66 6f 72 6d 65 64 20 74 6f 20 61 6e  ransformed to an
c5d0: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 2e 0a   integer value..
c5e0: 20 20 20 20 2a 2a 20 54 68 65 73 65 20 69 6e 74      ** These int
c5f0: 65 67 65 72 73 20 77 69 6c 6c 20 62 65 20 72 65  egers will be re
c600: 70 6c 61 63 65 64 20 62 79 20 63 6f 70 69 65 73  placed by copies
c610: 20 6f 66 20 74 68 65 20 63 6f 72 72 65 73 70 6f   of the correspo
c620: 6e 64 69 6e 67 20 72 65 73 75 6c 74 0a 20 20 20  nding result.   
c630: 20 2a 2a 20 73 65 74 20 65 78 70 72 65 73 73 69   ** set expressi
c640: 6f 6e 73 20 62 79 20 74 68 65 20 63 61 6c 6c 20  ons by the call 
c650: 74 6f 20 72 65 73 6f 6c 76 65 4f 72 64 65 72 47  to resolveOrderG
c660: 72 6f 75 70 42 79 28 29 20 62 65 6c 6f 77 2e 20  roupBy() below. 
c670: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 73   */.    if( p->s
c680: 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 43 6f 6e  elFlags & SF_Con
c690: 76 65 72 74 65 64 20 29 7b 0a 20 20 20 20 20 20  verted ){.      
c6a0: 53 65 6c 65 63 74 20 2a 70 53 75 62 20 3d 20 70  Select *pSub = p
c6b0: 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65  ->pSrc->a[0].pSe
c6c0: 6c 65 63 74 3b 0a 20 20 20 20 20 20 70 2d 3e 70  lect;.      p->p
c6d0: 4f 72 64 65 72 42 79 20 3d 20 70 53 75 62 2d 3e  OrderBy = pSub->
c6e0: 70 4f 72 64 65 72 42 79 3b 0a 20 20 20 20 20 20  pOrderBy;.      
c6f0: 70 53 75 62 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pSub->pOrderBy =
c700: 20 30 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   0;.    }..    /
c710: 2a 20 50 72 6f 63 65 73 73 20 74 68 65 20 4f 52  * Process the OR
c720: 44 45 52 20 42 59 20 63 6c 61 75 73 65 20 66 6f  DER BY clause fo
c730: 72 20 73 69 6e 67 6c 65 74 6f 6e 20 53 45 4c 45  r singleton SELE
c740: 43 54 20 73 74 61 74 65 6d 65 6e 74 73 2e 0a 20  CT statements.. 
c750: 20 20 20 2a 2a 20 54 68 65 20 4f 52 44 45 52 20     ** The ORDER 
c760: 42 59 20 63 6c 61 75 73 65 20 66 6f 72 20 63 6f  BY clause for co
c770: 6d 70 6f 75 6e 64 73 20 53 45 4c 45 43 54 20 73  mpounds SELECT s
c780: 74 61 74 65 6d 65 6e 74 73 20 69 73 20 68 61 6e  tatements is han
c790: 64 6c 65 64 0a 20 20 20 20 2a 2a 20 62 65 6c 6f  dled.    ** belo
c7a0: 77 2c 20 61 66 74 65 72 20 61 6c 6c 20 6f 66 20  w, after all of 
c7b0: 74 68 65 20 72 65 73 75 6c 74 2d 73 65 74 73 20  the result-sets 
c7c0: 66 6f 72 20 61 6c 6c 20 6f 66 20 74 68 65 20 65  for all of the e
c7d0: 6c 65 6d 65 6e 74 73 20 6f 66 0a 20 20 20 20 2a  lements of.    *
c7e0: 2a 20 74 68 65 20 63 6f 6d 70 6f 75 6e 64 20 68  * the compound h
c7f0: 61 76 65 20 62 65 65 6e 20 72 65 73 6f 6c 76 65  ave been resolve
c800: 64 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d..    **.    **
c810: 20 49 66 20 74 68 65 72 65 20 69 73 20 61 6e 20   If there is an 
c820: 4f 52 44 45 52 20 42 59 20 63 6c 61 75 73 65 20  ORDER BY clause 
c830: 6f 6e 20 61 20 74 65 72 6d 20 6f 66 20 61 20 63  on a term of a c
c840: 6f 6d 70 6f 75 6e 64 2d 73 65 6c 65 63 74 20 6f  ompound-select o
c850: 74 68 65 72 0a 20 20 20 20 2a 2a 20 74 68 61 6e  ther.    ** than
c860: 20 74 68 65 20 72 69 67 68 74 2d 6d 6f 73 74 20   the right-most 
c870: 74 65 72 6d 2c 20 74 68 65 6e 20 74 68 61 74 20  term, then that 
c880: 69 73 20 61 20 73 79 6e 74 61 78 20 65 72 72 6f  is a syntax erro
c890: 72 2e 20 20 42 75 74 20 74 68 65 20 65 72 72 6f  r.  But the erro
c8a0: 72 0a 20 20 20 20 2a 2a 20 69 73 20 6e 6f 74 20  r.    ** is not 
c8b0: 64 65 74 65 63 74 65 64 20 75 6e 74 69 6c 20 6d  detected until m
c8c0: 75 63 68 20 6c 61 74 65 72 2c 20 61 6e 64 20 73  uch later, and s
c8d0: 6f 20 77 65 20 6e 65 65 64 20 74 6f 20 67 6f 20  o we need to go 
c8e0: 61 68 65 61 64 20 61 6e 64 0a 20 20 20 20 2a 2a  ahead and.    **
c8f0: 20 72 65 73 6f 6c 76 65 20 74 68 6f 73 65 20 73   resolve those s
c900: 79 6d 62 6f 6c 73 20 6f 6e 20 74 68 65 20 69 6e  ymbols on the in
c910: 63 6f 72 72 65 63 74 20 4f 52 44 45 52 20 42 59  correct ORDER BY
c920: 20 66 6f 72 20 63 6f 6e 73 69 73 74 65 6e 63 79   for consistency
c930: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
c940: 20 69 73 43 6f 6d 70 6f 75 6e 64 3c 3d 6e 43 6f   isCompound<=nCo
c950: 6d 70 6f 75 6e 64 20 20 2f 2a 20 44 65 66 65 72  mpound  /* Defer
c960: 20 72 69 67 68 74 2d 6d 6f 73 74 20 4f 52 44 45   right-most ORDE
c970: 52 20 42 59 20 6f 66 20 61 20 63 6f 6d 70 6f 75  R BY of a compou
c980: 6e 64 20 2a 2f 0a 20 20 20 20 20 26 26 20 72 65  nd */.     && re
c990: 73 6f 6c 76 65 4f 72 64 65 72 47 72 6f 75 70 42  solveOrderGroupB
c9a0: 79 28 26 73 4e 43 2c 20 70 2c 20 70 2d 3e 70 4f  y(&sNC, p, p->pO
c9b0: 72 64 65 72 42 79 2c 20 22 4f 52 44 45 52 22 29  rderBy, "ORDER")
c9c0: 0a 20 20 20 20 29 7b 0a 20 20 20 20 20 20 72 65  .    ){.      re
c9d0: 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b 0a  turn WRC_Abort;.
c9e0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 64 62      }.    if( db
c9f0: 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 29  ->mallocFailed )
ca00: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57  {.      return W
ca10: 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20 7d 0a  RC_Abort;.    }.
ca20: 20 20 20 20 73 4e 43 2e 6e 63 46 6c 61 67 73 20      sNC.ncFlags 
ca30: 26 3d 20 7e 4e 43 5f 41 6c 6c 6f 77 57 69 6e 3b  &= ~NC_AllowWin;
ca40: 0a 20 20 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c  .  .    /* Resol
ca50: 76 65 20 74 68 65 20 47 52 4f 55 50 20 42 59 20  ve the GROUP BY 
ca60: 63 6c 61 75 73 65 2e 20 20 41 74 20 74 68 65 20  clause.  At the 
ca70: 73 61 6d 65 20 74 69 6d 65 2c 20 6d 61 6b 65 20  same time, make 
ca80: 73 75 72 65 20 0a 20 20 20 20 2a 2a 20 74 68 65  sure .    ** the
ca90: 20 47 52 4f 55 50 20 42 59 20 63 6c 61 75 73 65   GROUP BY clause
caa0: 20 64 6f 65 73 20 6e 6f 74 20 63 6f 6e 74 61 69   does not contai
cab0: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
cac0: 74 69 6f 6e 73 2e 0a 20 20 20 20 2a 2f 0a 20 20  tions..    */.  
cad0: 20 20 69 66 28 20 70 47 72 6f 75 70 42 79 20 29    if( pGroupBy )
cae0: 7b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  {.      struct E
caf0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
cb00: 74 65 6d 3b 0a 20 20 20 20 0a 20 20 20 20 20 20  tem;.    .      
cb10: 69 66 28 20 72 65 73 6f 6c 76 65 4f 72 64 65 72  if( resolveOrder
cb20: 47 72 6f 75 70 42 79 28 26 73 4e 43 2c 20 70 2c  GroupBy(&sNC, p,
cb30: 20 70 47 72 6f 75 70 42 79 2c 20 22 47 52 4f 55   pGroupBy, "GROU
cb40: 50 22 29 20 7c 7c 20 64 62 2d 3e 6d 61 6c 6c 6f  P") || db->mallo
cb50: 63 46 61 69 6c 65 64 20 29 7b 0a 20 20 20 20 20  cFailed ){.     
cb60: 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62     return WRC_Ab
cb70: 6f 72 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ort;.      }.   
cb80: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
cb90: 6d 3d 70 47 72 6f 75 70 42 79 2d 3e 61 3b 20 69  m=pGroupBy->a; i
cba0: 3c 70 47 72 6f 75 70 42 79 2d 3e 6e 45 78 70 72  <pGroupBy->nExpr
cbb0: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
cbc0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 45 78 70  .        if( Exp
cbd0: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 49 74  rHasProperty(pIt
cbe0: 65 6d 2d 3e 70 45 78 70 72 2c 20 45 50 5f 41 67  em->pExpr, EP_Ag
cbf0: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g) ){.          
cc00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
cc10: 70 50 61 72 73 65 2c 20 22 61 67 67 72 65 67 61  pParse, "aggrega
cc20: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 72 65  te functions are
cc30: 20 6e 6f 74 20 61 6c 6c 6f 77 65 64 20 69 6e 20   not allowed in 
cc40: 22 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ".              
cc50: 22 74 68 65 20 47 52 4f 55 50 20 42 59 20 63 6c  "the GROUP BY cl
cc60: 61 75 73 65 22 29 3b 0a 20 20 20 20 20 20 20 20  ause");.        
cc70: 20 20 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f    return WRC_Abo
cc80: 72 74 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  rt;.        }.  
cc90: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 20 20 20      }.    }..   
cca0: 20 2f 2a 20 49 66 20 74 68 69 73 20 69 73 20 70   /* If this is p
ccb0: 61 72 74 20 6f 66 20 61 20 63 6f 6d 70 6f 75 6e  art of a compoun
ccc0: 64 20 53 45 4c 45 43 54 2c 20 63 68 65 63 6b 20  d SELECT, check 
ccd0: 74 68 61 74 20 69 74 20 68 61 73 20 74 68 65 20  that it has the 
cce0: 72 69 67 68 74 0a 20 20 20 20 2a 2a 20 6e 75 6d  right.    ** num
ccf0: 62 65 72 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ber of expressio
cd00: 6e 73 20 69 6e 20 74 68 65 20 73 65 6c 65 63 74  ns in the select
cd10: 20 6c 69 73 74 2e 20 2a 2f 0a 20 20 20 20 69 66   list. */.    if
cd20: 28 20 70 2d 3e 70 4e 65 78 74 20 26 26 20 70 2d  ( p->pNext && p-
cd30: 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  >pEList->nExpr!=
cd40: 70 2d 3e 70 4e 65 78 74 2d 3e 70 45 4c 69 73 74  p->pNext->pEList
cd50: 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 20  ->nExpr ){.     
cd60: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 57 72   sqlite3SelectWr
cd70: 6f 6e 67 4e 75 6d 54 65 72 6d 73 45 72 72 6f 72  ongNumTermsError
cd80: 28 70 50 61 72 73 65 2c 20 70 2d 3e 70 4e 65 78  (pParse, p->pNex
cd90: 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
cda0: 20 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 20 20   WRC_Abort;.    
cdb0: 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63  }..    /* Advanc
cdc0: 65 20 74 6f 20 74 68 65 20 6e 65 78 74 20 74 65  e to the next te
cdd0: 72 6d 20 6f 66 20 74 68 65 20 63 6f 6d 70 6f 75  rm of the compou
cde0: 6e 64 0a 20 20 20 20 2a 2f 0a 20 20 20 20 70 20  nd.    */.    p 
cdf0: 3d 20 70 2d 3e 70 50 72 69 6f 72 3b 0a 20 20 20  = p->pPrior;.   
ce00: 20 6e 43 6f 6d 70 6f 75 6e 64 2b 2b 3b 0a 20 20   nCompound++;.  
ce10: 7d 0a 0a 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  }..  /* Resolve 
ce20: 74 68 65 20 4f 52 44 45 52 20 42 59 20 6f 6e 20  the ORDER BY on 
ce30: 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45 4c 45 43  a compound SELEC
ce40: 54 20 61 66 74 65 72 20 61 6c 6c 20 74 65 72 6d  T after all term
ce50: 73 20 6f 66 0a 20 20 2a 2a 20 74 68 65 20 63 6f  s of.  ** the co
ce60: 6d 70 6f 75 6e 64 20 68 61 76 65 20 62 65 65 6e  mpound have been
ce70: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a   resolved..  */.
ce80: 20 20 69 66 28 20 69 73 43 6f 6d 70 6f 75 6e 64    if( isCompound
ce90: 20 26 26 20 72 65 73 6f 6c 76 65 43 6f 6d 70 6f   && resolveCompo
cea0: 75 6e 64 4f 72 64 65 72 42 79 28 70 50 61 72 73  undOrderBy(pPars
ceb0: 65 2c 20 70 4c 65 66 74 6d 6f 73 74 29 20 29 7b  e, pLeftmost) ){
cec0: 0a 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f  .    return WRC_
ced0: 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a 20 20 72 65  Abort;.  }..  re
cee0: 74 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a  turn WRC_Prune;.
cef0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
cf00: 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65  utine walks an e
cf10: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
cf20: 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65  nd resolves refe
cf30: 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62  rences to.** tab
cf40: 6c 65 20 63 6f 6c 75 6d 6e 73 20 61 6e 64 20 72  le columns and r
cf50: 65 73 75 6c 74 2d 73 65 74 20 63 6f 6c 75 6d 6e  esult-set column
cf60: 73 2e 20 20 41 74 20 74 68 65 20 73 61 6d 65 20  s.  At the same 
cf70: 74 69 6d 65 2c 20 64 6f 20 65 72 72 6f 72 0a 2a  time, do error.*
cf80: 2a 20 63 68 65 63 6b 69 6e 67 20 6f 6e 20 66 75  * checking on fu
cf90: 6e 63 74 69 6f 6e 20 75 73 61 67 65 20 61 6e 64  nction usage and
cfa0: 20 73 65 74 20 61 20 66 6c 61 67 20 69 66 20 61   set a flag if a
cfb0: 6e 79 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ny aggregate fun
cfc0: 63 74 69 6f 6e 73 0a 2a 2a 20 61 72 65 20 73 65  ctions.** are se
cfd0: 65 6e 2e 0a 2a 2a 0a 2a 2a 20 54 6f 20 72 65 73  en..**.** To res
cfe0: 6f 6c 76 65 20 74 61 62 6c 65 20 63 6f 6c 75 6d  olve table colum
cff0: 6e 73 20 72 65 66 65 72 65 6e 63 65 73 20 77 65  ns references we
d000: 20 6c 6f 6f 6b 20 66 6f 72 20 6e 6f 64 65 73 20   look for nodes 
d010: 28 6f 72 20 73 75 62 74 72 65 65 73 29 20 6f 66  (or subtrees) of
d020: 20 74 68 65 20 0a 2a 2a 20 66 6f 72 6d 20 58 2e   the .** form X.
d030: 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75  Y.Z or Y.Z or ju
d040: 73 74 20 5a 20 77 68 65 72 65 0a 2a 2a 0a 2a 2a  st Z where.**.**
d050: 20 20 20 20 20 20 58 3a 20 20 20 54 68 65 20 6e        X:   The n
d060: 61 6d 65 20 6f 66 20 61 20 64 61 74 61 62 61 73  ame of a databas
d070: 65 2e 20 20 45 78 3a 20 20 22 6d 61 69 6e 22 20  e.  Ex:  "main" 
d080: 6f 72 20 22 74 65 6d 70 22 20 6f 72 0a 2a 2a 20  or "temp" or.** 
d090: 20 20 20 20 20 20 20 20 20 20 74 68 65 20 73 79            the sy
d0a0: 6d 62 6f 6c 69 63 20 6e 61 6d 65 20 61 73 73 69  mbolic name assi
d0b0: 67 6e 65 64 20 74 6f 20 61 6e 20 41 54 54 41 43  gned to an ATTAC
d0c0: 48 2d 65 64 20 64 61 74 61 62 61 73 65 2e 0a 2a  H-ed database..*
d0d0: 2a 0a 2a 2a 20 20 20 20 20 20 59 3a 20 20 20 54  *.**      Y:   T
d0e0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 74 61 62  he name of a tab
d0f0: 6c 65 20 69 6e 20 61 20 46 52 4f 4d 20 63 6c 61  le in a FROM cla
d100: 75 73 65 2e 20 20 4f 72 20 69 6e 20 61 20 74 72  use.  Or in a tr
d110: 69 67 67 65 72 0a 2a 2a 20 20 20 20 20 20 20 20  igger.**        
d120: 20 20 20 6f 6e 65 20 6f 66 20 74 68 65 20 73 70     one of the sp
d130: 65 63 69 61 6c 20 6e 61 6d 65 73 20 22 6f 6c 64  ecial names "old
d140: 22 20 6f 72 20 22 6e 65 77 22 2e 0a 2a 2a 0a 2a  " or "new"..**.*
d150: 2a 20 20 20 20 20 20 5a 3a 20 20 20 54 68 65 20  *      Z:   The 
d160: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
d170: 20 69 6e 20 74 61 62 6c 65 20 59 2e 0a 2a 2a 0a   in table Y..**.
d180: 2a 2a 20 54 68 65 20 6e 6f 64 65 20 61 74 20 74  ** The node at t
d190: 68 65 20 72 6f 6f 74 20 6f 66 20 74 68 65 20 73  he root of the s
d1a0: 75 62 74 72 65 65 20 69 73 20 6d 6f 64 69 66 69  ubtree is modifi
d1b0: 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a  ed as follows:.*
d1c0: 2a 0a 2a 2a 20 20 20 20 45 78 70 72 2e 6f 70 20  *.**    Expr.op 
d1d0: 20 20 20 20 20 20 20 43 68 61 6e 67 65 64 20 74         Changed t
d1e0: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 0a 2a 2a 20 20  o TK_COLUMN.**  
d1f0: 20 20 45 78 70 72 2e 70 54 61 62 20 20 20 20 20    Expr.pTab     
d200: 20 50 6f 69 6e 74 73 20 74 6f 20 74 68 65 20 54   Points to the T
d210: 61 62 6c 65 20 6f 62 6a 65 63 74 20 66 6f 72 20  able object for 
d220: 58 2e 59 0a 2a 2a 20 20 20 20 45 78 70 72 2e 69  X.Y.**    Expr.i
d230: 43 6f 6c 75 6d 6e 20 20 20 54 68 65 20 63 6f 6c  Column   The col
d240: 75 6d 6e 20 69 6e 64 65 78 20 69 6e 20 58 2e 59  umn index in X.Y
d250: 2e 20 20 2d 31 20 66 6f 72 20 74 68 65 20 72 6f  .  -1 for the ro
d260: 77 69 64 2e 0a 2a 2a 20 20 20 20 45 78 70 72 2e  wid..**    Expr.
d270: 69 54 61 62 6c 65 20 20 20 20 54 68 65 20 56 44  iTable    The VD
d280: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
d290: 20 66 6f 72 20 58 2e 59 0a 2a 2a 0a 2a 2a 0a 2a   for X.Y.**.**.*
d2a0: 2a 20 54 6f 20 72 65 73 6f 6c 76 65 20 72 65 73  * To resolve res
d2b0: 75 6c 74 2d 73 65 74 20 72 65 66 65 72 65 6e 63  ult-set referenc
d2c0: 65 73 2c 20 6c 6f 6f 6b 20 66 6f 72 20 65 78 70  es, look for exp
d2d0: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 73 20 6f 66  ression nodes of
d2e0: 20 74 68 65 0a 2a 2a 20 66 6f 72 6d 20 5a 20 28   the.** form Z (
d2f0: 77 69 74 68 20 6e 6f 20 58 20 61 6e 64 20 59 20  with no X and Y 
d300: 70 72 65 66 69 78 29 20 77 68 65 72 65 20 74 68  prefix) where th
d310: 65 20 5a 20 6d 61 74 63 68 65 73 20 74 68 65 20  e Z matches the 
d320: 72 69 67 68 74 2d 68 61 6e 64 0a 2a 2a 20 73 69  right-hand.** si
d330: 7a 65 20 6f 66 20 61 6e 20 41 53 20 63 6c 61 75  ze of an AS clau
d340: 73 65 20 69 6e 20 74 68 65 20 72 65 73 75 6c 74  se in the result
d350: 2d 73 65 74 20 6f 66 20 61 20 53 45 4c 45 43 54  -set of a SELECT
d360: 2e 20 20 54 68 65 20 5a 20 65 78 70 72 65 73 73  .  The Z express
d370: 69 6f 6e 0a 2a 2a 20 69 73 20 72 65 70 6c 61 63  ion.** is replac
d380: 65 64 20 62 79 20 61 20 63 6f 70 79 20 6f 66 20  ed by a copy of 
d390: 74 68 65 20 6c 65 66 74 2d 68 61 6e 64 20 73 69  the left-hand si
d3a0: 64 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74  de of the result
d3b0: 2d 73 65 74 20 65 78 70 72 65 73 73 69 6f 6e 2e  -set expression.
d3c0: 0a 2a 2a 20 54 61 62 6c 65 2d 6e 61 6d 65 20 61  .** Table-name a
d3d0: 6e 64 20 66 75 6e 63 74 69 6f 6e 20 72 65 73 6f  nd function reso
d3e0: 6c 75 74 69 6f 6e 20 6f 63 63 75 72 73 20 6f 6e  lution occurs on
d3f0: 20 74 68 65 20 73 75 62 73 74 69 74 75 74 65 64   the substituted
d400: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74   expression.** t
d410: 72 65 65 2e 20 20 46 6f 72 20 65 78 61 6d 70 6c  ree.  For exampl
d420: 65 2c 20 69 6e 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  e, in:.**.**    
d430: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
d440: 78 2c 20 63 2b 64 20 41 53 20 79 20 46 52 4f 4d  x, c+d AS y FROM
d450: 20 74 31 20 4f 52 44 45 52 20 42 59 20 78 3b 0a   t1 ORDER BY x;.
d460: 2a 2a 0a 2a 2a 20 54 68 65 20 22 78 22 20 74 65  **.** The "x" te
d470: 72 6d 20 6f 66 20 74 68 65 20 6f 72 64 65 72 20  rm of the order 
d480: 62 79 20 69 73 20 72 65 70 6c 61 63 65 64 20 62  by is replaced b
d490: 79 20 22 61 2b 62 22 20 74 6f 20 72 65 6e 64 65  y "a+b" to rende
d4a0: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 53 45  r:.**.**      SE
d4b0: 4c 45 43 54 20 61 2b 62 20 41 53 20 78 2c 20 63  LECT a+b AS x, c
d4c0: 2b 64 20 41 53 20 79 20 46 52 4f 4d 20 74 31 20  +d AS y FROM t1 
d4d0: 4f 52 44 45 52 20 42 59 20 61 2b 62 3b 0a 2a 2a  ORDER BY a+b;.**
d4e0: 0a 2a 2a 20 46 75 6e 63 74 69 6f 6e 20 63 61 6c  .** Function cal
d4f0: 6c 73 20 61 72 65 20 63 68 65 63 6b 65 64 20 74  ls are checked t
d500: 6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 61 74  o make sure that
d510: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 69 73   the function is
d520: 20 0a 2a 2a 20 64 65 66 69 6e 65 64 20 61 6e 64   .** defined and
d530: 20 74 68 61 74 20 74 68 65 20 63 6f 72 72 65 63   that the correc
d540: 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  t number of argu
d550: 6d 65 6e 74 73 20 61 72 65 20 73 70 65 63 69 66  ments are specif
d560: 69 65 64 2e 0a 2a 2a 20 49 66 20 74 68 65 20 66  ied..** If the f
d570: 75 6e 63 74 69 6f 6e 20 69 73 20 61 6e 20 61 67  unction is an ag
d580: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
d590: 2c 20 74 68 65 6e 20 74 68 65 20 4e 43 5f 48 61  , then the NC_Ha
d5a0: 73 41 67 67 20 66 6c 61 67 20 69 73 0a 2a 2a 20  sAgg flag is.** 
d5b0: 73 65 74 20 61 6e 64 20 74 68 65 20 6f 70 63 6f  set and the opco
d5c0: 64 65 20 69 73 20 63 68 61 6e 67 65 64 20 66 72  de is changed fr
d5d0: 6f 6d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 74  om TK_FUNCTION t
d5e0: 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f  o TK_AGG_FUNCTIO
d5f0: 4e 2e 0a 2a 2a 20 49 66 20 61 6e 20 65 78 70 72  N..** If an expr
d600: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
d610: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
d620: 6f 6e 73 20 74 68 65 6e 20 74 68 65 20 45 50 5f  ons then the EP_
d630: 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20  Agg.** property 
d640: 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  on the expressio
d650: 6e 20 69 73 20 73 65 74 2e 0a 2a 2a 0a 2a 2a 20  n is set..**.** 
d660: 41 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  An error message
d670: 20 69 73 20 6c 65 66 74 20 69 6e 20 70 50 61 72   is left in pPar
d680: 73 65 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  se if anything i
d690: 73 20 61 6d 69 73 73 2e 20 20 54 68 65 20 6e 75  s amiss.  The nu
d6a0: 6d 62 65 72 0a 2a 2a 20 69 66 20 65 72 72 6f 72  mber.** if error
d6b0: 73 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a 2a  s is returned..*
d6c0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 52 65 73  /.int sqlite3Res
d6d0: 6f 6c 76 65 45 78 70 72 4e 61 6d 65 73 28 20 0a  olveExprNames( .
d6e0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
d6f0: 4e 43 2c 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d  NC,       /* Nam
d700: 65 73 70 61 63 65 20 74 6f 20 72 65 73 6f 6c 76  espace to resolv
d710: 65 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  e expressions in
d720: 2e 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  . */.  Expr *pEx
d730: 70 72 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  pr             /
d740: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
d750: 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e   to be analyzed.
d760: 20 2a 2f 0a 29 7b 0a 20 20 75 31 36 20 73 61 76   */.){.  u16 sav
d770: 65 64 48 61 73 41 67 67 3b 0a 20 20 57 61 6c 6b  edHasAgg;.  Walk
d780: 65 72 20 77 3b 0a 0a 20 20 69 66 28 20 70 45 78  er w;..  if( pEx
d790: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53  pr==0 ) return S
d7a0: 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 73 61 76 65  QLITE_OK;.  save
d7b0: 64 48 61 73 41 67 67 20 3d 20 70 4e 43 2d 3e 6e  dHasAgg = pNC->n
d7c0: 63 46 6c 61 67 73 20 26 20 28 4e 43 5f 48 61 73  cFlags & (NC_Has
d7d0: 41 67 67 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67  Agg|NC_MinMaxAgg
d7e0: 29 3b 0a 20 20 70 4e 43 2d 3e 6e 63 46 6c 61 67  );.  pNC->ncFlag
d7f0: 73 20 26 3d 20 7e 28 4e 43 5f 48 61 73 41 67 67  s &= ~(NC_HasAgg
d800: 7c 4e 43 5f 4d 69 6e 4d 61 78 41 67 67 29 3b 0a  |NC_MinMaxAgg);.
d810: 20 20 77 2e 70 50 61 72 73 65 20 3d 20 70 4e 43    w.pParse = pNC
d820: 2d 3e 70 50 61 72 73 65 3b 0a 20 20 77 2e 78 45  ->pParse;.  w.xE
d830: 78 70 72 43 61 6c 6c 62 61 63 6b 20 3d 20 72 65  xprCallback = re
d840: 73 6f 6c 76 65 45 78 70 72 53 74 65 70 3b 0a 20  solveExprStep;. 
d850: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
d860: 63 6b 20 3d 20 72 65 73 6f 6c 76 65 53 65 6c 65  ck = resolveSele
d870: 63 74 53 74 65 70 3b 0a 20 20 77 2e 78 53 65 6c  ctStep;.  w.xSel
d880: 65 63 74 43 61 6c 6c 62 61 63 6b 32 20 3d 20 30  ectCallback2 = 0
d890: 3b 0a 20 20 77 2e 75 2e 70 4e 43 20 3d 20 70 4e  ;.  w.u.pNC = pN
d8a0: 43 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f 4d 41  C;.#if SQLITE_MA
d8b0: 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30 0a 20  X_EXPR_DEPTH>0. 
d8c0: 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65 69 67   w.pParse->nHeig
d8d0: 68 74 20 2b 3d 20 70 45 78 70 72 2d 3e 6e 48 65  ht += pExpr->nHe
d8e0: 69 67 68 74 3b 0a 20 20 69 66 28 20 73 71 6c 69  ight;.  if( sqli
d8f0: 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69 67  te3ExprCheckHeig
d900: 68 74 28 77 2e 70 50 61 72 73 65 2c 20 77 2e 70  ht(w.pParse, w.p
d910: 50 61 72 73 65 2d 3e 6e 48 65 69 67 68 74 29 20  Parse->nHeight) 
d920: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  ){.    return SQ
d930: 4c 49 54 45 5f 45 52 52 4f 52 3b 0a 20 20 7d 0a  LITE_ERROR;.  }.
d940: 23 65 6e 64 69 66 0a 20 20 73 71 6c 69 74 65 33  #endif.  sqlite3
d950: 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70 45 78  WalkExpr(&w, pEx
d960: 70 72 29 3b 0a 23 69 66 20 53 51 4c 49 54 45 5f  pr);.#if SQLITE_
d970: 4d 41 58 5f 45 58 50 52 5f 44 45 50 54 48 3e 30  MAX_EXPR_DEPTH>0
d980: 0a 20 20 77 2e 70 50 61 72 73 65 2d 3e 6e 48 65  .  w.pParse->nHe
d990: 69 67 68 74 20 2d 3d 20 70 45 78 70 72 2d 3e 6e  ight -= pExpr->n
d9a0: 48 65 69 67 68 74 3b 0a 23 65 6e 64 69 66 0a 20  Height;.#endif. 
d9b0: 20 69 66 28 20 70 4e 43 2d 3e 6e 63 46 6c 61 67   if( pNC->ncFlag
d9c0: 73 20 26 20 4e 43 5f 48 61 73 41 67 67 20 29 7b  s & NC_HasAgg ){
d9d0: 0a 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70  .    ExprSetProp
d9e0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 41  erty(pExpr, EP_A
d9f0: 67 67 29 3b 0a 20 20 7d 0a 20 20 70 4e 43 2d 3e  gg);.  }.  pNC->
da00: 6e 63 46 6c 61 67 73 20 7c 3d 20 73 61 76 65 64  ncFlags |= saved
da10: 48 61 73 41 67 67 3b 0a 20 20 72 65 74 75 72 6e  HasAgg;.  return
da20: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 7c 7c 20   pNC->nErr>0 || 
da30: 77 2e 70 50 61 72 73 65 2d 3e 6e 45 72 72 3e 30  w.pParse->nErr>0
da40: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
da50: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 66 6f 72  ve all names for
da60: 20 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 20   all expression 
da70: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
da80: 20 6c 69 73 74 2e 20 20 54 68 69 73 20 69 73 0a   list.  This is.
da90: 2a 2a 20 6a 75 73 74 20 6c 69 6b 65 20 73 71 6c  ** just like sql
daa0: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
dab0: 61 6d 65 73 28 29 20 65 78 63 65 70 74 20 74 68  ames() except th
dac0: 61 74 20 69 74 20 77 6f 72 6b 73 20 66 6f 72 20  at it works for 
dad0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  an expression.**
dae0: 20 6c 69 73 74 20 72 61 74 68 65 72 20 74 68 61   list rather tha
daf0: 6e 20 61 20 73 69 6e 67 6c 65 20 65 78 70 72 65  n a single expre
db00: 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssion..*/.int sq
db10: 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72  lite3ResolveExpr
db20: 4c 69 73 74 4e 61 6d 65 73 28 20 0a 20 20 4e 61  ListNames( .  Na
db30: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
db40: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
db50: 63 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78  ce to resolve ex
db60: 70 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f  pressions in. */
db70: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
db80: 73 74 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  st         /* Th
db90: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
dba0: 74 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  t to be analyzed
dbb0: 2e 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b  . */.){.  int i;
dbc0: 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b 0a  .  if( pList ){.
dbd0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
dbe0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
dbf0: 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  ){.      if( sql
dc00: 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e  ite3ResolveExprN
dc10: 61 6d 65 73 28 70 4e 43 2c 20 70 4c 69 73 74 2d  ames(pNC, pList-
dc20: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
dc30: 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74 3b  eturn WRC_Abort;
dc40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
dc50: 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
dc60: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c  ;.}../*.** Resol
dc70: 76 65 20 61 6c 6c 20 6e 61 6d 65 73 20 69 6e 20  ve all names in 
dc80: 61 6c 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20  all expressions 
dc90: 6f 66 20 61 20 53 45 4c 45 43 54 20 61 6e 64 20  of a SELECT and 
dca0: 69 6e 20 61 6c 6c 0a 2a 2a 20 64 65 63 65 6e 64  in all.** decend
dcb0: 65 6e 74 73 20 6f 66 20 74 68 65 20 53 45 4c 45  ents of the SELE
dcc0: 43 54 2c 20 69 6e 63 6c 75 64 69 6e 67 20 63 6f  CT, including co
dcd0: 6d 70 6f 75 6e 64 73 20 6f 66 66 20 6f 66 20 70  mpounds off of p
dce0: 2d 3e 70 50 72 69 6f 72 2c 0a 2a 2a 20 73 75 62  ->pPrior,.** sub
dcf0: 71 75 65 72 69 65 73 20 69 6e 20 65 78 70 72 65  queries in expre
dd00: 73 73 69 6f 6e 73 2c 20 61 6e 64 20 73 75 62 71  ssions, and subq
dd10: 75 65 72 69 65 73 20 75 73 65 64 20 61 73 20 46  ueries used as F
dd20: 52 4f 4d 20 63 6c 61 75 73 65 0a 2a 2a 20 74 65  ROM clause.** te
dd30: 72 6d 73 2e 0a 2a 2a 0a 2a 2a 20 53 65 65 20 73  rms..**.** See s
dd40: 71 6c 69 74 65 33 52 65 73 6f 6c 76 65 45 78 70  qlite3ResolveExp
dd50: 72 4e 61 6d 65 73 28 29 20 66 6f 72 20 61 20 64  rNames() for a d
dd60: 65 73 63 72 69 70 74 69 6f 6e 20 6f 66 20 74 68  escription of th
dd70: 65 20 6b 69 6e 64 73 20 6f 66 0a 2a 2a 20 74 72  e kinds of.** tr
dd80: 61 6e 73 66 6f 72 6d 61 74 69 6f 6e 73 20 74 68  ansformations th
dd90: 61 74 20 6f 63 63 75 72 2e 0a 2a 2a 0a 2a 2a 20  at occur..**.** 
dda0: 41 6c 6c 20 53 45 4c 45 43 54 20 73 74 61 74 65  All SELECT state
ddb0: 6d 65 6e 74 73 20 73 68 6f 75 6c 64 20 68 61 76  ments should hav
ddc0: 65 20 62 65 65 6e 20 65 78 70 61 6e 64 65 64 20  e been expanded 
ddd0: 75 73 69 6e 67 0a 2a 2a 20 73 71 6c 69 74 65 33  using.** sqlite3
dde0: 53 65 6c 65 63 74 45 78 70 61 6e 64 28 29 20 70  SelectExpand() p
ddf0: 72 69 6f 72 20 74 6f 20 69 6e 76 6f 6b 69 6e 67  rior to invoking
de00: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 2e 0a 2a   this routine..*
de10: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52 65  /.void sqlite3Re
de20: 73 6f 6c 76 65 53 65 6c 65 63 74 4e 61 6d 65 73  solveSelectNames
de30: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
de40: 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  e,         /* Th
de50: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
de60: 20 2a 2f 0a 20 20 53 65 6c 65 63 74 20 2a 70 2c   */.  Select *p,
de70: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
de80: 54 68 65 20 53 45 4c 45 43 54 20 73 74 61 74 65  The SELECT state
de90: 6d 65 6e 74 20 62 65 69 6e 67 20 63 6f 64 65 64  ment being coded
dea0: 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65  . */.  NameConte
deb0: 78 74 20 2a 70 4f 75 74 65 72 4e 43 20 20 2f 2a  xt *pOuterNC  /*
dec0: 20 4e 61 6d 65 20 63 6f 6e 74 65 78 74 20 66 6f   Name context fo
ded0: 72 20 70 61 72 65 6e 74 20 53 45 4c 45 43 54 20  r parent SELECT 
dee0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 29 7b 0a  statement */.){.
def0: 20 20 57 61 6c 6b 65 72 20 77 3b 0a 0a 20 20 61    Walker w;..  a
df00: 73 73 65 72 74 28 20 70 21 3d 30 20 29 3b 0a 20  ssert( p!=0 );. 
df10: 20 77 2e 78 45 78 70 72 43 61 6c 6c 62 61 63 6b   w.xExprCallback
df20: 20 3d 20 72 65 73 6f 6c 76 65 45 78 70 72 53 74   = resolveExprSt
df30: 65 70 3b 0a 20 20 77 2e 78 53 65 6c 65 63 74 43  ep;.  w.xSelectC
df40: 61 6c 6c 62 61 63 6b 20 3d 20 72 65 73 6f 6c 76  allback = resolv
df50: 65 53 65 6c 65 63 74 53 74 65 70 3b 0a 20 20 77  eSelectStep;.  w
df60: 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61 63 6b  .xSelectCallback
df70: 32 20 3d 20 30 3b 0a 20 20 77 2e 70 50 61 72 73  2 = 0;.  w.pPars
df80: 65 20 3d 20 70 50 61 72 73 65 3b 0a 20 20 77 2e  e = pParse;.  w.
df90: 75 2e 70 4e 43 20 3d 20 70 4f 75 74 65 72 4e 43  u.pNC = pOuterNC
dfa0: 3b 0a 20 20 73 71 6c 69 74 65 33 57 61 6c 6b 53  ;.  sqlite3WalkS
dfb0: 65 6c 65 63 74 28 26 77 2c 20 70 29 3b 0a 7d 0a  elect(&w, p);.}.
dfc0: 0a 2f 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 6e  ./*.** Resolve n
dfd0: 61 6d 65 73 20 69 6e 20 65 78 70 72 65 73 73 69  ames in expressi
dfe0: 6f 6e 73 20 74 68 61 74 20 63 61 6e 20 6f 6e 6c  ons that can onl
dff0: 79 20 72 65 66 65 72 65 6e 63 65 20 61 20 73 69  y reference a si
e000: 6e 67 6c 65 20 74 61 62 6c 65 3a 0a 2a 2a 0a 2a  ngle table:.**.*
e010: 2a 20 20 20 20 2a 20 20 20 43 48 45 43 4b 20 63  *    *   CHECK c
e020: 6f 6e 73 74 72 61 69 6e 74 73 0a 2a 2a 20 20 20  onstraints.**   
e030: 20 2a 20 20 20 57 48 45 52 45 20 63 6c 61 75 73   *   WHERE claus
e040: 65 73 20 6f 6e 20 70 61 72 74 69 61 6c 20 69 6e  es on partial in
e050: 64 69 63 65 73 0a 2a 2a 0a 2a 2a 20 54 68 65 20  dices.**.** The 
e060: 45 78 70 72 2e 69 54 61 62 6c 65 20 76 61 6c 75  Expr.iTable valu
e070: 65 20 66 6f 72 20 45 78 70 72 2e 6f 70 3d 3d 54  e for Expr.op==T
e080: 4b 5f 43 4f 4c 55 4d 4e 20 6e 6f 64 65 73 20 6f  K_COLUMN nodes o
e090: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
e0a0: 0a 2a 2a 20 69 73 20 73 65 74 20 74 6f 20 2d 31  .** is set to -1
e0b0: 20 61 6e 64 20 74 68 65 20 45 78 70 72 2e 69 43   and the Expr.iC
e0c0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 73  olumn value is s
e0d0: 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
e0e0: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 41   number..**.** A
e0f0: 6e 79 20 65 72 72 6f 72 73 20 63 61 75 73 65 20  ny errors cause 
e100: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
e110: 20 74 6f 20 62 65 20 73 65 74 20 69 6e 20 70 50   to be set in pP
e120: 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  arse..*/.void sq
e130: 6c 69 74 65 33 52 65 73 6f 6c 76 65 53 65 6c 66  lite3ResolveSelf
e140: 52 65 66 65 72 65 6e 63 65 28 0a 20 20 50 61 72  Reference(.  Par
e150: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
e160: 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74   /* Parsing cont
e170: 65 78 74 20 2a 2f 0a 20 20 54 61 62 6c 65 20 2a  ext */.  Table *
e180: 70 54 61 62 2c 20 20 20 20 20 20 20 20 2f 2a 20  pTab,        /* 
e190: 54 68 65 20 74 61 62 6c 65 20 62 65 69 6e 67 20  The table being 
e1a0: 72 65 66 65 72 65 6e 63 65 64 20 2a 2f 0a 20 20  referenced */.  
e1b0: 69 6e 74 20 74 79 70 65 2c 20 20 20 20 20 20 20  int type,       
e1c0: 20 20 20 20 2f 2a 20 4e 43 5f 49 73 43 68 65 63      /* NC_IsChec
e1d0: 6b 20 6f 72 20 4e 43 5f 50 61 72 74 49 64 78 20  k or NC_PartIdx 
e1e0: 6f 72 20 4e 43 5f 49 64 78 45 78 70 72 20 2a 2f  or NC_IdxExpr */
e1f0: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
e200: 20 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73         /* Expres
e210: 73 69 6f 6e 20 74 6f 20 72 65 73 6f 6c 76 65 2e  sion to resolve.
e220: 20 20 4d 61 79 20 62 65 20 4e 55 4c 4c 2e 20 2a    May be NULL. *
e230: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
e240: 69 73 74 20 20 20 20 20 2f 2a 20 45 78 70 72 65  ist     /* Expre
e250: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 72 65  ssion list to re
e260: 73 6f 6c 76 65 2e 20 20 4d 61 79 20 62 65 20 4e  solve.  May be N
e270: 55 4c 4c 2e 20 2a 2f 0a 29 7b 0a 20 20 53 72 63  ULL. */.){.  Src
e280: 4c 69 73 74 20 73 53 72 63 3b 20 20 20 20 20 20  List sSrc;      
e290: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
e2a0: 46 61 6b 65 20 53 72 63 4c 69 73 74 20 66 6f 72  Fake SrcList for
e2b0: 20 70 50 61 72 73 65 2d 3e 70 4e 65 77 54 61 62   pParse->pNewTab
e2c0: 6c 65 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74  le */.  NameCont
e2d0: 65 78 74 20 73 4e 43 3b 20 20 20 20 20 20 20 20  ext sNC;        
e2e0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20          /* Name 
e2f0: 63 6f 6e 74 65 78 74 20 66 6f 72 20 70 50 61 72  context for pPar
e300: 73 65 2d 3e 70 4e 65 77 54 61 62 6c 65 20 2a 2f  se->pNewTable */
e310: 0a 0a 20 20 61 73 73 65 72 74 28 20 74 79 70 65  ..  assert( type
e320: 3d 3d 4e 43 5f 49 73 43 68 65 63 6b 20 7c 7c 20  ==NC_IsCheck || 
e330: 74 79 70 65 3d 3d 4e 43 5f 50 61 72 74 49 64 78  type==NC_PartIdx
e340: 20 7c 7c 20 74 79 70 65 3d 3d 4e 43 5f 49 64 78   || type==NC_Idx
e350: 45 78 70 72 20 29 3b 0a 20 20 6d 65 6d 73 65 74  Expr );.  memset
e360: 28 26 73 4e 43 2c 20 30 2c 20 73 69 7a 65 6f 66  (&sNC, 0, sizeof
e370: 28 73 4e 43 29 29 3b 0a 20 20 6d 65 6d 73 65 74  (sNC));.  memset
e380: 28 26 73 53 72 63 2c 20 30 2c 20 73 69 7a 65 6f  (&sSrc, 0, sizeo
e390: 66 28 73 53 72 63 29 29 3b 0a 20 20 73 53 72 63  f(sSrc));.  sSrc
e3a0: 2e 6e 53 72 63 20 3d 20 31 3b 0a 20 20 73 53 72  .nSrc = 1;.  sSr
e3b0: 63 2e 61 5b 30 5d 2e 7a 4e 61 6d 65 20 3d 20 70  c.a[0].zName = p
e3c0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 73 53  Tab->zName;.  sS
e3d0: 72 63 2e 61 5b 30 5d 2e 70 54 61 62 20 3d 20 70  rc.a[0].pTab = p
e3e0: 54 61 62 3b 0a 20 20 73 53 72 63 2e 61 5b 30 5d  Tab;.  sSrc.a[0]
e3f0: 2e 69 43 75 72 73 6f 72 20 3d 20 2d 31 3b 0a 20  .iCursor = -1;. 
e400: 20 73 4e 43 2e 70 50 61 72 73 65 20 3d 20 70 50   sNC.pParse = pP
e410: 61 72 73 65 3b 0a 20 20 73 4e 43 2e 70 53 72 63  arse;.  sNC.pSrc
e420: 4c 69 73 74 20 3d 20 26 73 53 72 63 3b 0a 20 20  List = &sSrc;.  
e430: 73 4e 43 2e 6e 63 46 6c 61 67 73 20 3d 20 74 79  sNC.ncFlags = ty
e440: 70 65 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  pe;.  if( sqlite
e450: 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d 65  3ResolveExprName
e460: 73 28 26 73 4e 43 2c 20 70 45 78 70 72 29 20 29  s(&sNC, pExpr) )
e470: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
e480: 4c 69 73 74 20 29 20 73 71 6c 69 74 65 33 52 65  List ) sqlite3Re
e490: 73 6f 6c 76 65 45 78 70 72 4c 69 73 74 4e 61 6d  solveExprListNam
e4a0: 65 73 28 26 73 4e 43 2c 20 70 4c 69 73 74 29 3b  es(&sNC, pList);
e4b0: 0a 7d 0a                                         .}.