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

Artifact baa8a4229b3acf69d908efcd697ab63922009c9f:


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 43 20 63 6f 64 65 20 72  ontains C code r
03c0: 6f 75 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72  outines used for
03d0: 20 70 72 6f 63 65 73 73 69 6e 67 20 65 78 70 72   processing expr
03e0: 65 73 73 69 6f 6e 73 0a 2a 2a 0a 2a 2a 20 24 49  essions.**.** $I
03f0: 64 3a 20 65 78 70 72 2e 63 2c 76 20 31 2e 31 31  d: expr.c,v 1.11
0400: 20 32 30 30 30 2f 30 36 2f 30 37 20 32 33 3a 35   2000/06/07 23:5
0410: 31 3a 35 30 20 64 72 68 20 45 78 70 20 24 0a 2a  1:50 drh Exp $.*
0420: 2f 0a 23 69 6e 63 6c 75 64 65 20 22 73 71 6c 69  /.#include "sqli
0430: 74 65 49 6e 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20  teInt.h"../*.** 
0440: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
0450: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
0460: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
0470: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
0480: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
0490: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
04a0: 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  es..*/.static in
04b0: 74 20 69 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  t isConstant(Exp
04c0: 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28  r *p){.  switch(
04d0: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
04e0: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
04f0: 73 65 20 54 4b 5f 46 49 45 4c 44 3a 0a 20 20 20  se TK_FIELD:.   
0500: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20   case TK_DOT:.  
0510: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
0520: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
0530: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
0540: 26 26 20 21 69 73 43 6f 6e 73 74 61 6e 74 28 70  && !isConstant(p
0550: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
0560: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
0570: 2d 3e 70 52 69 67 68 74 20 26 26 20 21 69 73 43  ->pRight && !isC
0580: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67 68  onstant(p->pRigh
0590: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
05a0: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73       if( p->pLis
05b0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
05c0: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
05d0: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d  i=0; i<p->pList-
05e0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
05f0: 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73 43          if( !isC
0600: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74  onstant(p->pList
0610: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20  ->a[i].pExpr) ) 
0620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
0630: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
0640: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
0650: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
0660: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 74 68 65  ../*.** Walk the
0670: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
0680: 20 61 6e 64 20 70 72 6f 63 65 73 73 20 6f 70 65   and process ope
0690: 72 61 74 6f 72 73 20 6f 66 20 74 68 65 20 66 6f  rators of the fo
06a0: 72 6d 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20  rm:.**.**       
06b0: 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20  expr IN (SELECT 
06c0: 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65  ...).**.** These
06d0: 20 6f 70 65 72 61 74 6f 72 73 20 68 61 76 65 20   operators have 
06e0: 74 6f 20 62 65 20 70 72 6f 63 65 73 73 65 64 20  to be processed 
06f0: 62 65 66 6f 72 65 20 66 69 65 6c 64 20 6e 61 6d  before field nam
0700: 65 73 20 61 72 65 0a 2a 2a 20 72 65 73 6f 6c 76  es are.** resolv
0710: 65 64 20 62 65 63 61 75 73 65 20 65 61 63 68 20  ed because each 
0720: 73 75 63 68 20 6f 70 65 72 61 74 6f 72 20 69 6e  such operator in
0730: 63 72 65 6d 65 6e 74 73 20 70 50 61 72 73 65 2d  crements pParse-
0740: 3e 6e 54 61 62 0a 2a 2a 20 74 6f 20 72 65 73 65  >nTab.** to rese
0750: 72 76 65 20 61 20 63 75 72 73 6f 72 20 6e 75 6d  rve a cursor num
0760: 62 65 72 20 66 6f 72 20 69 74 73 20 6f 77 6e 20  ber for its own 
0770: 75 73 65 2e 20 20 42 75 74 20 70 50 61 72 73 65  use.  But pParse
0780: 2d 3e 6e 54 61 62 0a 2a 2a 20 6e 65 65 64 73 20  ->nTab.** needs 
0790: 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20 6f  to be constant o
07a0: 6e 63 65 20 77 65 20 62 65 67 69 6e 20 72 65 73  nce we begin res
07b0: 6f 6c 76 69 6e 67 20 66 69 65 6c 64 20 6e 61 6d  olving field nam
07c0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 63 74 75 61 6c  es..**.** Actual
07d0: 6c 79 2c 20 74 68 65 20 70 72 6f 63 65 73 73 69  ly, the processi
07e0: 6e 67 20 6f 66 20 49 4e 2d 53 45 4c 45 43 54 20  ng of IN-SELECT 
07f0: 69 73 20 6f 6e 6c 79 20 73 74 61 72 74 65 64 20  is only started 
0800: 62 79 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69  by this.** routi
0810: 6e 65 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  ne.  This routin
0820: 65 20 61 6c 6c 6f 63 61 74 65 73 20 61 20 63 75  e allocates a cu
0830: 72 73 6f 72 20 6e 75 6d 62 65 72 20 74 6f 20 74  rsor number to t
0840: 68 65 20 49 4e 2d 53 45 4c 45 43 54 0a 2a 2a 20  he IN-SELECT.** 
0850: 61 6e 64 20 74 68 65 6e 20 6d 6f 76 65 73 20 6f  and then moves o
0860: 6e 2e 20 20 54 68 65 20 63 6f 64 65 20 67 65 6e  n.  The code gen
0870: 65 72 61 74 69 6f 6e 20 69 73 20 64 6f 6e 65 20  eration is done 
0880: 62 79 20 0a 2a 2a 20 73 71 6c 69 74 65 45 78 70  by .** sqliteExp
0890: 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20 77 68  rResolveIds() wh
08a0: 69 63 68 20 6d 75 73 74 20 62 65 20 63 61 6c 6c  ich must be call
08b0: 65 64 20 61 66 74 65 72 77 61 72 64 73 2e 0a 2a  ed afterwards..*
08c0: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70  /.void sqliteExp
08d0: 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63 74  rResolveInSelect
08e0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
08f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
0900: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
0910: 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 45 78  eturn;.  if( pEx
0920: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 26 26  pr->op==TK_IN &&
0930: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 21   pExpr->pSelect!
0940: 3d 30 20 29 7b 0a 20 20 20 20 70 45 78 70 72 2d  =0 ){.    pExpr-
0950: 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65  >iTable = pParse
0960: 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 7d 65 6c 73  ->nTab++;.  }els
0970: 65 7b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72  e{.    if( pExpr
0980: 2d 3e 70 4c 65 66 74 20 29 20 73 71 6c 69 74 65  ->pLeft ) sqlite
0990: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
09a0: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
09b0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 69  r->pLeft);.    i
09c0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
09d0: 20 29 20 73 71 6c 69 74 65 45 78 70 72 52 65 73   ) sqliteExprRes
09e0: 6f 6c 76 65 49 6e 53 65 6c 65 63 74 28 70 50 61  olveInSelect(pPa
09f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
0a00: 68 74 29 3b 0a 20 20 20 20 69 66 28 20 70 45 78  ht);.    if( pEx
0a10: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
0a20: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
0a30: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
0a40: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
0a50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
0a60: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
0a70: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  ++){.        sql
0a80: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 6e  iteExprResolveIn
0a90: 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70  Select(pParse, p
0aa0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
0ab0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
0ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  .  }.}../*.** Th
0ad0: 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73  is routine walks
0ae0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
0af0: 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73  ree and resolves
0b00: 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a   references to.*
0b10: 2a 20 74 61 62 6c 65 20 66 69 65 6c 64 73 2e 20  * table fields. 
0b20: 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f   Nodes of the fo
0b30: 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72  rm ID.ID or ID r
0b40: 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a  esolve into an.*
0b50: 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74  * index to the t
0b60: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
0b70: 65 20 6c 69 73 74 20 61 6e 64 20 61 20 66 69 65  e list and a fie
0b80: 6c 64 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20  ld offset.  The 
0b90: 6f 70 63 6f 64 65 0a 2a 2a 20 66 6f 72 20 73 75  opcode.** for su
0ba0: 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e  ch nodes is chan
0bb0: 67 65 64 20 74 6f 20 54 4b 5f 46 49 45 4c 44 2e  ged to TK_FIELD.
0bc0: 20 20 54 68 65 20 69 54 61 62 6c 65 20 76 61 6c    The iTable val
0bd0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a  ue is changed.**
0be0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
0bf0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
0c00: 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
0c10: 74 20 70 6c 75 73 20 74 68 65 20 70 50 61 72 73  t plus the pPars
0c20: 65 2d 3e 6e 54 61 62 0a 2a 2a 20 76 61 6c 75 65  e->nTab.** value
0c30: 2e 20 20 54 68 65 20 69 46 69 65 6c 64 20 76 61  .  The iField va
0c40: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
0c50: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
0c60: 68 65 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20  he field of the 
0c70: 0a 2a 2a 20 72 65 66 65 72 65 6e 63 65 64 20 74  .** referenced t
0c80: 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 57 65 20 61  able..**.** We a
0c90: 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72 20 69 6e  lso check for in
0ca0: 73 74 61 6e 63 65 73 20 6f 66 20 74 68 65 20 49  stances of the I
0cb0: 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 4e 20  N operator.  IN 
0cc0: 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a 2a 2a 20  comes in two.** 
0cd0: 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  forms:.**.**    
0ce0: 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28         expr IN (
0cf0: 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20 61 6e 64  exprlist).** and
0d00: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
0d10: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
0d20: 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 69 72  .).**.** The fir
0d30: 73 74 20 66 6f 72 6d 20 69 73 20 68 61 6e 64 6c  st form is handl
0d40: 65 64 20 62 79 20 63 72 65 61 74 69 6e 67 20 61  ed by creating a
0d50: 20 73 65 74 20 68 6f 6c 64 69 6e 67 20 74 68 65   set holding the
0d60: 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61 6c 6c 6f   list.** of allo
0d70: 77 65 64 20 76 61 6c 75 65 73 2e 20 20 54 68 65  wed values.  The
0d80: 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20 63 61 75   second form cau
0d90: 73 65 73 20 74 68 65 20 53 45 4c 45 43 54 20 74  ses the SELECT t
0da0: 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a 2a 20 61  o generate .** a
0db0: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
0dc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
0dd0: 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f 6b 73 20  tine also looks 
0de0: 66 6f 72 20 73 63 61 6c 61 72 20 53 45 4c 45 43  for scalar SELEC
0df0: 54 73 20 74 68 61 74 20 61 72 65 20 70 61 72 74  Ts that are part
0e00: 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
0e10: 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66 69 6e 64  n..** If it find
0e20: 73 20 61 6e 79 2c 20 69 74 20 67 65 6e 65 72 61  s any, it genera
0e30: 74 65 73 20 63 6f 64 65 20 74 6f 20 77 72 69 74  tes code to writ
0e40: 65 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  e the value of t
0e50: 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a 20 69 6e  hat select.** in
0e60: 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  to a memory cell
0e70: 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f 77 6e 20  ..**.** Unknown 
0e80: 66 69 65 6c 64 73 20 6f 72 20 74 61 62 6c 65 73  fields or tables
0e90: 20 70 72 6f 76 6f 6b 65 20 61 6e 20 65 72 72 6f   provoke an erro
0ea0: 72 2e 20 20 54 68 65 20 66 75 6e 63 74 69 6f 6e  r.  The function
0eb0: 20 72 65 74 75 72 6e 73 0a 2a 2a 20 74 68 65 20   returns.** the 
0ec0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
0ed0: 20 73 65 65 6e 20 61 6e 64 20 6c 65 61 76 65 73   seen and leaves
0ee0: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
0ef0: 65 20 6f 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72  e on pParse->zEr
0f00: 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  rMsg..*/.int sql
0f10: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
0f20: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
0f30: 20 49 64 4c 69 73 74 20 2a 70 54 61 62 4c 69 73   IdList *pTabLis
0f40: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  t, Expr *pExpr){
0f50: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
0f60: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77  ) return 0;.  sw
0f70: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
0f80: 29 7b 0a 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65  ){.    /* A lone
0f90: 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 20   identifier */. 
0fa0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
0fb0: 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d  .      int cnt =
0fc0: 20 30 3b 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20   0;   /* Number 
0fd0: 6f 66 20 6d 61 74 63 68 65 73 20 2a 2f 0a 20 20  of matches */.  
0fe0: 20 20 20 20 69 6e 74 20 69 3b 20 20 20 20 20 20      int i;      
0ff0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74     /* Loop count
1000: 65 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72  er */.      char
1010: 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 20 20 73   *z = 0;.      s
1020: 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28  qliteSetNString(
1030: 26 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  &z, pExpr->token
1040: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
1050: 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 66 6f  .n, 0);.      fo
1060: 72 28 69 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73  r(i=0; i<pTabLis
1070: 74 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  t->nId; i++){.  
1080: 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20        int j;.   
1090: 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62       Table *pTab
10a0: 20 3d 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69   = pTabList->a[i
10b0: 5d 2e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ].pTab;.        
10c0: 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63 6f  if( pTab==0 ) co
10d0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
10e0: 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d  for(j=0; j<pTab-
10f0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20  >nCol; j++){.   
1100: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1110: 65 53 74 72 49 43 6d 70 28 70 54 61 62 2d 3e 61  eStrICmp(pTab->a
1120: 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 29  Col[j].zName, z)
1130: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
1140: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
1150: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
1160: 62 6c 65 20 3d 20 69 20 2b 20 70 50 61 72 73 65  ble = i + pParse
1170: 2d 3e 6e 54 61 62 3b 0a 20 20 20 20 20 20 20 20  ->nTab;.        
1180: 20 20 20 20 70 45 78 70 72 2d 3e 69 46 69 65 6c      pExpr->iFiel
1190: 64 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  d = j;.         
11a0: 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
11b0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
11c0: 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20  eFree(z);.      
11d0: 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20  if( cnt==0 ){.  
11e0: 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e        sqliteSetN
11f0: 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e  String(&pParse->
1200: 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63  zErrMsg, "no suc
1210: 68 20 66 69 65 6c 64 3a 20 22 2c 20 2d 31 2c 20  h field: ", -1, 
1220: 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70   .          pExp
1230: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70  r->token.z, pExp
1240: 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a  r->token.n, 0);.
1250: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
1260: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
1270: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
1280: 7d 65 6c 73 65 20 69 66 28 20 63 6e 74 3e 31 20  }else if( cnt>1 
1290: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
12a0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
12b0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61  rse->zErrMsg, "a
12c0: 6d 62 69 67 75 6f 75 73 20 66 69 65 6c 64 20 6e  mbiguous field n
12d0: 61 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20  ame: ", -1,  .  
12e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
12f0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
1300: 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20  oken.n, 0);.    
1310: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72      pParse->nErr
1320: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  ++;.        retu
1330: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
1340: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
1350: 54 4b 5f 46 49 45 4c 44 3b 0a 20 20 20 20 20 20  TK_FIELD;.      
1360: 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20  break; .    }.  
1370: 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c 65 20  .    /* A table 
1380: 6e 61 6d 65 20 61 6e 64 20 66 69 65 6c 64 20 6e  name and field n
1390: 61 6d 65 3a 20 20 49 44 2e 49 44 20 2a 2f 0a 20  ame:  ID.ID */. 
13a0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20     case TK_DOT: 
13b0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 63 6e 74 20  {.      int cnt 
13c0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
13d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
13e0: 74 63 68 65 73 20 2a 2f 0a 20 20 20 20 20 20 69  tches */.      i
13f0: 6e 74 20 69 3b 20 20 20 20 20 20 20 20 20 20 20  nt i;           
1400: 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20          /* Loop 
1410: 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20  counter */.     
1420: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70   Expr *pLeft, *p
1430: 52 69 67 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66  Right;    /* Lef
1440: 74 20 61 6e 64 20 72 69 67 68 74 20 73 75 62 62  t and right subb
1450: 72 61 6e 63 68 65 73 20 6f 66 20 74 68 65 20 65  ranches of the e
1460: 78 70 72 20 2a 2f 0a 20 20 20 20 20 20 63 68 61  xpr */.      cha
1470: 72 20 2a 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68  r *zLeft, *zRigh
1480: 74 3b 20 20 20 20 2f 2a 20 54 65 78 74 20 6f 66  t;    /* Text of
1490: 20 61 6e 20 69 64 65 6e 74 69 66 69 65 72 20 2a   an identifier *
14a0: 2f 0a 0a 20 20 20 20 20 20 70 4c 65 66 74 20 3d  /..      pLeft =
14b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20   pExpr->pLeft;. 
14c0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
14d0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
14e0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
14f0: 20 26 26 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54   && pLeft->op==T
1500: 4b 5f 49 44 20 29 3b 0a 20 20 20 20 20 20 61 73  K_ID );.      as
1510: 73 65 72 74 28 20 70 52 69 67 68 74 20 26 26 20  sert( pRight && 
1520: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
1530: 44 20 29 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74  D );.      zLeft
1540: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
1550: 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 7a 4c  teSetNString(&zL
1560: 65 66 74 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  eft, pLeft->toke
1570: 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  n.z, pLeft->toke
1580: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 7a  n.n, 0);.      z
1590: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 20 20 20  Right = 0;.     
15a0: 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e   sqliteSetNStrin
15b0: 67 28 26 7a 52 69 67 68 74 2c 20 70 52 69 67 68  g(&zRight, pRigh
15c0: 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67  t->token.z, pRig
15d0: 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b  ht->token.n, 0);
15e0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
15f0: 69 3c 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b  i<pTabList->nId;
1600: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
1610: 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 63 68  nt j;.        ch
1620: 61 72 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20  ar *zTab;.      
1630: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1640: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
1650: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
1660: 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pTab==0 ) conti
1670: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
1680: 20 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pTabList->a[i].
1690: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
16a0: 20 20 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c      zTab = pTabL
16b0: 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73  ist->a[i].zAlias
16c0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
16d0: 0a 20 20 20 20 20 20 20 20 20 20 7a 54 61 62 20  .          zTab 
16e0: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
16f0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
1700: 20 69 66 28 20 73 71 6c 69 74 65 53 74 72 49 43   if( sqliteStrIC
1710: 6d 70 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21  mp(zTab, zLeft)!
1720: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
1730: 20 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20         for(j=0; 
1740: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
1750: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
1760: 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28  ( sqliteStrICmp(
1770: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e  pTab->aCol[j].zN
1780: 61 6d 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30 20  ame, zRight)==0 
1790: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
17a0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
17b0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
17c0: 3d 20 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54  = i + pParse->nT
17d0: 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ab;.            
17e0: 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d 20  pExpr->iField = 
17f0: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  j;.          }. 
1800: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
1810: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
1820: 65 28 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  e(zLeft);.      
1830: 73 71 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68  sqliteFree(zRigh
1840: 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e  t);.      if( cn
1850: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  t==0 ){.        
1860: 73 71 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67  sqliteSetNString
1870: 28 26 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  (&pParse->zErrMs
1880: 67 2c 20 22 6e 6f 20 73 75 63 68 20 66 69 65 6c  g, "no such fiel
1890: 64 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20  d: ", -1,  .    
18a0: 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b        pLeft->tok
18b0: 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b  en.z, pLeft->tok
18c0: 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20  en.n, ".", 1, . 
18d0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
18e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74  >token.z, pRight
18f0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
1900: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1910: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72  Err++;.        r
1920: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1930: 65 6c 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29  else if( cnt>1 )
1940: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
1950: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
1960: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d  se->zErrMsg, "am
1970: 62 69 67 75 6f 75 73 20 66 69 65 6c 64 20 6e 61  biguous field na
1980: 6d 65 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20  me: ", -1,  .   
1990: 20 20 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f         pLeft->to
19a0: 6b 65 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f  ken.z, pLeft->to
19b0: 6b 65 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20  ken.n, ".", 1,. 
19c0: 20 20 20 20 20 20 20 20 20 70 52 69 67 68 74 2d           pRight-
19d0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74  >token.z, pRight
19e0: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20  ->token.n, 0);. 
19f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
1a00: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72  Err++;.        r
1a10: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
1a30: 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a  rDelete(pLeft);.
1a40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
1a50: 66 74 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71  ft = 0;.      sq
1a60: 6c 69 74 65 45 78 70 72 44 65 6c 65 74 65 28 70  liteExprDelete(p
1a70: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45  Right);.      pE
1a80: 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b  xpr->pRight = 0;
1a90: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70  .      pExpr->op
1aa0: 20 3d 20 54 4b 5f 46 49 45 4c 44 3b 0a 20 20 20   = TK_FIELD;.   
1ab0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
1ad0: 20 7b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76   {.      Vdbe *v
1ae0: 20 3d 20 73 71 6c 69 74 65 47 65 74 56 64 62 65   = sqliteGetVdbe
1af0: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1b00: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1b10: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73  n 1;.      if( s
1b20: 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65  qliteExprResolve
1b30: 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62  Ids(pParse, pTab
1b40: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  List, pExpr->pLe
1b50: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ft) ){.        r
1b60: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
1b70: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1b80: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
1b90: 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20       /* Case 1: 
1ba0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
1bb0: 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20  ECT ...).       
1bc0: 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47   **.        ** G
1bd0: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20  enerate code to 
1be0: 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c 74  write the result
1bf0: 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20  s of the select 
1c00: 69 6e 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79  into a temporary
1c10: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
1c20: 65 2e 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e  e.  The cursor n
1c30: 75 6d 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d  umber of the tem
1c40: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 68 61 73  porary table has
1c50: 20 61 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20   already.       
1c60: 20 2a 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20   ** been put in 
1c70: 69 54 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65  iTable by sqlite
1c80: 45 78 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c  ExprResolveInSel
1c90: 65 63 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a  ect()..        *
1ca0: 2f 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  /.        sqlite
1cb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1cc0: 4f 70 65 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  Open, pExpr->iTa
1cd0: 62 6c 65 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20  ble, 1, 0, 0);. 
1ce0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
1cf0: 65 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  eSelect(pParse, 
1d00: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
1d10: 53 52 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e  SRT_Set, pExpr->
1d20: 69 54 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20  iTable) );.     
1d30: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
1d40: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
1d50: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
1d60: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
1d70: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
1d80: 20 20 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74          ** Creat
1d90: 65 20 61 20 73 65 74 20 74 6f 20 70 75 74 20 74  e a set to put t
1da0: 68 65 20 65 78 70 72 6c 69 73 74 20 76 61 6c 75  he exprlist valu
1db0: 65 73 20 69 6e 2e 20 20 54 68 65 20 53 65 74 20  es in.  The Set 
1dc0: 69 64 20 69 73 20 73 74 6f 72 65 64 0a 20 20 20  id is stored.   
1dd0: 20 20 20 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c       ** in iTabl
1de0: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
1df0: 20 20 20 20 20 20 69 6e 74 20 69 2c 20 69 53 65        int i, iSe
1e00: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
1e10: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
1e20: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1e30: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
1e40: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
1e50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
1e60: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
1e70: 69 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  isConstant(pE2) 
1e80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
1e90: 71 6c 69 74 65 53 65 74 53 74 72 69 6e 67 28 26  qliteSetString(&
1ea0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
1eb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22  .              "
1ec0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
1ed0: 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d  of IN operator m
1ee0: 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22  ust be constant"
1ef0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
1f00: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
1f10: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  ;.            re
1f20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
1f30: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66    }.          if
1f40: 28 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63  ( sqliteExprChec
1f50: 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30  k(pParse, pE2, 0
1f60: 2c 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20  , 0) ){.        
1f70: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
1f80: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
1f90: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 53 65 74    }.        iSet
1fa0: 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65   = pExpr->iTable
1fb0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b   = pParse->nSet+
1fc0: 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  +;.        for(i
1fd0: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
1fe0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
1ff0: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
2000: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
2010: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
2020: 0a 20 20 20 20 20 20 20 20 20 20 73 77 69 74 63  .          switc
2030: 68 28 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20  h( pE2->op ){.  
2040: 20 20 20 20 20 20 20 20 20 20 63 61 73 65 20 54            case T
2050: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20  K_FLOAT:.       
2060: 20 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54       case TK_INT
2070: 45 47 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20  EGER:.          
2080: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
2090: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  : {.            
20a0: 20 20 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c    int addr = sql
20b0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
20c0: 4f 50 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53  OP_SetInsert, iS
20d0: 65 74 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20  et, 0, 0, 0);.  
20e0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
20f0: 74 65 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  teVdbeChangeP3(v
2100: 2c 20 61 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b  , addr, pE2->tok
2110: 65 6e 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e  en.z, pE2->token
2120: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  .n);.           
2130: 20 20 20 73 71 6c 69 74 65 56 64 62 65 44 65 71     sqliteVdbeDeq
2140: 75 6f 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b  uoteP3(v, addr);
2150: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62  .              b
2160: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
2170: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20    }.            
2180: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
2190: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 45           sqliteE
21a0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
21b0: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
21c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
21d0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73  dOp(v, OP_SetIns
21e0: 65 72 74 2c 20 69 53 65 74 2c 20 30 2c 20 30 2c  ert, iSet, 0, 0,
21f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20   0);.           
2200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2210: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2220: 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20    }.        }.  
2230: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
2240: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
2250: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
2260: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61        /* This ha
2270: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
2280: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
2290: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
22a0: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
22b0: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
22c0: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
22d0: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
22e0: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
22f0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
2300: 65 6c 6c 20 69 6e 20 69 46 69 65 6c 64 2e 0a 20  ell in iField.. 
2310: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
2320: 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d 20 70 50  xpr->iField = pP
2330: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
2340: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 65      if( sqliteSe
2350: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
2360: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
2370: 5f 4d 65 6d 2c 20 70 45 78 70 72 2d 3e 69 46 69  _Mem, pExpr->iFi
2380: 65 6c 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20  eld) ){.        
2390: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
23a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
23b0: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
23c0: 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20   all else, just 
23d0: 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  recursively walk
23e0: 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20   the tree */.   
23f0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
2400: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
2410: 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69  ft.      && sqli
2420: 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  teExprResolveIds
2430: 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73  (pParse, pTabLis
2440: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
2450: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
2460: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
2470: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
2480: 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26 20  Right .      && 
2490: 73 71 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76  sqliteExprResolv
24a0: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 54 61  eIds(pParse, pTa
24b0: 62 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52  bList, pExpr->pR
24c0: 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20  ight) ){.       
24d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
24e0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
24f0: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
2500: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
2510: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
2520: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
2530: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
2540: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
2550: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2560: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 45       if( sqliteE
2570: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
2580: 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20  arse, pTabList, 
2590: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
25a0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
25b0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
25c0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
25d0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
25e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
25f0: 7d 0a 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20  }..#if 0 /* NOT 
2600: 55 53 45 44 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f  USED */./*.** Co
2610: 6d 70 61 72 65 20 61 20 74 6f 6b 65 6e 20 61 67  mpare a token ag
2620: 61 69 6e 73 74 20 61 20 73 74 72 69 6e 67 2e 20  ainst a string. 
2630: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
2640: 74 68 65 79 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73  they match..*/.s
2650: 74 61 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65  tatic int sqlite
2660: 54 6f 6b 65 6e 43 6d 70 28 54 6f 6b 65 6e 20 2a  TokenCmp(Token *
2670: 70 54 6f 6b 65 6e 2c 20 63 6f 6e 73 74 20 63 68  pToken, const ch
2680: 61 72 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e 74  ar *zStr){.  int
2690: 20 6e 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72   n = strlen(zStr
26a0: 29 3b 0a 20 20 69 66 28 20 6e 21 3d 70 54 6f 6b  );.  if( n!=pTok
26b0: 65 6e 2d 3e 6e 20 29 20 72 65 74 75 72 6e 20 30  en->n ) return 0
26c0: 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74  ;.  return sqlit
26d0: 65 53 74 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e  eStrNICmp(pToken
26e0: 2d 3e 7a 2c 20 7a 53 74 72 2c 20 6e 29 3d 3d 30  ->z, zStr, n)==0
26f0: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  ;.}.#endif../*.*
2700: 2a 20 43 6f 6e 76 65 72 74 20 61 20 66 75 6e 63  * Convert a func
2710: 74 69 6f 6e 20 6e 61 6d 65 20 69 6e 74 6f 20 69  tion name into i
2720: 74 73 20 69 6e 74 65 67 65 72 20 69 64 65 6e 74  ts integer ident
2730: 69 66 69 65 72 2e 20 20 52 65 74 75 72 6e 20 74  ifier.  Return t
2740: 68 65 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72  he.** identifier
2750: 2e 20 20 52 65 74 75 72 6e 20 46 4e 5f 55 6e 6b  .  Return FN_Unk
2760: 6e 6f 77 6e 20 69 66 20 74 68 65 20 66 75 6e 63  nown if the func
2770: 74 69 6f 6e 20 6e 61 6d 65 20 69 73 20 75 6e 6b  tion name is unk
2780: 6e 6f 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nown..*/.int sql
2790: 69 74 65 46 75 6e 63 49 64 28 54 6f 6b 65 6e 20  iteFuncId(Token 
27a0: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 73 74 61 74  *pToken){.  stat
27b0: 69 63 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20  ic const struct 
27c0: 7b 0a 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61  {.     char *zNa
27d0: 6d 65 3b 0a 20 20 20 20 20 69 6e 74 20 6c 65 6e  me;.     int len
27e0: 3b 0a 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20  ;.     int id;. 
27f0: 20 7d 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20   } aFunc[] = {. 
2800: 20 20 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20      { "count",  
2810: 35 2c 20 46 4e 5f 43 6f 75 6e 74 20 7d 2c 0a 20  5, FN_Count },. 
2820: 20 20 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20      { "min",    
2830: 33 2c 20 46 4e 5f 4d 69 6e 20 20 20 7d 2c 0a 20  3, FN_Min   },. 
2840: 20 20 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20      { "max",    
2850: 33 2c 20 46 4e 5f 4d 61 78 20 20 20 7d 2c 0a 20  3, FN_Max   },. 
2860: 20 20 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20      { "sum",    
2870: 33 2c 20 46 4e 5f 53 75 6d 20 20 20 7d 2c 0a 20  3, FN_Sum   },. 
2880: 20 20 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20      { "avg",    
2890: 33 2c 20 46 4e 5f 41 76 67 20 20 20 7d 2c 0a 20  3, FN_Avg   },. 
28a0: 20 7d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 66   };.  int i;.  f
28b0: 6f 72 28 69 3d 30 3b 20 69 3c 41 72 72 61 79 53  or(i=0; i<ArrayS
28c0: 69 7a 65 28 61 46 75 6e 63 29 3b 20 69 2b 2b 29  ize(aFunc); i++)
28d0: 7b 0a 20 20 20 20 69 66 28 20 61 46 75 6e 63 5b  {.    if( aFunc[
28e0: 69 5d 2e 6c 65 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e  i].len==pToken->
28f0: 6e 20 0a 20 20 20 20 20 26 26 20 73 71 6c 69 74  n .     && sqlit
2900: 65 53 74 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e  eStrNICmp(pToken
2910: 2d 3e 7a 2c 20 61 46 75 6e 63 5b 69 5d 2e 7a 4e  ->z, aFunc[i].zN
2920: 61 6d 65 2c 20 61 46 75 6e 63 5b 69 5d 2e 6c 65  ame, aFunc[i].le
2930: 6e 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  n)==0 ){.       
2940: 72 65 74 75 72 6e 20 61 46 75 6e 63 5b 69 5d 2e  return aFunc[i].
2950: 69 64 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  id;.    }.  }.  
2960: 72 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f 77  return FN_Unknow
2970: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f  n;.}../*.** Erro
2980: 72 20 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63  r check the func
2990: 74 69 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72  tions in an expr
29a0: 65 73 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75  ession.  Make su
29b0: 72 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69  re all.** functi
29c0: 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63  on names are rec
29d0: 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20  ognized and all 
29e0: 66 75 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74  functions have t
29f0: 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75  he correct.** nu
2a00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
2a10: 73 2e 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72  s.  Leave an err
2a20: 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50  or message in pP
2a30: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a  arse->zErrMsg.**
2a40: 20 69 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20   if anything is 
2a50: 61 6d 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74  amiss.  Return t
2a60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
2a70: 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49  ors..**.** if pI
2a80: 73 41 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c  sAgg is not null
2a90: 20 61 6e 64 20 74 68 69 73 20 65 78 70 72 65 73   and this expres
2aa0: 73 69 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65  sion is an aggre
2ab0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  gate function.**
2ac0: 20 28 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20   (like count(*) 
2ad0: 6f 72 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74  or max(value)) t
2ae0: 68 65 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e  hen write a 1 in
2af0: 74 6f 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69  to *pIsAgg..*/.i
2b00: 6e 74 20 73 71 6c 69 74 65 45 78 70 72 43 68 65  nt sqliteExprChe
2b10: 63 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ck(Parse *pParse
2b20: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69  , Expr *pExpr, i
2b30: 6e 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74  nt allowAgg, int
2b40: 20 2a 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74   *pIsAgg){.  int
2b50: 20 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28   nErr = 0;.  if(
2b60: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
2b70: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
2b80: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
2b90: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
2ba0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
2bb0: 64 20 3d 20 73 71 6c 69 74 65 46 75 6e 63 49 64  d = sqliteFuncId
2bc0: 28 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 29 3b  (&pExpr->token);
2bd0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  .      int n = p
2be0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
2bf0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
2c00: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  r : 0;.      int
2c10: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
2c20: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 74 6f 6f  0;.      int too
2c30: 5f 6d 61 6e 79 5f 61 72 67 73 20 3d 20 30 3b 0a  _many_args = 0;.
2c40: 20 20 20 20 20 20 69 6e 74 20 74 6f 6f 5f 66 65        int too_fe
2c50: 77 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20 20  w_args = 0;.    
2c60: 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30    int is_agg = 0
2c70: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
2c80: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 46 69 65       pExpr->iFie
2c90: 6c 64 20 3d 20 69 64 3b 0a 20 20 20 20 20 20 73  ld = id;.      s
2ca0: 77 69 74 63 68 28 20 69 64 20 29 7b 0a 20 20 20  witch( id ){.   
2cb0: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 55 6e 6b       case FN_Unk
2cc0: 6e 6f 77 6e 3a 20 7b 20 0a 20 20 20 20 20 20 20  nown: { .       
2cd0: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
2ce0: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62  = 1;.          b
2cf0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
2d00: 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f          case FN_
2d10: 43 6f 75 6e 74 3a 20 7b 20 0a 20 20 20 20 20 20  Count: { .      
2d20: 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63      no_such_func
2d30: 20 3d 20 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20   = !allowAgg;.  
2d40: 20 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79          too_many
2d50: 5f 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20  _args = n>1;.   
2d60: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
2d70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  1;.          bre
2d80: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
2d90: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 61        case FN_Ma
2da0: 78 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20  x:.        case 
2db0: 46 4e 5f 4d 69 6e 3a 20 7b 0a 20 20 20 20 20 20  FN_Min: {.      
2dc0: 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73      too_few_args
2dd0: 20 3d 20 61 6c 6c 6f 77 41 67 67 20 3f 20 6e 3c   = allowAgg ? n<
2de0: 31 20 3a 20 6e 3c 32 3b 0a 20 20 20 20 20 20 20  1 : n<2;.       
2df0: 20 20 20 69 73 5f 61 67 67 20 3d 20 6e 3d 3d 31     is_agg = n==1
2e00: 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61  ;.          brea
2e10: 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  k;.        }.   
2e20: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 41 76 67       case FN_Avg
2e30: 3a 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46  :.        case F
2e40: 4e 5f 53 75 6d 3a 20 7b 0a 20 20 20 20 20 20 20  N_Sum: {.       
2e50: 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20     no_such_func 
2e60: 3d 20 21 61 6c 6c 6f 77 41 67 67 3b 0a 20 20 20  = !allowAgg;.   
2e70: 20 20 20 20 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f         too_many_
2e80: 61 72 67 73 20 3d 20 6e 3e 31 3b 0a 20 20 20 20  args = n>1;.    
2e90: 20 20 20 20 20 20 74 6f 6f 5f 66 65 77 5f 61 72        too_few_ar
2ea0: 67 73 20 3d 20 6e 3c 31 3b 0a 20 20 20 20 20 20  gs = n<1;.      
2eb0: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a      is_agg = 1;.
2ec0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2ed0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2ee0: 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61     default: brea
2ef0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
2f00: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
2f10: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
2f20: 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70  iteSetNString(&p
2f30: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20  Parse->zErrMsg, 
2f40: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
2f50: 6e 3a 20 22 2c 20 2d 31 2c 0a 20 20 20 20 20 20  n: ", -1,.      
2f60: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
2f70: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
2f80: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
2f90: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
2fa0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
2fb0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
2fc0: 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20 29   too_many_args )
2fd0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
2fe0: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72  SetNString(&pPar
2ff0: 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74 6f  se->zErrMsg, "to
3000: 6f 20 6d 61 6e 79 20 61 72 67 75 6d 65 6e 74 73  o many arguments
3010: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
3020: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
3030: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
3040: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
3050: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
3060: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3070: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
3080: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
3090: 66 28 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20  f( too_few_args 
30a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
30b0: 65 53 65 74 4e 53 74 72 69 6e 67 28 26 70 50 61  eSetNString(&pPa
30c0: 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 74  rse->zErrMsg, "t
30d0: 6f 6f 20 66 65 77 20 61 72 67 75 6d 65 6e 74 73  oo few arguments
30e0: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 22 2c 2d   to function ",-
30f0: 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70 45  1,.           pE
3100: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
3110: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 22 28  xpr->token.n, "(
3120: 29 22 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  )", 2, 0);.     
3130: 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b     pParse->nErr+
3140: 2b 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  +;.        nErr+
3150: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
3160: 20 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 45   if( is_agg ) pE
3170: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47  xpr->op = TK_AGG
3180: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20  _FUNCTION;.     
3190: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 70   if( is_agg && p
31a0: 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67 20  IsAgg ) *pIsAgg 
31b0: 3d 20 31 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  = 1;.      for(i
31c0: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
31d0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
31e0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
31f0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
3200: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
3210: 5b 69 5d 2e 70 45 78 70 72 2c 20 30 2c 20 30 29  [i].pExpr, 0, 0)
3220: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3230: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3240: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
3250: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
3260: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78   nErr = sqliteEx
3270: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
3280: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c  pExpr->pLeft, al
3290: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
32a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
32b0: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
32c0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
32d0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
32e0: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
32f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
3300: 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70  ght, allowAgg, p
3310: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
3320: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
3330: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
3340: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
3350: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
3360: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
3370: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
3380: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
3390: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
33a0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
33b0: 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  pE2 = pExpr->pLi
33c0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
33d0: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
33e0: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
33f0: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c  (pParse, pE2, al
3400: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
3410: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3420: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3430: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3440: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
3450: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3460: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
3470: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
3480: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
3490: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
34a0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
34b0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
34c0: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 43  void sqliteExprC
34d0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
34e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
34f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
3500: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
3510: 74 20 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  t op;.  switch( 
3520: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
3530: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
3540: 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20     op = OP_Add; 
3550: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3560: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
3570: 20 20 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61    op = OP_Subtra
3580: 63 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ct; break;.    c
3590: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
35a0: 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c   op = OP_Multipl
35b0: 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  y; break;.    ca
35c0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20  se TK_SLASH:    
35d0: 6f 70 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20  op = OP_Divide; 
35e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
35f0: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f  e TK_AND:      o
3600: 70 20 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20  p = OP_And;     
3610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3620: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70   TK_OR:       op
3630: 20 3d 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20   = OP_Or;       
3640: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3650: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
3660: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
3670: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
3680: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
3690: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
36a0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
36b0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
36c0: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
36d0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
36e0: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
36f0: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
3700: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
3710: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
3720: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
3730: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
3740: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
3750: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
3760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
3770: 45 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c  E:     op = OP_L
3780: 69 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ike;     break;.
3790: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
37a0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c  :     op = OP_Gl
37b0: 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ob;     break;. 
37c0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
37d0: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
37e0: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
37f0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
3800: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
3810: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
3820: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
3830: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20     op = OP_Not; 
3840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3850: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
3860: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69    op = OP_Negati
3870: 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  ve; break;.    d
3880: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
3890: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
38a0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
38b0: 73 65 20 54 4b 5f 46 49 45 4c 44 3a 20 7b 0a 20  se TK_FIELD: {. 
38c0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
38d0: 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20  >useAgg ){.     
38e0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
38f0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
3900: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 2c   0, pExpr->iAgg,
3910: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
3920: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3930: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3940: 4f 50 5f 46 69 65 6c 64 2c 20 70 45 78 70 72 2d  OP_Field, pExpr-
3950: 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
3960: 69 46 69 65 6c 64 2c 20 30 2c 20 30 29 3b 0a 20  iField, 0, 0);. 
3970: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3980: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3990: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
39a0: 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 61  .      int i = a
39b0: 74 6f 69 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  toi(pExpr->token
39c0: 2e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .z);.      sqlit
39d0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
39e0: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 2c 20  _Integer, i, 0, 
39f0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
3a00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3a10: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
3a20: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
3a30: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3a40: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
3a50: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
3a60: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
3a70: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 45 78  eP3(v, addr, pEx
3a80: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3a90: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
3aa0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3ab0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
3ac0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ING: {.      int
3ad0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
3ae0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3af0: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ring, 0, 0, 0, 0
3b00: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3b10: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
3b20: 64 64 72 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ddr, pExpr->toke
3b30: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
3b40: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n.n);.      sqli
3b50: 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  teVdbeDequoteP3(
3b60: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
3b70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3b80: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
3b90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3ba0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
3bb0: 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  l, 0, 0, 0, 0);.
3bc0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3bd0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
3be0: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
3bf0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
3c00: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
3c10: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
3c20: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
3c30: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a  ase TK_SLASH: {.
3c40: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
3c50: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
3c60: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
3c70: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
3c80: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3c90: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
3ca0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3cb0: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , op, 0, 0, 0, 0
3cc0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3cd0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
3ce0: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
3cf0: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
3d00: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
3d10: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
3d20: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
3d30: 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61 73 65 20  K_EQ: .    case 
3d40: 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20 20 63 61  TK_LIKE: .    ca
3d50: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
3d60: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
3d70: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
3d80: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
3d90: 72 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  r, 1, 0, 0, 0);.
3da0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
3db0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
3dc0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
3dd0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
3de0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3df0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 64  pRight);.      d
3e00: 65 73 74 20 3d 20 73 71 6c 69 74 65 56 64 62 65  est = sqliteVdbe
3e10: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
3e20: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
3e30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
3e40: 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b   0, dest, 0, 0);
3e50: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3e60: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
3e70: 49 6d 6d 2c 20 2d 31 2c 20 30 2c 20 30 2c 20 30  Imm, -1, 0, 0, 0
3e80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3e90: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
3ea0: 4b 5f 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_NOT:.    case 
3eb0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
3ec0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
3ed0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
3ee0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
3ef0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3f00: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , op, 0, 0, 0, 0
3f10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3f20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
3f30: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
3f40: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
3f50: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
3f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3f70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
3f80: 65 67 65 72 2c 20 31 2c 20 30 2c 20 30 2c 20 30  eger, 1, 0, 0, 0
3f90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
3fa0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
3fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
3fc0: 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69       dest = sqli
3fd0: 74 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  teVdbeCurrentAdd
3fe0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
3ff0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4000: 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 2c 20  v, op, 0, dest, 
4010: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4020: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4030: 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30  OP_AddImm, -1, 0
4040: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
4050: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4060: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
4070: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  TION: {.      sq
4080: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4090: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
40a0: 45 78 70 72 2d 3e 69 41 67 67 2c 20 30 2c 20 30  Expr->iAgg, 0, 0
40b0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
40c0: 70 72 2d 3e 69 46 69 65 6c 64 3d 3d 46 4e 5f 41  pr->iField==FN_A
40d0: 76 67 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  vg ){.        as
40e0: 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69 41  sert( pParse->iA
40f0: 67 67 43 6f 75 6e 74 3e 3d 30 20 26 26 20 70 50  ggCount>=0 && pP
4100: 61 72 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3c  arse->iAggCount<
4110: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 3b 0a  pParse->nAgg );.
4120: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
4130: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
4140: 67 47 65 74 2c 20 30 2c 20 70 50 61 72 73 65 2d  gGet, 0, pParse-
4150: 3e 69 41 67 67 43 6f 75 6e 74 2c 20 30 2c 20 30  >iAggCount, 0, 0
4160: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
4170: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4180: 5f 44 69 76 69 64 65 2c 20 30 2c 20 30 2c 20 30  _Divide, 0, 0, 0
4190: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
41a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
41b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
41c0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69  CTION: {.      i
41d0: 6e 74 20 69 64 20 3d 20 70 45 78 70 72 2d 3e 69  nt id = pExpr->i
41e0: 46 69 65 6c 64 3b 0a 20 20 20 20 20 20 69 6e 74  Field;.      int
41f0: 20 6f 70 3b 0a 20 20 20 20 20 20 69 6e 74 20 69   op;.      int i
4200: 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74  ;.      ExprList
4210: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
4220: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 6f 70  >pList;.      op
4230: 20 3d 20 69 64 3d 3d 46 4e 5f 4d 69 6e 20 3f 20   = id==FN_Min ? 
4240: 4f 50 5f 4d 69 6e 20 3a 20 4f 50 5f 4d 61 78 3b  OP_Min : OP_Max;
4250: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
4260: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
4270: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 73 71  i++){.        sq
4280: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
4290: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
42a0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
42b0: 20 69 66 28 20 69 3e 30 20 29 7b 0a 20 20 20 20   if( i>0 ){.    
42c0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
42d0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
42e0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
42f0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4300: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4310: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
4320: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
4330: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4340: 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d  _MemLoad, pExpr-
4350: 3e 69 46 69 65 6c 64 2c 20 30 2c 20 30 2c 20 30  >iField, 0, 0, 0
4360: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
4370: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
4380: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_IN: {.      in
4390: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 73 71  t addr;.      sq
43a0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
43b0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
43c0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
43d0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
43e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
43f0: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
4400: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 43 75 72   = sqliteVdbeCur
4410: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
4420: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53     if( pExpr->pS
4430: 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20  elect ){.       
4440: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4450: 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45  (v, OP_Found, pE
4460: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64  xpr->iTable, add
4470: 72 2b 32 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  r+2, 0, 0);.    
4480: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4490: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
44a0: 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c  (v, OP_SetFound,
44b0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
44c0: 61 64 64 72 2b 32 2c 20 30 2c 20 30 29 3b 0a 20  addr+2, 0, 0);. 
44d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
44e0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
44f0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30  OP_AddImm, -1, 0
4500: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
4510: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
4520: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
4530: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c   {.      int lbl
4540: 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b   = sqliteVdbeMak
4550: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
4560: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4570: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
4580: 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  0, 0, 0, 0);.   
4590: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 46     sqliteExprIfF
45a0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
45b0: 70 72 2c 20 6c 62 6c 29 3b 0a 20 20 20 20 20 20  pr, lbl);.      
45c0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
45d0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 31 2c  v, OP_AddImm, 1,
45e0: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
45f0: 20 73 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c   sqliteVdbeResol
4600: 76 65 4c 61 62 65 6c 28 76 2c 20 6c 62 6c 29 3b  veLabel(v, lbl);
4610: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4620: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
4630: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
4640: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62  ate code for a b
4650: 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f  oolean expressio
4660: 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75  n such that a ju
4670: 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f  mp is made.** to
4680: 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74   the label "dest
4690: 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  " if the express
46a0: 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20  ion is true but 
46b0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
46c0: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
46d0: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
46e0: 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e  ession is false.
46f0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45  .*/.void sqliteE
4700: 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20  xprIfTrue(Parse 
4710: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
4720: 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 29 7b  Expr, int dest){
4730: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
4740: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
4750: 74 20 6f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  t op = 0;.  swit
4760: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
4770: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
4780: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
4790: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
47a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
47b0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65        op = OP_Le
47c0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
47d0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
47e0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b       op = OP_Gt;
47f0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4800: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
4810: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20      op = OP_Ge; 
4820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4830: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
4840: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20     op = OP_Ne;  
4850: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
4860: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
4870: 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20    op = OP_Eq;   
4880: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
4890: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20  ase TK_LIKE:    
48a0: 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20   op = OP_Like;  
48b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
48c0: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20  se TK_GLOB:     
48d0: 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20  op = OP_Glob;   
48e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
48f0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
4900: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
4910: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
4920: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
4930: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
4940: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
4950: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
4960: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
4970: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
4980: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
4990: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
49a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
49b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
49c0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
49d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
49e0: 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
49f0: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
4a00: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
4a10: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
4a20: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
4a30: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
4a40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
4a50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a  .    case TK_OR:
4a60: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
4a70: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
4a80: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4a90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  dest);.      sql
4aa0: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
4ab0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
4ac0: 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ght, dest);.    
4ad0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4ae0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
4af0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4b00: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
4b10: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
4b20: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
4b30: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
4b40: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
4b50: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
4b60: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
4b70: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
4b80: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
4b90: 73 65 20 54 4b 5f 45 51 3a 0a 20 20 20 20 63 61  se TK_EQ:.    ca
4ba0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
4bb0: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a  case TK_GLOB: {.
4bc0: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4bd0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
4be0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
4bf0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
4c00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
4c10: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
4c20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4c30: 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74 2c 20 30  , op, 0, dest, 0
4c40: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4c50: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4c60: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
4c70: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
4c80: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
4c90: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
4ca0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
4cb0: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
4cc0: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20  AddOp(v, op, 0, 
4cd0: 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20  dest, 0, 0);.   
4ce0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4cf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
4d00: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78  {.      sqliteEx
4d10: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
4d20: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
4d30: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
4d40: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
4d50: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
4d60: 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  p(v, OP_Found, p
4d70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65  Expr->iTable, de
4d80: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
4d90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
4da0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
4db0: 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c 20  v, OP_SetFound, 
4dc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64  pExpr->iTable, d
4dd0: 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  est, 0, 0);.    
4de0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4df0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4e00: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
4e10: 20 20 20 20 69 6e 74 20 6c 62 6c 20 3d 20 73 71      int lbl = sq
4e20: 6c 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65  liteVdbeMakeLabe
4e30: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
4e40: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
4e50: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
4e60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
4e70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
4e80: 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  p, 0, 0, 0, 0);.
4e90: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4ea0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
4eb0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
4ec0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
4ed0: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4ee0: 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c 62 6c 2c 20   OP_Lt, 0, lbl, 
4ef0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
4f00: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
4f10: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
4f20: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
4f30: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4f40: 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30  ddOp(v, OP_Le, 0
4f50: 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  , dest, 0, 0);. 
4f60: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4f70: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4f80: 65 72 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  er, 0, 0, 0, 0);
4f90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4fa0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
4fb0: 2c 20 31 2c 20 30 2c 20 30 2c 20 6c 62 6c 29 3b  , 1, 0, 0, lbl);
4fc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4fd0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
4fe0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45   {.      sqliteE
4ff0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
5000: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
5010: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5020: 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74 2c   OP_If, 0, dest,
5030: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
5040: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
5050: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
5060: 20 63 6f 64 65 20 66 6f 72 20 62 6f 6f 6c 65 61   code for boolea
5070: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
5080: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
5090: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
50a0: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
50b0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
50c0: 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
50d0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
50e0: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
50f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
5100: 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76  on is true..*/.v
5110: 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 49 66  oid sqliteExprIf
5120: 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61  False(Parse *pPa
5130: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
5140: 2c 20 69 6e 74 20 64 65 73 74 29 7b 0a 20 20 56  , int dest){.  V
5150: 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d  dbe *v = pParse-
5160: 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70  >pVdbe;.  int op
5170: 20 3d 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20   = 0;.  switch( 
5180: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
5190: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
51a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
51b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
51c0: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
51d0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
51e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
51f0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
5200: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
5210: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5220: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
5230: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
5240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5250: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
5260: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
5270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5280: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
5290: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
52a0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
52b0: 54 4b 5f 4c 49 4b 45 3a 20 20 20 20 20 6f 70 20  TK_LIKE:     op 
52c0: 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20 20 20 20 62  = OP_Like;     b
52d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
52e0: 4b 5f 47 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d  K_GLOB:     op =
52f0: 20 4f 50 5f 47 6c 6f 62 3b 20 20 20 20 20 62 72   OP_Glob;     br
5300: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
5310: 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20  _ISNULL:   op = 
5320: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
5330: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
5340: 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f  NOTNULL:  op = O
5350: 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61  P_IsNull;   brea
5360: 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20  k;.    default: 
5370: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77   break;.  }.  sw
5380: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
5390: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
53a0: 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ND: {.      sqli
53b0: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
53c0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
53d0: 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ft, dest);.     
53e0: 20 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c   sqliteExprIfFal
53f0: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
5400: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b  ->pRight, dest);
5410: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5420: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5430: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
5440: 64 32 20 3d 20 73 71 6c 69 74 65 56 64 62 65 4d  d2 = sqliteVdbeM
5450: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
5460: 20 20 20 73 71 6c 69 74 65 45 78 70 72 49 66 54     sqliteExprIfT
5470: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
5480: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 29 3b 0a 20  r->pLeft, d2);. 
5490: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
54a0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
54b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
54c0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
54d0: 65 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  eVdbeResolveLabe
54e0: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
54f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5500: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
5510: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5520: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
5530: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
5540: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
5550: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5560: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
5570: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
5580: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
5590: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
55a0: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
55b0: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
55c0: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
55d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
55e0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
55f0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5600: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
5610: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64  ;.      sqliteVd
5620: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
5630: 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  , dest, 0, 0);. 
5640: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5650: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
5660: 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  KE:.    case TK_
5670: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73 71  GLOB: {.      sq
5680: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
5690: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
56a0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
56b0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
56c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
56d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
56e0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
56f0: 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20   dest, 0, 0);.  
5700: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5710: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
5720: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
5730: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
5740: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
5750: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5760: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5770: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5780: 20 6f 70 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c   op, 0, dest, 0,
5790: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
57a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
57b0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
57c0: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
57d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
57e0: 65 66 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  eft);.      if( 
57f0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
5800: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
5810: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5820: 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d  NotFound, pExpr-
5830: 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 2c 20 30  >iTable, dest, 0
5840: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  , 0);.      }els
5850: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
5860: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5870: 5f 53 65 74 4e 6f 74 46 6f 75 6e 64 2c 20 70 45  _SetNotFound, pE
5880: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
5890: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
58a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
58b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
58c0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
58d0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
58e0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
58f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5900: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5910: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5920: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30   OP_Dup, 0, 0, 0
5930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
5940: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
5950: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
5960: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
5970: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
5980: 65 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  eVdbeCurrentAddr
5990: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
59a0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
59b0: 5f 47 65 2c 20 30 2c 20 61 64 64 72 2b 33 2c 20  _Ge, 0, addr+3, 
59c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
59d0: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
59e0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 2c 20 30 2c  OP_Pop, 1, 0, 0,
59f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
5a00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
5a10: 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 2c 20  _Goto, 0, dest, 
5a20: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
5a30: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
5a40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
5a50: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
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 47 74 2c 20 30  ddOp(v, OP_Gt, 0
5a80: 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  , dest, 0, 0);. 
5a90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
5aa0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
5ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
5ac0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
5ad0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
5ae0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
5af0: 50 5f 4e 6f 74 2c 20 30 2c 20 30 2c 20 30 2c 20  P_Not, 0, 0, 0, 
5b00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
5b10: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
5b20: 49 66 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20  If, 0, dest, 0, 
5b30: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
5b40: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
5b50: 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
5b60: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
5b70: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
5b80: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
5b90: 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
5ba0: 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
5bb0: 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
5bc0: 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
5bd0: 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
5be0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 45 78 70 72  /.int sqliteExpr
5bf0: 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41  Compare(Expr *pA
5c00: 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69  , Expr *pB){.  i
5c10: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d  nt i;.  if( pA==
5c20: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
5c30: 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69  pB==0;.  }else i
5c40: 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20  f( pB==0 ){.    
5c50: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
5c60: 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e  if( pA->op!=pB->
5c70: 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  op ) return 0;. 
5c80: 20 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72   if( !sqliteExpr
5c90: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
5ca0: 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20  t, pB->pLeft) ) 
5cb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
5cc0: 21 73 71 6c 69 74 65 45 78 70 72 43 6f 6d 70 61  !sqliteExprCompa
5cd0: 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
5ce0: 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
5cf0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
5d00: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
5d10: 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
5d20: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
5d30: 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
5d40: 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
5d50: 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
5d60: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
5d70: 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
5d80: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
5d90: 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43 6f  f( !sqliteExprCo
5da0: 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d  mpare(pA->pList-
5db0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d  >a[i].pExpr, pB-
5dc0: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
5dd0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
5de0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
5df0: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
5e00: 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a  f( pB->pList ){.
5e10: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
5e20: 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65 6c  }.  if( pA->pSel
5e30: 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65  ect || pB->pSele
5e40: 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  ct ) return 0;. 
5e50: 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a   if( pA->token.z
5e60: 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   ){.    if( pB->
5e70: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74  token.z==0 ) ret
5e80: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
5e90: 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e  B->token.n!=pA->
5ea0: 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e  token.n ) return
5eb0: 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69   0;.    if( sqli
5ec0: 74 65 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74  teStrNICmp(pA->t
5ed0: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
5ee0: 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.z, pA->token.n
5ef0: 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  )!=0 ) return 0;
5f00: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b  .  }.  return 1;
5f10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  .}../*.** Add a 
5f20: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
5f30: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
5f40: 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75  ] array and retu
5f50: 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f  rn its index..*/
5f60: 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65  .static int appe
5f70: 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20  ndAggInfo(Parse 
5f80: 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20  *pParse){.  if( 
5f90: 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20  (pParse->nAgg & 
5fa0: 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69  0x7)==0 ){.    i
5fb0: 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d  nt amt = pParse-
5fc0: 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 70  >nAgg + 8;.    p
5fd0: 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 73 71  Parse->aAgg = sq
5fe0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72  liteRealloc(pPar
5ff0: 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69  se->aAgg, amt*si
6000: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
6010: 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  g[0]));.    if( 
6020: 70 50 61 72 73 65 2d 3e 61 41 67 67 3d 3d 30 20  pParse->aAgg==0 
6030: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 53  ){.      sqliteS
6040: 65 74 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  etString(&pParse
6050: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 6f 75 74 20  ->zErrMsg, "out 
6060: 6f 66 20 6d 65 6d 6f 72 79 22 2c 20 30 29 3b 0a  of memory", 0);.
6070: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
6080: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 72 65 74 75  rr++;.      retu
6090: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 7d  rn -1;.    }.  }
60a0: 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73  .  memset(&pPars
60b0: 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e  e->aAgg[pParse->
60c0: 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66  nAgg], 0, sizeof
60d0: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
60e0: 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61  ));.  return pPa
60f0: 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a  rse->nAgg++;.}..
6100: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
6110: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
6120: 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
6130: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
6140: 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
6150: 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
6160: 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
6170: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
6180: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
6190: 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
61a0: 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
61b0: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
61c0: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
61d0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
61e0: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
61f0: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
6200: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
6210: 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
6220: 65 64 20 62 79 20 73 71 6c 69 74 65 45 78 70 72  ed by sqliteExpr
6230: 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64  ResolveIds() and
6240: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
6250: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
6260: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
6270: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
6280: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
6290: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
62a0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
62b0: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
62c0: 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  eExprAnalyzeAggr
62d0: 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50  egates(Parse *pP
62e0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
62f0: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41  r){.  int i;.  A
6300: 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20  ggExpr *aAgg;.  
6310: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
6320: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
6330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
6340: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
6350: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 49 45  .    case TK_FIE
6360: 4c 44 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67  LD: {.      aAgg
6370: 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b   = pParse->aAgg;
6380: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
6390: 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20  i<pParse->nAgg; 
63a0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
63b0: 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ( aAgg[i].isAgg 
63c0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
63d0: 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e      if( aAgg[i].
63e0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
63f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20  Expr->iTable.   
6400: 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d        && aAgg[i]
6410: 2e 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d 3d  .pExpr->iField==
6420: 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 20 29 7b  pExpr->iField ){
6430: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
6440: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
6450: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6460: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6470: 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72       if( i>=pPar
6480: 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20  se->nAgg ){.    
6490: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
64a0: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
64b0: 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29         if( i<0 )
64c0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
64d0: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
64e0: 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20  i].isAgg = 0;.  
64f0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
6500: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
6510: 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  xpr;.      }.   
6520: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6530: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6540: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
6550: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 46 69    if( pExpr->iFi
6560: 65 6c 64 3d 3d 46 4e 5f 43 6f 75 6e 74 20 7c 7c  eld==FN_Count ||
6570: 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d 3d   pExpr->iField==
6580: 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20  FN_Avg ){.      
6590: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 41    if( pParse->iA
65a0: 67 67 43 6f 75 6e 74 3e 3d 30 20 29 7b 0a 20 20  ggCount>=0 ){.  
65b0: 20 20 20 20 20 20 20 20 69 20 3d 20 70 50 61 72          i = pPar
65c0: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3b 0a 20  se->iAggCount;. 
65d0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
65e0: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
65f0: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
6600: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6610: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b   i<0 ) return 1;
6620: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
6630: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
6640: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6650: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
6660: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
6670: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 41 67       pParse->iAg
6680: 67 43 6f 75 6e 74 20 3d 20 69 3b 0a 20 20 20 20  gCount = i;.    
6690: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
66a0: 28 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d  ( pExpr->iField=
66b0: 3d 46 4e 5f 43 6f 75 6e 74 20 29 7b 0a 20 20 20  =FN_Count ){.   
66c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
66d0: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
66e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
66f0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6700: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
6710: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
6720: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
6730: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
6740: 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e     if( !aAgg[i].
6750: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
6760: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
6770: 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28  liteExprCompare(
6780: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70  aAgg[i].pExpr, p
6790: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
67a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
67b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
67c0: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
67d0: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
67e0: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
67f0: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
6800: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
6810: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6820: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
6830: 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
6840: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
6850: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
6860: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6870: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
6880: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6890: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
68a0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
68b0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
68c0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
68d0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
68e0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
68f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
6900: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6910: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
6920: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
6930: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
6940: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
6950: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
6960: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
6970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6980: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
6990: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
69a0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
69b0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
69c0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
69d0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
69e0: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
69f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6a00: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
6a10: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
6a20: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
6a30: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
6a40: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6a50: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6a60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6a70: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
6a80: 7d 0a                                            }.