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

Artifact a6797a4bd02b22835ffbbab8bd63dd91cc60ca3d:


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 36  d: expr.c,v 1.16
0400: 20 32 30 30 30 2f 30 36 2f 31 36 20 32 30 3a 35   2000/06/16 20:5
0410: 31 3a 32 36 20 64 72 68 20 45 78 70 20 24 0a 2a  1:26 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 73 71 6c 69 74 65 53 74 72 4e   *z = sqliteStrN
1020: 44 75 70 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  Dup(pExpr->token
1030: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
1040: 2e 6e 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  .n);.      for(i
1050: 3d 30 3b 20 69 3c 70 54 61 62 4c 69 73 74 2d 3e  =0; i<pTabList->
1060: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  nId; i++){.     
1070: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
1080: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
1090: 70 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  pTabList->a[i].p
10a0: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28  Tab;.        if(
10b0: 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pTab==0 ) conti
10c0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  nue;.        for
10d0: 28 6a 3d 30 3b 20 6a 3c 70 54 61 62 2d 3e 6e 43  (j=0; j<pTab->nC
10e0: 6f 6c 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20  ol; j++){.      
10f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53 74      if( sqliteSt
1100: 72 49 43 6d 70 28 70 54 61 62 2d 3e 61 43 6f 6c  rICmp(pTab->aCol
1110: 5b 6a 5d 2e 7a 4e 61 6d 65 2c 20 7a 29 3d 3d 30  [j].zName, z)==0
1120: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
1130: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
1140: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1150: 20 3d 20 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e   = i + pParse->n
1160: 54 61 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20  Tab;.           
1170: 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d   pExpr->iField =
1180: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   j;.          }.
1190: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
11a0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72  }.      sqliteFr
11b0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 69 66 28  ee(z);.      if(
11c0: 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20   cnt==0 ){.     
11d0: 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74 72     sqliteSetNStr
11e0: 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45 72  ing(&pParse->zEr
11f0: 72 4d 73 67 2c 20 22 6e 6f 20 73 75 63 68 20 66  rMsg, "no such f
1200: 69 65 6c 64 3a 20 22 2c 20 2d 31 2c 20 20 0a 20  ield: ", -1,  . 
1210: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
1220: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
1230: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
1240: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
1250: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
1260: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
1270: 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a  se if( cnt>1 ){.
1280: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
1290: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
12a0: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69  ->zErrMsg, "ambi
12b0: 67 75 6f 75 73 20 66 69 65 6c 64 20 6e 61 6d 65  guous field name
12c0: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
12d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
12e0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
12f0: 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  n.n, 0);.       
1300: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
1310: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
1320: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
1330: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
1340: 46 49 45 4c 44 3b 0a 20 20 20 20 20 20 62 72 65  FIELD;.      bre
1350: 61 6b 3b 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20  ak; .    }.  .  
1360: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d    /* A table nam
1370: 65 20 61 6e 64 20 66 69 65 6c 64 20 6e 61 6d 65  e and field name
1380: 3a 20 20 49 44 2e 49 44 20 2a 2f 0a 20 20 20 20  :  ID.ID */.    
1390: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20  case TK_DOT: {. 
13a0: 20 20 20 20 20 69 6e 74 20 63 6e 74 20 3d 20 30       int cnt = 0
13b0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
13c0: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
13d0: 65 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  es */.      int 
13e0: 69 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  i;              
13f0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
1400: 6e 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 45 78  nter */.      Ex
1410: 70 72 20 2a 70 4c 65 66 74 2c 20 2a 70 52 69 67  pr *pLeft, *pRig
1420: 68 74 3b 20 20 20 20 2f 2a 20 4c 65 66 74 20 61  ht;    /* Left a
1430: 6e 64 20 72 69 67 68 74 20 73 75 62 62 72 61 6e  nd right subbran
1440: 63 68 65 73 20 6f 66 20 74 68 65 20 65 78 70 72  ches of the expr
1450: 20 2a 2f 0a 20 20 20 20 20 20 63 68 61 72 20 2a   */.      char *
1460: 7a 4c 65 66 74 2c 20 2a 7a 52 69 67 68 74 3b 20  zLeft, *zRight; 
1470: 20 20 20 2f 2a 20 54 65 78 74 20 6f 66 20 61 6e     /* Text of an
1480: 20 69 64 65 6e 74 69 66 69 65 72 20 2a 2f 0a 0a   identifier */..
1490: 20 20 20 20 20 20 70 4c 65 66 74 20 3d 20 70 45        pLeft = pE
14a0: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
14b0: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
14c0: 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  ->pRight;.      
14d0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 26 26  assert( pLeft &&
14e0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
14f0: 44 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  D );.      asser
1500: 74 28 20 70 52 69 67 68 74 20 26 26 20 70 52 69  t( pRight && pRi
1510: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
1520: 3b 0a 20 20 20 20 20 20 7a 4c 65 66 74 20 3d 20  ;.      zLeft = 
1530: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 4c  sqliteStrNDup(pL
1540: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 4c  eft->token.z, pL
1550: 65 66 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  eft->token.n);. 
1560: 20 20 20 20 20 7a 52 69 67 68 74 20 3d 20 73 71       zRight = sq
1570: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 52 69 67  liteStrNDup(pRig
1580: 68 74 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 52 69  ht->token.z, pRi
1590: 67 68 74 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20  ght->token.n);. 
15a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
15b0: 70 54 61 62 4c 69 73 74 2d 3e 6e 49 64 3b 20 69  pTabList->nId; i
15c0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  ++){.        int
15d0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72   j;.        char
15e0: 20 2a 7a 54 61 62 3b 0a 20 20 20 20 20 20 20 20   *zTab;.        
15f0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70 54  Table *pTab = pT
1600: 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 54 61  abList->a[i].pTa
1610: 62 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  b;.        if( p
1620: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
1630: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  e;.        if( p
1640: 54 61 62 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 41  TabList->a[i].zA
1650: 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20  lias ){.        
1660: 20 20 7a 54 61 62 20 3d 20 70 54 61 62 4c 69 73    zTab = pTabLis
1670: 74 2d 3e 61 5b 69 5d 2e 7a 41 6c 69 61 73 3b 0a  t->a[i].zAlias;.
1680: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
1690: 20 20 20 20 20 20 20 20 20 7a 54 61 62 20 3d 20           zTab = 
16a0: 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20  pTab->zName;.   
16b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
16c0: 66 28 20 73 71 6c 69 74 65 53 74 72 49 43 6d 70  f( sqliteStrICmp
16d0: 28 7a 54 61 62 2c 20 7a 4c 65 66 74 29 21 3d 30  (zTab, zLeft)!=0
16e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
16f0: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c       for(j=0; j<
1700: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 29  pTab->nCol; j++)
1710: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
1720: 73 71 6c 69 74 65 53 74 72 49 43 6d 70 28 70 54  sqliteStrICmp(pT
1730: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 7a 4e 61 6d  ab->aCol[j].zNam
1740: 65 2c 20 7a 52 69 67 68 74 29 3d 3d 30 20 29 7b  e, zRight)==0 ){
1750: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
1760: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
1770: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
1780: 69 20 2b 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  i + pParse->nTab
1790: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
17a0: 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d 20 6a 3b  xpr->iField = j;
17b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
17c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
17d0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
17e0: 7a 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  zLeft);.      sq
17f0: 6c 69 74 65 46 72 65 65 28 7a 52 69 67 68 74 29  liteFree(zRight)
1800: 3b 0a 20 20 20 20 20 20 69 66 28 20 63 6e 74 3d  ;.      if( cnt=
1810: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
1820: 6c 69 74 65 53 65 74 4e 53 74 72 69 6e 67 28 26  liteSetNString(&
1830: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c  pParse->zErrMsg,
1840: 20 22 6e 6f 20 73 75 63 68 20 66 69 65 6c 64 3a   "no such field:
1850: 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20 20   ", -1,  .      
1860: 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e      pLeft->token
1870: 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e  .z, pLeft->token
1880: 2e 6e 2c 20 22 2e 22 2c 20 31 2c 20 0a 20 20 20  .n, ".", 1, .   
1890: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
18a0: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
18b0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
18c0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
18d0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
18e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c  urn 1;.      }el
18f0: 73 65 20 69 66 28 20 63 6e 74 3e 31 20 29 7b 0a  se if( cnt>1 ){.
1900: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65          sqliteSe
1910: 74 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65  tNString(&pParse
1920: 2d 3e 7a 45 72 72 4d 73 67 2c 20 22 61 6d 62 69  ->zErrMsg, "ambi
1930: 67 75 6f 75 73 20 66 69 65 6c 64 20 6e 61 6d 65  guous field name
1940: 3a 20 22 2c 20 2d 31 2c 20 20 0a 20 20 20 20 20  : ", -1,  .     
1950: 20 20 20 20 20 70 4c 65 66 74 2d 3e 74 6f 6b 65       pLeft->toke
1960: 6e 2e 7a 2c 20 70 4c 65 66 74 2d 3e 74 6f 6b 65  n.z, pLeft->toke
1970: 6e 2e 6e 2c 20 22 2e 22 2c 20 31 2c 0a 20 20 20  n.n, ".", 1,.   
1980: 20 20 20 20 20 20 20 70 52 69 67 68 74 2d 3e 74         pRight->t
1990: 6f 6b 65 6e 2e 7a 2c 20 70 52 69 67 68 74 2d 3e  oken.z, pRight->
19a0: 74 6f 6b 65 6e 2e 6e 2c 20 30 29 3b 0a 20 20 20  token.n, 0);.   
19b0: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45 72       pParse->nEr
19c0: 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 72 65 74  r++;.        ret
19d0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
19e0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 44       sqliteExprD
19f0: 65 6c 65 74 65 28 70 4c 65 66 74 29 3b 0a 20 20  elete(pLeft);.  
1a00: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
1a10: 20 3d 20 30 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 0;.      sqli
1a20: 74 65 45 78 70 72 44 65 6c 65 74 65 28 70 52 69  teExprDelete(pRi
1a30: 67 68 74 29 3b 0a 20 20 20 20 20 20 70 45 78 70  ght);.      pExp
1a40: 72 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20  r->pRight = 0;. 
1a50: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d       pExpr->op =
1a60: 20 54 4b 5f 46 49 45 4c 44 3b 0a 20 20 20 20 20   TK_FIELD;.     
1a70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20   break;.    }.. 
1a80: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
1a90: 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d  .      Vdbe *v =
1aa0: 20 73 71 6c 69 74 65 47 65 74 56 64 62 65 28 70   sqliteGetVdbe(p
1ab0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 69 66  Parse);.      if
1ac0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
1ad0: 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c  1;.      if( sql
1ae0: 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49 64  iteExprResolveId
1af0: 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c 69  s(pParse, pTabLi
1b00: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
1b10: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
1b20: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
1b30: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
1b40: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
1b50: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
1b60: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
1b70: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
1b80: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
1b90: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
1ba0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
1bb0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
1bc0: 74 6f 20 61 20 74 65 6d 70 6f 72 61 72 79 0a 20  to a temporary. 
1bd0: 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 2e         ** table.
1be0: 20 20 54 68 65 20 63 75 72 73 6f 72 20 6e 75 6d    The cursor num
1bf0: 62 65 72 20 6f 66 20 74 68 65 20 74 65 6d 70 6f  ber of the tempo
1c00: 72 61 72 79 20 74 61 62 6c 65 20 68 61 73 20 61  rary table has a
1c10: 6c 72 65 61 64 79 0a 20 20 20 20 20 20 20 20 2a  lready.        *
1c20: 2a 20 62 65 65 6e 20 70 75 74 20 69 6e 20 69 54  * been put in iT
1c30: 61 62 6c 65 20 62 79 20 73 71 6c 69 74 65 45 78  able by sqliteEx
1c40: 70 72 52 65 73 6f 6c 76 65 49 6e 53 65 6c 65 63  prResolveInSelec
1c50: 74 28 29 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  t()..        */.
1c60: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 56 64          sqliteVd
1c70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70  beAddOp(v, OP_Op
1c80: 65 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  en, pExpr->iTabl
1c90: 65 2c 20 31 2c 20 30 2c 20 30 29 3b 0a 20 20 20  e, 1, 0, 0);.   
1ca0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 53       if( sqliteS
1cb0: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
1cc0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
1cd0: 54 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54  T_Set, pExpr->iT
1ce0: 61 62 6c 65 29 20 29 3b 0a 20 20 20 20 20 20 7d  able) );.      }
1cf0: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
1d00: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
1d10: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
1d20: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
1d30: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  t).        **.  
1d40: 20 20 20 20 20 20 2a 2a 20 43 72 65 61 74 65 20        ** Create 
1d50: 61 20 73 65 74 20 74 6f 20 70 75 74 20 74 68 65  a set to put the
1d60: 20 65 78 70 72 6c 69 73 74 20 76 61 6c 75 65 73   exprlist values
1d70: 20 69 6e 2e 20 20 54 68 65 20 53 65 74 20 69 64   in.  The Set id
1d80: 20 69 73 20 73 74 6f 72 65 64 0a 20 20 20 20 20   is stored.     
1d90: 20 20 20 2a 2a 20 69 6e 20 69 54 61 62 6c 65 2e     ** in iTable.
1da0: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
1db0: 20 20 20 20 69 6e 74 20 69 2c 20 69 53 65 74 3b      int i, iSet;
1dc0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1dd0: 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74  ; i<pExpr->pList
1de0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1df0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1e00: 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  E2 = pExpr->pLis
1e10: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
1e20: 20 20 20 20 20 20 20 20 20 69 66 28 20 21 69 73           if( !is
1e30: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
1e40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
1e50: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
1e60: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 0a 20  arse->zErrMsg,. 
1e70: 20 20 20 20 20 20 20 20 20 20 20 20 20 22 72 69               "ri
1e80: 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66  ght-hand side of
1e90: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73   IN operator mus
1ea0: 74 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 2c 20  t be constant", 
1eb0: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  0);.            
1ec0: 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a  pParse->nErr++;.
1ed0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
1ee0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
1ef0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
1f00: 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28  sqliteExprCheck(
1f10: 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20  pParse, pE2, 0, 
1f20: 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  0) ){.          
1f30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
1f40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
1f50: 7d 0a 20 20 20 20 20 20 20 20 69 53 65 74 20 3d  }.        iSet =
1f60: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
1f70: 20 70 50 61 72 73 65 2d 3e 6e 53 65 74 2b 2b 3b   pParse->nSet++;
1f80: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
1f90: 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74  ; i<pExpr->pList
1fa0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
1fb0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
1fc0: 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  E2 = pExpr->pLis
1fd0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
1fe0: 20 20 20 20 20 20 20 20 20 73 77 69 74 63 68 28           switch(
1ff0: 20 70 45 32 2d 3e 6f 70 20 29 7b 0a 20 20 20 20   pE2->op ){.    
2000: 20 20 20 20 20 20 20 20 63 61 73 65 20 54 4b 5f          case TK_
2010: 46 4c 4f 41 54 3a 0a 20 20 20 20 20 20 20 20 20  FLOAT:.         
2020: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
2030: 45 52 3a 0a 20 20 20 20 20 20 20 20 20 20 20 20  ER:.            
2040: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
2050: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
2060: 69 6e 74 20 61 64 64 72 20 3d 20 73 71 6c 69 74  int addr = sqlit
2070: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
2080: 5f 53 65 74 49 6e 73 65 72 74 2c 20 69 53 65 74  _SetInsert, iSet
2090: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
20a0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
20b0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
20c0: 61 64 64 72 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e  addr, pE2->token
20d0: 2e 7a 2c 20 70 45 32 2d 3e 74 6f 6b 65 6e 2e 6e  .z, pE2->token.n
20e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
20f0: 20 73 71 6c 69 74 65 56 64 62 65 44 65 71 75 6f   sqliteVdbeDequo
2100: 74 65 50 33 28 76 2c 20 61 64 64 72 29 3b 0a 20  teP3(v, addr);. 
2110: 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65               bre
2120: 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ak;.            
2130: 7d 0a 20 20 20 20 20 20 20 20 20 20 20 20 64 65  }.            de
2140: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 20  fault: {.       
2150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70         sqliteExp
2160: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
2170: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  2);.            
2180: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
2190: 70 28 76 2c 20 4f 50 5f 53 65 74 49 6e 73 65 72  p(v, OP_SetInser
21a0: 74 2c 20 69 53 65 74 2c 20 30 2c 20 30 2c 20 30  t, iSet, 0, 0, 0
21b0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  );.             
21c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
21d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
21e0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
21f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
2200: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
2210: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
2220: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
2230: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
2240: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
2250: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
2260: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
2270: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
2280: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
2290: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
22a0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
22b0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
22c0: 6c 20 69 6e 20 69 46 69 65 6c 64 2e 0a 20 20 20  l in iField..   
22d0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
22e0: 72 2d 3e 69 46 69 65 6c 64 20 3d 20 70 50 61 72  r->iField = pPar
22f0: 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20  se->nMem++;.    
2300: 20 20 69 66 28 20 73 71 6c 69 74 65 53 65 6c 65    if( sqliteSele
2310: 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ct(pParse, pExpr
2320: 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d  ->pSelect, SRT_M
2330: 65 6d 2c 20 70 45 78 70 72 2d 3e 69 46 69 65 6c  em, pExpr->iFiel
2340: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  d) ){.        re
2350: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
2360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
2370: 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61   }..    /* For a
2380: 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72 65  ll else, just re
2390: 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 74  cursively walk t
23a0: 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 64  he tree */.    d
23b0: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
23c0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
23d0: 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  .      && sqlite
23e0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
23f0: 50 61 72 73 65 2c 20 70 54 61 62 4c 69 73 74 2c  Parse, pTabList,
2400: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29   pExpr->pLeft) )
2410: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
2420: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
2430: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
2440: 67 68 74 20 0a 20 20 20 20 20 20 26 26 20 73 71  ght .      && sq
2450: 6c 69 74 65 45 78 70 72 52 65 73 6f 6c 76 65 49  liteExprResolveI
2460: 64 73 28 70 50 61 72 73 65 2c 20 70 54 61 62 4c  ds(pParse, pTabL
2470: 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  ist, pExpr->pRig
2480: 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ht) ){.        r
2490: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
24a0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
24b0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
24c0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
24d0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
24e0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
24f0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
2500: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2510: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
2520: 20 20 20 69 66 28 20 73 71 6c 69 74 65 45 78 70     if( sqliteExp
2530: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
2540: 73 65 2c 20 70 54 61 62 4c 69 73 74 2c 20 70 4c  se, pTabList, pL
2550: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
2560: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
2570: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
2580: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
2590: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
25a0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
25b0: 0a 23 69 66 20 30 20 2f 2a 20 4e 4f 54 20 55 53  .#if 0 /* NOT US
25c0: 45 44 20 2a 2f 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70  ED */./*.** Comp
25d0: 61 72 65 20 61 20 74 6f 6b 65 6e 20 61 67 61 69  are a token agai
25e0: 6e 73 74 20 61 20 73 74 72 69 6e 67 2e 20 20 52  nst a string.  R
25f0: 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68  eturn TRUE if th
2600: 65 79 20 6d 61 74 63 68 2e 0a 2a 2f 0a 73 74 61  ey match..*/.sta
2610: 74 69 63 20 69 6e 74 20 73 71 6c 69 74 65 54 6f  tic int sqliteTo
2620: 6b 65 6e 43 6d 70 28 54 6f 6b 65 6e 20 2a 70 54  kenCmp(Token *pT
2630: 6f 6b 65 6e 2c 20 63 6f 6e 73 74 20 63 68 61 72  oken, const char
2640: 20 2a 7a 53 74 72 29 7b 0a 20 20 69 6e 74 20 6e   *zStr){.  int n
2650: 20 3d 20 73 74 72 6c 65 6e 28 7a 53 74 72 29 3b   = strlen(zStr);
2660: 0a 20 20 69 66 28 20 6e 21 3d 70 54 6f 6b 65 6e  .  if( n!=pToken
2670: 2d 3e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ->n ) return 0;.
2680: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 53    return sqliteS
2690: 74 72 4e 49 43 6d 70 28 70 54 6f 6b 65 6e 2d 3e  trNICmp(pToken->
26a0: 7a 2c 20 7a 53 74 72 2c 20 6e 29 3d 3d 30 3b 0a  z, zStr, n)==0;.
26b0: 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20  }.#endif../*.** 
26c0: 43 6f 6e 76 65 72 74 20 61 20 66 75 6e 63 74 69  Convert a functi
26d0: 6f 6e 20 6e 61 6d 65 20 69 6e 74 6f 20 69 74 73  on name into its
26e0: 20 69 6e 74 65 67 65 72 20 69 64 65 6e 74 69 66   integer identif
26f0: 69 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ier.  Return the
2700: 0a 2a 2a 20 69 64 65 6e 74 69 66 69 65 72 2e 20  .** identifier. 
2710: 20 52 65 74 75 72 6e 20 46 4e 5f 55 6e 6b 6e 6f   Return FN_Unkno
2720: 77 6e 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  wn if the functi
2730: 6f 6e 20 6e 61 6d 65 20 69 73 20 75 6e 6b 6e 6f  on name is unkno
2740: 77 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  wn..*/.int sqlit
2750: 65 46 75 6e 63 49 64 28 54 6f 6b 65 6e 20 2a 70  eFuncId(Token *p
2760: 54 6f 6b 65 6e 29 7b 0a 20 20 73 74 61 74 69 63  Token){.  static
2770: 20 63 6f 6e 73 74 20 73 74 72 75 63 74 20 7b 0a   const struct {.
2780: 20 20 20 20 20 63 68 61 72 20 2a 7a 4e 61 6d 65       char *zName
2790: 3b 0a 20 20 20 20 20 69 6e 74 20 6c 65 6e 3b 0a  ;.     int len;.
27a0: 20 20 20 20 20 69 6e 74 20 69 64 3b 0a 20 20 7d       int id;.  }
27b0: 20 61 46 75 6e 63 5b 5d 20 3d 20 7b 0a 20 20 20   aFunc[] = {.   
27c0: 20 20 7b 20 22 63 6f 75 6e 74 22 2c 20 20 35 2c    { "count",  5,
27d0: 20 46 4e 5f 43 6f 75 6e 74 20 7d 2c 0a 20 20 20   FN_Count },.   
27e0: 20 20 7b 20 22 6d 69 6e 22 2c 20 20 20 20 33 2c    { "min",    3,
27f0: 20 46 4e 5f 4d 69 6e 20 20 20 7d 2c 0a 20 20 20   FN_Min   },.   
2800: 20 20 7b 20 22 6d 61 78 22 2c 20 20 20 20 33 2c    { "max",    3,
2810: 20 46 4e 5f 4d 61 78 20 20 20 7d 2c 0a 20 20 20   FN_Max   },.   
2820: 20 20 7b 20 22 73 75 6d 22 2c 20 20 20 20 33 2c    { "sum",    3,
2830: 20 46 4e 5f 53 75 6d 20 20 20 7d 2c 0a 20 20 20   FN_Sum   },.   
2840: 20 20 7b 20 22 61 76 67 22 2c 20 20 20 20 33 2c    { "avg",    3,
2850: 20 46 4e 5f 41 76 67 20 20 20 7d 2c 0a 20 20 20   FN_Avg   },.   
2860: 20 20 7b 20 22 66 63 6e 74 22 2c 20 20 20 34 2c    { "fcnt",   4,
2870: 20 46 4e 5f 46 63 6e 74 20 20 7d 2c 20 20 2f 2a   FN_Fcnt  },  /*
2880: 20 55 73 65 64 20 66 6f 72 20 74 65 73 74 69 6e   Used for testin
2890: 67 20 6f 6e 6c 79 20 2a 2f 0a 20 20 7d 3b 0a 20  g only */.  };. 
28a0: 20 69 6e 74 20 69 3b 0a 20 20 66 6f 72 28 69 3d   int i;.  for(i=
28b0: 30 3b 20 69 3c 41 72 72 61 79 53 69 7a 65 28 61  0; i<ArraySize(a
28c0: 46 75 6e 63 29 3b 20 69 2b 2b 29 7b 0a 20 20 20  Func); i++){.   
28d0: 20 69 66 28 20 61 46 75 6e 63 5b 69 5d 2e 6c 65   if( aFunc[i].le
28e0: 6e 3d 3d 70 54 6f 6b 65 6e 2d 3e 6e 20 0a 20 20  n==pToken->n .  
28f0: 20 20 20 26 26 20 73 71 6c 69 74 65 53 74 72 4e     && sqliteStrN
2900: 49 43 6d 70 28 70 54 6f 6b 65 6e 2d 3e 7a 2c 20  ICmp(pToken->z, 
2910: 61 46 75 6e 63 5b 69 5d 2e 7a 4e 61 6d 65 2c 20  aFunc[i].zName, 
2920: 61 46 75 6e 63 5b 69 5d 2e 6c 65 6e 29 3d 3d 30  aFunc[i].len)==0
2930: 20 29 7b 0a 20 20 20 20 20 20 20 72 65 74 75 72   ){.       retur
2940: 6e 20 61 46 75 6e 63 5b 69 5d 2e 69 64 3b 0a 20  n aFunc[i].id;. 
2950: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
2960: 6e 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3b 0a 7d 0a  n FN_Unknown;.}.
2970: 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65  ./*.** Error che
2980: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
2990: 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
29a0: 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  n.  Make sure al
29b0: 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  l.** function na
29c0: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
29d0: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
29e0: 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f  ions have the co
29f0: 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20  rrect.** number 
2a00: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
2a10: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
2a20: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
2a30: 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61  >zErrMsg.** if a
2a40: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
2a50: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
2a60: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
2a70: 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20  **.** if pIsAgg 
2a80: 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20  is not null and 
2a90: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
2aa0: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
2ab0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b  function.** (lik
2ac0: 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61  e count(*) or ma
2ad0: 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77  x(value)) then w
2ae0: 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70  rite a 1 into *p
2af0: 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  IsAgg..*/.int sq
2b00: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 50 61  liteExprCheck(Pa
2b10: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2b20: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61 6c  r *pExpr, int al
2b30: 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49 73  lowAgg, int *pIs
2b40: 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  Agg){.  int nErr
2b50: 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70   = 0;.  if( pExp
2b60: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
2b70: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
2b80: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
2b90: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
2ba0: 20 20 20 20 20 20 69 6e 74 20 69 64 20 3d 20 73        int id = s
2bb0: 71 6c 69 74 65 46 75 6e 63 49 64 28 26 70 45 78  qliteFuncId(&pEx
2bc0: 70 72 2d 3e 74 6f 6b 65 6e 29 3b 0a 20 20 20 20  pr->token);.    
2bd0: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
2be0: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
2bf0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
2c00: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73  ;.      int no_s
2c10: 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 0a 20 20  uch_func = 0;.  
2c20: 20 20 20 20 69 6e 74 20 74 6f 6f 5f 6d 61 6e 79      int too_many
2c30: 5f 61 72 67 73 20 3d 20 30 3b 0a 20 20 20 20 20  _args = 0;.     
2c40: 20 69 6e 74 20 74 6f 6f 5f 66 65 77 5f 61 72 67   int too_few_arg
2c50: 73 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  s = 0;.      int
2c60: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
2c70: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
2c80: 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 20 3d 20  pExpr->iField = 
2c90: 69 64 3b 0a 20 20 20 20 20 20 73 77 69 74 63 68  id;.      switch
2ca0: 28 20 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20  ( id ){.        
2cb0: 63 61 73 65 20 46 4e 5f 55 6e 6b 6e 6f 77 6e 3a  case FN_Unknown:
2cc0: 20 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6e 6f   { .          no
2cd0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a  _such_func = 1;.
2ce0: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
2cf0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
2d00: 20 20 20 63 61 73 65 20 46 4e 5f 43 6f 75 6e 74     case FN_Count
2d10: 3a 20 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6e  : { .          n
2d20: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 21 61  o_such_func = !a
2d30: 6c 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 20  llowAgg;.       
2d40: 20 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73     too_many_args
2d50: 20 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20   = n>1;.        
2d60: 20 20 69 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20    is_agg = 1;.  
2d70: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
2d80: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
2d90: 20 63 61 73 65 20 46 4e 5f 4d 61 78 3a 0a 20 20   case FN_Max:.  
2da0: 20 20 20 20 20 20 63 61 73 65 20 46 4e 5f 4d 69        case FN_Mi
2db0: 6e 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 74  n: {.          t
2dc0: 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d 20 61 6c  oo_few_args = al
2dd0: 6c 6f 77 41 67 67 20 3f 20 6e 3c 31 20 3a 20 6e  lowAgg ? n<1 : n
2de0: 3c 32 3b 0a 20 20 20 20 20 20 20 20 20 20 69 73  <2;.          is
2df0: 5f 61 67 67 20 3d 20 6e 3d 3d 31 3b 0a 20 20 20  _agg = n==1;.   
2e00: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
2e10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
2e20: 63 61 73 65 20 46 4e 5f 41 76 67 3a 0a 20 20 20  case FN_Avg:.   
2e30: 20 20 20 20 20 63 61 73 65 20 46 4e 5f 53 75 6d       case FN_Sum
2e40: 3a 20 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f  : {.          no
2e50: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 21 61 6c  _such_func = !al
2e60: 6c 6f 77 41 67 67 3b 0a 20 20 20 20 20 20 20 20  lowAgg;.        
2e70: 20 20 74 6f 6f 5f 6d 61 6e 79 5f 61 72 67 73 20    too_many_args 
2e80: 3d 20 6e 3e 31 3b 0a 20 20 20 20 20 20 20 20 20  = n>1;.         
2e90: 20 74 6f 6f 5f 66 65 77 5f 61 72 67 73 20 3d 20   too_few_args = 
2ea0: 6e 3c 31 3b 0a 20 20 20 20 20 20 20 20 20 20 69  n<1;.          i
2eb0: 73 5f 61 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  s_agg = 1;.     
2ec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
2ed0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 2f 2a      }.        /*
2ee0: 20 54 68 65 20 22 66 63 6e 74 28 2a 29 22 20 66   The "fcnt(*)" f
2ef0: 75 6e 63 74 69 6f 6e 20 61 6c 77 61 79 73 20 72  unction always r
2f00: 65 74 75 72 6e 73 20 74 68 65 20 6e 75 6d 62 65  eturns the numbe
2f10: 72 20 6f 66 20 66 65 74 63 68 0a 20 20 20 20 20  r of fetch.     
2f20: 20 20 20 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 73     ** operations
2f30: 20 74 68 61 74 20 68 61 76 65 20 6f 63 63 75 72   that have occur
2f40: 72 65 64 20 73 6f 20 66 61 72 20 77 68 69 6c 65  red so far while
2f50: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 65 0a   processing the.
2f60: 20 20 20 20 20 20 20 20 2a 2a 20 53 51 4c 20 73          ** SQL s
2f70: 74 61 74 65 6d 65 6e 74 2e 20 20 54 68 69 73 20  tatement.  This 
2f80: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 63 61 6e 20  information can 
2f90: 62 65 20 75 73 65 64 20 62 79 20 74 65 73 74 20  be used by test 
2fa0: 70 72 6f 63 65 64 75 72 65 73 0a 20 20 20 20 20  procedures.     
2fb0: 20 20 20 2a 2a 20 74 6f 20 76 65 72 69 66 79 20     ** to verify 
2fc0: 74 68 61 74 20 69 6e 64 69 63 65 73 20 61 72 65  that indices are
2fd0: 20 62 65 69 6e 67 20 75 73 65 64 20 70 72 6f 70   being used prop
2fe0: 65 72 6c 79 20 74 6f 20 6d 69 6e 69 6d 69 7a 65  erly to minimize
2ff0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 65 61 72  .        ** sear
3000: 63 68 69 6e 67 2e 20 20 41 6c 6c 20 61 72 67 75  ching.  All argu
3010: 6d 65 6e 74 73 20 74 6f 20 66 63 6e 74 28 29 20  ments to fcnt() 
3020: 61 72 65 20 69 67 6e 6f 72 65 64 2e 20 20 66 63  are ignored.  fc
3030: 6e 74 28 29 20 68 61 73 0a 20 20 20 20 20 20 20  nt() has.       
3040: 20 2a 2a 20 6e 6f 20 75 73 65 20 28 6f 74 68 65   ** no use (othe
3050: 72 20 74 68 61 6e 20 74 65 73 74 69 6e 67 29 20  r than testing) 
3060: 74 68 61 74 20 77 65 20 61 72 65 20 61 77 61 72  that we are awar
3070: 65 20 6f 66 2e 0a 20 20 20 20 20 20 20 20 2a 2f  e of..        */
3080: 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 46 4e  .        case FN
3090: 5f 46 63 6e 74 3a 20 7b 0a 20 20 20 20 20 20 20  _Fcnt: {.       
30a0: 20 20 20 6e 20 3d 20 30 3b 0a 20 20 20 20 20 20     n = 0;.      
30b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
30c0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 64 65 66     }.        def
30d0: 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 20  ault: break;.   
30e0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e     }.      if( n
30f0: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20  o_such_func ){. 
3100: 20 20 20 20 20 20 20 73 71 6c 69 74 65 53 65 74         sqliteSet
3110: 4e 53 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d  NString(&pParse-
3120: 3e 7a 45 72 72 4d 73 67 2c 20 22 6e 6f 20 73 75  >zErrMsg, "no su
3130: 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 22 2c 20  ch function: ", 
3140: 2d 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20 70  -1,.           p
3150: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
3160: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 20 30  Expr->token.n, 0
3170: 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  );.        pPars
3180: 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20  e->nErr++;.     
3190: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
31a0: 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f 5f 6d   }else if( too_m
31b0: 61 6e 79 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  any_args ){.    
31c0: 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53 74      sqliteSetNSt
31d0: 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a 45  ring(&pParse->zE
31e0: 72 72 4d 73 67 2c 20 22 74 6f 6f 20 6d 61 6e 79  rrMsg, "too many
31f0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
3200: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
3210: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
3220: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
3230: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
3240: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
3250: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3260: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
3270: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 74 6f 6f     }else if( too
3280: 5f 66 65 77 5f 61 72 67 73 20 29 7b 0a 20 20 20  _few_args ){.   
3290: 20 20 20 20 20 73 71 6c 69 74 65 53 65 74 4e 53       sqliteSetNS
32a0: 74 72 69 6e 67 28 26 70 50 61 72 73 65 2d 3e 7a  tring(&pParse->z
32b0: 45 72 72 4d 73 67 2c 20 22 74 6f 6f 20 66 65 77  ErrMsg, "too few
32c0: 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66 75   arguments to fu
32d0: 6e 63 74 69 6f 6e 20 22 2c 2d 31 2c 0a 20 20 20  nction ",-1,.   
32e0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74          pExpr->t
32f0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
3300: 6f 6b 65 6e 2e 6e 2c 20 22 28 29 22 2c 20 32 2c  oken.n, "()", 2,
3310: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 50 61   0);.        pPa
3320: 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20  rse->nErr++;.   
3330: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
3340: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
3350: 73 5f 61 67 67 20 29 20 70 45 78 70 72 2d 3e 6f  s_agg ) pExpr->o
3360: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
3370: 49 4f 4e 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ION;.      if( i
3380: 73 5f 61 67 67 20 26 26 20 70 49 73 41 67 67 20  s_agg && pIsAgg 
3390: 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20  ) *pIsAgg = 1;. 
33a0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45       for(i=0; nE
33b0: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
33c0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  +){.        nErr
33d0: 20 3d 20 73 71 6c 69 74 65 45 78 70 72 43 68 65   = sqliteExprChe
33e0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
33f0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
3400: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
3410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3420: 20 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20      allowAgg && 
3430: 21 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29  !is_agg, pIsAgg)
3440: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
3450: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
3460: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
3470: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
3480: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45 78   nErr = sqliteEx
3490: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
34a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c  pExpr->pLeft, al
34b0: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
34c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
34d0: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
34e0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
34f0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
3500: 6c 69 74 65 45 78 70 72 43 68 65 63 6b 28 70 50  liteExprCheck(pP
3510: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
3520: 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70  ght, allowAgg, p
3530: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
3540: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
3550: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
3560: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
3570: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
3580: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
3590: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
35a0: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
35b0: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
35c0: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
35d0: 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  pE2 = pExpr->pLi
35e0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
35f0: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
3600: 20 73 71 6c 69 74 65 45 78 70 72 43 68 65 63 6b   sqliteExprCheck
3610: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 61 6c  (pParse, pE2, al
3620: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
3630: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
3640: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
3650: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
3660: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
3670: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
3680: 69 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74  into the current
3690: 20 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74   Vdbe to evaluat
36a0: 65 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  e the given.** e
36b0: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65  xpression and le
36c0: 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f  ave the result o
36d0: 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  n the stack..*/.
36e0: 76 6f 69 64 20 73 71 6c 69 74 65 45 78 70 72 43  void sqliteExprC
36f0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
3700: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
3710: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
3720: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
3730: 74 20 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  t op;.  switch( 
3740: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
3750: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20   case TK_PLUS:  
3760: 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20     op = OP_Add; 
3770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3780: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20  case TK_MINUS:  
3790: 20 20 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61    op = OP_Subtra
37a0: 63 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ct; break;.    c
37b0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20  ase TK_STAR:    
37c0: 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c   op = OP_Multipl
37d0: 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  y; break;.    ca
37e0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20  se TK_SLASH:    
37f0: 6f 70 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20  op = OP_Divide; 
3800: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
3810: 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f  e TK_AND:      o
3820: 70 20 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20  p = OP_And;     
3830: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
3840: 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70   TK_OR:       op
3850: 20 3d 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20   = OP_Or;       
3860: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
3870: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
3880: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
3890: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
38a0: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
38b0: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
38c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
38d0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
38e0: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
38f0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
3900: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
3910: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
3920: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
3930: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
3940: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
3950: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
3960: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
3970: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
3980: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
3990: 45 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c  E:     op = OP_L
39a0: 69 6b 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a  ike;     break;.
39b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
39c0: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c  :     op = OP_Gl
39d0: 6f 62 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ob;     break;. 
39e0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
39f0: 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e  L:   op = OP_IsN
3a00: 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ull;   break;.  
3a10: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
3a20: 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  L:  op = OP_NotN
3a30: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
3a40: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20 20   case TK_NOT:   
3a50: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b 20     op = OP_Not; 
3a60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
3a70: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
3a80: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74 69    op = OP_Negati
3a90: 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  ve; break;.    d
3aa0: 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20  efault: break;. 
3ab0: 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78   }.  switch( pEx
3ac0: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
3ad0: 73 65 20 54 4b 5f 46 49 45 4c 44 3a 20 7b 0a 20  se TK_FIELD: {. 
3ae0: 20 20 20 20 20 69 66 28 20 70 50 61 72 73 65 2d       if( pParse-
3af0: 3e 75 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20  >useAgg ){.     
3b00: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
3b10: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
3b20: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 2c   0, pExpr->iAgg,
3b30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65   0, 0);.      }e
3b40: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
3b50: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
3b60: 4f 50 5f 46 69 65 6c 64 2c 20 70 45 78 70 72 2d  OP_Field, pExpr-
3b70: 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  >iTable, pExpr->
3b80: 69 46 69 65 6c 64 2c 20 30 2c 20 30 29 3b 0a 20  iField, 0, 0);. 
3b90: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3ba0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3bb0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
3bc0: 0a 20 20 20 20 20 20 69 6e 74 20 69 20 3d 20 61  .      int i = a
3bd0: 74 6f 69 28 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  toi(pExpr->token
3be0: 2e 7a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  .z);.      sqlit
3bf0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3c00: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 2c 20  _Integer, i, 0, 
3c10: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
3c20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3c30: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b 0a 20  se TK_FLOAT: {. 
3c40: 20 20 20 20 20 69 6e 74 20 61 64 64 72 20 3d 20       int addr = 
3c50: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
3c60: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30 2c  v, OP_String, 0,
3c70: 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20   0, 0, 0);.     
3c80: 20 73 71 6c 69 74 65 56 64 62 65 43 68 61 6e 67   sqliteVdbeChang
3c90: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 70 45 78  eP3(v, addr, pEx
3ca0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
3cb0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
3cc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3cd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
3ce0: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ING: {.      int
3cf0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64   addr = sqliteVd
3d00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
3d10: 72 69 6e 67 2c 20 30 2c 20 30 2c 20 30 2c 20 30  ring, 0, 0, 0, 0
3d20: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
3d30: 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61  dbeChangeP3(v, a
3d40: 64 64 72 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  ddr, pExpr->toke
3d50: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
3d60: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n.n);.      sqli
3d70: 74 65 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  teVdbeDequoteP3(
3d80: 76 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20  v, addr);.      
3d90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3da0: 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b   case TK_NULL: {
3db0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
3dc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
3dd0: 6c 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a  l, 0, 0, 0, 0);.
3de0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3df0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
3e00: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
3e10: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
3e20: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
3e30: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
3e40: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
3e50: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a  ase TK_SLASH: {.
3e60: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
3e70: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
3e80: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
3e90: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
3ea0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3eb0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
3ec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
3ed0: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30 2c 20 30  , op, 0, 0, 0, 0
3ee0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
3ef0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
3f00: 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20  K_CONCAT: {.    
3f10: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
3f20: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
3f30: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
3f40: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
3f50: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
3f60: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
3f70: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
3f80: 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 2c 20 30  _Concat, 2, 0, 0
3f90: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
3fa0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
3fb0: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
3fc0: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
3fd0: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
3fe0: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
3ff0: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
4000: 65 20 54 4b 5f 45 51 3a 20 0a 20 20 20 20 63 61  e TK_EQ: .    ca
4010: 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 0a 20 20 20  se TK_LIKE: .   
4020: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
4030: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
4040: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62  .      sqliteVdb
4050: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
4060: 65 67 65 72 2c 20 31 2c 20 30 2c 20 30 2c 20 30  eger, 1, 0, 0, 0
4070: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
4080: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
4090: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
40a0: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43       sqliteExprC
40b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
40c0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
40d0: 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 56    dest = sqliteV
40e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
40f0: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
4100: 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20  iteVdbeAddOp(v, 
4110: 6f 70 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20  op, 0, dest, 0, 
4120: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
4130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4140: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 2c 20 30  AddImm, -1, 0, 0
4150: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
4160: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
4170: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
4180: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
4190: 70 72 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 20  pr->pLeft );.   
41a0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
41b0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
41c0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 69  GER ){.        i
41d0: 6e 74 20 69 20 3d 20 61 74 6f 69 28 70 45 78 70  nt i = atoi(pExp
41e0: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 2e  r->pLeft->token.
41f0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  z);.        sqli
4200: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4210: 50 5f 49 6e 74 65 67 65 72 2c 20 2d 69 2c 20 30  P_Integer, -i, 0
4220: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
4230: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 65   break;.      }e
4240: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
4250: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
4260: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f  AT ){.        To
4270: 6b 65 6e 20 2a 70 20 3d 20 26 70 45 78 70 72 2d  ken *p = &pExpr-
4280: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
4290: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d         char *z =
42a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
42b0: 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20  ->n + 2 );.     
42c0: 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d     sprintf(z, "-
42d0: 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e  %.*s", p->n, p->
42e0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  z);.        sqli
42f0: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4300: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20  P_String, 0, 0, 
4310: 7a 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73  z, 0);.        s
4320: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
4330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4340: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
4350: 6c 6c 20 74 72 75 65 20 69 6e 74 6f 20 54 4b 5f  ll true into TK_
4360: 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  NOT */.    }.   
4370: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
4380: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
4390: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
43a0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
43b0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
43c0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 30  p(v, op, 0, 0, 0
43d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
43e0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
43f0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
4400: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
4410: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
4420: 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  st;.      sqlite
4430: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
4440: 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 2c 20 30  Integer, 1, 0, 0
4450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
4460: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
4470: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
4480: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
4490: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
44a0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
44b0: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
44c0: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
44d0: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
44e0: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
44f0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
4500: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
4510: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
4520: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
4530: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
4540: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4550: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
4560: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 2c 20 30  , pExpr->iAgg, 0
4570: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
4580: 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d 3d 46  pExpr->iField==F
4590: 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20 20  N_Avg ){.       
45a0: 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d   assert( pParse-
45b0: 3e 69 41 67 67 43 6f 75 6e 74 3e 3d 30 20 26 26  >iAggCount>=0 &&
45c0: 20 70 50 61 72 73 65 2d 3e 69 41 67 67 43 6f 75   pParse->iAggCou
45d0: 6e 74 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  nt<pParse->nAgg 
45e0: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
45f0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
4600: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 50 61 72  _AggGet, 0, pPar
4610: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 2c 20 30  se->iAggCount, 0
4620: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 73 71  , 0);.        sq
4630: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
4640: 20 4f 50 5f 44 69 76 69 64 65 2c 20 30 2c 20 30   OP_Divide, 0, 0
4650: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 0, 0);.      }
4660: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4670: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
4680: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
4690: 20 20 69 6e 74 20 69 64 20 3d 20 70 45 78 70 72    int id = pExpr
46a0: 2d 3e 69 46 69 65 6c 64 3b 0a 20 20 20 20 20 20  ->iField;.      
46b0: 69 6e 74 20 6f 70 3b 0a 20 20 20 20 20 20 69 6e  int op;.      in
46c0: 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c  t i;.      ExprL
46d0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
46e0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
46f0: 20 69 66 28 20 69 64 3d 3d 46 4e 5f 46 63 6e 74   if( id==FN_Fcnt
4700: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
4710: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
4720: 50 5f 46 63 6e 74 2c 20 30 2c 20 30 2c 20 30 2c  P_Fcnt, 0, 0, 0,
4730: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65   0);.        bre
4740: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
4750: 20 20 6f 70 20 3d 20 69 64 3d 3d 46 4e 5f 4d 69    op = id==FN_Mi
4760: 6e 20 3f 20 4f 50 5f 4d 69 6e 20 3a 20 4f 50 5f  n ? OP_Min : OP_
4770: 4d 61 78 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Max;.      for(i
4780: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4790: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
47a0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
47b0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
47c0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
47d0: 20 20 20 20 20 69 66 28 20 69 3e 30 20 29 7b 0a       if( i>0 ){.
47e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
47f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
4800: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
4810: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
4820: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
4830: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
4840: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73  ELECT: {.      s
4850: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
4860: 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45  , OP_MemLoad, pE
4870: 78 70 72 2d 3e 69 46 69 65 6c 64 2c 20 30 2c 20  xpr->iField, 0, 
4880: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
4890: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
48a0: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
48b0: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
48c0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
48d0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
48e0: 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   1, 0, 0, 0);.  
48f0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
4900: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
4910: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
4920: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 56 64 62  addr = sqliteVdb
4930: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
4940: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
4950: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
4960: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4970: 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64  ddOp(v, OP_Found
4980: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
4990: 20 61 64 64 72 2b 32 2c 20 30 2c 20 30 29 3b 0a   addr+2, 0, 0);.
49a0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
49b0: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
49c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f  ddOp(v, OP_SetFo
49d0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
49e0: 6c 65 2c 20 61 64 64 72 2b 32 2c 20 30 2c 20 30  le, addr+2, 0, 0
49f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
4a00: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
4a10: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
4a20: 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20  1, 0, 0, 0);.   
4a30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
4a40: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
4a50: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  EEN: {.      int
4a60: 20 6c 62 6c 20 3d 20 73 71 6c 69 74 65 56 64 62   lbl = sqliteVdb
4a70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
4a80: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41       sqliteVdbeA
4a90: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
4aa0: 65 72 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  er, 0, 0, 0, 0);
4ab0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
4ac0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
4ad0: 20 70 45 78 70 72 2c 20 6c 62 6c 29 3b 0a 20 20   pExpr, lbl);.  
4ae0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
4af0: 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d  dOp(v, OP_AddImm
4b00: 2c 20 31 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20  , 1, 0, 0, 0);. 
4b10: 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 52       sqliteVdbeR
4b20: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
4b30: 62 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  bl);.      break
4b40: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
4b50: 74 75 72 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  turn;.}../*.** G
4b60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
4b70: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
4b80: 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
4b90: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
4ba0: 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
4bb0: 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
4bc0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
4bd0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
4be0: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
4bf0: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
4c00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
4c10: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
4c20: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 50 61  iteExprIfTrue(Pa
4c30: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
4c40: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65  r *pExpr, int de
4c50: 73 74 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  st){.  Vdbe *v =
4c60: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
4c70: 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20    int op = 0;.  
4c80: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
4c90: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
4ca0: 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LT:       op = 
4cb0: 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Lt;       bre
4cc0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
4cd0: 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LE:       op = O
4ce0: 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Le;       brea
4cf0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
4d00: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
4d10: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
4d20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  ;.    case TK_GE
4d30: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
4d40: 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ge;       break;
4d50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
4d60: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e         op = OP_N
4d70: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
4d80: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
4d90: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
4da0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
4db0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
4dc0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b       op = OP_Lik
4dd0: 65 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e;     break;.  
4de0: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20    case TK_GLOB: 
4df0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62      op = OP_Glob
4e00: 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
4e10: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
4e20: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
4e30: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
4e40: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
4e50: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
4e60: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  l;  break;.    d
4e70: 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a  efault:  break;.
4e80: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
4e90: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
4ea0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
4eb0: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
4ec0: 69 74 65 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  iteVdbeMakeLabel
4ed0: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
4ee0: 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  eExprIfFalse(pPa
4ef0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
4f00: 74 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 73 71  t, d2);.      sq
4f10: 6c 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70  liteExprIfTrue(p
4f20: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
4f30: 69 67 68 74 2c 20 64 65 73 74 29 3b 0a 20 20 20  ight, dest);.   
4f40: 20 20 20 73 71 6c 69 74 65 56 64 62 65 52 65 73     sqliteVdbeRes
4f50: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
4f60: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
4f70: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
4f80: 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _OR: {.      sql
4f90: 69 74 65 45 78 70 72 49 66 54 72 75 65 28 70 50  iteExprIfTrue(pP
4fa0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
4fb0: 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ft, dest);.     
4fc0: 20 73 71 6c 69 74 65 45 78 70 72 49 66 54 72 75   sqliteExprIfTru
4fd0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
4fe0: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 29 3b 0a  >pRight, dest);.
4ff0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5000: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
5010: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
5020: 74 65 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  teExprIfFalse(pP
5030: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
5040: 66 74 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  ft, dest);.     
5050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5060: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
5070: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
5080: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
5090: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
50a0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
50b0: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 0a 20 20    case TK_EQ:.  
50c0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
50d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
50e0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
50f0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
5100: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
5110: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5120: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
5130: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
5140: 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64     sqliteVdbeAdd
5150: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73  Op(v, op, 0, des
5160: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
5170: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
5180: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
5190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
51a0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
51b0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
51c0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
51d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
51e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
51f0: 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b   0, dest, 0, 0);
5200: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5210: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5220: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  IN: {.      sqli
5230: 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  teExprCode(pPars
5240: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
5250: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
5260: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
5270: 20 20 20 20 20 20 73 71 6c 69 74 65 56 64 62 65        sqliteVdbe
5280: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e  AddOp(v, OP_Foun
5290: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
52a0: 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20  , dest, 0, 0);. 
52b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
52c0: 20 20 20 20 73 71 6c 69 74 65 56 64 62 65 41 64      sqliteVdbeAd
52d0: 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75  dOp(v, OP_SetFou
52e0: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
52f0: 65 2c 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a  e, dest, 0, 0);.
5300: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
5310: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5320: 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20  ase TK_BETWEEN: 
5330: 7b 0a 20 20 20 20 20 20 69 6e 74 20 6c 62 6c 20  {.      int lbl 
5340: 3d 20 73 71 6c 69 74 65 56 64 62 65 4d 61 6b 65  = sqliteVdbeMake
5350: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
5360: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
5370: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
5380: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
5390: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  teVdbeAddOp(v, O
53a0: 50 5f 44 75 70 2c 20 30 2c 20 30 2c 20 30 2c 20  P_Dup, 0, 0, 0, 
53b0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
53c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
53d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
53e0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
53f0: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5400: 70 28 76 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 6c  p(v, OP_Lt, 0, l
5410: 62 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  bl, 0, 0);.     
5420: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
5430: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
5440: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5450: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5460: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c  dbeAddOp(v, OP_L
5470: 65 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30  e, 0, dest, 0, 0
5480: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5490: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
54a0: 6e 74 65 67 65 72 2c 20 30 2c 20 30 2c 20 30 2c  nteger, 0, 0, 0,
54b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
54c0: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  eVdbeAddOp(v, OP
54d0: 5f 50 6f 70 2c 20 31 2c 20 30 2c 20 30 2c 20 6c  _Pop, 1, 0, 0, l
54e0: 62 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  bl);.      break
54f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
5500: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
5510: 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61 72  iteExprCode(pPar
5520: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
5530: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5540: 70 28 76 2c 20 4f 50 5f 49 66 2c 20 30 2c 20 64  p(v, OP_If, 0, d
5550: 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  est, 0, 0);.    
5560: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
5570: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
5580: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 62 6f  rate code for bo
5590: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
55a0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
55b0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
55c0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
55d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
55e0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
55f0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
5600: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
5610: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
5620: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
5630: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 45 78  */.void sqliteEx
5640: 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20  prIfFalse(Parse 
5650: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
5660: 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 29 7b  Expr, int dest){
5670: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
5680: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
5690: 74 20 6f 70 20 3d 20 30 3b 0a 20 20 73 77 69 74  t op = 0;.  swit
56a0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
56b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
56c0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
56d0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
56e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
56f0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74        op = OP_Gt
5700: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
5710: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
5720: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
5730: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
5740: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
5750: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
5760: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
5770: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
5780: 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20     op = OP_Eq;  
5790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
57a0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
57b0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
57c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
57d0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 20 20 20  ase TK_LIKE:    
57e0: 20 6f 70 20 3d 20 4f 50 5f 4c 69 6b 65 3b 20 20   op = OP_Like;  
57f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
5800: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 20 20 20 20  se TK_GLOB:     
5810: 6f 70 20 3d 20 4f 50 5f 47 6c 6f 62 3b 20 20 20  op = OP_Glob;   
5820: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
5830: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
5840: 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20  p = OP_NotNull; 
5850: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
5860: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
5870: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
5880: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
5890: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
58a0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
58b0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
58c0: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
58d0: 73 71 6c 69 74 65 45 78 70 72 49 66 46 61 6c 73  sqliteExprIfFals
58e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
58f0: 3e 70 4c 65 66 74 2c 20 64 65 73 74 29 3b 0a 20  >pLeft, dest);. 
5900: 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 49       sqliteExprI
5910: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
5920: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
5930: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
5940: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
5950: 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20   TK_OR: {.      
5960: 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 56  int d2 = sqliteV
5970: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
5980: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70  .      sqliteExp
5990: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
59a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
59b0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 45  );.      sqliteE
59c0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
59d0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
59e0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
59f0: 71 6c 69 74 65 56 64 62 65 52 65 73 6f 6c 76 65  qliteVdbeResolve
5a00: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
5a10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5a20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
5a30: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
5a40: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
5a50: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
5a60: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
5a70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
5a80: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
5a90: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
5aa0: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
5ab0: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
5ac0: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
5ad0: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
5ae0: 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64     sqliteExprCod
5af0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
5b00: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
5b10: 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50  qliteExprCode(pP
5b20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
5b30: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
5b40: 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  teVdbeAddOp(v, o
5b50: 70 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30  p, 0, dest, 0, 0
5b60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5b70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
5b80: 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65  K_LIKE:.    case
5b90: 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_GLOB: {.    
5ba0: 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65    sqliteExprCode
5bb0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
5bc0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
5bd0: 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70 50 61  liteExprCode(pPa
5be0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
5bf0: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
5c00: 65 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  eVdbeAddOp(v, op
5c10: 2c 20 31 2c 20 64 65 73 74 2c 20 30 2c 20 30 29  , 1, dest, 0, 0)
5c20: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
5c30: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
5c40: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
5c50: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
5c60: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5c70: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
5c80: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
5c90: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5ca0: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 64 65 73 74  p(v, op, 0, dest
5cb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
5cc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
5cd0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
5ce0: 20 20 20 20 73 71 6c 69 74 65 45 78 70 72 43 6f      sqliteExprCo
5cf0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
5d00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
5d10: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
5d20: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ct ){.        sq
5d30: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
5d40: 20 4f 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45   OP_NotFound, pE
5d50: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73  xpr->iTable, des
5d60: 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  t, 0, 0);.      
5d70: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
5d80: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5d90: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
5da0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
5db0: 20 64 65 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20   dest, 0, 0);.  
5dc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
5dd0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
5de0: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
5df0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
5e00: 20 20 20 20 20 20 73 71 6c 69 74 65 45 78 70 72        sqliteExpr
5e10: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
5e20: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
5e30: 20 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f    sqliteVdbeAddO
5e40: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
5e50: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
5e60: 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28 70  sqliteExprCode(p
5e70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
5e80: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
5e90: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
5ea0: 71 6c 69 74 65 56 64 62 65 43 75 72 72 65 6e 74  qliteVdbeCurrent
5eb0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
5ec0: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5ed0: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 61 64 64 72  , OP_Ge, 0, addr
5ee0: 2b 33 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  +3, 0, 0);.     
5ef0: 20 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70   sqliteVdbeAddOp
5f00: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
5f10: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
5f20: 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76  qliteVdbeAddOp(v
5f30: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
5f40: 73 74 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  st, 0, 0);.     
5f50: 20 73 71 6c 69 74 65 45 78 70 72 43 6f 64 65 28   sqliteExprCode(
5f60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
5f70: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
5f80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 56  );.      sqliteV
5f90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
5fa0: 74 2c 20 30 2c 20 64 65 73 74 2c 20 30 2c 20 30  t, 0, dest, 0, 0
5fb0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
5fc0: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
5fd0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
5fe0: 65 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  eExprCode(pParse
5ff0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
6000: 73 71 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28  sqliteVdbeAddOp(
6010: 76 2c 20 4f 50 5f 4e 6f 74 2c 20 30 2c 20 30 2c  v, OP_Not, 0, 0,
6020: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
6030: 6c 69 74 65 56 64 62 65 41 64 64 4f 70 28 76 2c  liteVdbeAddOp(v,
6040: 20 4f 50 5f 49 66 2c 20 30 2c 20 64 65 73 74 2c   OP_If, 0, dest,
6050: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
6060: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
6070: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
6080: 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
6090: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
60a0: 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
60b0: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
60c0: 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
60d0: 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
60e0: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
60f0: 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
6100: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
6110: 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72  ExprCompare(Expr
6120: 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b   *pA, Expr *pB){
6130: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
6140: 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pA==0 ){.    ret
6150: 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c  urn pB==0;.  }el
6160: 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a  se if( pB==0 ){.
6170: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6180: 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d  }.  if( pA->op!=
6190: 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20  pB->op ) return 
61a0: 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65  0;.  if( !sqlite
61b0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
61c0: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
61d0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
61e0: 69 66 28 20 21 73 71 6c 69 74 65 45 78 70 72 43  if( !sqliteExprC
61f0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
6200: 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
6210: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
6220: 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
6230: 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
6240: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
6250: 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
6260: 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
6270: 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
6280: 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
6290: 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
62a0: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
62b0: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 45 78     if( !sqliteEx
62c0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
62d0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
62e0: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
62f0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
6300: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
6310: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
6320: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
6330: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
6340: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
6350: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
6360: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
6370: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b  0;.  if( pA->tok
6380: 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  en.z ){.    if( 
6390: 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  pB->token.z==0 )
63a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
63b0: 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d  f( pB->token.n!=
63c0: 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65  pA->token.n ) re
63d0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
63e0: 73 71 6c 69 74 65 53 74 72 4e 49 43 6d 70 28 70  sqliteStrNICmp(p
63f0: 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  A->token.z, pB->
6400: 74 6f 6b 65 6e 2e 7a 2c 20 70 41 2d 3e 74 6f 6b  token.z, pA->tok
6410: 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72  en.n)!=0 ) retur
6420: 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 0;.  }.  retur
6430: 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64  n 1;.}../*.** Ad
6440: 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20  d a new element 
6450: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
6460: 41 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20  Agg[] array and 
6470: 72 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78  return its index
6480: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
6490: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61  appendAggInfo(Pa
64a0: 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20  rse *pParse){.  
64b0: 69 66 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67  if( (pParse->nAg
64c0: 67 20 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20  g & 0x7)==0 ){. 
64d0: 20 20 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61     int amt = pPa
64e0: 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20  rse->nAgg + 8;. 
64f0: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20     pParse->aAgg 
6500: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
6510: 70 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d  pParse->aAgg, am
6520: 74 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  t*sizeof(pParse-
6530: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20  >aAgg[0]));.    
6540: 69 66 28 20 70 50 61 72 73 65 2d 3e 61 41 67 67  if( pParse->aAgg
6550: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ==0 ){.      sql
6560: 69 74 65 53 65 74 53 74 72 69 6e 67 28 26 70 50  iteSetString(&pP
6570: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2c 20 22  arse->zErrMsg, "
6580: 6f 75 74 20 6f 66 20 6d 65 6d 6f 72 79 22 2c 20  out of memory", 
6590: 30 29 3b 0a 20 20 20 20 20 20 70 50 61 72 73 65  0);.      pParse
65a0: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
65b0: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
65c0: 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70  .  }.  memset(&p
65d0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50 61 72  Parse->aAgg[pPar
65e0: 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69  se->nAgg], 0, si
65f0: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
6600: 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e  g[0]));.  return
6610: 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b   pParse->nAgg++;
6620: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
6630: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
6640: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
6650: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
6660: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
6670: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
6680: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
6690: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
66a0: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
66b0: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
66c0: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
66d0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
66e0: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
66f0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
6700: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
6710: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
6720: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
6730: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
6740: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
6750: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29  ExprResolveIds()
6760: 20 61 6e 64 20 73 71 6c 69 74 65 45 78 70 72 43   and sqliteExprC
6770: 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66  heck()..**.** If
6780: 20 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e   errors are seen
6790: 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72  , leave an error
67a0: 20 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72   message in zErr
67b0: 4d 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a  Msg and return.*
67c0: 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  * the number of 
67d0: 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73  errors..*/.int s
67e0: 71 6c 69 74 65 45 78 70 72 41 6e 61 6c 79 7a 65  qliteExprAnalyze
67f0: 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73 65  Aggregates(Parse
6800: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
6810: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
6820: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
6830: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
6840: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
6850: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
6860: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
6870: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
6880: 5f 46 49 45 4c 44 3a 20 7b 0a 20 20 20 20 20 20  _FIELD: {.      
6890: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
68a0: 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  Agg;.      for(i
68b0: 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41  =0; i<pParse->nA
68c0: 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  gg; i++){.      
68d0: 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73    if( aAgg[i].is
68e0: 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  Agg ) continue;.
68f0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
6900: 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c  [i].pExpr->iTabl
6910: 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e==pExpr->iTable
6920: 0a 20 20 20 20 20 20 20 20 20 26 26 20 61 41 67  .         && aAg
6930: 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 46 69 65  g[i].pExpr->iFie
6940: 6c 64 3d 3d 70 45 78 70 72 2d 3e 69 46 69 65 6c  ld==pExpr->iFiel
6950: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  d ){.          b
6960: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
6970: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6980: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
6990: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
69a0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
69b0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
69c0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
69d0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
69e0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
69f0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
6a00: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
6a10: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
6a20: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
6a30: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
6a40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
6a50: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
6a60: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
6a70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 46 69    if( pExpr->iFi
6a80: 65 6c 64 3d 3d 46 4e 5f 43 6f 75 6e 74 20 7c 7c  eld==FN_Count ||
6a90: 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d 3d   pExpr->iField==
6aa0: 46 4e 5f 41 76 67 20 29 7b 0a 20 20 20 20 20 20  FN_Avg ){.      
6ab0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 69 41    if( pParse->iA
6ac0: 67 67 43 6f 75 6e 74 3e 3d 30 20 29 7b 0a 20 20  ggCount>=0 ){.  
6ad0: 20 20 20 20 20 20 20 20 69 20 3d 20 70 50 61 72          i = pPar
6ae0: 73 65 2d 3e 69 41 67 67 43 6f 75 6e 74 3b 0a 20  se->iAggCount;. 
6af0: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6b00: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
6b10: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
6b20: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
6b30: 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b   i<0 ) return 1;
6b40: 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73  .          pPars
6b50: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
6b60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20   = 1;.          
6b70: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
6b80: 70 45 78 70 72 20 3d 20 30 3b 0a 20 20 20 20 20  pExpr = 0;.     
6b90: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 69 41 67       pParse->iAg
6ba0: 67 43 6f 75 6e 74 20 3d 20 69 3b 0a 20 20 20 20  gCount = i;.    
6bb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
6bc0: 28 20 70 45 78 70 72 2d 3e 69 46 69 65 6c 64 3d  ( pExpr->iField=
6bd0: 3d 46 4e 5f 43 6f 75 6e 74 20 29 7b 0a 20 20 20  =FN_Count ){.   
6be0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41         pExpr->iA
6bf0: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 20 20  gg = i;.        
6c00: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
6c10: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
6c20: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
6c30: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
6c40: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
6c50: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
6c60: 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e     if( !aAgg[i].
6c70: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
6c80: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
6c90: 6c 69 74 65 45 78 70 72 43 6f 6d 70 61 72 65 28  liteExprCompare(
6ca0: 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70  aAgg[i].pExpr, p
6cb0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
6cc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
6cd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
6ce0: 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d    if( i>=pParse-
6cf0: 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  >nAgg ){.       
6d00: 20 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e   i = appendAggIn
6d10: 66 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  fo(pParse);.    
6d20: 20 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65      if( i<0 ) re
6d30: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
6d40: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
6d50: 69 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20  isAgg = 1;.     
6d60: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
6d70: 69 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72  i].pExpr = pExpr
6d80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6d90: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
6da0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6db0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
6dc0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
6dd0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
6de0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
6df0: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
6e00: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
6e10: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
6e20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
6e30: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
6e40: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
6e50: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
6e60: 74 65 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  teExprAnalyzeAgg
6e70: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
6e80: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
6e90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6ea0: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
6eb0: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
6ec0: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
6ed0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
6ee0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
6ef0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
6f00: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
6f10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
6f20: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 45    nErr = sqliteE
6f30: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
6f40: 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78  ates(pParse, pEx
6f50: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
6f60: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
6f70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
6f80: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
6f90: 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a  .  return nErr;.
6fa0: 7d 0a                                            }.