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

Artifact 4d6e26da200e0d08233df52fd8d07916d24a6926:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 32 30 37 20 32 30 30 35 2f 30 36 2f 32 32 20  .207 2005/06/22 
0220: 30 38 3a 34 38 3a 30 36 20 64 72 68 20 45 78 70  08:48:06 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
04b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a  r->op==TK_AS ){.
04c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04d0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
04e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
04f0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
0500: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0510: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0520: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0530: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0540: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0550: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
0560: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
0570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0580: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0590: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
05a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
05b0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
05c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
05d0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
05e0: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
05f0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0600: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0620: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
0630: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
0640: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
0650: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
0660: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
0670: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0680: 41 53 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  AS && !pColl ){.
0690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
06a0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
06b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
06c0: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
06d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
06e0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
06f0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0700: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0710: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0730: 69 73 20 61 6e 20 6f 70 65 72 61 6e 64 20 6f 66  is an operand of
0740: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0750: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0760: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0770: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 6f 74 68  inity of the oth
0780: 65 72 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  er operand.  Thi
0790: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
07a0: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
07b0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
07c0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
07d0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
07e0: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
07f0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0800: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0810: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0820: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0830: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0840: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0850: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0860: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0870: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
0880: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
0890: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
08a0: 72 69 63 20 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  ric or.    ** in
08b0: 74 65 67 65 72 20 61 66 66 69 6e 69 74 79 2c 20  teger affinity, 
08c0: 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77  use that. Otherw
08d0: 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e  ise use no affin
08e0: 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ity..    */.    
08f0: 69 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45  if( aff1==SQLITE
0900: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
0910: 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  aff2==SQLITE_AFF
0920: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
0930: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0940: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0950: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 31 3d   }else if( aff1=
0960: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
0970: 52 49 43 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c  RIC || aff2==SQL
0980: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
0990: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
09a0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
09b0: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
09c0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
09d0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
09e0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
09f0: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0a00: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0a10: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0a20: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0a30: 6d 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65  mn.  Compare the
0a40: 0a 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20  .    ** results 
0a50: 64 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f  directly..    */
0a60: 0a 20 20 20 20 2f 2a 20 72 65 74 75 72 6e 20 53  .    /* return S
0a70: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0a80: 43 3b 20 20 2f 2f 20 54 69 63 6b 65 74 20 23 38  C;  // Ticket #8
0a90: 30 35 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  05 */.    return
0aa0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
0ab0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
0ac0: 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20  * One side is a 
0ad0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65  column, the othe
0ae0: 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68  r is not. Use th
0af0: 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  e columns affini
0b00: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
0b10: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0b20: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0b30: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0b40: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0b50: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0b60: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0b70: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0b80: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0b90: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0ba0: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0bb0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0bc0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0bd0: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0be0: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0bf0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0c00: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0c10: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0c20: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0c30: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0c40: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0c50: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0c60: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0c70: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0c80: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0c90: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0ca0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0cb0: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0cc0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0cd0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0ce0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0cf0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0d00: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0d10: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0d20: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0d30: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0d40: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0d50: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0d60: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0d70: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0d80: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0d90: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
0da0: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
0db0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0dc0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a 20  F_NUMERIC;.  }. 
0dd0: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
0de0: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72   comparison expr
0e00: 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c  ession, eg. '=',
0e10: 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74   '<', IN(...) et
0e20: 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69  c..** idx_affini
0e30: 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69  ty is the affini
0e40: 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  ty of an indexed
0e50: 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20   column. Return 
0e60: 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69  true.** if the i
0e70: 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69  ndex with affini
0e80: 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ty idx_affinity 
0e90: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69  may be used to i
0ea0: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  mplement.** the 
0eb0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45  comparison in pE
0ec0: 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
0ed0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
0ee0: 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  Ok(Expr *pExpr, 
0ef0: 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74  char idx_affinit
0f00: 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  y){.  char aff =
0f10: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0f20: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 72 65  ity(pExpr);.  re
0f30: 74 75 72 6e 20 0a 20 20 20 20 28 61 66 66 3d 3d  turn .    (aff==
0f40: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
0f50: 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51   ||.    (aff==SQ
0f60: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0f70: 20 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79   && idx_affinity
0f80: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0f90: 45 47 45 52 29 20 7c 7c 0a 20 20 20 20 28 61 66  EGER) ||.    (af
0fa0: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
0fb0: 54 45 47 45 52 20 26 26 20 69 64 78 5f 61 66 66  TEGER && idx_aff
0fc0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
0fd0: 46 5f 4e 55 4d 45 52 49 43 29 20 7c 7c 0a 20 20  F_NUMERIC) ||.  
0fe0: 20 20 28 61 66 66 3d 3d 69 64 78 5f 61 66 66 69    (aff==idx_affi
0ff0: 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nity);.}../*.** 
1000: 52 65 74 75 72 6e 20 74 68 65 20 50 31 20 76 61  Return the P1 va
1010: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1020: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1030: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1040: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1050: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1060: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1070: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1080: 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75 6c  .** If jumpIfNul
1090: 6c 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  l is true, then 
10a0: 73 65 74 20 74 68 65 20 6c 6f 77 20 62 79 74 65  set the low byte
10b0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
10c0: 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20 74 6f 20  .** P1 value to 
10d0: 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 20  tell the opcode 
10e0: 74 6f 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  to jump if eithe
10f0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
1100: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1110: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
1120: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31   binaryCompareP1
1130: 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45  (Expr *pExpr1, E
1140: 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74  xpr *pExpr2, int
1150: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1160: 63 68 61 72 20 61 66 66 20 3d 20 73 71 6c 69 74  char aff = sqlit
1170: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1180: 45 78 70 72 32 29 3b 0a 20 20 72 65 74 75 72 6e  Expr2);.  return
1190: 20 28 28 69 6e 74 29 73 71 6c 69 74 65 33 43 6f   ((int)sqlite3Co
11a0: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
11b0: 78 70 72 31 2c 20 61 66 66 29 29 2b 28 6a 75 6d  xpr1, aff))+(jum
11c0: 70 49 66 4e 75 6c 6c 3f 30 78 31 30 30 3a 30 29  pIfNull?0x100:0)
11d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
11e0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  n a pointer to t
11f0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
1200: 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75 6c  uence that shoul
1210: 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a 20  d be used by.** 
1220: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
1230: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f 6d  son operator com
1240: 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e 64  paring pLeft and
1250: 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20 49   pRight..**.** I
1260: 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64 20  f the left hand 
1270: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
1280: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
1290: 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20 69  nce type, then i
12a0: 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f 74  t is.** used. Ot
12b0: 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c 6c  herwise the coll
12c0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
12d0: 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61 6e  or the right han
12e0: 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  d expression.** 
12f0: 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65 20  is used, or the 
1300: 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59 29  default (BINARY)
1310: 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70 72   if neither expr
1320: 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c  ession has a col
1330: 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e 0a  lating.** type..
1340: 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53 65  */.static CollSe
1350: 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65  q* binaryCompare
1360: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
1370: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c 65  Parse, Expr *pLe
1380: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
1390: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
13a0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
13b0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
13c0: 20 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20 21   pLeft);.  if( !
13d0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43 6f  pColl ){.    pCo
13e0: 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ll = sqlite3Expr
13f0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
1400: 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20 72  pRight);.  }.  r
1410: 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a  eturn pColl;.}..
1420: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
1430: 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61 72  ode for a compar
1440: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  ison operator..*
1450: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f 64  /.static int cod
1460: 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72 73  eCompare(.  Pars
1470: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f 2a  e *pParse,    /*
1480: 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61 6e   The parsing (an
1490: 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69 6e  d code generatin
14a0: 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  g) context */.  
14b0: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20 20  Expr *pLeft,    
14c0: 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f 70    /* The left op
14d0: 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20  erand */.  Expr 
14e0: 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a 20  *pRight,     /* 
14f0: 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e  The right operan
1500: 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f 64  d */.  int opcod
1510: 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  e,       /* The 
1520: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f 64  comparison opcod
1530: 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c  e */.  int dest,
1540: 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70           /* Jump
1550: 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20 20   here if true.  
1560: 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66 4e  */.  int jumpIfN
1570: 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72 75  ull    /* If tru
1580: 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  e, jump if eithe
1590: 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55 4c  r operand is NUL
15a0: 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70 31  L */.){.  int p1
15b0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
15c0: 50 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68 74  P1(pLeft, pRight
15d0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
15e0: 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 62   CollSeq *p3 = b
15f0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
1600: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66  Seq(pParse, pLef
1610: 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72 65  t, pRight);.  re
1620: 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62 65  turn sqlite3Vdbe
1630: 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64 62  Op3(pParse->pVdb
1640: 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20 64  e, opcode, p1, d
1650: 65 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c 20  est, (void*)p3, 
1660: 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a 0a  P3_COLLSEQ);.}..
1670: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1680: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
1690: 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e   node and return
16a0: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74   a pointer to it
16b0: 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72  .  Memory.** for
16c0: 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62   this node is ob
16d0: 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69  tained from sqli
16e0: 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65  teMalloc().  The
16f0: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
1700: 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69  n.** is responsi
1710: 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73  ble for making s
1720: 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65  ure the node eve
1730: 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65  ntually gets fre
1740: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
1750: 69 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c  ite3Expr(int op,
1760: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78   Expr *pLeft, Ex
1770: 70 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e 73  pr *pRight, cons
1780: 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  t Token *pToken)
1790: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
17a0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
17b0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
17c0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
17d0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
17e0: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
17f0: 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20 61  , delete pLeft a
1800: 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72 65  nd pRight. Expre
1810: 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74 6f  ssions passed to
1820: 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66 75   .    ** this fu
1830: 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77 61  nction must alwa
1840: 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64 20  ys be allocated 
1850: 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70 72  with sqlite3Expr
1860: 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20 20  () for this .   
1870: 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20 20   ** reason. .   
1880: 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33 45   */.    sqlite3E
1890: 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74 29  xprDelete(pLeft)
18a0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  ;.    sqlite3Exp
18b0: 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29 3b  rDelete(pRight);
18c0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
18d0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
18e0: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
18f0: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
1900: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
1910: 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67 67  ht;.  pNew->iAgg
1920: 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54 6f   = -1;.  if( pTo
1930: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
1940: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
1950: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73  0 );.    pNew->s
1960: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
1970: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d  n = *pToken;.  }
1980: 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 26  else if( pLeft &
1990: 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  & pRight ){.    
19a0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
19b0: 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70  pNew, &pLeft->sp
19c0: 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61  an, &pRight->spa
19d0: 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  n);.  }.  return
19e0: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
19f0: 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73  When doing a nes
1a00: 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63  ted parse, you c
1a10: 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73  an include terms
1a20: 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
1a30: 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c  n.** that look l
1a40: 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23  ike this:   #0 #
1a50: 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20  1 #2 ...  These 
1a60: 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65  terms refer to e
1a70: 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68  lements.** on th
1a80: 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 6d  e stack.  "#0" m
1a90: 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20  eans the top of 
1aa0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23  the stack..** "#
1ab0: 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78  1" means the nex
1ac0: 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74  t down on the st
1ad0: 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  ack.  And so for
1ae0: 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  th..**.** This r
1af0: 6f 75 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64  outine is called
1b00: 20 62 79 20 74 68 65 20 70 61 72 73 65 72 20 74   by the parser t
1b10: 6f 20 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f  o deal with on o
1b20: 66 20 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a  f those terms..*
1b30: 2a 20 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79  * It immediately
1b40: 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20   generates code 
1b50: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c  to store the val
1b60: 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c  ue in a memory l
1b70: 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20  ocation..** The 
1b80: 72 65 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65  returns an expre
1b90: 73 73 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20  ssion that will 
1ba0: 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63 74 20  code to extract 
1bb0: 74 68 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a  the value from.*
1bc0: 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f  * that memory lo
1bd0: 63 61 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64  cation as needed
1be0: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1bf0: 65 33 52 65 67 69 73 74 65 72 45 78 70 72 28 50  e3RegisterExpr(P
1c00: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f  arse *pParse, To
1c10: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
1c20: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
1c30: 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20  ->pVdbe;.  Expr 
1c40: 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b  *p;.  int depth;
1c50: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
1c60: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 50  turn 0;.  if( pP
1c70: 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20  arse->nested==0 
1c80: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72  ){.    sqlite3Er
1c90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
1ca0: 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e  near \"%T\": syn
1cb0: 74 61 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b  tax error", pTok
1cc0: 65 6e 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  en);.    return 
1cd0: 30 3b 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c  0;.  }.  p = sql
1ce0: 69 74 65 33 45 78 70 72 28 54 4b 5f 52 45 47 49  ite3Expr(TK_REGI
1cf0: 53 54 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b  STER, 0, 0, pTok
1d00: 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  en);.  if( p==0 
1d10: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  ){.    return 0;
1d20: 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c    /* Malloc fail
1d30: 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74  ed */.  }.  dept
1d40: 68 20 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65 6e  h = atoi(&pToken
1d50: 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 70 2d 3e 69 54  ->z[1]);.  p->iT
1d60: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
1d70: 4d 65 6d 2b 2b 3b 0a 20 20 73 71 6c 69 74 65 33  Mem++;.  sqlite3
1d80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
1d90: 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29 3b 0a  Dup, depth, 0);.
1da0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1db0: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72  Op(v, OP_MemStor
1dc0: 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c 20 31 29  e, p->iTable, 1)
1dd0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a  ;.  return p;.}.
1de0: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
1df0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
1e00: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
1e10: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
1e20: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
1e30: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
1e40: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
1e50: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
1e60: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
1e70: 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66 74 2c  And(Expr *pLeft,
1e80: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
1e90: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
1ea0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
1eb0: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
1ec0: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
1ed0: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
1ee0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1ef0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1f00: 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70  TK_AND, pLeft, p
1f10: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d  Right, 0);.  }.}
1f20: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1f30: 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20  Expr.span field 
1f40: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1f50: 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20  ression to span 
1f60: 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77  all.** text betw
1f70: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
1f80: 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69  n tokens..*/.voi
1f90: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61  d sqlite3ExprSpa
1fa0: 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  n(Expr *pExpr, T
1fb0: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
1fc0: 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61  en *pRight){.  a
1fd0: 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
1fe0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1ff0: 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
2000: 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f  !sqlite3_malloc_
2010: 66 61 69 6c 65 64 20 26 26 20 70 52 69 67 68 74  failed && pRight
2020: 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  ->z && pLeft->z 
2030: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2040: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20  Left->dyn==0 || 
2050: 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e  pLeft->z[pLeft->
2060: 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  n]==0 );.    if(
2070: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
2080: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
2090: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
20a0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
20b0: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
20c0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
20d0: 2d 3e 6e 20 2b 20 28 70 52 69 67 68 74 2d 3e 7a  ->n + (pRight->z
20e0: 20 2d 20 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20   - pLeft->z);.  
20f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70    }else{.      p
2100: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30  Expr->span.z = 0
2110: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
2120: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
2130: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2140: 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74  node for a funct
2150: 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c  ion with multipl
2160: 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a  e.** arguments..
2170: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2180: 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70  ExprFunction(Exp
2190: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f  rList *pList, To
21a0: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20  ken *pToken){.  
21b0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e  Expr *pNew;.  pN
21c0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
21d0: 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20  c( sizeof(Expr) 
21e0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
21f0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
2200: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c  xprListDelete(pL
2210: 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64 20 6c  ist); /* Avoid l
2220: 65 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 77 68  eaking memory wh
2230: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
2240: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
2250: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
2260: 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  = TK_FUNCTION;. 
2270: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70   pNew->pList = p
2280: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b  List;.  if( pTok
2290: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
22a0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
22b0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   );.    pNew->to
22c0: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
22d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
22e0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
22f0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20   }.  pNew->span 
2300: 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20  = pNew->token;. 
2310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
2320: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
2330: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2340: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2350: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
2360: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
2370: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
2380: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
2390: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
23a0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
23b0: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
23c0: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
23d0: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
23e0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
23f0: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
2400: 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20  the form "?nnn" 
2410: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2420: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
2430: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
2440: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
2450: 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64   be to avoid a d
2460: 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65  enial of service
2470: 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20   attack when.** 
2480: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2490: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20  t comes from an 
24a0: 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e  external source.
24b0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
24c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61   of the form ":a
24d0: 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61 72  aa" or "$aaa" ar
24e0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
24f0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
2500: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
2510: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
2520: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
2530: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2540: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
2550: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
2560: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
2570: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
2580: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
2590: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
25a0: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
25b0: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
25c0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25d0: 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70  xpr){.  Token *p
25e0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78  Token;.  if( pEx
25f0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2600: 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70    pToken = &pExp
2610: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  r->token;.  asse
2620: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31  rt( pToken->n>=1
2630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2640: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  oken->z!=0 );.  
2650: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2660: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
2670: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b   pToken->n==1 ){
2680: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2690: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
26a0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
26b0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
26c0: 65 72 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d  er */.    pExpr-
26d0: 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72  >iTable = ++pPar
26e0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73  se->nVar;.  }els
26f0: 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  e if( pToken->z[
2700: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f  0]=='?' ){.    /
2710: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2720: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20  e form "?nnn".  
2730: 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f  Convert "nnn" to
2740: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a   an integer and.
2750: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
2760: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
2770: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mber */.    int 
2780: 69 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  i;.    pExpr->iT
2790: 61 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28  able = i = atoi(
27a0: 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a  &pToken->z[1]);.
27b0: 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69      if( i<1 || i
27c0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  >SQLITE_MAX_VARI
27d0: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20  ABLE_NUMBER ){. 
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
2800: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
2810: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
2820: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
2830: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
2840: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
2850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2860: 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29  i>pParse->nVar )
2870: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
2880: 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  nVar = i;.    }.
2890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28a0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
28b0: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
28c0: 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "$aaa".  Reuse t
28d0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
28e0: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61  .    ** number a
28f0: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
2900: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
2910: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
2920: 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68  he name.    ** h
2930: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
2940: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
2950: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
2960: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a  e number.    */.
2970: 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
2980: 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b    n = pToken->n;
2990: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29a0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
29b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
29c0: 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66  pr *pE;.      if
29d0: 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e  ( (pE = pParse->
29e0: 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30  apVarExpr[i])!=0
29f0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45  .          && pE
2a00: 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20  ->token.n==n.   
2a10: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
2a20: 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54  (pE->token.z, pT
2a30: 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29  oken->z, n)==0 )
2a40: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2a50: 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54  >iTable = pE->iT
2a60: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72  able;.        br
2a70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a80: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50   }.    if( i>=pP
2a90: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29  arse->nVarExpr )
2aa0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
2ab0: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2ac0: 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66  ->nVar;.      if
2ad0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  ( pParse->nVarEx
2ae0: 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72  pr>=pParse->nVar
2af0: 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20  ExprAlloc-1 ){. 
2b00: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
2b10: 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20  VarExprAlloc += 
2b20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b30: 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20  Alloc + 10;.    
2b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
2b50: 72 45 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65  rExpr = sqliteRe
2b60: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 70  alloc(pParse->ap
2b70: 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20  VarExpr,.       
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2ba0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61  Alloc*sizeof(pPa
2bb0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30  rse->apVarExpr[0
2bc0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ]) );.      }.  
2bd0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2be0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
2bf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2c00: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
2c10: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
2c20: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c30: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
2c40: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
2c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c60: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   } .}../*.** Rec
2c70: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
2c80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2c90: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
2ca0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78  te3ExprDelete(Ex
2cb0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
2cc0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2cd0: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  f( p->span.dyn )
2ce0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2cf0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
2d00: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
2d10: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2d20: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
2d30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2d40: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
2d50: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2d60: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
2d70: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
2d80: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
2d90: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
2da0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
2db0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2dc0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Free(p);.}.../*.
2dd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2de0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
2df0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
2e00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
2e10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
2e20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
2e30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
2e40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
2e50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
2e60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
2e70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
2e80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
2e90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
2ea0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
2eb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
2ec0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
2ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2ee0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
2ef0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
2f00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
2f20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
2f30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
2f40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
2f50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
2f60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
2f70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
2f80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
2f90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
2fa0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
2fb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
2fc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
2fd0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
2fe0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ff0: 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29  ExprDup(Expr *p)
3000: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3010: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3020: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3030: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3040: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3050: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3060: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
3070: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
3080: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
3090: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
30a0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
30b0: 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  n.z = sqliteStrN
30c0: 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Dup(p->token.z, 
30d0: 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  p->token.n);.   
30e0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
30f0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3100: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
3110: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
3120: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
3130: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
3140: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
3150: 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b  prDup(p->pLeft);
3160: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
3170: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3180: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  (p->pRight);.  p
3190: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
31a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
31b0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65  p->pList);.  pNe
31c0: 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  w->pSelect = sql
31d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
31e0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65  >pSelect);.  pNe
31f0: 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61  w->pTab = p->pTa
3200: 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  b;.  return pNew
3210: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
3220: 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20  TokenCopy(Token 
3230: 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72  *pTo, Token *pFr
3240: 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e  om){.  if( pTo->
3250: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
3260: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
3270: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
3280: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
3290: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
32a0: 6f 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72  o->z = sqliteStr
32b0: 4e 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70  NDup(pFrom->z, p
32c0: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
32d0: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
32e0: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
32f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
3300: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
3310: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
3320: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
3330: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3340: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3350: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3360: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3370: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3380: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3390: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
33a0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
33b0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
33c0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
33d0: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
33e0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
33f0: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
3400: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
3410: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
3420: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3430: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
3440: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
3450: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3460: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
3470: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
3480: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
3490: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
34a0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
34b0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
34c0: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
34d0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
34e0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
34f0: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
3500: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
3510: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  r);.    if( pOld
3520: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
3530: 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20  && pNewExpr ){. 
3540: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d       /* Always m
3550: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
3560: 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c  e span for top-l
3570: 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  evel expressions
3580: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3590: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
35a0: 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20  .  The logic in 
35b0: 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e  SELECT processin
35c0: 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  g that determine
35d0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
35e0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
35f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3600: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
3610: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
3620: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
3630: 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70  py(&pNewExpr->sp
3640: 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73  an, &pOldExpr->s
3650: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pan);.    }.    
3660: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
3670: 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d  ==0 || pNewExpr-
3680: 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20  >span.z!=0 .    
3690: 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45          || pOldE
36a0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c  xpr->span.z==0 |
36b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
36c0: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  _failed );.    p
36d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
36e0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
36f0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3700: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
3710: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
3720: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
3730: 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64  em->isAgg = pOld
3740: 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20  Item->isAgg;.   
3750: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
3760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3770: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
3780: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
3790: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
37a0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
37b0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
37c0: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
37d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
37e0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
37f0: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
3800: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
3810: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
3820: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
3830: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
3840: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
3850: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
3860: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
3870: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
3880: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
3890: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
38a0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
38c0: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
38d0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
38e0: 73 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70  stDup(SrcList *p
38f0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
3900: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
3910: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
3920: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3930: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
3940: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
3950: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
3960: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
3970: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
3980: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3990: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  w( nByte );.  if
39a0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
39b0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
39c0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
39d0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
39e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
39f0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
3a00: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3a10: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
3a20: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
3a30: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3a40: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
3a50: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c  ->a[i];.    Tabl
3a60: 65 20 2a 70 54 61 62 3b 0a 20 20 20 20 70 4e 65  e *pTab;.    pNe
3a70: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
3a80: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
3a90: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
3aa0: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
3ab0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3ac0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3ad0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
3ae0: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
3af0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3b00: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
3b10: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3b20: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
3b30: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
3b40: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
3b50: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
3b60: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 54  >iCursor;.    pT
3b70: 61 62 20 3d 20 70 4e 65 77 49 74 65 6d 2d 3e 70  ab = pNewItem->p
3b80: 54 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  Tab = pOldItem->
3b90: 70 54 61 62 3b 0a 20 20 20 20 69 66 28 20 70 54  pTab;.    if( pT
3ba0: 61 62 20 29 7b 0a 20 20 20 20 20 20 70 54 61 62  ab ){.      pTab
3bb0: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 7d 0a  ->nRef++;.    }.
3bc0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53      pNewItem->pS
3bd0: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
3be0: 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74 65  electDup(pOldIte
3bf0: 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  m->pSelect);.   
3c00: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d   pNewItem->pOn =
3c10: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3c20: 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a  pOldItem->pOn);.
3c30: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
3c40: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
3c50: 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65 6d  ListDup(pOldItem
3c60: 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20 70  ->pUsing);.    p
3c70: 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65 64  NewItem->colUsed
3c80: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f 6c   = pOldItem->col
3c90: 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Used;.  }.  retu
3ca0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
3cb0: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
3cc0: 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a  Dup(IdList *p){.
3cd0: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
3ce0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
3cf0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3d00: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
3d10: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
3d20: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
3d30: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3d40: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
3d50: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
3d60: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
3d70: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
3d80: 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69  ocRaw( p->nId*si
3d90: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
3da0: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
3db0: 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46  0 ){.    sqliteF
3dc0: 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72  ree(pNew);.    r
3dd0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 66  eturn 0;.  }.  f
3de0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
3df0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3e00: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
3e10: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
3e20: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
3e30: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
3e40: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
3e50: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
3e60: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3e70: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3e80: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
3e90: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
3ea0: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
3eb0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3ec0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
3ed0: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
3ee0: 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
3ef0: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3f00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3f10: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3f20: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
3f30: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
3f40: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3f50: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
3f60: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
3f70: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ct;.  pNew->pELi
3f80: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
3f90: 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73  ListDup(p->pELis
3fa0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  t);.  pNew->pSrc
3fb0: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
3fc0: 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20  tDup(p->pSrc);. 
3fd0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
3fe0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3ff0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
4000: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
4010: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
4020: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
4030: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
4040: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4050: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70  p->pHaving);.  p
4060: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
4070: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4080: 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  up(p->pOrderBy);
4090: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
40a0: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
40b0: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
40c0: 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72  ectDup(p->pPrior
40d0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69  );.  pNew->pLimi
40e0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
40f0: 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a 20  up(p->pLimit);. 
4100: 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20 3d   pNew->pOffset =
4110: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4120: 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20 70  p->pOffset);.  p
4130: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
4140: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
4150: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4160: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a  ppOpenTemp = 0;.
4170: 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c 76    pNew->isResolv
4180: 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c 76  ed = p->isResolv
4190: 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67  ed;.  pNew->isAg
41a0: 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20 20  g = p->isAgg;.  
41b0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 23  return pNew;.}.#
41c0: 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71 6c  else.Select *sql
41d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65  ite3SelectDup(Se
41e0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73 65  lect *p){.  asse
41f0: 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65  rt( p==0 );.  re
4200: 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66  turn 0;.}.#endif
4210: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
4220: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
4230: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
4240: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
4250: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
4260: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
4270: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
4280: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
4290: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
42a0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
42b0: 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  nd(ExprList *pLi
42c0: 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  st, Expr *pExpr,
42d0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
42e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
42f0: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
4300: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
4310: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
4320: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
4330: 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20 6e   ){.      goto n
4340: 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20 20  o_mem;.    }.   
4350: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
4360: 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d  nAlloc==0 );.  }
4370: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41  .  if( pList->nA
4380: 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78  lloc<=pList->nEx
4390: 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  pr ){.    struct
43a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
43b0: 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20 70  a;.    int n = p
43c0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b  List->nAlloc*2 +
43d0: 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   4;.    a = sqli
43e0: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
43f0: 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c 69  >a, n*sizeof(pLi
4400: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
4410: 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20 20  if( a==0 ){.    
4420: 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a 20    goto no_mem;. 
4430: 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d 3e     }.    pList->
4440: 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73 74  a = a;.    pList
4450: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20 20  ->nAlloc = n;.  
4460: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
4470: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
4480: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
4490: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
44a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
44b0: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
44c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
44d0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
44e0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
44f0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
4500: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
4510: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
4520: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
4530: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
4540: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
4550: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
4560: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
4570: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
4580: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
4590: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
45a0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
45b0: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  .  sqlite3ExprLi
45c0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
45d0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
45e0: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
45f0: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
4600: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
4610: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
4620: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
4630: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
4640: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
4650: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
4660: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
4670: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
4680: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
4690: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
46a0: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
46b0: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
46c0: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
46d0: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
46e0: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
46f0: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
4700: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
4710: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
4720: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
4730: 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ete(pItem->pExpr
4740: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
4750: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
4760: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
4770: 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
4780: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
4790: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
47a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
47b0: 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63 20  ee.  Call xFunc 
47c0: 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76 69  for each node vi
47d0: 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  sited..**.** The
47e0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
47f0: 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d 69  om xFunc determi
4800: 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65 20  nes whether the 
4810: 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e  tree walk contin
4820: 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20  ues..** 0 means 
4830: 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67  continue walking
4840: 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d 65   the tree.  1 me
4850: 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20  ans do not walk 
4860: 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74  children.** of t
4870: 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65 20  he current node 
4880: 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69 74  but continue wit
4890: 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d  h siblings.  2 m
48a0: 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20  eans abandon.** 
48b0: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63 6f  the tree walk co
48c0: 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20  mpletely..**.** 
48d0: 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  The return value
48e0: 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74 69   from this routi
48f0: 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e 64  ne is 1 to aband
4900: 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  on the tree walk
4910: 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e  .** and 0 to con
4920: 74 69 6e 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63  tinue..*/.static
4930: 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69 73   int walkExprLis
4940: 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e  t(ExprList *, in
4950: 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78  t (*)(void *, Ex
4960: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73  pr*), void *);.s
4970: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
4980: 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45 78  prTree(Expr *pEx
4990: 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  pr, int (*xFunc)
49a0: 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76  (void*,Expr*), v
49b0: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e  oid *pArg){.  in
49c0: 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78 70  t rc;.  if( pExp
49d0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
49e0: 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63 29  .  rc = (*xFunc)
49f0: 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a 20  (pArg, pExpr);. 
4a00: 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20   if( rc==0 ){.  
4a10: 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72    if( walkExprTr
4a20: 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  ee(pExpr->pLeft,
4a30: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4a40: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66  return 1;.    if
4a50: 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70  ( walkExprTree(p
4a60: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78 46  Expr->pRight, xF
4a70: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4a80: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
4a90: 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78 70  alkExprList(pExp
4aa0: 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c  r->pList, xFunc,
4ab0: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4ac0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
4ad0: 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  rc>1;.}../*.** C
4ae0: 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65 65  all walkExprTree
4af0: 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78 70  () for every exp
4b00: 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20  ression in list 
4b10: 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  p..*/.static int
4b20: 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45 78   walkExprList(Ex
4b30: 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20 28  prList *p, int (
4b40: 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20  *xFunc)(void *, 
4b50: 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41  Expr*), void *pA
4b60: 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  rg){.  int i;.  
4b70: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4b80: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
4b90: 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20 30  f( !p ) return 0
4ba0: 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78  ;.  for(i=p->nEx
4bb0: 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20  pr, pItem=p->a; 
4bc0: 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b  i>0; i--, pItem+
4bd0: 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b  +){.    if( walk
4be0: 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d 3e  ExprTree(pItem->
4bf0: 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70 41  pExpr, xFunc, pA
4c00: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4c10: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
4c20: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61  }../*.** Call wa
4c30: 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f 72  lkExprTree() for
4c40: 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69 6f   every expressio
4c50: 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e  n in Select p, n
4c60: 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20  ot including.** 
4c70: 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61 74  expressions that
4c80: 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75 62   are part of sub
4c90: 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79 20  -selects in any 
4ca0: 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20 74  FROM clause or t
4cb0: 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f  he LIMIT.** or O
4cc0: 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f 6e  FFSET expression
4cd0: 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  s...*/.static in
4ce0: 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70 72  t walkSelectExpr
4cf0: 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20  (Select *p, int 
4d00: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
4d10: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
4d20: 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg){.  walkExpr
4d30: 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20  List(p->pEList, 
4d40: 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20  xFunc, pArg);.  
4d50: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e  walkExprTree(p->
4d60: 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20 70  pWhere, xFunc, p
4d70: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
4d80: 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42 79  List(p->pGroupBy
4d90: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
4da0: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
4db0: 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e 63  ->pHaving, xFunc
4dc0: 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45  , pArg);.  walkE
4dd0: 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65  xprList(p->pOrde
4de0: 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  rBy, xFunc, pArg
4df0: 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d  );.  return 0;.}
4e00: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  .../*.** This ro
4e10: 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65  utine is designe
4e20: 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  d as an xFunc fo
4e30: 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
4e40: 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20  ..**.** pArg is 
4e50: 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72  really a pointer
4e60: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e 20   to an integer. 
4e70: 20 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c 20   If we can tell 
4e80: 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74  by looking.** at
4e90: 20 70 45 78 70 72 20 74 68 61 74 20 74 68 65 20   pExpr that the 
4ea0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20  expression that 
4eb0: 63 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20 69  contains pExpr i
4ec0: 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74  s not a constant
4ed0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  .** expression, 
4ee0: 74 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20 74  then set *pArg t
4ef0: 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20 32  o 0 and return 2
4f00: 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20   to abandon the 
4f10: 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66  tree walk..** If
4f20: 20 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65 73   pExpr does does
4f30: 20 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79 20   not disqualify 
4f40: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 66  the expression f
4f50: 72 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e 73  rom being a cons
4f60: 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20  tant.** then do 
4f70: 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41  nothing..**.** A
4f80: 66 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68 65  fter walking the
4f90: 20 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66 20   whole tree, if 
4fa0: 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f 75  no nodes are fou
4fb0: 6e 64 20 74 68 61 74 20 64 69 73 71 75 61 6c 69  nd that disquali
4fc0: 66 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  fy.** the expres
4fd0: 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74  sion as constant
4fe0: 2c 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d 65  , then we assume
4ff0: 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72 65   the whole expre
5000: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73  ssion.** is cons
5010: 74 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69 74  tant.  See sqlit
5020: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
5030: 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61  () for additiona
5040: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
5050: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78 70  /.static int exp
5060: 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 28  rNodeIsConstant(
5070: 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72  void *pArg, Expr
5080: 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 77 69 74   *pExpr){.  swit
5090: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
50a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
50b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
50c0: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
50d0: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
50e0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a  K_AGG_FUNCTION:.
50f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
5100: 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51  TION:.#ifndef SQ
5110: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
5120: 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  RY.    case TK_S
5130: 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65 20  ELECT:.    case 
5140: 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64 69  TK_EXISTS:.#endi
5150: 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a 29  f.      *((int*)
5160: 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20 20  pArg) = 0;.     
5170: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 64   return 2;.    d
5180: 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65  efault:.      re
5190: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f  turn 0;.  }.}../
51a0: 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70  *.** Walk an exp
51b0: 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52  ression tree.  R
51c0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
51d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
51e0: 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69  stant.** and 0 i
51f0: 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61  f it involves va
5200: 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46  riables..**.** F
5210: 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20  or the purposes 
5220: 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e  of this function
5230: 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65  , a double-quote
5240: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61  d string (ex: "a
5250: 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69  bc").** is consi
5260: 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65  dered a variable
5270: 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75   but a single-qu
5280: 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a  oted string (ex:
5290: 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20   'abc') is.** a 
52a0: 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74  constant..*/.int
52b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
52c0: 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b  nstant(Expr *p){
52d0: 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d  .  int isConst =
52e0: 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72   1;.  walkExprTr
52f0: 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49 73  ee(p, exprNodeIs
5300: 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e  Constant, &isCon
5310: 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69 73  st);.  return is
5320: 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Const;.}../*.** 
5330: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
5340: 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e 73  n p codes a cons
5350: 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61  tant integer tha
5360: 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67  t is small enoug
5370: 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61  h.** to fit in a
5380: 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c   32-bit integer,
5390: 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75   return 1 and pu
53a0: 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
53b0: 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e  he integer.** in
53c0: 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68   *pValue.  If th
53d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
53e0: 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f  not an integer o
53f0: 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62  r if it is too b
5400: 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  ig.** to fit in 
5410: 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20  a signed 32-bit 
5420: 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20  integer, return 
5430: 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61  0 and leave *pVa
5440: 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a  lue unchanged..*
5450: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5460: 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72 20  rIsInteger(Expr 
5470: 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29  *p, int *pValue)
5480: 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f  {.  switch( p->o
5490: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
54a0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
54b0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74    if( sqlite3Get
54c0: 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  Int32(p->token.z
54d0: 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  , pValue) ){.   
54e0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
54f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5500: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
5510: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
5520: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
5530: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
5540: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
5550: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  e);.    }.    ca
5560: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
5570: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
5580: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
5590: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
55a0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
55b0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
55c0: 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  v;.        retur
55d0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
55e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
55f0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
5600: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
5610: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
5620: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
5630: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
5640: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
5650: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
5660: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
5670: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
5680: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
5690: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
56a0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
56b0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
56c0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
56d0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
56e0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
56f0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
5700: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
5710: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5720: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
5730: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
5740: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
5750: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
5760: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
5770: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
5780: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
5790: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
57a0: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
57b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
57c0: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
57d0: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
57e0: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
57f0: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
5800: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
5810: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
5820: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
5830: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
5840: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
5850: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
5860: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
5870: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
5880: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
5890: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
58a0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
58b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
58c0: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
58d0: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
58f0: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
5900: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
5910: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
5920: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
5930: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
5940: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
5950: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
5960: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
5970: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
5980: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
5990: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
59a0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
59b0: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
59c0: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
59d0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
59e0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
59f0: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
5a00: 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73   The pDbToken is
5a10: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5a20: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
5a30: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
5a40: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
5a50: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
5a60: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
5a70: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
5a80: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
5a90: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
5aa0: 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f  d.  The pTableTo
5ab0: 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ken is the name 
5ac0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
5ad0: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
5ae0: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
5af0: 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69  LL if pDbToken i
5b00: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66  s also NULL.  If
5b10: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
5b20: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
5b30: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
5b40: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
5b50: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
5b60: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
5b70: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
5b80: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
5b90: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
5ba0: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
5bb0: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
5bc0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
5bd0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
5be0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
5bf0: 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63  turn zero on suc
5c00: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
5c10: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
5c20: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5c30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
5c40: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
5c50: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
5c60: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
5c70: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
5c80: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
5c90: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
5ca0: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
5cb0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
5cc0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
5cd0: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
5ce0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
5cf0: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
5d00: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
5d10: 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74  */.  NameContext
5d20: 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65   *pNC,    /* The
5d30: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75 73   name context us
5d40: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74 68  ed to resolve th
5d50: 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72  e name */.  Expr
5d60: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
5d70: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
5d80: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
5d90: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
5da0: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
5db0: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
5dc0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
5dd0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
5de0: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
5df0: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
5e00: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
5e10: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
5e20: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
5e30: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
5e40: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
5e50: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
5e60: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
5e70: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
5e80: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
5e90: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
5ea0: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
5eb0: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
5ec0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
5ed0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
5ee0: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
5ef0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
5f00: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
5f10: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33  mes */.  sqlite3
5f20: 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64   *db = pParse->d
5f30: 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  b;  /* The datab
5f40: 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74 20  ase */.  struct 
5f50: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
5f60: 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55 73  tem;       /* Us
5f70: 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76  e for looping ov
5f80: 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  er pSrcList item
5f90: 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72  s */.  struct Sr
5fa0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74  cList_item *pMat
5fb0: 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20  ch = 0;  /* The 
5fc0: 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69 73  matching pSrcLis
5fd0: 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65  t item */.  Name
5fe0: 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43 20  Context *pTopNC 
5ff0: 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a  = pNC;        /*
6000: 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65   First nameconte
6010: 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20 2a  xt in the list *
6020: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
6030: 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f  lumnToken && pCo
6040: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20  lumnToken->z ); 
6050: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
6060: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
6070: 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69   */.  zDb = sqli
6080: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
6090: 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54  (pDbToken);.  zT
60a0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
60b0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
60c0: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
60d0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
60e0: 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b  Token(pColumnTok
60f0: 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  en);.  if( sqlit
6100: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
6110: 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f 6f   ){.    goto loo
6120: 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20 7d  kupname_end;.  }
6130: 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ..  pExpr->iTabl
6140: 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65 28  e = -1;.  while(
6150: 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20 29   pNC && cnt==0 )
6160: 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a 70  {.    SrcList *p
6170: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
6180: 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45 78 70  SrcList;.    Exp
6190: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d 20  rList *pEList = 
61a0: 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20 20  pNC->pEList;..  
61b0: 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a 54 61    /* assert( zTa
61c0: 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d  b==0 || pEList==
61d0: 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28 20  0 ); */.    if( 
61e0: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
61f0: 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65 6d    for(i=0, pItem
6200: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69 3c  =pSrcList->a; i<
6210: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
6220: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
6230: 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54         Table *pT
6240: 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62  ab = pItem->pTab
6250: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
6260: 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20 20   *pCol;.  .     
6270: 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29     if( pTab==0 )
6280: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6290: 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
62a0: 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 20  >nCol>0 );.     
62b0: 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20     if( zTab ){. 
62c0: 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49 74           if( pIt
62d0: 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20  em->zAlias ){.  
62e0: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
62f0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65 6d  zTabName = pItem
6300: 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20 20  ->zAlias;.      
6310: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
6320: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
6330: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f  e, zTab)!=0 ) co
6340: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6350: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6360: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
6370: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
6380: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  e;.            i
6390: 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c  f( zTabName==0 |
63a0: 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  | sqlite3StrICmp
63b0: 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29  (zTabName, zTab)
63c0: 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  !=0 ) continue;.
63d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
63e0: 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zDb!=0 && sqlite
63f0: 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62  3StrICmp(db->aDb
6400: 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d  [pTab->iDb].zNam
6410: 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20  e, zDb)!=0 ){.  
6420: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
6430: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
6440: 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a    }.          }.
6450: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6460: 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62    if( 0==(cntTab
6470: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ++) ){.         
6480: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6490: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
64a0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
64b0: 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44  ->iDb = pTab->iD
64c0: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61  b;.          pMa
64d0: 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20  tch = pItem;.   
64e0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 66       }.        f
64f0: 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(j=0, pCol=pTa
6500: 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
6510: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c  >nCol; j++, pCol
6520: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
6530: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
6540: 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a  p(pCol->zName, z
6550: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
6560: 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a 70         IdList *p
6570: 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20 20  Using;.         
6580: 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20     cnt++;.      
6590: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
65a0: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
65b0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
65c0: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
65d0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
65e0: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
65f0: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20  >iDb;.          
6600: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
6610: 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d  the rowid (colum
6620: 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e  n -1) for the IN
6630: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6640: 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 20  Y */.           
6650: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
6660: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
6670: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
6680: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66         pExpr->af
6690: 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61  finity = pTab->a
66a0: 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b  Col[j].affinity;
66b0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
66c0: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
66d0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
66e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
66f0: 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65   pItem->jointype
6700: 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29 7b   & JT_NATURAL ){
6710: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  .              /
6720: 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68 20  * If this match 
6730: 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68 65 20  occurred in the 
6740: 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61 20  left table of a 
6750: 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20 20  natural join,.  
6760: 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 74              ** t
6770: 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69 67  hen skip the rig
6780: 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f 69  ht table to avoi
6790: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
67a0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  tch */.         
67b0: 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20       pItem++;.  
67c0: 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b 3b              i++;
67d0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
67e0: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 28             if( (
67f0: 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d 2d 3e  pUsing = pItem->
6800: 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20 20  pUsing)!=0 ){.  
6810: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49              /* I
6820: 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63 63  f this match occ
6830: 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e 20  urs on a column 
6840: 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20 55  that is in the U
6850: 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20 20  SING clause.    
6860: 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20            ** of 
6870: 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68 65  a join, skip the
6880: 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20 72   search of the r
6890: 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74 68  ight table of th
68a0: 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20 20  e join.         
68b0: 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69 64       ** to avoid
68c0: 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61 74   a duplicate mat
68d0: 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20 20  ch there. */.   
68e0: 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20 6b             int k
68f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;.              
6900: 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69 6e  for(k=0; k<pUsin
6910: 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20 20  g->nId; k++){.  
6920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
6930: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
6940: 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a 4e  (pUsing->a[k].zN
6950: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
6960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
6970: 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20 20     pItem++;.    
6980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b                i+
6990: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  +;.             
69a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
69b0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
69d0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
69e0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
69f0: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
6a00: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
6a10: 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49   }..#ifndef SQLI
6a20: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
6a30: 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76      /* If we hav
6a40: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
6a50: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
6a60: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20   then maybe .   
6a70: 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e   ** it is a new.
6a80: 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67  * or old.* trigg
6a90: 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65  er argument refe
6aa0: 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20  rence.    */.   
6ab0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
6ac0: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
6ad0: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
6ae0: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
6af0: 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a    TriggerStack *
6b00: 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20  pTriggerStack = 
6b10: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
6b20: 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a  k;.      Table *
6b30: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20  pTab = 0;.      
6b40: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
6b50: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
6b60: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
6b70: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
6b80: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  = 0 ){.        p
6b90: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
6ba0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
6bb0: 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73  wIdx;.        as
6bc0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
6bd0: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
6be0: 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69       pTab = pTri
6bf0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b  ggerStack->pTab;
6c00: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
6c10: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
6c20: 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20  oldIdx != -1 && 
6c30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
6c40: 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29  old", zTab)==0 )
6c50: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
6c60: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
6c70: 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b  erStack->oldIdx;
6c80: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6c90: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
6ca0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
6cb0: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
6cc0: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
6cd0: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70    }..      if( p
6ce0: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20  Tab ){ .        
6cf0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 43  int j;.        C
6d00: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
6d10: 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20  ab->aCol;..     
6d20: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
6d30: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
6d40: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
6d50: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20       for(j=0; j 
6d60: 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  < pTab->nCol; j+
6d70: 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20  +, pCol++) {.   
6d80: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
6d90: 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e  e3StrICmp(pCol->
6da0: 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20  zName, zCol)==0 
6db0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6dc0: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20  nt++;.          
6dd0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
6de0: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
6df0: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
6e00: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
6e10: 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e  ffinity = pTab->
6e20: 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79  aCol[j].affinity
6e30: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6e40: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61  xpr->pColl = pTa
6e50: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
6e60: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6e70: 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62  xpr->pTab = pTab
6e80: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62 72  ;.            br
6e90: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  eak;.          }
6ea0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6eb0: 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20   }.    }.#endif 
6ec0: 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49  /* !defined(SQLI
6ed0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29  TE_OMIT_TRIGGER)
6ee0: 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
6ef0: 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20 6e  ** Perhaps the n
6f00: 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65 6e  ame is a referen
6f10: 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a  ce to the ROWID.
6f20: 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63      */.    if( c
6f30: 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d  nt==0 && cntTab=
6f40: 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73 52  =1 && sqlite3IsR
6f50: 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20  owid(zCol) ){.  
6f60: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
6f70: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
6f80: 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45  n = -1;.      pE
6f90: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
6fa0: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
6fb0: 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f  ER;.    }..    /
6fc0: 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20  *.    ** If the 
6fd0: 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65 20  input is of the 
6fe0: 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20  form Z (not Y.Z 
6ff0: 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74  or X.Y.Z) then t
7000: 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a  he name Z.    **
7010: 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f 20   might refer to 
7020: 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c  an result-set al
7030: 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70 65  ias.  This happe
7040: 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c  ns, for example,
7050: 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20   when.    ** we 
7060: 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61  are resolving na
7070: 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52 45  mes in the WHERE
7080: 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66   clause of the f
7090: 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64  ollowing command
70a0: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
70b0: 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41      SELECT a+b A
70c0: 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57  S x FROM table W
70d0: 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a  HERE x<10;.    *
70e0: 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65  *.    ** In case
70f0: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
7100: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
7110: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
7120: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
7130: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
7140: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
7150: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
7160: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
7170: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
7180: 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20     ** Note that 
7190: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
71a0: 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  n the result set
71b0: 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72   should have alr
71c0: 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a  eady been.    **
71d0: 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65   resolved by the
71e0: 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45 20   time the WHERE 
71f0: 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76  clause is resolv
7200: 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  ed..    */.    i
7210: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c  f( cnt==0 && pEL
7220: 69 73 74 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d  ist!=0 && zTab==
7230: 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a  0 ){.      for(j
7240: 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45  =0; j<pEList->nE
7250: 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20  xpr; j++){.     
7260: 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70     char *zAs = p
7270: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d  EList->a[j].zNam
7280: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
7290: 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  As!=0 && sqlite3
72a0: 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f  StrICmp(zAs, zCo
72b0: 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  l)==0 ){.       
72c0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
72d0: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
72e0: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
72f0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
7300: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20  r->op = TK_AS;. 
7310: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
7320: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
7330: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c         pExpr->pL
7340: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
7350: 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a  rDup(pEList->a[j
7360: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
7370: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
7380: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
7390: 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30  Tab==0 && zDb==0
73a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67 6f   );.          go
73b0: 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65 6e  to lookupname_en
73c0: 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  d_2;.        }. 
73d0: 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20       } .    }.. 
73e0: 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f     /* Advance to
73f0: 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20 63   the next name c
7400: 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f  ontext.  The loo
7410: 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65 6e  p will exit when
7420: 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20 77   either.    ** w
7430: 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20 28  e have a match (
7440: 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20 77  cnt>0) or when w
7450: 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d  e run out of nam
7460: 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20  e contexts..    
7470: 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d  */.    if( cnt==
7480: 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d  0 ){.      pNC =
7490: 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20   pNC->pNext;.   
74a0: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a   }.  }..  /*.  *
74b0: 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72 65  * If X and Y are
74c0: 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20   NULL (in other 
74d0: 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68  words if only th
74e0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20  e column name Z 
74f0: 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64  is.  ** supplied
7500: 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20  ) and the value 
7510: 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64  of Z is enclosed
7520: 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65   in double-quote
7530: 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69  s, then.  ** Z i
7540: 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72  s a string liter
7550: 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74  al if it doesn't
7560: 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d   match any colum
7570: 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61  n names.  In tha
7580: 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20  t.  ** case, we 
7590: 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72  need to return r
75a0: 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f  ight away and no
75b0: 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67  t make any chang
75c0: 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72  es to.  ** pExpr
75d0: 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63 61  ..  **.  ** Beca
75e0: 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63 65  use no reference
75f0: 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75 74   was made to out
7600: 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68 65  er contexts, the
7610: 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a 20   pNC->nRef.  ** 
7620: 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20 63  fields are not c
7630: 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63 6f  hanged in any co
7640: 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69 66  ntext..  */.  if
7650: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
7660: 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ==0 && pColumnTo
7670: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29  ken->z[0]=='"' )
7680: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
7690: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zCol);.    retu
76a0: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rn 0;.  }..  /*.
76b0: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
76c0: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
76d0: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
76e0: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
76f0: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
7700: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
7710: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
7720: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
7730: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
7740: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
7750: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
7760: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
7770: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
7780: 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75  n: %s" : "ambigu
7790: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
77a0: 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44   %s";.    if( zD
77b0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
77c0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
77d0: 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20  zDb, ".", zTab, 
77e0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
77f0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
7800: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
7810: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
7820: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
7830: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
7840: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
7850: 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20  StrDup(zCol);.  
7860: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
7870: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7880: 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71  zErr, z);.    sq
7890: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
78a0: 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b   pTopNC->nErr++;
78b0: 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20  .  }..  /* If a 
78c0: 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61  column from a ta
78d0: 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20  ble in pSrcList 
78e0: 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74  is referenced, t
78f0: 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20  hen record.  ** 
7900: 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68 65  this fact in the
7910: 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f   pSrcList.a[].co
7920: 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20  lUsed bitmask.  
7930: 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a  Column 0 causes.
7940: 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65    ** bit 0 to be
7950: 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20   set.  Column 1 
7960: 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64  sets bit 1.  And
7970: 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74   so forth.  If t
7980: 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e  he.  ** column n
7990: 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65 72  umber is greater
79a0: 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72   than the number
79b0: 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65 20   of bits in the 
79c0: 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65  bitmask.  ** the
79d0: 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f  n set the high-o
79e0: 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65 20  rder bit of the 
79f0: 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20  bitmask..  */.  
7a00: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
7a10: 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21  mn>=0 && pMatch!
7a20: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20  =0 ){.    int n 
7a30: 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  = pExpr->iColumn
7a40: 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a  ;.    if( n>=siz
7a50: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29  eof(Bitmask)*8 )
7a60: 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65  {.      n = size
7a70: 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b  of(Bitmask)*8-1;
7a80: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
7a90: 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73  t( pMatch->iCurs
7aa0: 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  or==pExpr->iTabl
7ab0: 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d  e );.    pMatch-
7ac0: 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c 3c 6e  >colUsed |= 1<<n
7ad0: 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61 6d  ;.  }..lookupnam
7ae0: 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65 61  e_end:.  /* Clea
7af0: 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a  n up and return.
7b00: 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65    */.  sqliteFre
7b10: 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65  e(zDb);.  sqlite
7b20: 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71  Free(zTab);.  sq
7b30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7b40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
7b50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
7b60: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
7b70: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
7b80: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
7b90: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
7ba0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
7bb0: 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65 5f  UMN;.lookupname_
7bc0: 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65 46  end_2:.  sqliteF
7bd0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66 28  ree(zCol);.  if(
7be0: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
7bf0: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
7c00: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
7c10: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
7c20: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
7c30: 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61 74  t);.    if( pMat
7c40: 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e 70  ch && !pMatch->p
7c50: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
7c60: 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 4d  pExpr->pTab = pM
7c70: 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20 20  atch->pTab;.    
7c80: 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d 65  }.    /* Increme
7c90: 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c 75  nt the nRef valu
7ca0: 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63 6f  e on all name co
7cb0: 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70 4e  ntexts from TopN
7cc0: 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20 74  C up to.    ** t
7cd0: 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20 74  he point where t
7ce0: 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64 2e  he name matched.
7cf0: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29 7b   */.    for(;;){
7d00: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
7d10: 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20 20  TopNC!=0 );.    
7d20: 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b 2b    pTopNC->nRef++
7d30: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f 70  ;.      if( pTop
7d40: 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b 3b  NC==pNC ) break;
7d50: 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d 20  .      pTopNC = 
7d60: 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20  pTopNC->pNext;. 
7d70: 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e 20     }.    return 
7d80: 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20  0;.  } else {.  
7d90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a    return 1;.  }.
7da0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
7db0: 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65  utine is designe
7dc0: 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f  d as an xFunc fo
7dd0: 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29  r walkExprTree()
7de0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20  ..**.** Resolve 
7df0: 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69  symbolic names i
7e00: 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70  nto TK_COLUMN op
7e10: 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20  erators for the 
7e20: 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20  current.** node 
7e30: 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  in the expressio
7e40: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
7e50: 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68  0 to continue th
7e60: 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a  e search down.**
7e70: 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20 74   the tree or 2 t
7e80: 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65 65  o abort the tree
7e90: 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69   walk..**.** Thi
7ea0: 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64  s routine also d
7eb0: 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69  oes error checki
7ec0: 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f  ng and name reso
7ed0: 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75  lution for.** fu
7ee0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54  nction names.  T
7ef0: 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20  he operator for 
7f00: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
7f10: 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a  ons is changed.*
7f20: 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43  * to TK_AGG_FUNC
7f30: 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  TION..*/.static 
7f40: 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72  int nameResolver
7f50: 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67 2c  Step(void *pArg,
7f60: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
7f70: 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e   NameContext *pN
7f80: 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74  C = (NameContext
7f90: 2a 29 70 41 72 67 3b 0a 20 20 53 72 63 4c 69 73  *)pArg;.  SrcLis
7fa0: 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a 20 20 50  t *pSrcList;.  P
7fb0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a 20  arse *pParse;.. 
7fc0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7fd0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73 65  return 1;.  asse
7fe0: 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20 20  rt( pNC!=0 );.  
7ff0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
8000: 70 53 72 63 4c 69 73 74 3b 0a 20 20 70 50 61 72  pSrcList;.  pPar
8010: 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65  se = pNC->pParse
8020: 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61 73  ;..  if( ExprHas
8030: 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78 70  AnyProperty(pExp
8040: 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29 20  r, EP_Resolved) 
8050: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45 78  ) return 1;.  Ex
8060: 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45  prSetProperty(pE
8070: 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64  xpr, EP_Resolved
8080: 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42 55  );.#ifndef NDEBU
8090: 47 0a 20 20 69 66 28 20 70 53 72 63 4c 69 73 74  G.  if( pSrcList
80a0: 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   ){.    int i;. 
80b0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53     for(i=0; i<pS
80c0: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
80d0: 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +){.      assert
80e0: 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d  ( pSrcList->a[i]
80f0: 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70  .iCursor>=0 && p
8100: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43  SrcList->a[i].iC
8110: 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54  ursor<pParse->nT
8120: 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 23  ab);.    }.  }.#
8130: 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28 20  endif.  switch( 
8140: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8150: 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74 65   /* Double-quote
8160: 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 22  d strings (ex: "
8170: 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20 61  abc") are used a
8180: 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69 66  s identifiers if
8190: 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c 65  .    ** possible
81a0: 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  .  Otherwise the
81b0: 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72 69  y remain as stri
81c0: 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75 6f  ngs.  Single-quo
81d0: 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69 6e  ted.    ** strin
81e0: 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20 61  gs (ex: 'abc') a
81f0: 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e 67  re always string
8200: 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20 2a   literals..    *
8210: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  /.    case TK_ST
8220: 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69 66  RING: {.      if
8230: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  ( pExpr->token.z
8240: 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65 61  [0]=='\'' ) brea
8250: 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c  k;.      /* Fall
8260: 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20 54   thru into the T
8270: 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68 69  K_ID case if thi
8280: 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71 75  s is a double-qu
8290: 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a 20  oted string */. 
82a0: 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c 6f     }.    /* A lo
82b0: 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69 73  ne identifier is
82c0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
82d0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20  olumn..    */.  
82e0: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b 0a    case TK_ID: {.
82f0: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
8300: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
8310: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e  pExpr->token, pN
8320: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
8330: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8340: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62  .  .    /* A tab
8350: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  le name and colu
8360: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e  mn name:     ID.
8370: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64  ID.    ** Or a d
8380: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
8390: 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49  nd column:  ID.I
83a0: 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  D.ID.    */.    
83b0: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20  case TK_DOT: {. 
83c0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c       Token *pCol
83d0: 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  umn;.      Token
83e0: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *pTable;.      
83f0: 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20  Token *pDb;.    
8400: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a    Expr *pRight;.
8410: 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70 53  .      /* if( pS
8420: 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65 61  rcList==0 ) brea
8430: 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69 67  k; */.      pRig
8440: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
8450: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
8460: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
8470: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  ){.        pDb =
8480: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
8490: 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  le = &pExpr->pLe
84a0: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
84b0: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
84c0: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
84d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
84e0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
84f0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
8500: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70          pDb = &p
8510: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
8520: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  en;.        pTab
8530: 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c  le = &pRight->pL
8540: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
8550: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
8560: 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74  Right->pRight->t
8570: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
8580: 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70      lookupName(p
8590: 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62  Parse, pDb, pTab
85a0: 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e 43  le, pColumn, pNC
85b0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
85c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
85d0: 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65 20  .    /* Resolve 
85e0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a 20  function names. 
85f0: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
8600: 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20  K_CONST_FUNC:.  
8610: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
8620: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  ON: {.      Expr
8630: 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
8640: 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f  xpr->pList;    /
8650: 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20 6c  * The argument l
8660: 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ist */.      int
8670: 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69   n = pList ? pLi
8680: 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20  st->nExpr : 0;  
8690: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67  /* Number of arg
86a0: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
86b0: 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63  int no_such_func
86c0: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54   = 0;       /* T
86d0: 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66  rue if no such f
86e0: 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a  unction exists *
86f0: 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e  /.      int wron
8700: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20  g_num_args = 0; 
8710: 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77      /* True if w
8720: 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61  rong number of a
8730: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
8740: 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30    int is_agg = 0
8750: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  ;             /*
8760: 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61   True if is an a
8770: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
8780: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69  n */.      int i
8790: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  ;.      int nId;
87a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
87b0: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
87c0: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66   characters in f
87d0: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a  unction name */.
87e0: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
87f0: 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20   *zId;          
8800: 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
8810: 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20  n name. */.     
8820: 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 20   FuncDef *pDef; 
8830: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8840: 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75  Information abou
8850: 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  t the function *
8860: 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63 20  /.      int enc 
8870: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
8880: 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62  c;  /* The datab
8890: 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a  ase encoding */.
88a0: 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45 78  .      zId = pEx
88b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
88c0: 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d 3e     nId = pExpr->
88d0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 70  token.n;.      p
88e0: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
88f0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
8900: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
8910: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
8920: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
8930: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
8940: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
8950: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
8960: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
8970: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
8980: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
8990: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
89a0: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
89b0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
89c0: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
89d0: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
89e0: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
89f0: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
8a00: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
8a10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8a20: 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d   is_agg && !pNC-
8a30: 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20  >allowAgg ){.   
8a40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8a50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69  rMsg(pParse, "mi
8a60: 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74  suse of aggregat
8a70: 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  e function %.*s(
8a80: 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20  )", nId,zId);.  
8a90: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
8aa0: 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  +;.        is_ag
8ab0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
8ac0: 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66  se if( no_such_f
8ad0: 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73  unc ){.        s
8ae0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8af0: 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20  Parse, "no such 
8b00: 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c  function: %.*s",
8b10: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
8b20: 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b      pNC->nErr++;
8b30: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
8b40: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
8b50: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8b60: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
8b70: 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  e,"wrong number 
8b80: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20  of arguments to 
8b90: 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22  function %.*s()"
8ba0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e  ,.             n
8bb0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
8bc0: 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20    pNC->nErr++;. 
8bd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
8be0: 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20   is_agg ){.     
8bf0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
8c00: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a  K_AGG_FUNCTION;.
8c10: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73          pNC->has
8c20: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d  Agg = 1;.      }
8c30: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
8c40: 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67  g ) pNC->allowAg
8c50: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72  g = 0;.      for
8c60: 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d  (i=0; pNC->nErr=
8c70: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
8c80: 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70  .        walkExp
8c90: 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69  rTree(pList->a[i
8ca0: 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73  ].pExpr, nameRes
8cb0: 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b  olverStep, pNC);
8cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8cd0: 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d  f( is_agg ) pNC-
8ce0: 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20  >allowAgg = 1;. 
8cf0: 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20       /* FIX ME: 
8d00: 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e   Compute pExpr->
8d10: 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f  affinity based o
8d20: 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72  n the expected r
8d30: 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74  eturn.      ** t
8d40: 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ype of the funct
8d50: 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20  ion .      */.  
8d60: 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67      return is_ag
8d70: 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  g;.    }.#ifndef
8d80: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
8d90: 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54  QUERY.    case T
8da0: 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61  K_SELECT:.    ca
8db0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65  se TK_EXISTS:.#e
8dc0: 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
8dd0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _IN: {.      if(
8de0: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
8df0: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
8e00: 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66 3b  Ref = pNC->nRef;
8e10: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8e20: 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70 50  SelectResolve(pP
8e30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
8e40: 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20 20 20  lect, pNC);.    
8e50: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43 2d      assert( pNC-
8e60: 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a 20  >nRef>=nRef );. 
8e70: 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66 21         if( nRef!
8e80: 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20 20  =pNC->nRef ){.  
8e90: 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74 50          ExprSetP
8ea0: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
8eb0: 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20 20  P_VarSelect);.  
8ec0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
8ed0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
8ee0: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rn 0;.}../*.** T
8ef0: 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b  his routine walk
8f00: 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  s an expression 
8f10: 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65  tree and resolve
8f20: 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a  s references to.
8f30: 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73  ** table columns
8f40: 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20  .  Nodes of the 
8f50: 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44  form ID.ID or ID
8f60: 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e   resolve into an
8f70: 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65  .** index to the
8f80: 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61   table in the ta
8f90: 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63  ble list and a c
8fa0: 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54  olumn offset.  T
8fb0: 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f  he .** Expr.opco
8fc0: 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65  de for such node
8fd0: 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20  s is changed to 
8fe0: 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20  TK_COLUMN.  The 
8ff0: 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76  Expr.iTable.** v
9000: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
9010: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
9020: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20 74  the referenced t
9030: 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74  able in pTabList
9040: 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61  .** plus the "ba
9050: 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20  se" value.  The 
9060: 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20  base value will 
9070: 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d  ultimately becom
9080: 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75  e the.** VDBE cu
9090: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
90a0: 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69 73  a cursor that is
90b0: 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74   pointing into t
90c0: 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  he referenced.**
90d0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
90e0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
90f0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
9100: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63  e index of the c
9110: 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65  olumn .** of the
9120: 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c   referenced tabl
9130: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
9140: 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74  lumn value for t
9150: 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f  he special.** RO
9160: 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31  WID column is -1
9170: 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50  .  Any INTEGER P
9180: 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d  RIMARY KEY colum
9190: 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61 6e  n is tried as an
91a0: 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f  .** alias for RO
91b0: 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  WID..**.** Also 
91c0: 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  resolve function
91d0: 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b   names and check
91e0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66   the functions f
91f0: 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61  or proper.** usa
9200: 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  ge.  Make sure a
9210: 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ll function name
9220: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
9230: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
9240: 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63  ns.** have the c
9250: 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66  orrect number of
9260: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
9270: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
9280: 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65  age.** in pParse
9290: 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79  ->zErrMsg if any
92a0: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
92b0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
92c0: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
92d0: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
92e0: 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61  ssion contains a
92f0: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
9300: 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  ns then set the 
9310: 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72  EP_Agg.** proper
9320: 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73  ty on the expres
9330: 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  sion..*/.int sql
9340: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e  ite3ExprResolveN
9350: 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f 6e 74  ames(.  NameCont
9360: 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20 20  ext *pNC,       
9370: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f 20  /* Namespace to 
9380: 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73 69  resolve expressi
9390: 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78 70  ons in. */.  Exp
93a0: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
93b0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
93c0: 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61  ession to be ana
93d0: 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20 69  lyzed. */.){.  i
93e0: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
93f0: 74 75 72 6e 20 30 3b 0a 20 20 77 61 6c 6b 45 78  turn 0;.  walkEx
9400: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61  prTree(pExpr, na
9410: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
9420: 70 4e 43 29 3b 0a 20 20 69 66 28 20 70 4e 43 2d  pNC);.  if( pNC-
9430: 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20 45  >nErr>0 ){.    E
9440: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
9450: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
9460: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45 78  .  }.  return Ex
9470: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
9480: 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a  xpr, EP_Error);.
9490: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e 74  }../*.** A point
94a0: 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  er instance of t
94b0: 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69 73  his structure is
94c0: 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69 6e   used to pass in
94d0: 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68 72  formation.** thr
94e0: 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72 65  ough walkExprTre
94f0: 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71 75  e into codeSubqu
9500: 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74 79  eryStep()..*/.ty
9510: 70 65 64 65 66 20 73 74 72 75 63 74 20 51 75 65  pedef struct Que
9520: 72 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f 64  ryCoder QueryCod
9530: 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72 79  er;.struct Query
9540: 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65 20  Coder {.  Parse 
9550: 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20 2f  *pParse;       /
9560: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f  * The parsing co
9570: 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65 43  ntext */.  NameC
9580: 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20 20  ontext *pNC;    
9590: 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66 20  /* Namespace of 
95a0: 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20  first enclosing 
95b0: 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f 2a  query */.};.../*
95c0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
95d0: 65 20 66 6f 72 20 73 75 62 71 75 65 72 69 65 73  e for subqueries
95e0: 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f 72   and IN operator
95f0: 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f 70 65 72  s..**.** IN oper
9600: 61 74 6f 72 73 20 63 6f 6d 65 73 20 69 6e 20 74  ators comes in t
9610: 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  wo forms:.**.** 
9620: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49            expr I
9630: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20  N (exprlist).** 
9640: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
9650: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
9660: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
9670: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61  first form is ha
9680: 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e  ndled by creatin
9690: 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20  g a set holding 
96a0: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61  the list.** of a
96b0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20  llowed values.  
96c0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
96d0: 63 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43  causes the SELEC
96e0: 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a  T to generate .*
96f0: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  * a temporary ta
9700: 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  ble..*/.#ifndef 
9710: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
9720: 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74 65  UERY.void sqlite
9730: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 50  3CodeSubselect(P
9740: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
9750: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e  pr *pExpr){.  in
9760: 74 20 6c 61 62 65 6c 20 3d 20 30 3b 20 20 20 20  t label = 0;    
9770: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9780: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9790: 61 66 74 65 72 20 73 75 62 2d 73 65 6c 65 63 74  after sub-select
97a0: 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65 20   code */.  Vdbe 
97b0: 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56  *v = sqlite3GetV
97c0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 69  dbe(pParse);.  i
97d0: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
97e0: 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73 20  ;..  /* If this 
97f0: 69 73 20 6e 6f 74 20 61 20 76 61 72 69 61 62 6c  is not a variabl
9800: 65 20 28 63 6f 72 72 65 6c 61 74 65 64 29 20 73  e (correlated) s
9810: 65 6c 65 63 74 2c 20 74 68 65 6e 20 65 78 65 63  elect, then exec
9820: 75 74 65 0a 20 20 2a 2a 20 69 74 20 6f 6e 6c 79  ute.  ** it only
9830: 20 6f 6e 63 65 2e 20 55 6e 6c 65 73 73 20 74 68   once. Unless th
9840: 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 61 20  is is part of a 
9850: 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 2e  trigger program.
9860: 20 49 6e 0a 20 20 2a 2a 20 74 68 61 74 20 63 61   In.  ** that ca
9870: 73 65 20 72 65 2d 65 78 65 63 75 74 65 20 65 76  se re-execute ev
9880: 65 72 79 20 74 69 6d 65 20 28 74 68 69 73 20 63  ery time (this c
9890: 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a 65  ould be optimize
98a0: 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 21  d)..  */.  if( !
98b0: 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72  ExprHasAnyProper
98c0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
98d0: 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61 72  Select) && !pPar
98e0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
98f0: 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20 70  .    int mem = p
9900: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
9910: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9920: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
9930: 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  d, mem, 0);.    
9940: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
9950: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
9960: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9970: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
9980: 30 2c 20 6c 61 62 65 6c 29 3b 0a 20 20 20 20 73  0, label);.    s
9990: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
99a0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31  v, OP_Integer, 1
99b0: 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , 0);.    sqlite
99c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
99d0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d 65 6d 2c 20  _MemStore, mem, 
99e0: 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  1);.  }..  if( p
99f0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
9a00: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
9a10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 43  AddOp(v, OP_AggC
9a20: 6f 6e 74 65 78 74 50 75 73 68 2c 20 30 2c 20 30  ontextPush, 0, 0
9a30: 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63 68  );.  }..  switch
9a40: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
9a50: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
9a60: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
9a70: 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79 49  nity;.      KeyI
9a80: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20  nfo keyInfo;.   
9a90: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
9aa0: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
9ab0: 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e  f OP_OpenTemp in
9ac0: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
9ad0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
9ae0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9af0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
9b00: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
9b10: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
9b20: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
9b30: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
9b40: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
9b50: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
9b60: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
9b70: 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70  same way. A temp
9b80: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a  orary table is .
9b90: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
9ba0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
9bb0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
9bc0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
9bd0: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
9be0: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
9bf0: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
9c00: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
9c10: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
9c20: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
9c30: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
9c40: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
9c50: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
9c60: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
9c70: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
9c80: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
9c90: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
9ca0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
9cb0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
9cc0: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
9cd0: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
9ce0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
9cf0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
9d00: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
9d10: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
9d20: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
9d30: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
9d40: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
9d50: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
9d60: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
9d70: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
9d80: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
9d90: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
9da0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
9db0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
9dc0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
9dd0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9de0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
9df0: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
9e00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9e10: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
9e20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
9e30: 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  0);.      memset
9e40: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
9e50: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
9e60: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
9e70: 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ield = 1;.      
9e80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9e90: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
9ea0: 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  umns, pExpr->iTa
9eb0: 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ble, 1);..      
9ec0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
9ed0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
9ee0: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
9ef0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
9f00: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
9f10: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
9f20: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
9f30: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
9f40: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
9f50: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
9f60: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
9f70: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
9f80: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
9f90: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
9fa0: 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69  iParm = pExpr->i
9fb0: 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29  Table +  (((int)
9fc0: 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a  affinity)<<16);.
9fd0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
9fe0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
9ff0: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
a000: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
a010: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
a020: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ble );.        s
a030: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
a040: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
a050: 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50  ect, SRT_Set, iP
a060: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  arm, 0, 0, 0, 0)
a070: 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
a080: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
a090: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
a0a0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
a0b0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
a0c0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
a0d0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
a0e0: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
a0f0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
a100: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
a110: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
a120: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
a130: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a140: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
a150: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
a160: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
a170: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
a180: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  st).        **..
a190: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
a1a0: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
a1b0: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
a1c0: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
a1d0: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
a1e0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
a1f0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
a200: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
a210: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
a220: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
a230: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
a240: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
a250: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
a260: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
a270: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
a280: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
a290: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
a2a0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
a2b0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
a2c0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
a2d0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
a2e0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
a2f0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a300: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
a310: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
a320: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
a330: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
a340: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
a350: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
a360: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
a370: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
a380: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
a390: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
a3a0: 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72  xpr *pE2 = pExpr
a3b0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
a3c0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
a3d0: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
a3e0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a3f0: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c  constant and val
a400: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  id. */.         
a410: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
a420: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
a430: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a440: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a450: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
a460: 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e        "right-han
a470: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65  d side of IN ope
a480: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f  rator must be co
a490: 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20  nstant");.      
a4a0: 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20        return;.  
a4b0: 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20          }..     
a4c0: 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65       /* Evaluate
a4d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
a4e0: 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e  and insert it in
a4f0: 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c  to the temp tabl
a500: 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73  e */.          s
a510: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a520: 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20  Parse, pE2);.   
a530: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a540: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65  beOp3(v, OP_Make
a550: 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61  Record, 1, 0, &a
a560: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
a570: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a580: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 64  beAddOp(v, OP_Id
a590: 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72 2d 3e  xInsert, pExpr->
a5a0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
a5b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
a5c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
a5d0: 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c  hangeP3(v, addr,
a5e0: 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66   (void *)&keyInf
a5f0: 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a  o, P3_KEYINFO);.
a600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a610: 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   }..    case TK_
a620: 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73 65  EXISTS:.    case
a630: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
a640: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
a650: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
a660: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
a670: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
a680: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
a690: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
a6a0: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
a6b0: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
a6c0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
a6d0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
a6e0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
a6f0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
a700: 20 73 6f 70 3b 0a 20 20 20 20 20 20 53 65 6c 65   sop;.      Sele
a710: 63 74 20 2a 70 53 65 6c 3b 0a 0a 20 20 20 20 20  ct *pSel;..     
a720: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
a730: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
a740: 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70  ;.      pSel = p
a750: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b 0a 20  Expr->pSelect;. 
a760: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a770: 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b  op==TK_SELECT ){
a780: 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d 20 53  .        sop = S
a790: 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 7d 65  RT_Mem;.      }e
a7a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 74 61  lse{.        sta
a7b0: 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65 6e 20  tic const Token 
a7c0: 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20 30 2c 20  one = { "1", 0, 
a7d0: 31 20 7d 3b 0a 20 20 20 20 20 20 20 20 73 6f 70  1 };.        sop
a7e0: 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b 0a 20   = SRT_Exists;. 
a7f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a800: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 53 65  prListDelete(pSe
a810: 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 20 20  l->pEList);.    
a820: 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69 73 74      pSel->pEList
a830: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
a840: 73 74 41 70 70 65 6e 64 28 30 2c 20 0a 20 20 20  stAppend(0, .   
a850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a870: 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30  pr(TK_INTEGER, 0
a880: 2c 20 30 2c 20 26 6f 6e 65 29 2c 20 30 29 3b 0a  , 0, &one), 0);.
a890: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a8a0: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
a8b0: 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c 20 70  se, pSel, sop, p
a8c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30  Expr->iColumn, 0
a8d0: 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  , 0, 0, 0);.    
a8e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a8f0: 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70 72 2d   }..  if( pExpr-
a900: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
a910: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a920: 28 76 2c 20 4f 50 5f 41 67 67 43 6f 6e 74 65 78  (v, OP_AggContex
a930: 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 7d  tPop, 0, 0);.  }
a940: 0a 20 20 69 66 28 20 6c 61 62 65 6c 3c 30 20 29  .  if( label<0 )
a950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a960: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
a970: 20 6c 61 62 65 6c 29 3b 0a 20 20 7d 0a 20 20 72   label);.  }.  r
a980: 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69 66 20  eturn;.}.#endif 
a990: 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53  /* SQLITE_OMIT_S
a9a0: 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a  UBQUERY */../*.*
a9b0: 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e  * Generate an in
a9c0: 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77  struction that w
a9d0: 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65  ill put the inte
a9e0: 67 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a  ger describe by.
a9f0: 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31  ** text z[0..n-1
aa00: 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a  ] on the stack..
aa10: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63  */.static void c
aa20: 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20  odeInteger(Vdbe 
aa30: 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  *v, const char *
aa40: 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74  z, int n){.  int
aa50: 20 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65   i;.  if( sqlite
aa60: 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29  3GetInt32(z, &i)
aa70: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
aa80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
aa90: 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b 0a 20  nteger, i, 0);. 
aaa0: 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c 69 74   }else if( sqlit
aab0: 65 33 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a  e3FitsIn64Bits(z
aac0: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
aad0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  VdbeOp3(v, OP_In
aae0: 74 65 67 65 72 2c 20 30 2c 20 30 2c 20 7a 2c 20  teger, 0, 0, z, 
aaf0: 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  n);.  }else{.   
ab00: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
ab10: 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30  v, OP_Real, 0, 0
ab20: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a  , z, n);.  }.}..
ab30: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
ab40: 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63 75 72  ode into the cur
ab50: 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65 76 61  rent Vdbe to eva
ab60: 6c 75 61 74 65 20 74 68 65 20 67 69 76 65 6e 0a  luate the given.
ab70: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  ** expression an
ab80: 64 20 6c 65 61 76 65 20 74 68 65 20 72 65 73 75  d leave the resu
ab90: 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20 6f 66  lt on the top of
aba0: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68   stack..**.** Th
abb0: 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73 20  is code depends 
abc0: 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61 74  on the fact that
abd0: 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76   certain token v
abe0: 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45 51  alues (ex: TK_EQ
abf0: 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61 6d  ).** are the sam
ac00: 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c 75  e as opcode valu
ac10: 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20 74  es (ex: OP_Eq) t
ac20: 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68  hat implement th
ac30: 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a  e corresponding.
ac40: 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53  ** operation.  S
ac50: 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20  pecial comments 
ac60: 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74 68  in vdbe.c and th
ac70: 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20  e mkopcodeh.awk 
ac80: 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65  script in.** the
ac90: 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63 61   make process ca
aca0: 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65 73  use these values
acb0: 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73 65   to align.  Asse
acc0: 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f 64  rt()s in the cod
acd0: 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69 66  e.** below verif
ace0: 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62 65  y that the numbe
acf0: 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20 63  rs are aligned c
ad00: 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69  orrectly..*/.voi
ad10: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
ad20: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
ad30: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
ad40: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
ad50: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
ad60: 6f 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  op;.  if( v==0 )
ad70: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
ad80: 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Expr==0 ){.    s
ad90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ada0: 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30  v, OP_Null, 0, 0
adb0: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20  );.    return;. 
adc0: 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d   }.  op = pExpr-
add0: 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f  >op;.  switch( o
ade0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
adf0: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
ae00: 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 66 69   if( !pParse->fi
ae10: 6c 6c 41 67 67 20 26 26 20 70 45 78 70 72 2d 3e  llAgg && pExpr->
ae20: 69 41 67 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20  iAgg>=0 ){.     
ae30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ae40: 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74  dOp(v, OP_AggGet
ae50: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78  , pExpr->iAggCtx
ae60: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
ae70: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
ae80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
ae90: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
aea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aeb0: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
aec0: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
aed0: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20  ->iColumn);.    
aee0: 20 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d      sqlite3Colum
aef0: 6e 44 65 66 61 75 6c 74 28 76 2c 20 70 45 78 70  nDefault(v, pExp
af00: 72 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e  r->pTab, pExpr->
af10: 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20  iColumn);.      
af20: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
af30: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
af40: 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 70 45 78  v, OP_Rowid, pEx
af50: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
af60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
af70: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
af80: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
af90: 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65  {.      codeInte
afa0: 67 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f  ger(v, pExpr->to
afb0: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
afc0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72  ken.n);.      br
afd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
afe0: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
aff0: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
b000: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b010: 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52  ( TK_FLOAT==OP_R
b020: 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eal );.      ass
b030: 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d  ert( TK_STRING==
b040: 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20  OP_String8 );.  
b050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
b060: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
b070: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
b080: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
b090: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b0a0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
b0b0: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
b0c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b0d0: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
b0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b0f0: 70 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30 2c  p(v, OP_Null, 0,
b100: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b110: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
b120: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42  SQLITE_OMIT_BLOB
b130: 5f 4c 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73  _LITERAL.    cas
b140: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
b150: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c     assert( TK_BL
b160: 4f 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29  OB==OP_HexBlob )
b170: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b180: 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c  dbeOp3(v, op, 0,
b190: 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e   0, pExpr->token
b1a0: 2e 7a 2b 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  .z+1, pExpr->tok
b1b0: 65 6e 2e 6e 2d 31 29 3b 0a 20 20 20 20 20 20 73  en.n-1);.      s
b1c0: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
b1d0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
b1e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
b1f0: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
b200: 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20  K_VARIABLE: {.  
b210: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b220: 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61  ddOp(v, OP_Varia
b230: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  ble, pExpr->iTab
b240: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66  le, 0);.      if
b250: 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  ( pExpr->token.n
b260: 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  >1 ){.        sq
b270: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
b280: 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e  3(v, -1, pExpr->
b290: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
b2a0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
b2b0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b2c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b2d0: 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20  _REGISTER: {.   
b2e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b2f0: 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61  dOp(v, OP_MemLoa
b300: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
b310: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
b320: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b330: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
b340: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
b350: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
b360: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
b370: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
b380: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
b390: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
b3a0: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
b3b0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
b3c0: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
b3d0: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
b3e0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
b3f0: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
b400: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b410: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
b420: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b430: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
b440: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b450: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b460: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b470: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b480: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b490: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
b4a0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
b4b0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
b4c0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
b4d0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
b4e0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b4f0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a     case TK_AND:.
b500: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a      case TK_OR:.
b510: 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53      case TK_PLUS
b520: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  :.    case TK_ST
b530: 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AR:.    case TK_
b540: 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20  MINUS:.    case 
b550: 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
b560: 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20   TK_BITAND:.    
b570: 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20  case TK_BITOR:. 
b580: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
b590: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  :.    case TK_LS
b5a0: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
b5b0: 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63  K_RSHIFT: .    c
b5c0: 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b  ase TK_CONCAT: {
b5d0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b5e0: 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b  K_AND==OP_And );
b5f0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b600: 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20  K_OR==OP_Or );. 
b610: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b620: 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a  PLUS==OP_Add );.
b630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b640: 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72  _MINUS==OP_Subtr
b650: 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  act );.      ass
b660: 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f  ert( TK_REM==OP_
b670: 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20  Remainder );.   
b680: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
b690: 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20  TAND==OP_BitAnd 
b6a0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b6b0: 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69   TK_BITOR==OP_Bi
b6c0: 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  tOr );.      ass
b6d0: 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f  ert( TK_SLASH==O
b6e0: 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20  P_Divide );.    
b6f0: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48    assert( TK_LSH
b700: 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66  IFT==OP_ShiftLef
b710: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
b720: 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50  t( TK_RSHIFT==OP
b730: 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20  _ShiftRight );. 
b740: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b750: 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61  CONCAT==OP_Conca
b760: 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  t );.      sqlit
b770: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b780: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b790: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b7a0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b7b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
b7c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b7d0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
b7e0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b7f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b800: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
b810: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
b820: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
b830: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4c        assert( pL
b840: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28  eft );.      if(
b850: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
b860: 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f  LOAT || pLeft->o
b870: 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b  p==TK_INTEGER ){
b880: 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  .        Token *
b890: 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65  p = &pLeft->toke
b8a0: 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  n;.        char 
b8b0: 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  *z = sqliteMallo
b8c0: 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20  c( p->n + 2 );. 
b8d0: 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a         sprintf(z
b8e0: 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c  , "-%.*s", p->n,
b8f0: 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20   p->z);.        
b900: 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54  if( pLeft->op==T
b910: 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20  K_FLOAT ){.     
b920: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b930: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
b940: 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29  0, 0, z, p->n+1)
b950: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
b960: 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65 49  .          codeI
b970: 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e  nteger(v, z, p->
b980: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  n+1);.        }.
b990: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46 72          sqliteFr
b9a0: 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62  ee(z);.        b
b9b0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20  reak;.      }.  
b9c0: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f      /* Fall thro
b9d0: 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20  ugh into TK_NOT 
b9e0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  */.    }.    cas
b9f0: 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20  e TK_BITNOT:.   
ba00: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
ba10: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
ba20: 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e  _BITNOT==OP_BitN
ba30: 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  ot );.      asse
ba40: 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e  rt( TK_NOT==OP_N
ba50: 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ot );.      sqli
ba60: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ba70: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ba80: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ba90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
baa0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
bab0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bac0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
bad0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
bae0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
baf0: 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65  dest;.      asse
bb00: 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
bb10: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
bb20: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
bb30: 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
bb40: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
bb50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bb60: 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b  _Integer, 1, 0);
bb70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bb80: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
bb90: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
bba0: 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74      dest = sqlit
bbb0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
bbc0: 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20  r(v) + 2;.      
bbd0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bbe0: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
bbf0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bc00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
bc10: 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20  ddImm, -1, 0);. 
bc20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bc30: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
bc40: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
bc50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bc60: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
bc70: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
bc80: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
bc90: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bca0: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
bcb0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
bcc0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
bcd0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
bce0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
bcf0: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
bd00: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
bd10: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
bd20: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
bd30: 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
bd40: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
bd50: 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  Id;.      int p2
bd60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
bd70: 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  i;.      u8 enc 
bd80: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
bd90: 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  c;.      CollSeq
bda0: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
bdb0: 20 20 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e     zId = pExpr->
bdc0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e  token.z;.      n
bdd0: 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  Id = pExpr->toke
bde0: 6e 2e 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20  n.n;.      pDef 
bdf0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
be00: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
be10: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70  , zId, nId, nExp
be20: 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  r, enc, 0);.    
be30: 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d    assert( pDef!=
be40: 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  0 );.      nExpr
be50: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
be60: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
be70: 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  e, pList);.     
be80: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
be90: 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
bea0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
beb0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
bec0: 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
bed0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
bee0: 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b     p2 |= (1<<i);
bef0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
bf00: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
bf10: 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
bf20: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
bf30: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
bf40: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
bf50: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
bf60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
bf70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
bf80: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
bf90: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
bfa0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
bfb0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
bfc0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
bfd0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bfe0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
bff0: 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
c000: 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
c010: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
c020: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c030: 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  3(v, OP_Function
c040: 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68  , nExpr, p2, (ch
c050: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
c060: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65  CDEF);.      bre
c070: 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
c080: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
c090: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
c0a0: 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
c0b0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
c0c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f  .      sqlite3Co
c0d0: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
c0e0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
c0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c100: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
c110: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
c120: 2c 20 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65  , 0);.      Vdbe
c130: 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c  Comment((v, "# l
c140: 6f 61 64 20 73 75 62 71 75 65 72 79 20 72 65 73  oad subquery res
c150: 75 6c 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72  ult"));.      br
c160: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c170: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
c180: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
c190: 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74 79     char affinity
c1a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 43  ;.      sqlite3C
c1b0: 6f 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61  odeSubselect(pPa
c1c0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20  rse, pExpr);..  
c1d0: 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75      /* Figure ou
c1e0: 74 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74  t the affinity t
c1f0: 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20  o use to create 
c200: 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72  a key from the r
c210: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
c220: 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  of the expressio
c230: 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73  n. affinityStr s
c240: 74 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73  tores a static s
c250: 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66  tring suitable f
c260: 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f  or.      ** P3 o
c270: 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e  f OP_MakeRecord.
c280: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c290: 61 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61  affinity = compa
c2a0: 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45  risonAffinity(pE
c2b0: 78 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  xpr);..      sql
c2c0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c2d0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
c2e0: 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  0);..      /* Co
c2f0: 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  de the <expr> fr
c300: 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
c310: 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72  ..)". The tempor
c320: 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ary table.      
c330: 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
c340: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
c350: 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
c360: 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e  p the (...) set.
c370: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c380: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c390: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c3a0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
c3b0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
c3c0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
c3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c3e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
c3f0: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29  ull, -1, addr+4)
c400: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
c410: 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20  addr + 0 */.    
c420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c430: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c  Op(v, OP_Pop, 2,
c440: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c450: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c460: 50 5f 4e 75 6c 6c 2c 20 30 2c 20 30 29 3b 0a 20  P_Null, 0, 0);. 
c470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c480: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c490: 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20  , 0, addr+7);.  
c4a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
c4b0: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
c4c0: 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66 69  ord, 1, 0, &affi
c4d0: 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20 61  nity, 1);   /* a
c4e0: 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20  ddr + 4 */.     
c4f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c500: 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70  p(v, OP_Found, p
c510: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64  Expr->iTable, ad
c520: 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+7);.      sql
c530: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c540: 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20   OP_AddImm, -1, 
c550: 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  0);             
c560: 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 36       /* addr + 6
c570: 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61 6b   */..      break
c580: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
c590: 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
c5a0: 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  EN: {.      Expr
c5b0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
c5c0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74  >pLeft;.      st
c5d0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
c5e0: 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78  em *pLItem = pEx
c5f0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20  pr->pList->a;.  
c600: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
c610: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
c620: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c630: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c640: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c650: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c660: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
c670: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c680: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c690: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
c6a0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
c6b0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
c6c0: 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20   OP_Ge, 0, 0);. 
c6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c6e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c  AddOp(v, OP_Pull
c6f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70  , 1, 0);.      p
c700: 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70  LItem++;.      p
c710: 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
c720: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
c730: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c740: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
c750: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
c760: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
c770: 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c  Right, OP_Le, 0,
c780: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c790: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c7a0: 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20  P_And, 0, 0);.  
c7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c7c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
c7d0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
c7e0: 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  AS: {.      sqli
c7f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c800: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c810: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c820: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c830: 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20  K_CASE: {.      
c840: 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  int expr_end_lab
c850: 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75  el;.      int ju
c860: 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e  mpInst;.      in
c870: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e  t addr;.      in
c880: 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69  t nExpr;.      i
c890: 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72  nt i;.      Expr
c8a0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
c8b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
c8c0: 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65  ist_item *aListe
c8d0: 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  lem;..      asse
c8e0: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29  rt(pExpr->pList)
c8f0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28  ;.      assert((
c900: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
c910: 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a  xpr % 2) == 0);.
c920: 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78        assert(pEx
c930: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
c940: 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c   > 0);.      pEL
c950: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
c960: 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65  st;.      aListe
c970: 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b  lem = pEList->a;
c980: 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70  .      nExpr = p
c990: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  EList->nExpr;.  
c9a0: 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62      expr_end_lab
c9b0: 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  el = sqlite3Vdbe
c9c0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
c9d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c9e0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
c9f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ca00: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ca10: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
ca20: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
ca30: 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20  nExpr; i=i+2){. 
ca40: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ca50: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
ca60: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
ca70: 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  r);.        if( 
ca80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
ca90: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
caa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
cab0: 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20  _Dup, 1, 1);.   
cac0: 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20         jumpInst 
cad0: 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50  = codeCompare(pP
cae0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
caf0: 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  ft, aListelem[i]
cb00: 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20  .pExpr,.        
cb10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb20: 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20           OP_Ne, 
cb30: 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 1);.         
cb40: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
cb50: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
cb60: 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  0);.        }els
cb70: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  e{.          jum
cb80: 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56  pInst = sqlite3V
cb90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
cba0: 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20  fNot, 1, 0);.   
cbb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
cbc0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
cbd0: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
cbe0: 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  [i+1].pExpr);.  
cbf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cc00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
cc10: 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c  o, 0, expr_end_l
cc20: 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61  abel);.        a
cc30: 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ddr = sqlite3Vdb
cc40: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
cc50: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cc60: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
cc70: 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b  jumpInst, addr);
cc80: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
cc90: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
cca0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
ccb0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ccc0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
ccd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cce0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b  pExpr->pRight ){
ccf0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
cd00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
cd10: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
cd20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
cd30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd40: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 75 6c  eAddOp(v, OP_Nul
cd50: 6c 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 0, 0);.      
cd60: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
cd70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
cd80: 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  v, expr_end_labe
cd90: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
cda0: 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53  .    }.#ifndef S
cdb0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47  QLITE_OMIT_TRIGG
cdc0: 45 52 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  ER.    case TK_R
cdd0: 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 66  AISE: {.      if
cde0: 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53  ( !pParse->trigS
cdf0: 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20 20  tack ){.        
ce00: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
ce10: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
ce20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
ce30: 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79  RAISE() may only
ce40: 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e 20   be used within 
ce50: 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72 61  a trigger-progra
ce60: 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20  m");..return;.  
ce70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
ce80: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  pExpr->iColumn!=
ce90: 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20 20 20  OE_Ignore ){.   
cea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
ceb0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45  xpr->iColumn==OE
cec0: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20 20 20  _Rollback ||.   
ced0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45                pE
cee0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
cef0: 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20 20 20  OE_Abort ||.    
cf00: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
cf10: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
cf20: 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20 20 20  E_Fail );.      
cf30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
cf40: 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51  3(v, OP_Halt, SQ
cf50: 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c  LITE_CONSTRAINT,
cf60: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
cf70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf80: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
cf90: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
cfa0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
cfb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65     sqlite3VdbeDe
cfc0: 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a  quoteP3(v, -1);.
cfd0: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 20        } else {. 
cfe0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
cff0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
d000: 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 20  = OE_Ignore );. 
d010: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
d020: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
d030: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
d040: 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  ;.         sqlit
d050: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
d060: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
d070: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
d080: 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20 20 20  noreJump);.     
d090: 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
d0a0: 28 76 2c 20 22 23 20 72 61 69 73 65 28 49 47 4e  (v, "# raise(IGN
d0b0: 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20 20 7d  ORE)"));.      }
d0c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
d0d0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a    break;.  }.}..
d0e0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
d0f0: 4d 49 54 5f 54 52 49 47 47 45 52 0a 2f 2a 0a 2a  MIT_TRIGGER./*.*
d100: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d110: 74 68 61 74 20 65 76 61 6c 75 74 65 73 20 74 68  that evalutes th
d120: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
d130: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 74 68  on and leaves th
d140: 65 20 72 65 73 75 6c 74 0a 2a 2a 20 6f 6e 20 74  e result.** on t
d150: 68 65 20 73 74 61 63 6b 2e 20 20 53 65 65 20 61  he stack.  See a
d160: 6c 73 6f 20 73 71 6c 69 74 65 33 45 78 70 72 43  lso sqlite3ExprC
d170: 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ode()..**.** Thi
d180: 73 20 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20  s routine might 
d190: 61 6c 73 6f 20 63 61 63 68 65 20 74 68 65 20 72  also cache the r
d1a0: 65 73 75 6c 74 20 61 6e 64 20 6d 6f 64 69 66 79  esult and modify
d1b0: 20 74 68 65 20 70 45 78 70 72 20 74 72 65 65 0a   the pExpr tree.
d1c0: 2a 2a 20 73 6f 20 74 68 61 74 20 69 74 20 77 69  ** so that it wi
d1d0: 6c 6c 20 6d 61 6b 65 20 75 73 65 20 6f 66 20 74  ll make use of t
d1e0: 68 65 20 63 61 63 68 65 64 20 72 65 73 75 6c 74  he cached result
d1f0: 20 6f 6e 20 73 75 62 73 65 71 75 65 6e 74 20 65   on subsequent e
d200: 76 61 6c 75 61 74 69 6f 6e 73 0a 2a 2a 20 72 61  valuations.** ra
d210: 74 68 65 72 20 74 68 61 6e 20 65 76 61 6c 75 61  ther than evalua
d220: 74 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70  te the whole exp
d230: 72 65 73 73 69 6f 6e 20 61 67 61 69 6e 2e 20 20  ression again.  
d240: 54 72 69 76 69 61 6c 20 65 78 70 72 65 73 73 69  Trivial expressi
d250: 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e 6f 74 20 63  ons are.** not c
d260: 61 63 68 65 64 2e 20 20 49 66 20 74 68 65 20 65  ached.  If the e
d270: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 61 63  xpression is cac
d280: 68 65 64 2c 20 69 74 73 20 72 65 73 75 6c 74 20  hed, its result 
d290: 69 73 20 73 74 6f 72 65 64 20 69 6e 20 61 20 0a  is stored in a .
d2a0: 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69  ** memory locati
d2b0: 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  on..*/.void sqli
d2c0: 74 65 33 45 78 70 72 43 6f 64 65 41 6e 64 43 61  te3ExprCodeAndCa
d2d0: 63 68 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  che(Parse *pPars
d2e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
d2f0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
d300: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
d310: 74 20 69 4d 65 6d 3b 0a 20 20 69 6e 74 20 61 64  t iMem;.  int ad
d320: 64 72 31 2c 20 61 64 64 72 32 3b 0a 20 20 69 66  dr1, addr2;.  if
d330: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
d340: 0a 20 20 61 64 64 72 31 20 3d 20 73 71 6c 69 74  .  addr1 = sqlit
d350: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
d360: 72 28 76 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  r(v);.  sqlite3E
d370: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
d380: 70 45 78 70 72 29 3b 0a 20 20 61 64 64 72 32 20  pExpr);.  addr2 
d390: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
d3a0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 69  rentAddr(v);.  i
d3b0: 66 28 20 61 64 64 72 32 3e 61 64 64 72 31 2b 31  f( addr2>addr1+1
d3c0: 20 7c 7c 20 73 71 6c 69 74 65 33 56 64 62 65 47   || sqlite3VdbeG
d3d0: 65 74 4f 70 28 76 2c 20 61 64 64 72 31 29 2d 3e  etOp(v, addr1)->
d3e0: 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46 75 6e 63 74  opcode==OP_Funct
d3f0: 69 6f 6e 20 29 7b 0a 20 20 20 20 69 4d 65 6d 20  ion ){.    iMem 
d400: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
d410: 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b  = pParse->nMem++
d420: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
d430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
d440: 53 74 6f 72 65 2c 20 69 4d 65 6d 2c 20 30 29 3b  Store, iMem, 0);
d450: 0a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d  .    pExpr->op =
d460: 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
d470: 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a 2f 2a 0a 2a  }.}.#endif../*.*
d480: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
d490: 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20  that pushes the 
d4a0: 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65  value of every e
d4b0: 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69  lement of the gi
d4c0: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
d4d0: 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20  n list onto the 
d4e0: 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74  stack..**.** Ret
d4f0: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
d500: 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65  f elements pushe
d510: 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  d onto the stack
d520: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
d530: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
d540: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
d550: 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e  e,     /* Parsin
d560: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45  g context */.  E
d570: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20  xprList *pList  
d580: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
d590: 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63  ion list to be c
d5a0: 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72  oded */.){.  str
d5b0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
d5c0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
d5d0: 69 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b  i, n;.  Vdbe *v;
d5e0: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
d5f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20  ) return 0;.  v 
d600: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
d610: 28 70 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20  (pParse);.  n = 
d620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
d630: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
d640: 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
d650: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
d660: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
d670: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
d680: 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65  pExpr);.  }.  re
d690: 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn n;.}../*.**
d6a0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
d6b0: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
d6c0: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
d6d0: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
d6e0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
d6f0: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
d700: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
d710: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
d720: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
d730: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
d740: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
d750: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
d760: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
d770: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
d780: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
d790: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
d7a0: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
d7b0: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
d7c0: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
d7d0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
d7e0: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
d7f0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
d800: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
d810: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
d820: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
d830: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
d840: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
d850: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
d860: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
d870: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
d880: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
d890: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
d8a0: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
d8b0: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
d8c0: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
d8d0: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
d8e0: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
d8f0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
d900: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
d910: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
d920: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
d930: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
d940: 65 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72  e3ExprIfTrue(Par
d950: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
d960: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73   *pExpr, int des
d970: 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  t, int jumpIfNul
d980: 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  l){.  Vdbe *v = 
d990: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
d9a0: 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69   int op = 0;.  i
d9b0: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
d9c0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
d9d0: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
d9e0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
d9f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
da00: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
da10: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
da20: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
da30: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
da40: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
da50: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
da60: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
da70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
da80: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
da90: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
daa0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
dab0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
dac0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
dad0: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
dae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
daf0: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
db00: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
db10: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
db20: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
db30: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
db40: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
db50: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
db60: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
db70: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
db80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
db90: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
dba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
dbb0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
dbc0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
dbd0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
dbe0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
dbf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
dc00: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
dc10: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
dc20: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
dc30: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
dc40: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
dc50: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
dc60: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
dc70: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
dc80: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
dc90: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
dca0: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
dcb0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dcc0: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
dcd0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
dce0: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
dcf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dd00: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
dd10: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
dd20: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
dd30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
dd40: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
dd50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
dd60: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
dd70: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
dd80: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
dd90: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
dda0: 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  p, dest, jumpIfN
ddb0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
ddc0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
ddd0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
dde0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
ddf0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
de00: 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
de10: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
de20: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
de30: 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
de40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
de50: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
de60: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
de70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
de80: 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20  AddOp(v, op, 1, 
de90: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65  dest);.      bre
dea0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
deb0: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
dec0: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78  .      /* The ex
ded0: 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57  pression "x BETW
dee0: 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20  EEN y AND z" is 
def0: 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a  implemented as:.
df00: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
df10: 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47  * 1 IF (x < y) G
df20: 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
df30: 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54   IF (x <= z) GOT
df40: 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
df50: 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f  * 3 ....      */
df60: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
df70: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
df80: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
df90: 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
dfa0: 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70  Right = pExpr->p
dfb0: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
dfc0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
dfd0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
dfe0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
dff0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
e000: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
e010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e020: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e030: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64  Right);.      ad
e040: 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  dr = codeCompare
e050: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
e060: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30  pRight, OP_Lt, 0
e070: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
e080: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
e090: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
e0a0: 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  1].pExpr;.      
e0b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e0c0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
e0d0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
e0e0: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
e0f0: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
e100: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
e110: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
e120: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e130: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
e140: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e150: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
e160: 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ddr, sqlite3Vdbe
e170: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
e180: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
e190: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
e1a0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
e1b0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e1c0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
e1d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
e1e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
e1f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
e200: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
e210: 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  f, jumpIfNull, d
e220: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
e230: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
e240: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
e250: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
e260: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
e270: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
e280: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
e290: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
e2a0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
e2b0: 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
e2c0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
e2d0: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
e2e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e2f0: 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
e300: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
e310: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
e320: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
e330: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
e340: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
e350: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
e360: 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  e or fall throug
e370: 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  h if jumpIfNull 
e380: 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69  is false..*/.voi
e390: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
e3a0: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
e3b0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
e3c0: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
e3d0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
e3e0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
e3f0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
e400: 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  = 0;.  if( v==0 
e410: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
e420: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20  turn;..  /* The 
e430: 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e  value of pExpr->
e440: 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65  op and op are re
e450: 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  lated as follows
e460: 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20  :.  **.  **     
e470: 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20    pExpr->op     
e480: 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20         op.  **  
e490: 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20       ---------  
e4a0: 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d          --------
e4b0: 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  --.  **       TK
e4c0: 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20  _ISNULL         
e4d0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a   OP_NotNull.  **
e4e0: 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c         TK_NOTNUL
e4f0: 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e  L         OP_IsN
e500: 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  ull.  **       T
e510: 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20  K_NE            
e520: 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20    OP_Eq.  **    
e530: 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20     TK_EQ        
e540: 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a        OP_Ne.  **
e550: 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20         TK_GT    
e560: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a            OP_Le.
e570: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45    **       TK_LE
e580: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
e590: 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Gt.  **       T
e5a0: 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20  K_GE            
e5b0: 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20    OP_Lt.  **    
e5c0: 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20     TK_LT        
e5d0: 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a        OP_Ge.  **
e5e0: 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20  .  ** For other 
e5f0: 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d  values of pExpr-
e600: 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66  >op, op is undef
e610: 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e  ined and unused.
e620: 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20  .  ** The value 
e630: 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
e640: 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72  onstants are arr
e650: 61 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20  anged such that 
e660: 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70  we.  ** can comp
e670: 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20  ute the mapping 
e680: 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20  above using the 
e690: 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73  following expres
e6a0: 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72  sion..  ** Asser
e6b0: 74 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74  t()s verify that
e6c0: 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e   the computation
e6d0: 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a   is correct..  *
e6e0: 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72  /.  op = ((pExpr
e6f0: 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26  ->op+(TK_ISNULL&
e700: 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c  1))^1)-(TK_ISNUL
e710: 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69  L&1);..  /* Veri
e720: 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e  fy correct align
e730: 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20  ment of TK_ and 
e740: 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20  OP_ constants.  
e750: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  */.  assert( pEx
e760: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c  pr->op!=TK_ISNUL
e770: 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e  L || op==OP_NotN
e780: 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28  ull );.  assert(
e790: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e   pExpr->op!=TK_N
e7a0: 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50  OTNULL || op==OP
e7b0: 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  _IsNull );.  ass
e7c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e7d0: 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_NE || op==OP_
e7e0: 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Eq );.  assert( 
e7f0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51  pExpr->op!=TK_EQ
e800: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b   || op==OP_Ne );
e810: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e820: 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f  ->op!=TK_LT || o
e830: 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73  p==OP_Ge );.  as
e840: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e850: 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LE || op==OP
e860: 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Gt );.  assert(
e870: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47   pExpr->op!=TK_G
e880: 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29  T || op==OP_Le )
e890: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e8a0: 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20  r->op!=TK_GE || 
e8b0: 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20  op==OP_Lt );..  
e8c0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
e8d0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
e8e0: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
e8f0: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
e900: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e910: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
e920: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
e930: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
e940: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
e950: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
e960: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
e970: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e980: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
e990: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
e9a0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
e9b0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
e9c0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
e9d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
e9e0: 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d  >pLeft, d2, !jum
e9f0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ea00: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
ea10: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
ea20: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
ea30: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ea40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ea50: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
ea60: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ea70: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
ea80: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
ea90: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
eaa0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
eab0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
eac0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ead0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
eae0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
eaf0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
eb00: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
eb10: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
eb20: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
eb30: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
eb40: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
eb50: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
eb60: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
eb70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
eb80: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
eb90: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
eba0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
ebb0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ebc0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
ebd0: 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   op, dest, jumpI
ebe0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
ebf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ec00: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
ec10: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
ec20: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LL: {.      sqli
ec30: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ec40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ec50: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ec60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
ec70: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
ec80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
ec90: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
eca0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
ecb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
ecc0: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
ecd0: 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65   z". It is imple
ece0: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
ecf0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
ed00: 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20  F (x >= y) GOTO 
ed10: 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54  3.      ** 2 GOT
ed20: 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a  O <dest>.      *
ed30: 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47  * 3 IF (x > z) G
ed40: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
ed50: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64   */.      int ad
ed60: 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  dr;.      Expr *
ed70: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
ed80: 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72  Left;.      Expr
ed90: 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72   *pRight = pExpr
eda0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
edb0: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
edc0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
edd0: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
ede0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
edf0: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
ee00: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ee10: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ee20: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
ee30: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
ee40: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ee50: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
ee60: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
ee70: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
ee80: 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70  e, addr+3, !jump
ee90: 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20  IfNull);..      
eea0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
eeb0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
eec0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
eed0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
eee0: 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a  Goto, 0, dest);.
eef0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
ef00: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
ef10: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
ef20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ef30: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
ef40: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
ef50: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
ef60: 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20   pRight, OP_Gt, 
ef70: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
ef80: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ef90: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
efa0: 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  t: {.      sqlit
efb0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
efc0: 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  e, pExpr);.     
efd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
efe0: 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a  p(v, OP_IfNot, j
eff0: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
f000: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
f010: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
f020: 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70  * Do a deep comp
f030: 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78  arison of two ex
f040: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20  pression trees. 
f050: 20 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f   Return TRUE (no
f060: 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68  n-zero).** if th
f070: 65 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c  ey are identical
f080: 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53   and return FALS
f090: 45 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72  E if they differ
f0a0: 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a   in any way..*/.
f0b0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
f0c0: 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c  ompare(Expr *pA,
f0d0: 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e   Expr *pB){.  in
f0e0: 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30  t i;.  if( pA==0
f0f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
f100: 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66  B==0;.  }else if
f110: 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pB==0 ){.    r
f120: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69  eturn 0;.  }.  i
f130: 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f  f( pA->op!=pB->o
f140: 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  p ) return 0;.  
f150: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
f160: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66  Compare(pA->pLef
f170: 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20  t, pB->pLeft) ) 
f180: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f190: 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70  !sqlite3ExprComp
f1a0: 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20  are(pA->pRight, 
f1b0: 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65  pB->pRight) ) re
f1c0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
f1d0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69  ->pList ){.    i
f1e0: 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20  f( pB->pList==0 
f1f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
f200: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  if( pA->pList->n
f210: 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d  Expr!=pB->pList-
f220: 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
f230: 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  0;.    for(i=0; 
f240: 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  i<pA->pList->nEx
f250: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
f260: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
f270: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73  Compare(pA->pLis
f280: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70  t->a[i].pExpr, p
f290: 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  B->pList->a[i].p
f2a0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
f2b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
f2c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65   }.    }.  }else
f2d0: 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29   if( pB->pList )
f2e0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
f2f0: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53    }.  if( pA->pS
f300: 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65  elect || pB->pSe
f310: 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b  lect ) return 0;
f320: 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c  .  if( pA->iTabl
f330: 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c  e!=pB->iTable ||
f340: 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42   pA->iColumn!=pB
f350: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75  ->iColumn ) retu
f360: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e  rn 0;.  if( pA->
f370: 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69  token.z ){.    i
f380: 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d  f( pB->token.z==
f390: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
f3a0: 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
f3b0: 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29  n!=pA->token.n )
f3c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
f3d0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43  f( sqlite3StrNIC
f3e0: 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  mp(pA->token.z, 
f3f0: 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d  pB->token.z, pB-
f400: 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72  >token.n)!=0 ) r
f410: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72  eturn 0;.  }.  r
f420: 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 1;.}../*.*
f430: 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d  * Add a new elem
f440: 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72 73  ent to the pPars
f450: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
f460: 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 69  and return its i
f470: 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20 6e 65 77  ndex..** The new
f480: 20 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e 69 74   element is init
f490: 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72 6f 2e  ialized to zero.
f4a0: 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66 75    The calling fu
f4b0: 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 65 78 70  nction is.** exp
f4c0: 65 63 74 65 64 20 74 6f 20 66 69 6c 6c 20 69 74  ected to fill it
f4d0: 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69   in..*/.static i
f4e0: 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f  nt appendAggInfo
f4f0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
f500: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
f510: 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29  nAgg & 0x7)==0 )
f520: 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  {.    int amt = 
f530: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38  pParse->nAgg + 8
f540: 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61  ;.    AggExpr *a
f550: 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Agg = sqliteReal
f560: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67  loc(pParse->aAgg
f570: 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61  , amt*sizeof(pPa
f580: 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a  rse->aAgg[0]));.
f590: 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20      if( aAgg==0 
f5a0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
f5b0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  -1;.    }.    pP
f5c0: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67  arse->aAgg = aAg
f5d0: 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  g;.  }.  memset(
f5e0: 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50  &pParse->aAgg[pP
f5f0: 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20  arse->nAgg], 0, 
f600: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
f610: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75  Agg[0]));.  retu
f620: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b  rn pParse->nAgg+
f630: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  +;.}../*.** This
f640: 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72   is an xFunc for
f650: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
f660: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
f670: 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70  t .** sqlite3Exp
f680: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
f690: 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c 69 74  es().  See sqlit
f6a0: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
f6b0: 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72 20 61  regates.** for a
f6c0: 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d  dditional inform
f6d0: 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ation..**.** Thi
f6e0: 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c 79 7a  s routine analyz
f6f0: 65 73 20 74 68 65 20 61 67 67 72 65 67 61 74 65  es the aggregate
f700: 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70 45 78   function at pEx
f710: 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  pr..*/.static in
f720: 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  t analyzeAggrega
f730: 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  te(void *pArg, E
f740: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
f750: 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20  nt i;.  AggExpr 
f760: 2a 61 41 67 67 3b 0a 20 20 4e 61 6d 65 43 6f 6e  *aAgg;.  NameCon
f770: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
f780: 65 43 6f 6e 74 65 78 74 20 2a 29 70 41 72 67 3b  eContext *)pArg;
f790: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
f7a0: 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a   = pNC->pParse;.
f7b0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
f7c0: 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c  ist = pNC->pSrcL
f7d0: 69 73 74 3b 0a 0a 20 20 73 77 69 74 63 68 28 20  ist;..  switch( 
f7e0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
f7f0: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
f800: 20 7b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30   {.      for(i=0
f810: 3b 20 70 53 72 63 4c 69 73 74 20 26 26 20 69 3c  ; pSrcList && i<
f820: 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20  pSrcList->nSrc; 
f830: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
f840: 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ( pExpr->iTable=
f850: 3d 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e  =pSrcList->a[i].
f860: 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20 20  iCursor ){.     
f870: 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72       aAgg = pPar
f880: 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20  se->aAgg;.      
f890: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
f8a0: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
f8b0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  ){.            i
f8c0: 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  f( aAgg[i].isAgg
f8d0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
f8e0: 20 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67           if( aAg
f8f0: 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62  g[i].pExpr->iTab
f900: 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
f910: 65 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 26  e.             &
f920: 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  & aAgg[i].pExpr-
f930: 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d  >iColumn==pExpr-
f940: 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20 20  >iColumn ){.    
f950: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
f960: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20  .            }. 
f970: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
f980: 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72       if( i>=pPar
f990: 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20  se->nAgg ){.    
f9a0: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
f9b0: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
f9c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69  );.            i
f9d0: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
f9e0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  1;.            p
f9f0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
fa00: 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  sAgg = 0;.      
fa10: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
fa20: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
fa30: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  xpr;.          }
fa40: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
fa50: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
fa60: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
fa70: 67 43 74 78 20 3d 20 70 4e 43 2d 3e 6e 44 65 70  gCtx = pNC->nDep
fa80: 74 68 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65  th;.          re
fa90: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
faa0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
fab0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
fac0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
fad0: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
fae0: 20 20 69 66 28 20 70 4e 43 2d 3e 6e 44 65 70 74    if( pNC->nDept
faf0: 68 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  h==0 ){.        
fb00: 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61  aAgg = pParse->a
fb10: 41 67 67 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  Agg;.        for
fb20: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
fb30: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
fb40: 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b        if( !aAgg[
fb50: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
fb60: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69  nue;.          i
fb70: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
fb80: 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45  mpare(aAgg[i].pE
fb90: 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
fba0: 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b             break
fbb0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20  ;.          }.  
fbc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
fbd0: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
fbe0: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 20  Agg ){.         
fbf0: 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65   u8 enc = pParse
fc00: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20  ->db->enc;.     
fc10: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
fc20: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
fc30: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3c            if( i<
fc40: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
fc50: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
fc60: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20  aAgg[i].isAgg = 
fc70: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61  1;.          pPa
fc80: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
fc90: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
fca0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
fcb0: 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71  gg[i].pFunc = sq
fcc0: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
fcd0: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
fce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
fcf0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
fd00: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
fd10: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
fd20: 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
fd30: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
fd40: 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   0, enc, 0);.   
fd50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 70       }.        p
fd60: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
fd70: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
fd80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
fd90: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
fda0: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
fdb0: 70 4e 43 2d 3e 6e 44 65 70 74 68 2b 2b 3b 0a 20  pNC->nDepth++;. 
fdc0: 20 20 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70     walkSelectExp
fdd0: 72 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  r(pExpr->pSelect
fde0: 2c 20 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  , analyzeAggrega
fdf0: 74 65 2c 20 70 4e 43 29 3b 0a 20 20 20 20 70 4e  te, pNC);.    pN
fe00: 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b 0a 20 20 7d  C->nDepth--;.  }
fe10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
fe20: 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
fe30: 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69  e given expressi
fe40: 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
fe50: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
fe60: 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
fe70: 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
fe80: 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
fe90: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
fea0: 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61  g[] array..** Ma
feb0: 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e  ke additional en
fec0: 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50 61  tries to the pPa
fed0: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
fee0: 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a  y as necessary..
fef0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
ff00: 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62  ne should only b
ff10: 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74  e called after t
ff20: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  he expression ha
ff30: 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a  s been.** analyz
ff40: 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  ed by sqlite3Exp
ff50: 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e  rResolveNames().
ff60: 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73  .**.** If errors
ff70: 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65   are seen, leave
ff80: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
ff90: 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64  e in zErrMsg and
ffa0: 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e   return.** the n
ffb0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
ffc0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
ffd0: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
ffe0: 61 74 65 73 28 4e 61 6d 65 43 6f 6e 74 65 78 74  ates(NameContext
fff0: 20 2a 70 4e 43 2c 20 45 78 70 72 20 2a 70 45 78   *pNC, Expr *pEx
10000 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  pr){.  int nErr 
10010 3d 20 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e  = pNC->pParse->n
10020 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  Err;.  walkExprT
10030 72 65 65 28 70 45 78 70 72 2c 20 61 6e 61 6c 79  ree(pExpr, analy
10040 7a 65 41 67 67 72 65 67 61 74 65 2c 20 70 4e 43  zeAggregate, pNC
10050 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 43 2d  );.  return pNC-
10060 3e 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d 20  >pParse->nErr - 
10070 6e 45 72 72 3b 0a 7d 0a                          nErr;.}.