/ Hex Artifact Content
Login
SQLite training in Houston TX on 2019-11-05 (details)
Part of the 2019 Tcl Conference

Artifact 745383609b65d504a2cc04ac4d9389e9c8e2bc80:


0000: 2f 2a 0a 2a 2a 20 43 6f 70 79 72 69 67 68 74 20  /*.** Copyright 
0010: 28 63 29 20 31 39 39 39 2c 20 32 30 30 30 20 44  (c) 1999, 2000 D
0020: 2e 20 52 69 63 68 61 72 64 20 48 69 70 70 0a 2a  . Richard Hipp.*
0030: 2a 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61  *.** This progra
0040: 6d 20 69 73 20 66 72 65 65 20 73 6f 66 74 77 61  m is free softwa
0050: 72 65 3b 20 79 6f 75 20 63 61 6e 20 72 65 64 69  re; you can redi
0060: 73 74 72 69 62 75 74 65 20 69 74 20 61 6e 64 2f  stribute it and/
0070: 6f 72 0a 2a 2a 20 6d 6f 64 69 66 79 20 69 74 20  or.** modify it 
0080: 75 6e 64 65 72 20 74 68 65 20 74 65 72 6d 73 20  under the terms 
0090: 6f 66 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72  of the GNU Gener
00a0: 61 6c 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63  al Public.** Lic
00b0: 65 6e 73 65 20 61 73 20 70 75 62 6c 69 73 68 65  ense as publishe
00c0: 64 20 62 79 20 74 68 65 20 46 72 65 65 20 53 6f  d by the Free So
00d0: 66 74 77 61 72 65 20 46 6f 75 6e 64 61 74 69 6f  ftware Foundatio
00e0: 6e 3b 20 65 69 74 68 65 72 0a 2a 2a 20 76 65 72  n; either.** ver
00f0: 73 69 6f 6e 20 32 20 6f 66 20 74 68 65 20 4c 69  sion 2 of the Li
0100: 63 65 6e 73 65 2c 20 6f 72 20 28 61 74 20 79 6f  cense, or (at yo
0110: 75 72 20 6f 70 74 69 6f 6e 29 20 61 6e 79 20 6c  ur option) any l
0120: 61 74 65 72 20 76 65 72 73 69 6f 6e 2e 0a 2a 2a  ater version..**
0130: 0a 2a 2a 20 54 68 69 73 20 70 72 6f 67 72 61 6d  .** This program
0140: 20 69 73 20 64 69 73 74 72 69 62 75 74 65 64 20   is distributed 
0150: 69 6e 20 74 68 65 20 68 6f 70 65 20 74 68 61 74  in the hope that
0160: 20 69 74 20 77 69 6c 6c 20 62 65 20 75 73 65 66   it will be usef
0170: 75 6c 2c 0a 2a 2a 20 62 75 74 20 57 49 54 48 4f  ul,.** but WITHO
0180: 55 54 20 41 4e 59 20 57 41 52 52 41 4e 54 59 3b  UT ANY WARRANTY;
0190: 20 77 69 74 68 6f 75 74 20 65 76 65 6e 20 74 68   without even th
01a0: 65 20 69 6d 70 6c 69 65 64 20 77 61 72 72 61 6e  e implied warran
01b0: 74 79 20 6f 66 0a 2a 2a 20 4d 45 52 43 48 41 4e  ty of.** MERCHAN
01c0: 54 41 42 49 4c 49 54 59 20 6f 72 20 46 49 54 4e  TABILITY or FITN
01d0: 45 53 53 20 46 4f 52 20 41 20 50 41 52 54 49 43  ESS FOR A PARTIC
01e0: 55 4c 41 52 20 50 55 52 50 4f 53 45 2e 20 20 53  ULAR PURPOSE.  S
01f0: 65 65 20 74 68 65 20 47 4e 55 0a 2a 2a 20 47 65  ee the GNU.** Ge
0200: 6e 65 72 61 6c 20 50 75 62 6c 69 63 20 4c 69 63  neral Public Lic
0210: 65 6e 73 65 20 66 6f 72 20 6d 6f 72 65 20 64 65  ense for more de
0220: 74 61 69 6c 73 2e 0a 2a 2a 20 0a 2a 2a 20 59 6f  tails..** .** Yo
0230: 75 20 73 68 6f 75 6c 64 20 68 61 76 65 20 72 65  u should have re
0240: 63 65 69 76 65 64 20 61 20 63 6f 70 79 20 6f 66  ceived a copy of
0250: 20 74 68 65 20 47 4e 55 20 47 65 6e 65 72 61 6c   the GNU General
0260: 20 50 75 62 6c 69 63 0a 2a 2a 20 4c 69 63 65 6e   Public.** Licen
0270: 73 65 20 61 6c 6f 6e 67 20 77 69 74 68 20 74 68  se along with th
0280: 69 73 20 6c 69 62 72 61 72 79 3b 20 69 66 20 6e  is library; if n
0290: 6f 74 2c 20 77 72 69 74 65 20 74 6f 20 74 68 65  ot, write to the
02a0: 0a 2a 2a 20 46 72 65 65 20 53 6f 66 74 77 61 72  .** Free Softwar
02b0: 65 20 46 6f 75 6e 64 61 74 69 6f 6e 2c 20 49 6e  e Foundation, In
02c0: 63 2e 2c 20 35 39 20 54 65 6d 70 6c 65 20 50 6c  c., 59 Temple Pl
02d0: 61 63 65 20 2d 20 53 75 69 74 65 20 33 33 30 2c  ace - Suite 330,
02e0: 0a 2a 2a 20 42 6f 73 74 6f 6e 2c 20 4d 41 20 20  .** Boston, MA  
02f0: 30 32 31 31 31 2d 31 33 30 37 2c 20 55 53 41 2e  02111-1307, USA.
0300: 0a 2a 2a 0a 2a 2a 20 41 75 74 68 6f 72 20 63 6f  .**.** Author co
0310: 6e 74 61 63 74 20 69 6e 66 6f 72 6d 61 74 69 6f  ntact informatio
0320: 6e 3a 0a 2a 2a 20 20 20 64 72 68 40 68 77 61 63  n:.**   drh@hwac
0330: 69 2e 63 6f 6d 0a 2a 2a 20 20 20 68 74 74 70 3a  i.com.**   http:
0340: 2f 2f 77 77 77 2e 68 77 61 63 69 2e 63 6f 6d 2f  //www.hwaci.com/
0350: 64 72 68 2f 0a 2a 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a  drh/.**.********
0360: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0370: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0380: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0390: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
03a0: 2a 0a 2a 2a 20 54 68 69 73 20 66 69 6c 65 20 63  *.** This file c
03b0: 6f 6e 74 61 69 6e 73 20 72 6f 75 74 69 6e 65 73  ontains routines
03c0: 20 75 73 65 64 20 66 6f 72 20 61 6e 61 6c 79 7a   used for analyz
03d0: 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 73 20  ing expressions 
03e0: 61 6e 64 0a 2a 2a 20 66 6f 72 20 67 65 6e 65 72  and.** for gener
03f0: 61 74 69 6e 67 20 56 44 42 45 20 63 6f 64 65 20  ating VDBE code 
0400: 74 68 61 74 20 65 76 61 6c 75 61 74 65 73 20 65  that evaluates e
0410: 78 70 72 65 73 73 69 6f 6e 73 2e 0a 2a 2a 0a 2a  xpressions..**.*
0420: 2a 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20  * $Id: expr.c,v 
0430: 31 2e 32 33 20 32 30 30 31 2f 30 34 2f 30 34 20  1.23 2001/04/04 
0440: 32 31 3a 32 32 3a 31 34 20 64 72 68 20 45 78 70  21:22:14 drh Exp
0450: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0460: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a  sqliteInt.h"../*
0470: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
0480: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
0490: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
04a0: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
04b0: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
04c0: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
04d0: 69 61 62 6c 65 73 2e 0a 2a 2f 0a 73 74 61 74 69  iables..*/.stati
04e0: 63 20 69 6e 74 20 69 73 43 6f 6e 73 74 61 6e 74  c int isConstant
04f0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69  (Expr *p){.  swi
0500: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
0510: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
0520: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
0530: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
0540: 54 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  T:.      return 
0550: 30 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  0;.    default: 
0560: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  {.      if( p->p
0570: 4c 65 66 74 20 26 26 20 21 69 73 43 6f 6e 73 74  Left && !isConst
0580: 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20  ant(p->pLeft) ) 
0590: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
05a0: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26  if( p->pRight &&
05b0: 20 21 69 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e   !isConstant(p->
05c0: 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e  pRight) ) return
05d0: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
05e0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
05f0: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
0600: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70   for(i=0; i<p->p
0610: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
0620: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
0630: 20 21 69 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e   !isConstant(p->
0640: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
0650: 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
0660: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
0670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
0680: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
0690: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c   1;.}../*.** Wal
06a0: 6b 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  k the expression
06b0: 20 74 72 65 65 20 61 6e 64 20 70 72 6f 63 65 73   tree and proces
06c0: 73 20 6f 70 65 72 61 74 6f 72 73 20 6f 66 20 74  s operators of t
06d0: 68 65 20 66 6f 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20  he form:.**.**  
06e0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
06f0: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
0700: 54 68 65 73 65 20 6f 70 65 72 61 74 6f 72 73 20  These operators 
0710: 68 61 76 65 20 74 6f 20 62 65 20 70 72 6f 63 65  have to be proce
0720: 73 73 65 64 20 62 65 66 6f 72 65 20 63 6f 6c 75  ssed before colu
0730: 6d 6e 20 6e 61 6d 65 73 20 61 72 65 0a 2a 2a 20  mn names are.** 
0740: 72 65 73 6f 6c 76 65 64 20 62 65 63 61 75 73 65  resolved because
0750: 20 65 61 63 68 20 73 75 63 68 20 6f 70 65 72 61   each such opera
0760: 74 6f 72 20 69 6e 63 72 65 6d 65 6e 74 73 20 70  tor increments p
0770: 50 61 72 73 65 2d 3e 6e 54 61 62 0a 2a 2a 20 74  Parse->nTab.** t
0780: 6f 20 72 65 73 65 72 76 65 20 63 75 72 73 6f 72  o reserve cursor
0790: 20 6e 75 6d 62 65 72 73 20 66 6f 72 20 69 74 73   numbers for its
07a0: 20 6f 77 6e 20 75 73 65 2e 20 20 42 75 74 20 70   own use.  But p
07b0: 50 61 72 73 65 2d 3e 6e 54 61 62 0a 2a 2a 20 6e  Parse->nTab.** n
07c0: 65 65 64 73 20 74 6f 20 62 65 20 63 6f 6e 73 74  eeds to be const
07d0: 61 6e 74 20 6f 6e 63 65 20 77 65 20 62 65 67 69  ant once we begi
07e0: 6e 20 72 65 73 6f 6c 76 69 6e 67 20 63 6f 6c 75  n resolving colu
07f0: 6d 6e 20 6e 61 6d 65 73 2e 0a 2a 2a 0a 2a 2a 20  mn names..**.** 
0800: 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 70 72  Actually, the pr
0810: 6f 63 65 73 73 69 6e 67 20 6f 66 20 49 4e 2d 53  ocessing of IN-S
0820: 45 4c 45 43 54 20 69 73 20 6f 6e 6c 79 20 73 74  ELECT is only st
0830: 61 72 74 65 64 20 62 79 20 74 68 69 73 0a 2a 2a  arted by this.**
0840: 20 72 6f 75 74 69 6e 65 2e 20 20 54 68 69 73 20   routine.  This 
0850: 72 6f 75 74 69 6e 65 20 61 6c 6c 6f 63 61 74 65  routine allocate
0860: 73 20 61 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  s a cursor numbe
0870: 72 20 74 6f 20 74 68 65 20 49 4e 2d 53 45 4c 45  r to the IN-SELE
0880: 43 54 0a 2a 2a 20 61 6e 64 20 74 68 65 6e 20 6d  CT.** and then m
0890: 6f 76 65 73 20 6f 6e 2e 20 20 54 68 65 20 63 6f  oves on.  The co
08a0: 64 65 20 67 65 6e 65 72 61 74 69 6f 6e 20 69 73  de generation is
08b0: 20 64 6f 6e 65 20 62 79 20 0a 2a 2a 20 73 71 6c   done by .** sql
08c0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
08d0: 73 28 29 20 77 68 69 63 68 20 6d 75 73 74 20 62  s() which must b
08e0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 77 61  e called afterwa
08f0: 72 64 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rds..*/.void sql
0900: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
0910: 53 65 6c 65 63 74 28 50 61 72 73 65 20 2a 70 50  Select(Parse *pP
0920: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
0930: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  r){.  if( pExpr=
0940: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
0950: 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
0960: 5f 49 4e 20 26 26 20 70 45 78 70 72 2d 3e 70 53  _IN && pExpr->pS
0970: 65 6c 65 63 74 21 3d 30 20 29 7b 0a 20 20 20 20  elect!=0 ){.    
0980: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
0990: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
09a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66 28    }else{.    if(
09b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 20   pExpr->pLeft ) 
09c0: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
09d0: 65 49 6e 53 65 6c 65 63 74 28 70 50 61 72 73 65  eInSelect(pParse
09e0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
09f0: 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e  .    if( pExpr->
0a00: 70 52 69 67 68 74 20 29 20 73 71 6c 69 74 65 45  pRight ) sqliteE
0a10: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
0a20: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
0a30: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 69  ->pRight);.    i
0a40: 66 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  f( pExpr->pList 
0a50: 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  ){.      int i;.
0a60: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
0a70: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
0a80: 4c 69 73 74 3b 0a 20 20 20 20 20 20 66 6f 72 28  List;.      for(
0a90: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
0aa0: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
0ab0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 52 65 73     sqliteExprRes
0ac0: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
0ad0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
0ae0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d  .pExpr);.      }
0af0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
0b00: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
0b10: 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74 72  if the given str
0b20: 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20  ing is a row-id 
0b30: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  column name..*/.
0b40: 73 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74  static int sqlit
0b50: 65 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  eIsRowid(const c
0b60: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
0b70: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
0b80: 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20  "_ROWID_")==0 ) 
0b90: 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20  return 1;.  if( 
0ba0: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c  sqliteStrICmp(z,
0bb0: 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72   "ROWID")==0 ) r
0bc0: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73  eturn 1;.  if( s
0bd0: 71 6c 69 74 65 53 74 72 49 43 6d 70 28 7a 2c 20  qliteStrICmp(z, 
0be0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
0bf0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
0c00: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
0c10: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
0c20: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
0c30: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
0c40: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
0c50: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
0c60: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
0c70: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
0c80: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
0c90: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
0ca0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
0cb0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
0cc0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 6f  n offset.  The o
0cd0: 70 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 73 75 63  pcode.** for suc
0ce0: 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67  h nodes is chang
0cf0: 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e  ed to TK_COLUMN.
0d00: 20 20 54 68 65 20 69 54 61 62 6c 65 20 76 61 6c    The iTable val
0d10: 75 65 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ue is changed.**
0d20: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
0d30: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
0d40: 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
0d50: 74 20 70 6c 75 73 20 74 68 65 20 70 50 61 72 73  t plus the pPars
0d60: 65 2d 3e 6e 54 61 62 0a 2a 2a 20 76 61 6c 75 65  e->nTab.** value
0d70: 2e 20 20 54 68 65 20 69 43 6f 6c 75 6d 6e 20 76  .  The iColumn v
0d80: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
0d90: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
0da0: 74 68 65 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68  the column of th
0db0: 65 20 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64  e .** referenced
0dc0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 65   table..**.** We
0dd0: 20 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20   also check for 
0de0: 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65  instances of the
0df0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49   IN operator.  I
0e00: 4e 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a  N comes in two.*
0e10: 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20  * forms:.**.**  
0e20: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
0e30: 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61   (exprlist).** a
0e40: 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  nd.**           
0e50: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
0e60: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66  ...).**.** The f
0e70: 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e  irst form is han
0e80: 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e 67  dled by creating
0e90: 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74   a set holding t
0ea0: 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c  he list.** of al
0eb0: 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54  lowed values.  T
0ec0: 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63  he second form c
0ed0: 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43 54  auses the SELECT
0ee0: 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a   to generate .**
0ef0: 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62   a temporary tab
0f00: 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  le..**.** This r
0f10: 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b  outine also look
0f20: 73 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c  s for scalar SEL
0f30: 45 43 54 73 20 74 68 61 74 20 61 72 65 20 70 61  ECTs that are pa
0f40: 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  rt of an express
0f50: 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69  ion..** If it fi
0f60: 6e 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65  nds any, it gene
0f70: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72  rates code to wr
0f80: 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66  ite the value of
0f90: 20 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20   that select.** 
0fa0: 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65  into a memory ce
0fb0: 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77  ll..**.** Unknow
0fc0: 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61 62  n columns or tab
0fd0: 6c 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65  les provoke an e
0fe0: 72 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63 74  rror.  The funct
0ff0: 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74  ion returns.** t
1000: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
1010: 6f 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65 61  ors seen and lea
1020: 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ves an error mes
1030: 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e  sage on pParse->
1040: 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20  zErrMsg..*/.int 
1050: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
1060: 65 49 64 73 28 50 61 72 73 65 20 2a 70 50 61 72  eIds(Parse *pPar
1070: 73 65 2c 20 49 64 4c 69 73 74 20 2a 70 54 61 62  se, IdList *pTab
1080: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
1090: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  r){.  if( pExpr=
10a0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
10b0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
10c0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6c  op ){.    /* A l
10d0: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 2a  one identifier *
10e0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
10f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e  : {.      int cn
1100: 74 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  t = 0;      /* N
1110: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 65 73  umber of matches
1120: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
1130: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
1140: 6f 6f 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20  oop counter */. 
1150: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
1160: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 45 78  qliteStrNDup(pEx
1170: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
1180: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
1190: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
11a0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
11b0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
11c0: 6a 3b 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65  j;.        Table
11d0: 20 2a 70 54 61 62 20 3d 20 70 54 61 62 4c 69 73   *pTab = pTabLis
11e0: 74 2d 3e 61 5b 69 5d 2e 70 54 61 62 3b 0a 20 20  t->a[i].pTab;.  
11f0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d        if( pTab==
1200: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
1210: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
1220: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
1230: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  ){.          if(
1240: 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70   sqliteStrICmp(p
1250: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61  Tab->aCol[j].zNa
1260: 6d 65 2c 20 7a 29 3d 3d 30 20 29 7b 0a 20 20 20  me, z)==0 ){.   
1270: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
1280: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
1290: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b 20  r->iTable = i + 
12a0: 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20 20  pParse->nTab;.  
12b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
12c0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
12d0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
12e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
12f0: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
1300: 73 71 6c 69 74 65 49 73 52 6f 77 69 64 28 7a 29  sqliteIsRowid(z)
1310: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
1320: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b  r->iColumn = -1;
1330: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
1340: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
1350: 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 20 20 63  >nTab;.        c
1360: 6e 74 20 3d 20 31 20 2b 20 28 70 54 61 62 4c 69  nt = 1 + (pTabLi
1370: 73 74 2d 3e 6e 49 64 3e 31 29 3b 0a 20 20 20 20  st->nId>1);.    
1380: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
1390: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 69  Free(z);.      i
13a0: 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  f( cnt==0 ){.   
13b0: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
13c0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
13d0: 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68  ErrMsg, "no such
13e0: 20 63 6f 6c 75 6d 6e 3a 20 22 2c 20 2d 31 2c 20   column: ", -1, 
13f0: 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1400: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
1410: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  r->token.n, 0);.
1420: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1430: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1440: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1450: 7d 65 6c 73 65 20 69 66 28 20 63 6e 74 3e 31 20  }else if( cnt>1 
1460: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
1470: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
1480: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61  rse->zErrMsg, "a
1490: 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20  mbiguous column 
14a0: 6e 61 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20  name: ", -1,  . 
14b0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
14c0: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
14d0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
14e0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
14f0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
1500: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1510: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1520: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
1530: 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a    break; .    }.
1540: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
1550: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
1560: 6e 20 6e 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a  n name:  ID.ID *
1570: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
1580: 54 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 63  T: {.      int c
1590: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
15a0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
15b0: 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20 20 20   matches */.    
15c0: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
15d0: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ;          /* Nu
15e0: 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67  mber of matching
15f0: 20 74 61 62 6c 65 73 20 2a 2f 0a 20 20 20 20 20   tables */.     
1600: 20 69 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20   int i;         
1610: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
1620: 70 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20  p counter */.   
1630: 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20     Expr *pLeft, 
1640: 2a 70 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c  *pRight;    /* L
1650: 65 66 74 20 61 6e 64 20 72 69 67 68 74 20 73 75  eft and right su
1660: 62 62 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65  bbranches of the
1670: 20 65 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63   expr */.      c
1680: 68 61 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69  har *zLeft, *zRi
1690: 67 68 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20  ght;    /* Text 
16a0: 6f 66 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72  of an identifier
16b0: 20 2a 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74   */..      pLeft
16c0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
16d0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
16e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20  pExpr->pRight;. 
16f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65       assert( pLe
1700: 66 74 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d  ft && pLeft->op=
1710: 3d 54 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20  =TK_ID );.      
1720: 61 73 73 65 72 74 28 20 70 52 69 67 68 74 20 26  assert( pRight &
1730: 26 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  & pRight->op==TK
1740: 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65  _ID );.      zLe
1750: 66 74 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  ft = sqliteStrND
1760: 75 70 28 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  up(pLeft->token.
1770: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
1780: 6e 29 3b 0a 20 20 20 20 20 20 7a 52 69 67 68 74  n);.      zRight
1790: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
17a0: 28 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e 7a  (pRight->token.z
17b0: 2c 20 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 2e  , pRight->token.
17c0: 6e 29 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  n);.      pExpr-
17d0: 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20  >iTable = -1;.  
17e0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
17f0: 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69 2b  TabList->nId; i+
1800: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  +){.        int 
1810: 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  j;.        char 
1820: 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20 54  *zTab;.        T
1830: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54 61  able *pTab = pTa
1840: 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61 62  bList->a[i].pTab
1850: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1860: 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  ab==0 ) continue
1870: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 54  ;.        if( pT
1880: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c  abList->a[i].zAl
1890: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ias ){.         
18a0: 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73 74   zTab = pTabList
18b0: 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a 20  ->a[i].zAlias;. 
18c0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
18d0: 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20 70          zTab = p
18e0: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
18f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
1900: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1910: 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21 3d 30 20  zTab, zLeft)!=0 
1920: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
1930: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
1940: 61 62 2b 2b 29 20 29 20 70 45 78 70 72 2d 3e 69  ab++) ) pExpr->i
1950: 54 61 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72  Table = i + pPar
1960: 73 65 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20  se->nTab;.      
1970: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61    for(j=0; j<pTa
1980: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20  b->nCol; j++){. 
1990: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
19a0: 69 74 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d  iteStrICmp(pTab-
19b0: 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20  >aCol[j].zName, 
19c0: 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b 0a 20 20  zRight)==0 ){.  
19d0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
19e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
19f0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 2b  pr->iTable = i +
1a00: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 3b 0a 20   pParse->nTab;. 
1a10: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
1a20: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  ->iColumn = j;. 
1a30: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
1a40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
1a50: 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26     if( cnt==0 &&
1a60: 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71   cntTab==1 && sq
1a70: 6c 69 74 65 49 73 52 6f 77 69 64 28 7a 52 69 67  liteIsRowid(zRig
1a80: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ht) ){.        c
1a90: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nt = 1;.        
1aa0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
1ab0: 20 2d 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   -1;.      }.   
1ac0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 4c     sqliteFree(zL
1ad0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
1ae0: 74 65 46 72 65 65 28 7a 52 69 67 68 74 29 3b 0a  teFree(zRight);.
1af0: 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30        if( cnt==0
1b00: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
1b10: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50  teSetNString(&pP
1b20: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
1b30: 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20  no such column: 
1b40: 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20 20  ", -1,  .       
1b50: 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e     pLeft->token.
1b60: 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  z, pLeft->token.
1b70: 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20 20  n, ".", 1, .    
1b80: 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74 6f        pRight->to
1b90: 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e 74  ken.z, pRight->t
1ba0: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
1bb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1bc0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
1bd0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rn 1;.      }els
1be0: 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a 20  e if( cnt>1 ){. 
1bf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
1c00: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
1c10: 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69 67  >zErrMsg, "ambig
1c20: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
1c30: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
1c40: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
1c50: 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  n.z, pLeft->toke
1c60: 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20  n.n, ".", 1,.   
1c70: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
1c80: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
1c90: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
1ca0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1cb0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
1cc0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1cd0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
1ce0: 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20  elete(pLeft);.  
1cf0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1d00: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
1d10: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  teExprDelete(pRi
1d20: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ght);.      pExp
1d30: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
1d40: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1d50: 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 20 20   TK_COLUMN;.    
1d60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
1d70: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
1d80: 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20  {.      Vdbe *v 
1d90: 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28  = sqliteGetVdbe(
1da0: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69  pParse);.      i
1db0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
1dc0: 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   1;.      if( sq
1dd0: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
1de0: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
1df0: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  ist, pExpr->pLef
1e00: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  t) ){.        re
1e10: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
1e20: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
1e30: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
1e40: 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20      /* Case 1:  
1e50: 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45     expr IN (SELE
1e60: 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20  CT ...).        
1e70: 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65  **.        ** Ge
1e80: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77  nerate code to w
1e90: 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73  rite the results
1ea0: 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69   of the select i
1eb0: 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a  nto a temporary.
1ec0: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
1ed0: 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75  .  The cursor nu
1ee0: 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70  mber of the temp
1ef0: 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20  orary table has 
1f00: 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20  already.        
1f10: 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69  ** been put in i
1f20: 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 45  Table by sqliteE
1f30: 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65  xprResolveInSele
1f40: 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f  ct()..        */
1f50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
1f60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f  dbeAddOp(v, OP_O
1f70: 70 65 6e 49 64 78 2c 20 70 45 78 70 72 2d 3e 69  penIdx, pExpr->i
1f80: 54 61 62 6c 65 2c 20 31 2c 20 30 2c 20 30 29 3b  Table, 1, 0, 0);
1f90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
1fa0: 69 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65  iteSelect(pParse
1fb0: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
1fc0: 2c 20 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72  , SRT_Set, pExpr
1fd0: 2d 3e 69 54 61 62 6c 65 29 20 29 3b 0a 20 20 20  ->iTable) );.   
1fe0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
1ff0: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
2000: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20       /* Case 2: 
2010: 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78 70      expr IN (exp
2020: 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a  rlist).        *
2030: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65  *.        ** Cre
2040: 61 74 65 20 61 20 73 65 74 20 74 6f 20 70 75 74  ate a set to put
2050: 20 74 68 65 20 65 78 70 72 6c 69 73 74 20 76 61   the exprlist va
2060: 6c 75 65 73 20 69 6e 2e 20 20 54 68 65 20 53 65  lues in.  The Se
2070: 74 20 69 64 20 69 73 20 73 74 6f 72 65 64 0a 20  t id is stored. 
2080: 20 20 20 20 20 20 20 2a 2a 20 69 6e 20 69 54 61         ** in iTa
2090: 62 6c 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ble..        */.
20a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 2c 20 69          int i, i
20b0: 53 65 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Set;.        for
20c0: 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70  (i=0; i<pExpr->p
20d0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
20e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
20f0: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
2100: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
2110: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  r;.          if(
2120: 20 21 69 73 43 6f 6e 73 74 61 6e 74 28 70 45 32   !isConstant(pE2
2130: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
2140: 20 73 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67   sqliteSetString
2150: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
2160: 67 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  g,.             
2170: 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64   "right-hand sid
2180: 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  e of IN operator
2190: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
21a0: 74 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  t", 0);.        
21b0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
21c0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
21d0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
21e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21f0: 69 66 28 20 73 71 6c 69 74 65 45 78 70 72 43 68  if( sqliteExprCh
2200: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c  eck(pParse, pE2,
2210: 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20   0, 0) ){.      
2220: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2230: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
2240: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 53      }.        iS
2250: 65 74 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  et = pExpr->iTab
2260: 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65  le = pParse->nSe
2270: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t++;.        for
2280: 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70  (i=0; i<pExpr->p
2290: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
22a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
22b0: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
22c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
22d0: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 73 77 69  r;.          swi
22e0: 74 63 68 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a  tch( pE2->op ){.
22f0: 20 20 20 20 20 20 20 20 20 20 20 20 63 61 73 65              case
2300: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20   TK_FLOAT:.     
2310: 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49         case TK_I
2320: 4e 54 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20  NTEGER:.        
2330: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
2340: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20  NG: {.          
2350: 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73      int addr = s
2360: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
2370: 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20  , OP_SetInsert, 
2380: 69 53 65 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  iSet, 0, 0, 0);.
2390: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71                sq
23a0: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
23b0: 28 76 2c 20 61 64 64 72 2c 20 70 45 32 2d 3e 74  (v, addr, pE2->t
23c0: 6f 6b 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b  oken.z, pE2->tok
23d0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20  en.n);.         
23e0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 44       sqliteVdbeD
23f0: 65 71 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72  equoteP3(v, addr
2400: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
2410: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
2420: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
2430: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
2440: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
2450: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
2460: 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20  , pE2);.        
2470: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
2480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49  AddOp(v, OP_SetI
2490: 6e 73 65 72 74 2c 20 69 53 65 74 2c 20 30 2c 20  nsert, iSet, 0, 
24a0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
24b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
24c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
24d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
24e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
24f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  eak;.    }..    
2500: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
2510: 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20  {.      /* This 
2520: 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c  has to be a scal
2530: 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65  ar SELECT.  Gene
2540: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74  rate code to put
2550: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61   the.      ** va
2560: 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65  lue of this sele
2570: 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63  ct in a memory c
2580: 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74  ell and record t
2590: 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20  he number.      
25a0: 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79  ** of the memory
25b0: 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e   cell in iColumn
25c0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
25d0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
25e0: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
25f0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
2600: 74 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  teSelect(pParse,
2610: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
2620: 20 53 52 54 5f 4d 65 6d 2c 20 70 45 78 70 72 2d   SRT_Mem, pExpr-
2630: 3e 69 43 6f 6c 75 6d 6e 29 20 29 7b 0a 20 20 20  >iColumn) ){.   
2640: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
2650: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
2660: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ak;.    }..    /
2670: 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20  * For all else, 
2680: 6a 75 73 74 20 72 65 63 75 72 73 69 76 65 6c 79  just recursively
2690: 20 77 61 6c 6b 20 74 68 65 20 74 72 65 65 20 2a   walk the tree *
26a0: 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  /.    default: {
26b0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
26c0: 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20 26 26  ->pLeft.      &&
26d0: 20 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c   sqliteExprResol
26e0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54  veIds(pParse, pT
26f0: 61 62 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  abList, pExpr->p
2700: 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20  Left) ){.       
2710: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
2720: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
2730: 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20 20  pr->pRight .    
2740: 20 20 26 26 20 73 71 6c 69 74 65 45 78 70 72 52    && sqliteExprR
2750: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
2760: 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 45 78 70  , pTabList, pExp
2770: 72 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20  r->pRight) ){.  
2780: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
2790: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
27a0: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
27b0: 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  {.        int i;
27c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
27d0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
27e0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  ->pList;.       
27f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
2800: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
2810: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
2820: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
2830: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
2840: 69 73 74 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  ist, pList->a[i]
2850: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
2860: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
2870: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
2880: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
2890: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
28a0: 6e 20 30 3b 0a 7d 0a 0a 23 69 66 20 30 20 2f 2a  n 0;.}..#if 0 /*
28b0: 20 4e 4f 54 20 55 53 45 44 20 2a 2f 0a 2f 2a 0a   NOT USED */./*.
28c0: 2a 2a 20 43 6f 6d 70 61 72 65 20 61 20 74 6f 6b  ** Compare a tok
28d0: 65 6e 20 61 67 61 69 6e 73 74 20 61 20 73 74 72  en against a str
28e0: 69 6e 67 2e 20 20 52 65 74 75 72 6e 20 54 52 55  ing.  Return TRU
28f0: 45 20 69 66 20 74 68 65 79 20 6d 61 74 63 68 2e  E if they match.
2900: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 73  .*/.static int s
2910: 71 6c 69 74 65 54 6f 6b 65 6e 43 6d 70 28 54 6f  qliteTokenCmp(To
2920: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 63 6f 6e  ken *pToken, con
2930: 73 74 20 63 68 61 72 20 2a 7a 53 74 72 29 7b 0a  st char *zStr){.
2940: 20 20 69 6e 74 20 6e 20 3d 20 73 74 72 6c 65 6e    int n = strlen
2950: 28 7a 53 74 72 29 3b 0a 20 20 69 66 28 20 6e 21  (zStr);.  if( n!
2960: 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 29 20 72 65 74  =pToken->n ) ret
2970: 75 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  urn 0;.  return 
2980: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
2990: 54 6f 6b 65 6e 2d 3e 7a 2c 20 7a 53 74 72 2c 20  Token->z, zStr, 
29a0: 6e 29 3d 3d 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a  n)==0;.}.#endif.
29b0: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
29c0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69   function name i
29d0: 6e 74 6f 20 69 74 73 20 69 6e 74 65 67 65 72 20  nto its integer 
29e0: 69 64 65 6e 74 69 66 69 65 72 2e 20 20 52 65 74  identifier.  Ret
29f0: 75 72 6e 20 74 68 65 0a 2a 2a 20 69 64 65 6e 74  urn the.** ident
2a00: 69 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20 46  ifier.  Return F
2a10: 4e 5f 55 6e 6b 6e 6f 77 6e 20 69 66 20 74 68 65  N_Unknown if the
2a20: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 69   function name i
2a30: 73 20 75 6e 6b 6e 6f 77 6e 2e 0a 2a 2f 0a 69 6e  s unknown..*/.in
2a40: 74 20 73 71 6c 69 74 65 46 75 6e 63 49 64 28 54  t sqliteFuncId(T
2a50: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
2a60: 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 73 74   static const st
2a70: 72 75 63 74 20 7b 0a 20 20 20 20 20 63 68 61 72  ruct {.     char
2a80: 20 2a 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 69 6e   *zName;.     in
2a90: 74 20 6c 65 6e 3b 0a 20 20 20 20 20 69 6e 74 20  t len;.     int 
2aa0: 69 64 3b 0a 20 20 7d 20 61 46 75 6e 63 5b 5d 20  id;.  } aFunc[] 
2ab0: 3d 20 7b 0a 20 20 20 20 20 7b 20 22 63 6f 75 6e  = {.     { "coun
2ac0: 74 22 2c 20 20 35 2c 20 46 4e 5f 43 6f 75 6e 74  t",  5, FN_Count
2ad0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 69 6e 22   },.     { "min"
2ae0: 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 69 6e 20 20  ,    3, FN_Min  
2af0: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 6d 61 78 22   },.     { "max"
2b00: 2c 20 20 20 20 33 2c 20 46 4e 5f 4d 61 78 20 20  ,    3, FN_Max  
2b10: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 73 75 6d 22   },.     { "sum"
2b20: 2c 20 20 20 20 33 2c 20 46 4e 5f 53 75 6d 20 20  ,    3, FN_Sum  
2b30: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 61 76 67 22   },.     { "avg"
2b40: 2c 20 20 20 20 33 2c 20 46 4e 5f 41 76 67 20 20  ,    3, FN_Avg  
2b50: 20 7d 2c 0a 20 20 20 20 20 7b 20 22 66 63 6e 74   },.     { "fcnt
2b60: 22 2c 20 20 20 34 2c 20 46 4e 5f 46 63 6e 74 20  ",   4, FN_Fcnt 
2b70: 20 7d 2c 20 20 2f 2a 20 55 73 65 64 20 66 6f 72   },  /* Used for
2b80: 20 74 65 73 74 69 6e 67 20 6f 6e 6c 79 20 2a 2f   testing only */
2b90: 0a 20 20 20 20 20 7b 20 22 6c 65 6e 67 74 68 22  .     { "length"
2ba0: 2c 20 36 2c 20 46 4e 5f 4c 65 6e 67 74 68 7d 2c  , 6, FN_Length},
2bb0: 0a 20 20 20 20 20 7b 20 22 73 75 62 73 74 72 22  .     { "substr"
2bc0: 2c 20 36 2c 20 46 4e 5f 53 75 62 73 74 72 7d 2c  , 6, FN_Substr},
2bd0: 0a 20 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  .  };.  int i;. 
2be0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61   for(i=0; i<Arra
2bf0: 79 53 69 7a 65 28 61 46 75 6e 63 29 3b 20 69 2b  ySize(aFunc); i+
2c00: 2b 29 7b 0a 20 20 20 20 69 66 28 20 61 46 75 6e  +){.    if( aFun
2c10: 63 5b 69 5d 2e 6c 65 6e 3d 3d 70 54 6f 6b 65 6e  c[i].len==pToken
2c20: 2d 3e 6e 20 0a 20 20 20 20 20 26 26 20 73 71 6c  ->n .     && sql
2c30: 69 74 65 53 74 72 4e 49 43 6d 70 28 70 54 6f 6b  iteStrNICmp(pTok
2c40: 65 6e 2d 3e 7a 2c 20 61 46 75 6e 63 5b 69 5d 2e  en->z, aFunc[i].
2c50: 7a 4e 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e  zName, aFunc[i].
2c60: 6c 65 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  len)==0 ){.     
2c70: 20 20 72 65 74 75 72 6e 20 61 46 75 6e 63 5b 69    return aFunc[i
2c80: 5d 2e 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ].id;.    }.  }.
2c90: 20 20 72 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e    return FN_Unkn
2ca0: 6f 77 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72  own;.}../*.** Er
2cb0: 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20 66 75  ror check the fu
2cc0: 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20 65 78  nctions in an ex
2cd0: 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b 65 20  pression.  Make 
2ce0: 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63  sure all.** func
2cf0: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20 72  tion names are r
2d00: 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c  ecognized and al
2d10: 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65  l functions have
2d20: 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20   the correct.** 
2d30: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
2d40: 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20 65  nts.  Leave an e
2d50: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
2d60: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a  pParse->zErrMsg.
2d70: 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69  ** if anything i
2d80: 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72 6e  s amiss.  Return
2d90: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
2da0: 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20  rrors..**.** if 
2db0: 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20 6e 75  pIsAgg is not nu
2dc0: 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78 70 72  ll and this expr
2dd0: 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61 67 67  ession is an agg
2de0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a  regate function.
2df0: 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74 28 2a  ** (like count(*
2e00: 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65 29 29  ) or max(value))
2e10: 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 31 20   then write a 1 
2e20: 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a 2a 2f  into *pIsAgg..*/
2e30: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 43  .int sqliteExprC
2e40: 68 65 63 6b 28 50 61 72 73 65 20 2a 70 50 61 72  heck(Parse *pPar
2e50: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
2e60: 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69   int allowAgg, i
2e70: 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a 20 20 69  nt *pIsAgg){.  i
2e80: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69  nt nErr = 0;.  i
2e90: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
2ea0: 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68  turn 0;.  switch
2eb0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
2ec0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
2ed0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
2ee0: 20 69 64 20 3d 20 73 71 6c 69 74 65 46 75 6e 63   id = sqliteFunc
2ef0: 49 64 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Id(&pExpr->token
2f00: 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  );.      int n =
2f10: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
2f20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
2f30: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 69  xpr : 0;.      i
2f40: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
2f50: 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 74  = 0;.      int t
2f60: 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20 30  oo_many_args = 0
2f70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f  ;.      int too_
2f80: 66 65 77 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20  few_args = 0;.  
2f90: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
2fa0: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
2fb0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
2fc0: 6f 6c 75 6d 6e 20 3d 20 69 64 3b 0a 20 20 20 20  olumn = id;.    
2fd0: 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b 0a    switch( id ){.
2fe0: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
2ff0: 55 6e 6b 6e 6f 77 6e 3a 20 7b 20 0a 20 20 20 20  Unknown: { .    
3000: 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75        no_such_fu
3010: 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  nc = 1;.        
3020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
3030: 20 7d 0a 20 20 20 20 20 20 20 20 63 61 73 65 20   }.        case 
3040: 46 4e 5f 43 6f 75 6e 74 3a 20 7b 20 0a 20 20 20  FN_Count: { .   
3050: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
3060: 75 6e 63 20 3d 20 21 61 6c 6c 6f 77 41 67 67 3b  unc = !allowAgg;
3070: 0a 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d  .          too_m
3080: 61 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 31 3b 0a  any_args = n>1;.
3090: 20 20 20 20 20 20 20 20 20 20 69 73 5f 61 67 67            is_agg
30a0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
30b0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
30c0: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
30d0: 5f 4d 61 78 3a 0a 20 20 20 20 20 20 20 20 63 61  _Max:.        ca
30e0: 73 65 20 46 4e 5f 4d 69 6e 3a 20 7b 0a 20 20 20  se FN_Min: {.   
30f0: 20 20 20 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61         too_few_a
3100: 72 67 73 20 3d 20 61 6c 6c 6f 77 41 67 67 20 3f  rgs = allowAgg ?
3110: 20 6e 3c 31 20 3a 20 6e 3c 32 3b 0a 20 20 20 20   n<1 : n<2;.    
3120: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 6e        is_agg = n
3130: 3d 3d 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  ==1;.          b
3140: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
3150: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
3160: 41 76 67 3a 0a 20 20 20 20 20 20 20 20 63 61 73  Avg:.        cas
3170: 65 20 46 4e 5f 53 75 6d 3a 20 7b 0a 20 20 20 20  e FN_Sum: {.    
3180: 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75        no_such_fu
3190: 6e 63 20 3d 20 21 61 6c 6c 6f 77 41 67 67 3b 0a  nc = !allowAgg;.
31a0: 20 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61            too_ma
31b0: 6e 79 5f 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20  ny_args = n>1;. 
31c0: 20 20 20 20 20 20 20 20 20 74 6f 6f 5f 66 65 77           too_few
31d0: 5f 61 72 67 73 20 3d 20 6e 3c 31 3b 0a 20 20 20  _args = n<1;.   
31e0: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
31f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
3200: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
3210: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c 65        case FN_Le
3220: 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20 20  ngth: {.        
3230: 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d    too_few_args =
3240: 20 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20 20   n<1;.          
3250: 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20  too_many_args = 
3260: 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  n>1;.          b
3270: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
3280: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
3290: 53 75 62 73 74 72 3a 20 7b 0a 20 20 20 20 20 20  Substr: {.      
32a0: 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73      too_few_args
32b0: 20 3d 20 6e 3c 33 3b 0a 20 20 20 20 20 20 20 20   = n<3;.        
32c0: 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20    too_many_args 
32d0: 3d 20 6e 3e 33 3b 0a 20 20 20 20 20 20 20 20 20  = n>3;.         
32e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
32f0: 7d 0a 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65  }.        /* The
3300: 20 22 66 63 6e 74 28 2a 29 22 20 66 75 6e 63 74   "fcnt(*)" funct
3310: 69 6f 6e 20 61 6c 77 61 79 73 20 72 65 74 75 72  ion always retur
3320: 6e 73 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ns the number of
3330: 20 66 65 74 63 68 0a 20 20 20 20 20 20 20 20 2a   fetch.        *
3340: 2a 20 6f 70 65 72 61 74 69 6f 6e 73 20 74 68 61  * operations tha
3350: 74 20 68 61 76 65 20 6f 63 63 75 72 72 65 64 20  t have occurred 
3360: 73 6f 20 66 61 72 20 77 68 69 6c 65 20 70 72 6f  so far while pro
3370: 63 65 73 73 69 6e 67 20 74 68 65 0a 20 20 20 20  cessing the.    
3380: 20 20 20 20 2a 2a 20 53 51 4c 20 73 74 61 74 65      ** SQL state
3390: 6d 65 6e 74 2e 20 20 54 68 69 73 20 69 6e 66 6f  ment.  This info
33a0: 72 6d 61 74 69 6f 6e 20 63 61 6e 20 62 65 20 75  rmation can be u
33b0: 73 65 64 20 62 79 20 74 65 73 74 20 70 72 6f 63  sed by test proc
33c0: 65 64 75 72 65 73 0a 20 20 20 20 20 20 20 20 2a  edures.        *
33d0: 2a 20 74 6f 20 76 65 72 69 66 79 20 74 68 61 74  * to verify that
33e0: 20 69 6e 64 69 63 65 73 20 61 72 65 20 62 65 69   indices are bei
33f0: 6e 67 20 75 73 65 64 20 70 72 6f 70 65 72 6c 79  ng used properly
3400: 20 74 6f 20 6d 69 6e 69 6d 69 7a 65 0a 20 20 20   to minimize.   
3410: 20 20 20 20 20 2a 2a 20 73 65 61 72 63 68 69 6e       ** searchin
3420: 67 2e 20 20 41 6c 6c 20 61 72 67 75 6d 65 6e 74  g.  All argument
3430: 73 20 74 6f 20 66 63 6e 74 28 29 20 61 72 65 20  s to fcnt() are 
3440: 69 67 6e 6f 72 65 64 2e 20 20 66 63 6e 74 28 29  ignored.  fcnt()
3450: 20 68 61 73 0a 20 20 20 20 20 20 20 20 2a 2a 20   has.        ** 
3460: 6e 6f 20 75 73 65 20 28 6f 74 68 65 72 20 74 68  no use (other th
3470: 61 6e 20 74 65 73 74 69 6e 67 29 20 74 68 61 74  an testing) that
3480: 20 77 65 20 61 72 65 20 61 77 61 72 65 20 6f 66   we are aware of
3490: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
34a0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 46 63 6e       case FN_Fcn
34b0: 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  t: {.          n
34c0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 20 20   = 0;.          
34d0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
34e0: 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20 20 20  .      .        
34f0: 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a  default: break;.
3500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3510: 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29  ( no_such_func )
3520: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
3530: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
3540: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f  se->zErrMsg, "no
3550: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
3560: 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20 20 20 20  ", -1,.         
3570: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
3580: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
3590: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50  , 0);.        pP
35a0: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20  arse->nErr++;.  
35b0: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
35c0: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 6f      }else if( to
35d0: 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 29 7b 0a 20  o_many_args ){. 
35e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
35f0: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
3600: 3e 7a 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20 6d  >zErrMsg, "too m
3610: 61 6e 79 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  any arguments to
3620: 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a   function ",-1,.
3630: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3640: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
3650: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c  ->token.n, "()",
3660: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   2, 0);.        
3670: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3680: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
3690: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
36a0: 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 29 7b 0a  too_few_args ){.
36b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
36c0: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
36d0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20  ->zErrMsg, "too 
36e0: 66 65 77 20 61 72 67 75 6d 65 6e 74 73 20 74 6f  few arguments to
36f0: 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a   function ",-1,.
3700: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
3710: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
3720: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c  ->token.n, "()",
3730: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   2, 0);.        
3740: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
3750: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
3760: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
3770: 28 20 69 73 5f 61 67 67 20 29 20 70 45 78 70 72  ( is_agg ) pExpr
3780: 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55  ->op = TK_AGG_FU
3790: 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 69 66  NCTION;.      if
37a0: 28 20 69 73 5f 61 67 67 20 26 26 20 70 49 73 41  ( is_agg && pIsA
37b0: 67 67 20 29 20 2a 70 49 73 41 67 67 20 3d 20 31  gg ) *pIsAgg = 1
37c0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
37d0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b   nErr==0 && i<n;
37e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 6e   i++){.        n
37f0: 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72  Err = sqliteExpr
3800: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
3810: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
3820: 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
3830: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3840: 20 20 20 20 20 20 20 61 6c 6c 6f 77 41 67 67 20         allowAgg 
3850: 26 26 20 21 69 73 5f 61 67 67 2c 20 70 49 73 41  && !is_agg, pIsA
3860: 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  gg);.      }.   
3870: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
3880: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
3890: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
38a0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
38b0: 65 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  eExprCheck(pPars
38c0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
38d0: 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67   allowAgg, pIsAg
38e0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
38f0: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
3900: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
3910: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
3920: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
3930: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3940: 70 52 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67  pRight, allowAgg
3950: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
3960: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72   }.      if( nEr
3970: 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  r==0 && pExpr->p
3980: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
3990: 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70  int n = pExpr->p
39a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20  List->nExpr;.   
39b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
39c0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
39d0: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
39e0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
39f0: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
3a00: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3a10: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72  r;.          nEr
3a20: 72 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68  r = sqliteExprCh
3a30: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c  eck(pParse, pE2,
3a40: 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67   allowAgg, pIsAg
3a50: 67 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  g);.        }.  
3a60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
3a70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  k;.    }.  }.  r
3a80: 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f  eturn nErr;.}../
3a90: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
3aa0: 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72 72  de into the curr
3ab0: 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61 6c  ent Vdbe to eval
3ac0: 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a 2a  uate the given.*
3ad0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  * expression and
3ae0: 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75 6c   leave the resul
3af0: 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66 20  t on the top of 
3b00: 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73  stack..*/.void s
3b10: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 50 61  qliteExprCode(Pa
3b20: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
3b30: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62  r *pExpr){.  Vdb
3b40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
3b50: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a  Vdbe;.  int op;.
3b60: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
3b70: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
3b80: 54 4b 5f 50 4c 55 53 3a 20 20 20 20 20 6f 70 20  TK_PLUS:     op 
3b90: 3d 20 4f 50 5f 41 64 64 3b 20 20 20 20 20 20 62  = OP_Add;      b
3ba0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3bb0: 4b 5f 4d 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d  K_MINUS:    op =
3bc0: 20 4f 50 5f 53 75 62 74 72 61 63 74 3b 20 62 72   OP_Subtract; br
3bd0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
3be0: 5f 53 54 41 52 3a 20 20 20 20 20 6f 70 20 3d 20  _STAR:     op = 
3bf0: 4f 50 5f 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65  OP_Multiply; bre
3c00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3c10: 53 4c 41 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f  SLASH:    op = O
3c20: 50 5f 44 69 76 69 64 65 3b 20 20 20 62 72 65 61  P_Divide;   brea
3c30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
3c40: 4e 44 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  ND:      op = OP
3c50: 5f 41 6e 64 3b 20 20 20 20 20 20 62 72 65 61 6b  _And;      break
3c60: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  ;.    case TK_OR
3c70: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
3c80: 4f 72 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Or;       break;
3c90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
3ca0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
3cb0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
3cc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
3cd0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65        op = OP_Le
3ce0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
3cf0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
3d00: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b       op = OP_Gt;
3d10: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
3d20: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
3d30: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20      op = OP_Ge; 
3d40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3d50: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
3d60: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20     op = OP_Ne;  
3d70: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3d80: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
3d90: 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20    op = OP_Eq;   
3da0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
3db0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20  ase TK_LIKE:    
3dc0: 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20   op = OP_Like;  
3dd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
3de0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20  se TK_GLOB:     
3df0: 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20  op = OP_Glob;   
3e00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3e10: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
3e20: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
3e30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3e40: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
3e50: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
3e60: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3e70: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20  TK_NOT:      op 
3e80: 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62  = OP_Not;      b
3e90: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3ea0: 4b 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d  K_UMINUS:   op =
3eb0: 20 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72   OP_Negative; br
3ec0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
3ed0: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73  : break;.  }.  s
3ee0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
3ef0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
3f00: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
3f10: 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41  if( pParse->useA
3f20: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gg ){.        sq
3f30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
3f40: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
3f50: 45 78 70 72 2d 3e 69 41 67 67 2c 20 30 2c 20 30  Expr->iAgg, 0, 0
3f60: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  );.      }else i
3f70: 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  f( pExpr->iColum
3f80: 6e 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  n>=0 ){.        
3f90: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3fa0: 76 2c 20 4f 50 5f 46 69 65 6c 64 2c 20 70 45 78  v, OP_Field, pEx
3fb0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
3fc0: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 2c 20 30  r->iColumn, 0, 0
3fd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
3fe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
3ff0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4b 65  beAddOp(v, OP_Ke
4000: 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
4010: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4020: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4030: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4040: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
4050: 20 20 20 20 69 6e 74 20 69 20 3d 20 61 74 6f 69      int i = atoi
4060: 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 29  (pExpr->token.z)
4070: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4080: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
4090: 74 65 67 65 72 2c 20 69 2c 20 30 2c 20 30 2c 20  teger, i, 0, 0, 
40a0: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
40b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
40c0: 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20 20 20 20  TK_FLOAT: {.    
40d0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
40e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
40f0: 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c  OP_String, 0, 0,
4100: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
4110: 6c 69 74 65 56 64 62 65 43 68 61 6e 67 65 50 33  liteVdbeChangeP3
4120: 28 76 2c 20 61 64 64 72 2c 20 70 45 78 70 72 2d  (v, addr, pExpr-
4130: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
4140: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
4150: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
4160: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
4170: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
4180: 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62 65 41  dr = sqliteVdbeA
4190: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
41a0: 67 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  g, 0, 0, 0, 0);.
41b0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
41c0: 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72  ChangeP3(v, addr
41d0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
41e0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
41f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
4200: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
4210: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 62 72 65  addr);.      bre
4220: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4230: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
4240: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4250: 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20  dOp(v, OP_Null, 
4260: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
4270: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4280: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
4290: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
42a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55  .    case TK_PLU
42b0: 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  S:.    case TK_S
42c0: 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TAR:.    case TK
42d0: 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65  _MINUS:.    case
42e0: 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20 20 20   TK_SLASH: {.   
42f0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
4300: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
4310: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
4320: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
4330: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
4340: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
4350: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
4360: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
4370: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4380: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
4390: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  ONCAT: {.      s
43a0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
43b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
43c0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
43d0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
43e0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
43f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
4410: 6e 63 61 74 2c 20 32 2c 20 30 2c 20 30 2c 20 30  ncat, 2, 0, 0, 0
4420: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4430: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4440: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
4450: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
4460: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
4470: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
4480: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
4490: 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61 73 65 20  K_EQ: .    case 
44a0: 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20 20 63 61  TK_LIKE: .    ca
44b0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
44c0: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
44d0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
44e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
44f0: 72 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  r, 1, 0, 0, 0);.
4500: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4510: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
4520: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
4530: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
4540: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4550: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 64  pRight);.      d
4560: 65 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  est = sqliteVdbe
4570: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
4580: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
4590: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
45a0: 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b   0, dest, 0, 0);
45b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
45c0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
45d0: 49 6d 6d 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  Imm, -1, 0, 0, 0
45e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
45f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4600: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
4610: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
4620: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20  >pLeft );.      
4630: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
4640: 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52  ->op==TK_INTEGER
4650: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
4660: 69 20 3d 20 61 74 6f 69 28 70 45 78 70 72 2d 3e  i = atoi(pExpr->
4670: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  pLeft->token.z);
4680: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4690: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
46a0: 6e 74 65 67 65 72 2c 20 2d 69 2c 20 30 2c 20 30  nteger, -i, 0, 0
46b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72  , 0);.        br
46c0: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  eak;.      }else
46d0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
46e0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
46f0: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
4700: 20 2a 70 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c   *p = &pExpr->pL
4710: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
4720: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
4730: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
4740: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
4750: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
4760: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
4770: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
4780: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
4790: 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 7a 2c 20  tring, 0, 0, z, 
47a0: 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  0);.        sqli
47b0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
47c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
47d0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
47e0: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f  through into TK_
47f0: 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  NOT */.    }.   
4800: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
4810: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4820: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
4830: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
4840: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4850: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  p(v, op, 0, 0, 0
4860: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4870: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4880: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
4890: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
48a0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
48b0: 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
48c0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
48d0: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 2c 20 30  Integer, 1, 0, 0
48e0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
48f0: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
4900: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
4910: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
4920: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
4930: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
4940: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4950: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
4960: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
4970: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4980: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
4990: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
49a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
49b0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
49c0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
49d0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
49e0: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
49f0: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 2c 20 30  , pExpr->iAgg, 0
4a00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4a10: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
4a20: 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20  FN_Avg ){.      
4a30: 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
4a40: 2d 3e 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 26  ->iAggCount>=0 &
4a50: 26 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f  & pParse->iAggCo
4a60: 75 6e 74 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  unt<pParse->nAgg
4a70: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
4a80: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4a90: 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 50 61  P_AggGet, 0, pPa
4aa0: 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 2c 20  rse->iAggCount, 
4ab0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  0, 0);.        s
4ac0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4ad0: 2c 20 4f 50 5f 44 69 76 69 64 65 2c 20 30 2c 20  , OP_Divide, 0, 
4ae0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
4af0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4b00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
4b10: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
4b20: 20 20 20 69 6e 74 20 69 64 20 3d 20 70 45 78 70     int id = pExp
4b30: 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  r->iColumn;.    
4b40: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20    int op;.      
4b50: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70  int i;.      Exp
4b60: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
4b70: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
4b80: 20 20 20 73 77 69 74 63 68 28 20 69 64 20 29 7b     switch( id ){
4b90: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
4ba0: 5f 46 63 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20  _Fcnt: {.       
4bb0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
4bc0: 4f 70 28 76 2c 20 4f 50 5f 46 63 6e 74 2c 20 30  Op(v, OP_Fcnt, 0
4bd0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4be0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 63       }.        c
4c00: 61 73 65 20 46 4e 5f 4d 69 6e 3a 20 0a 20 20 20  ase FN_Min: .   
4c10: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 61 78       case FN_Max
4c20: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6f 70  : {.          op
4c30: 20 3d 20 69 64 3d 3d 46 4e 5f 4d 69 6e 20 3f 20   = id==FN_Min ? 
4c40: 4f 50 5f 4d 69 6e 20 3a 20 4f 50 5f 4d 61 78 3b  OP_Min : OP_Max;
4c50: 0a 20 20 20 20 20 20 20 20 20 20 66 6f 72 28 69  .          for(i
4c60: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4c70: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4c80: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4c90: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 69  Code(pParse, pLi
4ca0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
4cb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
4cc0: 20 69 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20   i>0 ){.        
4cd0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4ce0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
4cf0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
4d00: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
4d10: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 62 72    }.          br
4d20: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
4d30: 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4c         case FN_L
4d40: 65 6e 67 74 68 3a 20 7b 0a 20 20 20 20 20 20 20  ength: {.       
4d50: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
4d60: 65 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d  e(pParse, pList-
4d70: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
4d80: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4d90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
4da0: 72 6c 65 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30  rlen, 0, 0, 0, 0
4db0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  );.          bre
4dc0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
4dd0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75        case FN_Su
4de0: 62 73 74 72 3a 20 7b 0a 20 20 20 20 20 20 20 20  bstr: {.        
4df0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69    for(i=0; i<pLi
4e00: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
4e10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
4e20: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4e30: 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  se, pList->a[i].
4e40: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
4e50: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71    }.          sq
4e60: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4e70: 20 4f 50 5f 53 75 62 73 74 72 2c 20 30 2c 20 30   OP_Substr, 0, 0
4e80: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
4e90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4ea0: 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66 61    }.        defa
4eb0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20 20 20  ult: {.         
4ec0: 20 2f 2a 20 43 61 6e 27 74 20 68 61 70 70 65 6e   /* Can't happen
4ed0: 21 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 62  ! */.          b
4ee0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
4ef0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
4f00: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
4f10: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
4f20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4f30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
4f40: 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f  Load, pExpr->iCo
4f50: 6c 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  lumn, 0, 0, 0);.
4f60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4f70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
4f80: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
4f90: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
4fa0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4fb0: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 2c 20  _Integer, 1, 0, 
4fc0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4fd0: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4fe0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
4ff0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
5000: 73 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e  sqliteVdbeCurren
5010: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
5020: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
5030: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
5040: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5050: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
5060: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 32  ->iTable, addr+2
5070: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
5080: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
5090: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
50a0: 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45   OP_SetFound, pE
50b0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
50c0: 72 2b 32 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  r+2, 0, 0);.    
50d0: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
50e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
50f0: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 2c 20 30  AddImm, -1, 0, 0
5100: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
5110: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5120: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
5130: 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20        int lbl = 
5140: 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61  sqliteVdbeMakeLa
5150: 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71  bel(v);.      sq
5160: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5170: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
5180: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
5190: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
51a0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  e(pParse, pExpr,
51b0: 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c   lbl);.      sql
51c0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
51d0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c 20 30 2c  OP_AddImm, 1, 0,
51e0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
51f0: 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c  liteVdbeResolveL
5200: 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b 0a 20 20  abel(v, lbl);.  
5210: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5220: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d  .  }.  return;.}
5230: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5240: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
5250: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
5260: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
5270: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
5280: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
5290: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
52a0: 20 69 73 20 74 72 75 65 20 62 75 74 20 65 78 65   is true but exe
52b0: 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e  cution.** contin
52c0: 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72  ues straight thr
52d0: 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  u if the express
52e0: 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ion is false..*/
52f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72  .void sqliteExpr
5300: 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70 50  IfTrue(Parse *pP
5310: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
5320: 72 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20  r, int dest){.  
5330: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
5340: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
5350: 70 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28  p = 0;.  switch(
5360: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
5370: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
5380: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
5390: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
53a0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
53b0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
53c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
53d0: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
53e0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
53f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5400: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
5410: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
5420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5430: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20  se TK_NE:       
5440: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
5450: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5460: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f  e TK_EQ:       o
5470: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
5480: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5490: 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70   TK_LIKE:     op
54a0: 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20   = OP_Like;     
54b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
54c0: 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20  TK_GLOB:     op 
54d0: 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62  = OP_Glob;     b
54e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
54f0: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
5500: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
5510: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5520: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
5530: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
5540: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
5550: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
5560: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
5570: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
5580: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
5590: 20 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65   d2 = sqliteVdbe
55a0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
55b0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
55c0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
55d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 29 3b  xpr->pLeft, d2);
55e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
55f0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
5600: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
5610: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
5620: 74 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  teVdbeResolveLab
5630: 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20  el(v, d2);.     
5640: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5650: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a    case TK_OR: {.
5660: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5670: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
5680: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
5690: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
56a0: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
56b0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
56c0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
56d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
56e0: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
56f0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
5700: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
5710: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
5720: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5730: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5740: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
5750: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
5760: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
5770: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
5780: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
5790: 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61 73 65 20  TK_EQ:.    case 
57a0: 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73  TK_LIKE:.    cas
57b0: 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_GLOB: {.   
57c0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
57d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
57e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
57f0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
5800: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
5810: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
5820: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
5830: 70 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30  p, 0, dest, 0, 0
5840: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5850: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
5860: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
5870: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
5880: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
5890: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
58a0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
58b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
58c0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
58d0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
58e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
58f0: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
5900: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
5910: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
5920: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
5930: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
5940: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ect ){.        s
5950: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5960: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
5970: 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 2c  r->iTable, dest,
5980: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
5990: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
59a0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
59b0: 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20 70 45 78  OP_SetFound, pEx
59c0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
59d0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
59e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
59f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5a00: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
5a10: 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71 6c 69 74   int lbl = sqlit
5a20: 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  eVdbeMakeLabel(v
5a30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
5a40: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
5a50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5a60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
5a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
5a80: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
5a90: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
5aa0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
5ab0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
5ac0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
5ad0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5ae0: 5f 4c 74 2c 20 30 2c 20 6c 62 6c 2c 20 30 2c 20  _Lt, 0, lbl, 0, 
5af0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5b00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
5b10: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
5b20: 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [1].pExpr);.    
5b30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5b40: 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 64  p(v, OP_Le, 0, d
5b50: 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  est, 0, 0);.    
5b60: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5b70: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
5b80: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
5b90: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
5ba0: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
5bb0: 2c 20 30 2c 20 30 2c 20 6c 62 6c 29 3b 0a 20 20  , 0, 0, lbl);.  
5bc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5bd0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
5be0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5bf0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
5c00: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
5c10: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5c20: 5f 49 66 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c  _If, 0, dest, 0,
5c30: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
5c40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
5c50: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
5c60: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
5c70: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
5c80: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
5c90: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
5ca0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
5cb0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5cc0: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
5cd0: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
5ce0: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
5cf0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
5d00: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f  n is true..*/.vo
5d10: 69 64 20 73 71 6c 69 74 65 45 78 70 72 49 66 46  id sqliteExprIfF
5d20: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
5d30: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
5d40: 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20 56 64   int dest){.  Vd
5d50: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
5d60: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
5d70: 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  = 0;.  switch( p
5d80: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
5d90: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
5da0: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
5db0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
5dc0: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
5dd0: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
5de0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5df0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
5e00: 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20  op = OP_Le;     
5e10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5e20: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
5e30: 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20  p = OP_Lt;      
5e40: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5e50: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
5e60: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
5e70: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
5e80: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
5e90: 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62  = OP_Ne;       b
5ea0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
5eb0: 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20 3d  K_LIKE:     op =
5ec0: 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62 72   OP_Like;     br
5ed0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5ee0: 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20  _GLOB:     op = 
5ef0: 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72 65  OP_Glob;     bre
5f00: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5f10: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
5f20: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
5f30: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
5f40: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
5f50: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
5f60: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
5f70: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
5f80: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5f90: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
5fa0: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
5fb0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
5fc0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
5fd0: 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  t, dest);.      
5fe0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
5ff0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
6000: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a  >pRight, dest);.
6010: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6020: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
6030: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
6040: 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61  2 = sqliteVdbeMa
6050: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
6060: 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72    sqliteExprIfTr
6070: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
6080: 2d 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20 20  ->pLeft, d2);.  
6090: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66      sqliteExprIf
60a0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
60b0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
60c0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
60d0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
60e0: 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
60f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
6100: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
6110: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
6120: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
6130: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
6140: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6150: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
6160: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
6170: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
6180: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
6190: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
61a0: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
61b0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_EQ: {.      sq
61c0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
61d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
61e0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
61f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
6200: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
6210: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
6220: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
6230: 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20   dest, 0, 0);.  
6240: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
6250: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
6260: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
6270: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  LOB: {.      sql
6280: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
6290: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
62a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
62b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
62c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
62d0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
62e0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
62f0: 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  dest, 0, 0);.   
6300: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6310: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
6320: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
6330: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
6340: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
6350: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6360: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
6370: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6380: 6f 70 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20  op, 0, dest, 0, 
6390: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
63a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
63b0: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73  TK_IN: {.      s
63c0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
63d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
63e0: 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ft);.      if( p
63f0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
6400: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56  .        sqliteV
6410: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
6420: 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  otFound, pExpr->
6430: 69 54 61 62 6c 65 2c 20 64 65 73 74 2c 20 30 2c  iTable, dest, 0,
6440: 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65   0);.      }else
6450: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
6460: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6470: 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78  SetNotFound, pEx
6480: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74  pr->iTable, dest
6490: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
64a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
64b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
64c0: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
64d0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
64e0: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
64f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6500: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
6510: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
6520: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c  OP_Dup, 0, 0, 0,
6530: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
6540: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
6550: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
6560: 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[0].pExpr);.   
6570: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
6580: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
6590: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
65a0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
65b0: 47 65 2c 20 30 2c 20 61 64 64 72 2b 33 2c 20 30  Ge, 0, addr+3, 0
65c0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
65d0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
65e0: 50 5f 50 6f 70 2c 20 31 2c 20 30 2c 20 30 2c 20  P_Pop, 1, 0, 0, 
65f0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
6600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6610: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 2c 20 30  Goto, 0, dest, 0
6620: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
6630: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
6640: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
6650: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
6660: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
6670: 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 30 2c  dOp(v, OP_Gt, 0,
6680: 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20   dest, 0, 0);.  
6690: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
66a0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
66b0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
66c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
66d0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
66e0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
66f0: 5f 4e 6f 74 2c 20 30 2c 20 30 2c 20 30 2c 20 30  _Not, 0, 0, 0, 0
6700: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
6710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
6720: 66 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30  f, 0, dest, 0, 0
6730: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
6740: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
6750: 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
6760: 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
6770: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
6780: 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e    Return TRUE (n
6790: 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74  on-zero).** if t
67a0: 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61  hey are identica
67b0: 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c  l and return FAL
67c0: 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65  SE if they diffe
67d0: 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f  r in any way..*/
67e0: 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72 43  .int sqliteExprC
67f0: 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
6800: 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
6810: 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
6820: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
6830: 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  B==0;.  }else if
6840: 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pB==0 ){.    r
6850: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
6860: 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
6870: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
6880: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
6890: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
68a0: 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
68b0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
68c0: 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72  sqliteExprCompar
68d0: 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42  e(pA->pRight, pB
68e0: 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
68f0: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
6900: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66 28  pList ){.    if(
6910: 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20   pB->pList==0 ) 
6920: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
6930: 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  ( pA->pList->nEx
6940: 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e  pr!=pB->pList->n
6950: 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30 3b  Expr ) return 0;
6960: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
6970: 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pA->pList->nExpr
6980: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  ; i++){.      if
6990: 28 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d  ( !sqliteExprCom
69a0: 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e  pare(pA->pList->
69b0: 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e  a[i].pExpr, pB->
69c0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
69d0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  r) ){.        re
69e0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
69f0: 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66      }.  }else if
6a00: 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pB->pList ){. 
6a10: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
6a20: 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65  .  if( pA->pSele
6a30: 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63  ct || pB->pSelec
6a40: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  t ) return 0;.  
6a50: 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20  if( pA->token.z 
6a60: 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74  ){.    if( pB->t
6a70: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75  oken.z==0 ) retu
6a80: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42  rn 0;.    if( pB
6a90: 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74  ->token.n!=pA->t
6aa0: 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20  oken.n ) return 
6ab0: 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74  0;.    if( sqlit
6ac0: 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  eStrNICmp(pA->to
6ad0: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
6ae0: 2e 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pA->token.n)
6af0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
6b00: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
6b10: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
6b20: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
6b30: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
6b40: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
6b50: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n its index..*/.
6b60: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
6b70: 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a  dAggInfo(Parse *
6b80: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28  pParse){.  if( (
6b90: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30  pParse->nAgg & 0
6ba0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  x7)==0 ){.    in
6bb0: 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e  t amt = pParse->
6bc0: 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 70 50  nAgg + 8;.    pP
6bd0: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 73 71 6c  arse->aAgg = sql
6be0: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
6bf0: 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a  e->aAgg, amt*siz
6c00: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67  eof(pParse->aAgg
6c10: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70  [0]));.    if( p
6c20: 50 61 72 73 65 2d 3e 61 41 67 67 3d 3d 30 20 29  Parse->aAgg==0 )
6c30: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53 65  {.      sqliteSe
6c40: 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  tString(&pParse-
6c50: 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20 6f  >zErrMsg, "out o
6c60: 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a 20  f memory", 0);. 
6c70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
6c80: 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75 72  r++;.      retur
6c90: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  n -1;.    }.  }.
6ca0: 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65    memset(&pParse
6cb0: 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e  ->aAgg[pParse->n
6cc0: 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Agg], 0, sizeof(
6cd0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
6ce0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72  );.  return pPar
6cf0: 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f  se->nAgg++;.}../
6d00: 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65  *.** Analyze the
6d10: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
6d20: 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67  n looking for ag
6d30: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
6d40: 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72  s and.** for var
6d50: 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64  iables that need
6d60: 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20   to be added to 
6d70: 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67  the pParse->aAgg
6d80: 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b  [] array..** Mak
6d90: 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74  e additional ent
6da0: 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72  ries to the pPar
6db0: 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79  se->aAgg[] array
6dc0: 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a   as necessary..*
6dd0: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
6de0: 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65  e should only be
6df0: 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68   called after th
6e00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73  e expression has
6e10: 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65   been.** analyze
6e20: 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72 52  d by sqliteExprR
6e30: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
6e40: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
6e50: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
6e60: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
6e70: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
6e80: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
6e90: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
6ea0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
6eb0: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
6ec0: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
6ed0: 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50 61  gates(Parse *pPa
6ee0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
6ef0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67  ){.  int i;.  Ag
6f00: 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69  gExpr *aAgg;.  i
6f10: 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20  nt nErr = 0;..  
6f20: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
6f30: 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63  eturn 0;.  switc
6f40: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
6f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
6f60: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  MN: {.      aAgg
6f70: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
6f80: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6f90: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
6fa0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
6fb0: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
6fc0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6fd0: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
6fe0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
6ff0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
7000: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
7010: 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d  .pExpr->iColumn=
7020: 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20  =pExpr->iColumn 
7030: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
7040: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
7050: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7060: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
7070: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
7080: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
7090: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
70a0: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
70b0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
70c0: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
70d0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 0;.        pPa
70e0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
70f0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
7100: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
7110: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
7120: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7130: 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55    case TK_AGG_FU
7140: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
7150: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
7160: 6d 6e 3d 3d 46 4e 5f 43 6f 75 6e 74 20 7c 7c 20  mn==FN_Count || 
7170: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
7180: 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20  FN_Avg ){.      
7190: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 41    if( pParse->iA
71a0: 67 67 43 6f 75 6e 74 3e 3d 30 20 29 7b 0a 20 20  ggCount>=0 ){.  
71b0: 20 20 20 20 20 20 20 20 69 20 3d 20 70 50 61 72          i = pPar
71c0: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3b 0a 20  se->iAggCount;. 
71d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
71e0: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
71f0: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
7200: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
7210: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b   i<0 ) return 1;
7220: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
7230: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
7240: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
7250: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
7260: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
7270: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 41 67       pParse->iAg
7280: 67 43 6f 75 6e 74 20 3d 20 69 3b 0a 20 20 20 20  gCount = i;.    
7290: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
72a0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
72b0: 3d 3d 46 4e 5f 43 6f 75 6e 74 20 29 7b 0a 20 20  ==FN_Count ){.  
72c0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
72d0: 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20  Agg = i;.       
72e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
72f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
7300: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
7310: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
7320: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
7330: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
7340: 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d      if( !aAgg[i]
7350: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
7360: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
7370: 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65  qliteExprCompare
7380: 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20  (aAgg[i].pExpr, 
7390: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
73a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
73b0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
73c0: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
73d0: 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20  ->nAgg ){.      
73e0: 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49    i = appendAggI
73f0: 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20  nfo(pParse);.   
7400: 20 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72       if( i<0 ) r
7410: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20  eturn 1;.       
7420: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
7430: 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  .isAgg = 1;.    
7440: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
7450: 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70  [i].pExpr = pExp
7460: 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  r;.      }.     
7470: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
7480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7490: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
74a0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
74b0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
74c0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
74d0: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
74e0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
74f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
7500: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7510: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
7520: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
7530: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
7540: 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  iteExprAnalyzeAg
7550: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
7560: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
7570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7580: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
7590: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
75a0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
75b0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
75c0: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
75d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
75e0: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
75f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
7600: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
7610: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
7620: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
7630: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
7640: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
7650: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7660: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7670: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
7680: 0a 7d 0a                                         .}.