/ Hex Artifact Content
Login

Artifact e2aec43eda9d5f8cf6a7eb3adee59ec913effed7:


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 34 20 32 30 30 35 2f 30 36 2f 30 36 20  .204 2005/06/06 
0220: 31 37 3a 31 31 3a 34 36 20 64 72 68 20 45 78 70  17:11:46 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 28 69 6e 74 29 73 71 6c 69 74 65 33 43   (((int)sqlite3C
11a0: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
11b0: 45 78 70 72 31 2c 20 61 66 66 29 29 3c 3c 38 29  Expr1, aff))<<8)
11c0: 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f 31 3a 30  +(jumpIfNull?1:0
11d0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
11e0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
11f0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
1200: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1210: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1220: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1230: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1240: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1250: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
1260: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
1270: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1280: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
1290: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
12a0: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
12b0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
12c0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
12d0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
12e0: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
12f0: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
1300: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1310: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1320: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1330: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1340: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
1350: 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  eq* binaryCompar
1360: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
1370: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c  pParse, Expr *pL
1380: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1390: 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  t){.  CollSeq *p
13a0: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
13b0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
13c0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  , pLeft);.  if( 
13d0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43  !pColl ){.    pC
13e0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
13f0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
1400: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
1410: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1420: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1430: 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d 70 61  code for a compa
1440: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
1450: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 63 6f  */.static int co
1460: 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50 61 72  deCompare(.  Par
1470: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 2f  se *pParse,    /
1480: 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 28 61  * The parsing (a
1490: 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61 74 69  nd code generati
14a0: 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ng) context */. 
14b0: 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 20 20   Expr *pLeft,   
14c0: 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74 20 6f     /* The left o
14d0: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72  perand */.  Expr
14e0: 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20 2f 2a   *pRight,     /*
14f0: 20 54 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   The right opera
1500: 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70 63 6f  nd */.  int opco
1510: 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54 68 65  de,       /* The
1520: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 63 6f   comparison opco
1530: 64 65 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74  de */.  int dest
1540: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ,         /* Jum
1550: 70 20 68 65 72 65 20 69 66 20 74 72 75 65 2e 20  p here if true. 
1560: 20 2a 2f 0a 20 20 69 6e 74 20 6a 75 6d 70 49 66   */.  int jumpIf
1570: 4e 75 6c 6c 20 20 20 20 2f 2a 20 49 66 20 74 72  Null    /* If tr
1580: 75 65 2c 20 6a 75 6d 70 20 69 66 20 65 69 74 68  ue, jump if eith
1590: 65 72 20 6f 70 65 72 61 6e 64 20 69 73 20 4e 55  er operand is NU
15a0: 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 70  LL */.){.  int p
15b0: 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  1 = binaryCompar
15c0: 65 50 31 28 70 4c 65 66 74 2c 20 70 52 69 67 68  eP1(pLeft, pRigh
15d0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
15e0: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20    CollSeq *p3 = 
15f0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  binaryCompareCol
1600: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 65  lSeq(pParse, pLe
1610: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 72  ft, pRight);.  r
1620: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64 62  eturn sqlite3Vdb
1630: 65 4f 70 33 28 70 50 61 72 73 65 2d 3e 70 56 64  eOp3(pParse->pVd
1640: 62 65 2c 20 6f 70 63 6f 64 65 2c 20 70 31 2c 20  be, opcode, p1, 
1650: 64 65 73 74 2c 20 28 76 6f 69 64 2a 29 70 33 2c  dest, (void*)p3,
1660: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 7d 0a   P3_COLLSEQ);.}.
1670: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
1680: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
1690: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
16a0: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
16b0: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
16c0: 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f  r this node is o
16d0: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
16e0: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  iteMalloc().  Th
16f0: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
1700: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
1710: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
1720: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
1730: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
1740: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
1750: 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70  lite3Expr(int op
1760: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
1770: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 63 6f 6e  xpr *pRight, con
1780: 73 74 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  st Token *pToken
1790: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
17a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
17b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
17c0: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
17d0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
17e0: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
17f0: 73 2c 20 64 65 6c 65 74 65 20 70 4c 65 66 74 20  s, delete pLeft 
1800: 61 6e 64 20 70 52 69 67 68 74 2e 20 45 78 70 72  and pRight. Expr
1810: 65 73 73 69 6f 6e 73 20 70 61 73 73 65 64 20 74  essions passed t
1820: 6f 20 0a 20 20 20 20 2a 2a 20 74 68 69 73 20 66  o .    ** this f
1830: 75 6e 63 74 69 6f 6e 20 6d 75 73 74 20 61 6c 77  unction must alw
1840: 61 79 73 20 62 65 20 61 6c 6c 6f 63 61 74 65 64  ays be allocated
1850: 20 77 69 74 68 20 73 71 6c 69 74 65 33 45 78 70   with sqlite3Exp
1860: 72 28 29 20 66 6f 72 20 74 68 69 73 20 0a 20 20  r() for this .  
1870: 20 20 2a 2a 20 72 65 61 73 6f 6e 2e 20 0a 20 20    ** reason. .  
1880: 20 20 2a 2f 0a 20 20 20 20 73 71 6c 69 74 65 33    */.    sqlite3
1890: 45 78 70 72 44 65 6c 65 74 65 28 70 4c 65 66 74  ExprDelete(pLeft
18a0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  );.    sqlite3Ex
18b0: 70 72 44 65 6c 65 74 65 28 70 52 69 67 68 74 29  prDelete(pRight)
18c0: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
18d0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d    }.  pNew->op =
18e0: 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65   op;.  pNew->pLe
18f0: 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e  ft = pLeft;.  pN
1900: 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69  ew->pRight = pRi
1910: 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41 67  ght;.  pNew->iAg
1920: 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70 54  g = -1;.  if( pT
1930: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1940: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1950: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1960: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1970: 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20  en = *pToken;.  
1980: 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20  }else if( pLeft 
1990: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
19a0: 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e   sqlite3ExprSpan
19b0: 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73  (pNew, &pLeft->s
19c0: 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70  pan, &pRight->sp
19d0: 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  an);.  }.  retur
19e0: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
19f0: 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65   When doing a ne
1a00: 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20  sted parse, you 
1a10: 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d  can include term
1a20: 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  s in an expressi
1a30: 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20  on.** that look 
1a40: 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20  like this:   #0 
1a50: 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65  #1 #2 ...  These
1a60: 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20   terms refer to 
1a70: 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74  elements.** on t
1a80: 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20  he stack.  "#0" 
1a90: 28 6f 72 20 6a 75 73 74 20 22 23 22 29 20 6d 65  (or just "#") me
1aa0: 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74  ans the top of t
1ab0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31  he stack..** "#1
1ac0: 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74  " means the next
1ad0: 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61   down on the sta
1ae0: 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74  ck.  And so fort
1af0: 68 2e 20 20 23 2d 31 20 6d 65 61 6e 73 0a 2a 2a  h.  #-1 means.**
1b00: 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e   memory location
1b10: 20 30 2e 20 20 23 2d 32 20 6d 65 61 6e 73 20 6d   0.  #-2 means m
1b20: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 31  emory location 1
1b30: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1b40: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
1b50: 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79  ine is called by
1b60: 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20 64   the parser to d
1b70: 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74  eal with on of t
1b80: 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49  hose terms..** I
1b90: 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65  t immediately ge
1ba0: 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20  nerates code to 
1bb0: 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20  store the value 
1bc0: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  in a memory loca
1bd0: 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74  tion..** The ret
1be0: 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69  urns an expressi
1bf0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64  on that will cod
1c00: 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68 65  e to extract the
1c10: 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74   value from.** t
1c20: 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74  hat memory locat
1c30: 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a  ion as needed..*
1c40: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52  /.Expr *sqlite3R
1c50: 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72 73  egisterExpr(Pars
1c60: 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e  e *pParse, Token
1c70: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62   *pToken){.  Vdb
1c80: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1c90: 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b  Vdbe;.  Expr *p;
1ca0: 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a 20 20  .  int depth;.  
1cb0: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
1cc0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73  n 0;.  if( pPars
1cd0: 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a  e->nested==0 ){.
1ce0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
1cf0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61  Msg(pParse, "nea
1d00: 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78  r \"%T\": syntax
1d10: 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29   error", pToken)
1d20: 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  ;.    return 0;.
1d30: 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65    }.  p = sqlite
1d40: 33 45 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45  3Expr(TK_REGISTE
1d50: 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29  R, 0, 0, pToken)
1d60: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a  ;.  if( p==0 ){.
1d70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f      return 0;  /
1d80: 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20  * Malloc failed 
1d90: 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d  */.  }.  depth =
1da0: 20 61 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a   atoi(&pToken->z
1db0: 5b 31 5d 29 3b 0a 20 20 69 66 28 20 64 65 70 74  [1]);.  if( dept
1dc0: 68 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69  h>=0 ){.    p->i
1dd0: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
1de0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69  nMem++;.    sqli
1df0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
1e00: 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30  OP_Dup, depth, 0
1e10: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  );.    sqlite3Vd
1e20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
1e30: 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c  mStore, p->iTabl
1e40: 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  e, 1);.  }else{.
1e50: 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20      p->iTable = 
1e60: 2d 31 2d 64 65 70 74 68 3b 0a 20 20 7d 0a 20 20  -1-depth;.  }.  
1e70: 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a  return p;.}../*.
1e80: 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72  ** Join two expr
1e90: 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e  essions using an
1ea0: 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20   AND operator.  
1eb0: 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  If either expres
1ec0: 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c  sion is.** NULL,
1ed0: 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72   then just retur
1ee0: 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72  n the other expr
1ef0: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20  ession..*/.Expr 
1f00: 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28  *sqlite3ExprAnd(
1f10: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1f20: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66  r *pRight){.  if
1f30: 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20  ( pLeft==0 ){.  
1f40: 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b    return pRight;
1f50: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
1f60: 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  ght==0 ){.    re
1f70: 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65  turn pLeft;.  }e
1f80: 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  lse{.    return 
1f90: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41  sqlite3Expr(TK_A
1fa0: 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  ND, pLeft, pRigh
1fb0: 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  t, 0);.  }.}../*
1fc0: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
1fd0: 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74  .span field of t
1fe0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1ff0: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
2000: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
2010: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
2020: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
2030: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45 78  lite3ExprSpan(Ex
2040: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
2050: 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a   *pLeft, Token *
2060: 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72  pRight){.  asser
2070: 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  t( pRight!=0 );.
2080: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
2090: 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c  =0 );.  if( !sql
20a0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
20b0: 65 64 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20  ed && pRight->z 
20c0: 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20  && pLeft->z ){. 
20d0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
20e0: 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66  ->dyn==0 || pLef
20f0: 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d  t->z[pLeft->n]==
2100: 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65  0 );.    if( pLe
2110: 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52  ft->dyn==0 && pR
2120: 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a  ight->dyn==0 ){.
2130: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
2140: 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a  n.z = pLeft->z;.
2150: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
2160: 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20  n.n = pRight->n 
2170: 2b 20 28 70 52 69 67 68 74 2d 3e 7a 20 2d 20 70  + (pRight->z - p
2180: 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Left->z);.    }e
2190: 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
21a0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20  ->span.z = 0;.  
21b0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
21c0: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
21d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
21e0: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
21f0: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
2200: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
2210: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2220: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73  Function(ExprLis
2230: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
2240: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
2250: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
2260: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
2270: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
2280: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
2290: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c      sqlite3ExprL
22a0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
22b0: 3b 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61 6b 69  ; /* Avoid leaki
22c0: 6e 67 20 6d 65 6d 6f 72 79 20 77 68 65 6e 20 6d  ng memory when m
22d0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
22e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
22f0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
2300: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
2310: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
2320: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
2330: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
2340: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
2350: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20      pNew->token 
2360: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
2370: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
2380: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20  ken.z = 0;.  }. 
2390: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
23a0: 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74  ew->token;.  ret
23b0: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
23c0: 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72 69  ** Assign a vari
23d0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20 61  able number to a
23e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61  n expression tha
23f0: 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c 64  t encodes a wild
2400: 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20 6f  card.** in the o
2410: 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61 74  riginal SQL stat
2420: 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20 57  ement.  .**.** W
2430: 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73 74  ildcards consist
2440: 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65 20  ing of a single 
2450: 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65 64  "?" are assigned
2460: 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e   the next sequen
2470: 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c 65  tial.** variable
2480: 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20 57   number..**.** W
2490: 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65 20  ildcards of the 
24a0: 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65 20  form "?nnn" are 
24b0: 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75 6d  assigned the num
24c0: 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20 6d  ber "nnn".  We m
24d0: 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e 6e  ake.** sure "nnn
24e0: 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65 20  " is not too be 
24f0: 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69 61  to avoid a denia
2500: 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74 74  l of service att
2510: 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65 20  ack when.** the 
2520: 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63 6f  SQL statement co
2530: 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74 65  mes from an exte
2540: 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a 0a  rnal source..**.
2550: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  ** Wildcards of 
2560: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
2570: 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61 73  or "$aaa" are as
2580: 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65 20  signed the same 
2590: 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68 65  number.** as the
25a0: 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61 6e   previous instan
25b0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 77  ce of the same w
25c0: 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66 20  ildcard.  Or if 
25d0: 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72 73  this is the firs
25e0: 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f 66  t.** instance of
25f0: 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20 74   the wildcard, t
2600: 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69 61  he next sequenia
2610: 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  l variable numbe
2620: 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65 64  r is.** assigned
2630: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
2640: 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e 75  3ExprAssignVarNu
2650: 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61 72  mber(Parse *pPar
2660: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
2670: 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65  {.  Token *pToke
2680: 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  n;.  if( pExpr==
2690: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70 54  0 ) return;.  pT
26a0: 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e 74  oken = &pExpr->t
26b0: 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  oken;.  assert( 
26c0: 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b 0a  pToken->n>=1 );.
26d0: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
26e0: 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ->z!=0 );.  asse
26f0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d  rt( pToken->z[0]
2700: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54 6f  !=0 );.  if( pTo
2710: 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20 20  ken->n==1 ){.   
2720: 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20   /* Wildcard of 
2730: 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20 41  the form "?".  A
2740: 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20 76  ssign the next v
2750: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a  ariable number *
2760: 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61  /.    pExpr->iTa
2770: 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  ble = ++pParse->
2780: 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69 66  nVar;.  }else if
2790: 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d  ( pToken->z[0]==
27a0: 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69  '?' ){.    /* Wi
27b0: 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f  ldcard of the fo
27c0: 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e 76  rm "?nnn".  Conv
27d0: 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e 20  ert "nnn" to an 
27e0: 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20 20  integer and.    
27f0: 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68 65  ** use it as the
2800: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
2810: 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20   */.    int i;. 
2820: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
2830: 20 3d 20 69 20 3d 20 61 74 6f 69 28 26 70 54 6f   = i = atoi(&pTo
2840: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20 20  ken->z[1]);.    
2850: 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51 4c  if( i<1 || i>SQL
2860: 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45  ITE_MAX_VARIABLE
2870: 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20 20  _NUMBER ){.     
2880: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
2890: 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61 62  (pParse, "variab
28a0: 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20 62  le number must b
28b0: 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e 64  e between ?1 and
28c0: 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20 20   ?%d",.         
28d0: 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49   SQLITE_MAX_VARI
28e0: 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20 20  ABLE_NUMBER);.  
28f0: 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70 50    }.    if( i>pP
2900: 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20 20  arse->nVar ){.  
2910: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2920: 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d 65   = i;.    }.  }e
2930: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  lse{.    /* Wild
2940: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
2950: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
2960: 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20 73  a".  Reuse the s
2970: 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20 20  ame variable.   
2980: 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74 68   ** number as th
2990: 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61 6e  e prior appearan
29a0: 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20 6e  ce of the same n
29b0: 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20 6e  ame, or if the n
29c0: 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20 6e  ame.    ** has n
29d0: 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62 65  ever appeared be
29e0: 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65 20  fore, reuse the 
29f0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e 75  same variable nu
2a00: 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20 20  mber.    */.    
2a10: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e 20  int i, n;.    n 
2a20: 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20 20  = pToken->n;.   
2a30: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
2a40: 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69 2b  se->nVarExpr; i+
2a50: 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  +){.      Expr *
2a60: 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28 70  pE;.      if( (p
2a70: 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56 61  E = pParse->apVa
2a80: 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20 20  rExpr[i])!=0.   
2a90: 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74 6f         && pE->to
2aa0: 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20 20  ken.n==n.       
2ab0: 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45 2d     && memcmp(pE-
2ac0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65 6e  >token.z, pToken
2ad0: 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20 20  ->z, n)==0 ){.  
2ae0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
2af0: 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c 65  ble = pE->iTable
2b00: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
2b10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2b20: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
2b30: 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20 20  ->nVarExpr ){.  
2b40: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2b50: 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e 56  e = ++pParse->nV
2b60: 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70 50  ar;.      if( pP
2b70: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e 3d  arse->nVarExpr>=
2b80: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b90: 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20 20  Alloc-1 ){.     
2ba0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
2bb0: 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61 72  xprAlloc += pPar
2bc0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2bd0: 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20 20  c + 10;.        
2be0: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2bf0: 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  r = sqliteReallo
2c00: 63 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  c(pParse->apVarE
2c10: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
2c20: 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61 72              pPar
2c30: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2c40: 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  c*sizeof(pParse-
2c50: 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 20 29  >apVarExpr[0]) )
2c60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
2c70: 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c  if( !sqlite3_mal
2c80: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
2c90: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 50        assert( pP
2ca0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 21  arse->apVarExpr!
2cb0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 50  =0 );.        pP
2cc0: 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b  arse->apVarExpr[
2cd0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2ce0: 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  ++] = pExpr;.   
2cf0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20 0a     }.    }.  } .
2d00: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
2d10: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
2d20: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
2d30: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
2d40: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
2d50: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
2d60: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
2d70: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
2d80: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
2d90: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28  ->span.z);.  if(
2da0: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20   p->token.dyn ) 
2db0: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
2dc0: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  *)p->token.z);. 
2dd0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2de0: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
2df0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
2e00: 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  e(p->pRight);.  
2e10: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2e20: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
2e30: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2e40: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
2e50: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
2e60: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  (p);.}.../*.** T
2e70: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
2e80: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
2e90: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
2ea0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
2eb0: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
2ec0: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
2ed0: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
2ee0: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
2ef0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
2f00: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
2f10: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
2f20: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
2f30: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
2f40: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
2f50: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
2f60: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
2f70: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
2f80: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
2f90: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
2fa0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2fb0: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
2fc0: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
2fd0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
2fe0: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
2ff0: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
3000: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
3010: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
3020: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
3030: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
3040: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
3050: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
3060: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
3070: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45  duplicated..*/.E
3080: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
3090: 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  Dup(Expr *p){.  
30a0: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
30b0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
30c0: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
30d0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
30e0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
30f0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
3100: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
3110: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
3120: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
3130: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
3140: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
3150: 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28  = sqliteStrNDup(
3160: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e 74  p->token.z, p->t
3170: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e 65  oken.n);.    pNe
3180: 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31  w->token.dyn = 1
3190: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
31a0: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
31b0: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  en.z==0 );.  }. 
31c0: 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20   pNew->span.z = 
31d0: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74  0;.  pNew->pLeft
31e0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
31f0: 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  p(p->pLeft);.  p
3200: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73 71  New->pRight = sq
3210: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
3220: 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d  pRight);.  pNew-
3230: 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  >pList = sqlite3
3240: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
3250: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
3260: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3270: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53 65  SelectDup(p->pSe
3280: 6c 65 63 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lect);.  pNew->p
3290: 54 61 62 20 3d 20 70 2d 3e 70 54 61 62 3b 0a 20  Tab = p->pTab;. 
32a0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
32b0: 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b 65  void sqlite3Toke
32c0: 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f  nCopy(Token *pTo
32d0: 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b  , Token *pFrom){
32e0: 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20  .  if( pTo->dyn 
32f0: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
3300: 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69  ar*)pTo->z);.  i
3310: 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20  f( pFrom->z ){. 
3320: 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f     pTo->n = pFro
3330: 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a  m->n;.    pTo->z
3340: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
3350: 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d  (pFrom->z, pFrom
3360: 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64  ->n);.    pTo->d
3370: 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b  yn = 1;.  }else{
3380: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b  .    pTo->z = 0;
3390: 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20  .  }.}.ExprList 
33a0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
33b0: 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70 29  Dup(ExprList *p)
33c0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4e  {.  ExprList *pN
33d0: 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70  ew;.  struct Exp
33e0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
33f0: 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20 20  m, *pOldItem;.  
3400: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
3410: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3420: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3430: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
3440: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
3450: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3460: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
3470: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
3480: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d  ->nExpr;.  pNew-
3490: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
34a0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45  iteMalloc( p->nE
34b0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
34c0: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
34d0: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
34e0: 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  iteFree(pNew);. 
34f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
3500: 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20 70   .  pOldItem = p
3510: 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  ->a;.  for(i=0; 
3520: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
3530: 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49 74   pItem++, pOldIt
3540: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
3550: 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64  *pNewExpr, *pOld
3560: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
3570: 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70  >pExpr = pNewExp
3580: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
3590: 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 4f  up(pOldExpr = pO
35a0: 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  ldItem->pExpr);.
35b0: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
35c0: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70  ->span.z!=0 && p
35d0: 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20  NewExpr ){.     
35e0: 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20   /* Always make 
35f0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70  a copy of the sp
3600: 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c  an for top-level
3610: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
3620: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
3630: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54  ression list.  T
3640: 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45  he logic in SELE
3650: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  CT processing th
3660: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20  at determines.  
3670: 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73      ** the names
3680: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
3690: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65  he result set ne
36a0: 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  eds this informa
36b0: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
36c0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
36d0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20  pNewExpr->span, 
36e0: 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29  &pOldExpr->span)
36f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
3700: 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20  rt( pNewExpr==0 
3710: 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  || pNewExpr->spa
3720: 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20  n.z!=0 .        
3730: 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d      || pOldExpr-
3740: 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71  >span.z==0 || sq
3750: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
3760: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
3770: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
3780: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3790: 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  >zName);.    pIt
37a0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
37b0: 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f 72  pOldItem->sortOr
37c0: 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  der;.    pItem->
37d0: 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65 6d  isAgg = pOldItem
37e0: 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49 74  ->isAgg;.    pIt
37f0: 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20  em->done = 0;.  
3800: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 63 75 72  .}../*.** If cur
3820: 73 6f 72 73 2c 20 74 72 69 67 67 65 72 73 2c 20  sors, triggers, 
3830: 76 69 65 77 73 20 61 6e 64 20 73 75 62 71 75 65  views and subque
3840: 72 69 65 73 20 61 72 65 20 61 6c 6c 20 6f 6d 69  ries are all omi
3850: 74 74 65 64 20 66 72 6f 6d 0a 2a 2a 20 74 68 65  tted from.** the
3860: 20 62 75 69 6c 64 2c 20 74 68 65 6e 20 6e 6f 6e   build, then non
3870: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
3880: 6e 67 20 72 6f 75 74 69 6e 65 73 2c 20 65 78 63  ng routines, exc
3890: 65 70 74 20 66 6f 72 20 0a 2a 2a 20 73 71 6c 69  ept for .** sqli
38a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 29 2c 20  te3SelectDup(), 
38b0: 63 61 6e 20 62 65 20 63 61 6c 6c 65 64 2e 20 73  can be called. s
38c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
38d0: 29 20 69 73 20 73 6f 6d 65 74 69 6d 65 73 0a 2a  ) is sometimes.*
38e0: 2a 20 63 61 6c 6c 65 64 20 77 69 74 68 20 61 20  * called with a 
38f0: 4e 55 4c 4c 20 61 72 67 75 6d 65 6e 74 2e 0a 2a  NULL argument..*
3900: 2f 0a 23 69 66 20 21 64 65 66 69 6e 65 64 28 53  /.#if !defined(S
3910: 51 4c 49 54 45 5f 4f 4d 49 54 5f 56 49 45 57 29  QLITE_OMIT_VIEW)
3920: 20 7c 7c 20 21 64 65 66 69 6e 65 64 28 53 51 4c   || !defined(SQL
3930: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
3940: 29 20 5c 0a 20 7c 7c 20 21 64 65 66 69 6e 65 64  ) \. || !defined
3950: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42  (SQLITE_OMIT_SUB
3960: 51 55 45 52 59 29 0a 53 72 63 4c 69 73 74 20 2a  QUERY).SrcList *
3970: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
3980: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
3990: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
39a0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
39b0: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
39c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
39d0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
39e0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
39f0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
3a00: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
3a10: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
3a20: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
3a30: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
3a40: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
3a50: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
3a60: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
3a70: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
3a80: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
3a90: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
3aa0: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
3ab0: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
3ac0: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
3ad0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
3ae0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
3af0: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
3b00: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
3b10: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
3b20: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
3b30: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3b40: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3b50: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
3b60: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
3b70: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
3b80: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
3b90: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
3ba0: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
3bb0: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
3bc0: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
3bd0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
3be0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
3bf0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
3c00: 6d 2d 3e 70 54 61 62 20 3d 20 70 4f 6c 64 49 74  m->pTab = pOldIt
3c10: 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20 69 66  em->pTab;.    if
3c20: 28 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62  ( pNewItem->pTab
3c30: 20 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 49 74   ){.      pNewIt
3c40: 65 6d 2d 3e 70 54 61 62 2d 3e 69 73 54 72 61 6e  em->pTab->isTran
3c50: 73 69 65 6e 74 20 3d 20 30 3b 0a 20 20 20 20 7d  sient = 0;.    }
3c60: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
3c70: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
3c80: 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74  SelectDup(pOldIt
3c90: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
3ca0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
3cb0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3cc0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b  (pOldItem->pOn);
3cd0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
3ce0: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
3cf0: 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65  dListDup(pOldIte
3d00: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 20 20  m->pUsing);.    
3d10: 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c 55 73 65  pNewItem->colUse
3d20: 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 63 6f  d = pOldItem->co
3d30: 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20 72 65 74  lUsed;.  }.  ret
3d40: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
3d50: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
3d60: 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b  tDup(IdList *p){
3d70: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
3d80: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
3d90: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3da0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
3db0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
3dc0: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
3dd0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3de0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
3df0: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
3e00: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
3e10: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  w->a = sqliteMal
3e20: 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73  locRaw( p->nId*s
3e30: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
3e40: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
3e50: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
3e60: 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20 20 20  Free(pNew);.    
3e70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
3e80: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
3e90: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
3ea0: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
3eb0: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
3ec0: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
3ed0: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
3ee0: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
3ef0: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
3f00: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3f10: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3f20: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
3f30: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
3f40: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
3f50: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3f60: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
3f70: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
3f80: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
3f90: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3fa0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3fb0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3fc0: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3fd0: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
3fe0: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3ff0: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
4000: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
4010: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  nct;.  pNew->pEL
4020: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
4030: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69  rListDup(p->pELi
4040: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
4050: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
4060: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
4070: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
4080: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
4090: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
40a0: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
40b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
40c0: 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  p(p->pGroupBy);.
40d0: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
40e0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
40f0: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
4100: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
4110: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
4120: 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  Dup(p->pOrderBy)
4130: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
4140: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
4150: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
4160: 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f  lectDup(p->pPrio
4170: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 6d  r);.  pNew->pLim
4180: 69 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  it = sqlite3Expr
4190: 44 75 70 28 70 2d 3e 70 4c 69 6d 69 74 29 3b 0a  Dup(p->pLimit);.
41a0: 20 20 70 4e 65 77 2d 3e 70 4f 66 66 73 65 74 20    pNew->pOffset 
41b0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
41c0: 28 70 2d 3e 70 4f 66 66 73 65 74 29 3b 0a 20 20  (p->pOffset);.  
41d0: 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d  pNew->iLimit = -
41e0: 31 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73  1;.  pNew->iOffs
41f0: 65 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  et = -1;.  pNew-
4200: 3e 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b  >ppOpenTemp = 0;
4210: 0a 20 20 70 4e 65 77 2d 3e 69 73 52 65 73 6f 6c  .  pNew->isResol
4220: 76 65 64 20 3d 20 70 2d 3e 69 73 52 65 73 6f 6c  ved = p->isResol
4230: 76 65 64 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41  ved;.  pNew->isA
4240: 67 67 20 3d 20 70 2d 3e 69 73 41 67 67 3b 0a 20  gg = p->isAgg;. 
4250: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
4260: 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73 71  #else.Select *sq
4270: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53  lite3SelectDup(S
4280: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73 73  elect *p){.  ass
4290: 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72  ert( p==0 );.  r
42a0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69  eturn 0;.}.#endi
42b0: 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20  f.../*.** Add a 
42c0: 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74  new element to t
42d0: 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70  he end of an exp
42e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49  ression list.  I
42f0: 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e  f pList is.** in
4300: 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68  itially NULL, th
4310: 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20  en create a new 
4320: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
4330: 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  .*/.ExprList *sq
4340: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70  lite3ExprListApp
4350: 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  end(ExprList *pL
4360: 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72  ist, Expr *pExpr
4370: 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b  , Token *pName){
4380: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
4390: 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73  ){.    pList = s
43a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
43b0: 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b  eof(ExprList) );
43c0: 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  .    if( pList==
43d0: 30 20 29 7b 0a 20 20 20 20 20 20 67 6f 74 6f 20  0 ){.      goto 
43e0: 6e 6f 5f 6d 65 6d 3b 0a 20 20 20 20 7d 0a 20 20  no_mem;.    }.  
43f0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4400: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
4410: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
4420: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
4430: 78 70 72 20 29 7b 0a 20 20 20 20 73 74 72 75 63  xpr ){.    struc
4440: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
4450: 2a 61 3b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20  *a;.    int n = 
4460: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
4470: 2b 20 34 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c  + 4;.    a = sql
4480: 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
4490: 2d 3e 61 2c 20 6e 2a 73 69 7a 65 6f 66 28 70 4c  ->a, n*sizeof(pL
44a0: 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20  ist->a[0]));.   
44b0: 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a 20 20 20   if( a==0 ){.   
44c0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
44d0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
44e0: 3e 61 20 3d 20 61 3b 0a 20 20 20 20 70 4c 69 73  >a = a;.    pLis
44f0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 6e 3b 0a 20  t->nAlloc = n;. 
4500: 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69   }.  assert( pLi
4510: 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66  st->a!=0 );.  if
4520: 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65  ( pExpr || pName
4530: 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45   ){.    struct E
4540: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
4550: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
4560: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b  pList->nExpr++];
4570: 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65  .    memset(pIte
4580: 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49  m, 0, sizeof(*pI
4590: 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d  tem));.    pItem
45a0: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
45b0: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
45c0: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
45d0: 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
45e0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c  .  }.  return pL
45f0: 69 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20  ist;..no_mem:   
4600: 20 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65    .  /* Avoid le
4610: 61 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20  aking memory if 
4620: 6d 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65  malloc has faile
4630: 64 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45  d. */.  sqlite3E
4640: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
4650: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
4660: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
4670: 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  ;.  return 0;.}.
4680: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
4690: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
46a0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
46b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
46c0: 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20  Delete(ExprList 
46d0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
46e0: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
46f0: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
4700: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
4710: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
4720: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
4730: 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  || (pList->nExpr
4740: 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41  ==0 && pList->nA
4750: 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73  lloc==0) );.  as
4760: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
4770: 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  pr<=pList->nAllo
4780: 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  c );.  for(pItem
4790: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
47a0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
47b0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
47c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
47d0: 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  lete(pItem->pExp
47e0: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
47f0: 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
4800: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
4810: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
4820: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
4830: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
4840: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
4850: 72 65 65 2e 20 20 43 61 6c 6c 20 78 46 75 6e 63  ree.  Call xFunc
4860: 20 66 6f 72 20 65 61 63 68 20 6e 6f 64 65 20 76   for each node v
4870: 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  isited..**.** Th
4880: 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66  e return value f
4890: 72 6f 6d 20 78 46 75 6e 63 20 64 65 74 65 72 6d  rom xFunc determ
48a0: 69 6e 65 73 20 77 68 65 74 68 65 72 20 74 68 65  ines whether the
48b0: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6e 74 69   tree walk conti
48c0: 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73  nues..** 0 means
48d0: 20 63 6f 6e 74 69 6e 75 65 20 77 61 6c 6b 69 6e   continue walkin
48e0: 67 20 74 68 65 20 74 72 65 65 2e 20 20 31 20 6d  g the tree.  1 m
48f0: 65 61 6e 73 20 64 6f 20 6e 6f 74 20 77 61 6c 6b  eans do not walk
4900: 20 63 68 69 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20   children.** of 
4910: 74 68 65 20 63 75 72 72 65 6e 74 20 6e 6f 64 65  the current node
4920: 20 62 75 74 20 63 6f 6e 74 69 6e 75 65 20 77 69   but continue wi
4930: 74 68 20 73 69 62 6c 69 6e 67 73 2e 20 20 32 20  th siblings.  2 
4940: 6d 65 61 6e 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a  means abandon.**
4950: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
4960: 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a  ompletely..**.**
4970: 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75   The return valu
4980: 65 20 66 72 6f 6d 20 74 68 69 73 20 72 6f 75 74  e from this rout
4990: 69 6e 65 20 69 73 20 31 20 74 6f 20 61 62 61 6e  ine is 1 to aban
49a0: 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c  don the tree wal
49b0: 6b 0a 2a 2a 20 61 6e 64 20 30 20 74 6f 20 63 6f  k.** and 0 to co
49c0: 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73 74 61 74 69  ntinue..*/.stati
49d0: 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 4c 69  c int walkExprLi
49e0: 73 74 28 45 78 70 72 4c 69 73 74 20 2a 2c 20 69  st(ExprList *, i
49f0: 6e 74 20 28 2a 29 28 76 6f 69 64 20 2a 2c 20 45  nt (*)(void *, E
4a00: 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 29 3b 0a  xpr*), void *);.
4a10: 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45  static int walkE
4a20: 78 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45  xprTree(Expr *pE
4a30: 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63  xpr, int (*xFunc
4a40: 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20  )(void*,Expr*), 
4a50: 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 69  void *pArg){.  i
4a60: 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70 45 78  nt rc;.  if( pEx
4a70: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
4a80: 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75 6e 63  ;.  rc = (*xFunc
4a90: 29 28 70 41 72 67 2c 20 70 45 78 70 72 29 3b 0a  )(pArg, pExpr);.
4aa0: 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b 0a 20    if( rc==0 ){. 
4ab0: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
4ac0: 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ree(pExpr->pLeft
4ad0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29  , xFunc, pArg) )
4ae0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 69   return 1;.    i
4af0: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4b00: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 78  pExpr->pRight, x
4b10: 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65  Func, pArg) ) re
4b20: 74 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20  turn 1;.    if( 
4b30: 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 70 45 78  walkExprList(pEx
4b40: 70 72 2d 3e 70 4c 69 73 74 2c 20 78 46 75 6e 63  pr->pList, xFunc
4b50: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4b60: 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   1;.  }.  return
4b70: 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   rc>1;.}../*.** 
4b80: 43 61 6c 6c 20 77 61 6c 6b 45 78 70 72 54 72 65  Call walkExprTre
4b90: 65 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  e() for every ex
4ba0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 6c 69 73 74  pression in list
4bb0: 20 70 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e   p..*/.static in
4bc0: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
4bd0: 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74 20  xprList *p, int 
4be0: 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c  (*xFunc)(void *,
4bf0: 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70   Expr*), void *p
4c00: 41 72 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  Arg){.  int i;. 
4c10: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
4c20: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
4c30: 69 66 28 20 21 70 20 29 20 72 65 74 75 72 6e 20  if( !p ) return 
4c40: 30 3b 0a 20 20 66 6f 72 28 69 3d 70 2d 3e 6e 45  0;.  for(i=p->nE
4c50: 78 70 72 2c 20 70 49 74 65 6d 3d 70 2d 3e 61 3b  xpr, pItem=p->a;
4c60: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
4c70: 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c  ++){.    if( wal
4c80: 6b 45 78 70 72 54 72 65 65 28 70 49 74 65 6d 2d  kExprTree(pItem-
4c90: 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c 20 70  >pExpr, xFunc, p
4ca0: 41 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b  Arg) ) return 1;
4cb0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4cc0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77  .}../*.** Call w
4cd0: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20 66 6f  alkExprTree() fo
4ce0: 72 20 65 76 65 72 79 20 65 78 70 72 65 73 73 69  r every expressi
4cf0: 6f 6e 20 69 6e 20 53 65 6c 65 63 74 20 70 2c 20  on in Select p, 
4d00: 6e 6f 74 20 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a  not including.**
4d10: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 74 68 61   expressions tha
4d20: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 73 75  t are part of su
4d30: 62 2d 73 65 6c 65 63 74 73 20 69 6e 20 61 6e 79  b-selects in any
4d40: 20 46 52 4f 4d 20 63 6c 61 75 73 65 20 6f 72 20   FROM clause or 
4d50: 74 68 65 20 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20  the LIMIT.** or 
4d60: 4f 46 46 53 45 54 20 65 78 70 72 65 73 73 69 6f  OFFSET expressio
4d70: 6e 73 2e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ns...*/.static i
4d80: 6e 74 20 77 61 6c 6b 53 65 6c 65 63 74 45 78 70  nt walkSelectExp
4d90: 72 28 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74  r(Select *p, int
4da0: 20 28 2a 78 46 75 6e 63 29 28 76 6f 69 64 20 2a   (*xFunc)(void *
4db0: 2c 20 45 78 70 72 2a 29 2c 20 76 6f 69 64 20 2a  , Expr*), void *
4dc0: 70 41 72 67 29 7b 0a 20 20 77 61 6c 6b 45 78 70  pArg){.  walkExp
4dd0: 72 4c 69 73 74 28 70 2d 3e 70 45 4c 69 73 74 2c  rList(p->pEList,
4de0: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20   xFunc, pArg);. 
4df0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d   walkExprTree(p-
4e00: 3e 70 57 68 65 72 65 2c 20 78 46 75 6e 63 2c 20  >pWhere, xFunc, 
4e10: 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70  pArg);.  walkExp
4e20: 72 4c 69 73 74 28 70 2d 3e 70 47 72 6f 75 70 42  rList(p->pGroupB
4e30: 79 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b  y, xFunc, pArg);
4e40: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
4e50: 70 2d 3e 70 48 61 76 69 6e 67 2c 20 78 46 75 6e  p->pHaving, xFun
4e60: 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c 6b  c, pArg);.  walk
4e70: 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64  ExprList(p->pOrd
4e80: 65 72 42 79 2c 20 78 46 75 6e 63 2c 20 70 41 72  erBy, xFunc, pAr
4e90: 67 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a  g);.  return 0;.
4ea0: 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  }.../*.** This r
4eb0: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
4ec0: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
4ed0: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
4ee0: 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67 20 69 73  )..**.** pArg is
4ef0: 20 72 65 61 6c 6c 79 20 61 20 70 6f 69 6e 74 65   really a pointe
4f00: 72 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 2e  r to an integer.
4f10: 20 20 49 66 20 77 65 20 63 61 6e 20 74 65 6c 6c    If we can tell
4f20: 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61   by looking.** a
4f30: 74 20 70 45 78 70 72 20 74 68 61 74 20 74 68 65  t pExpr that the
4f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74   expression that
4f50: 20 63 6f 6e 74 61 69 6e 73 20 70 45 78 70 72 20   contains pExpr 
4f60: 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73 74 61 6e  is not a constan
4f70: 74 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 2c  t.** expression,
4f80: 20 74 68 65 6e 20 73 65 74 20 2a 70 41 72 67 20   then set *pArg 
4f90: 74 6f 20 30 20 61 6e 64 20 72 65 74 75 72 6e 20  to 0 and return 
4fa0: 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65  2 to abandon the
4fb0: 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49   tree walk..** I
4fc0: 66 20 70 45 78 70 72 20 64 6f 65 73 20 64 6f 65  f pExpr does doe
4fd0: 73 20 6e 6f 74 20 64 69 73 71 75 61 6c 69 66 79  s not disqualify
4fe0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
4ff0: 66 72 6f 6d 20 62 65 69 6e 67 20 61 20 63 6f 6e  from being a con
5000: 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e 20 64 6f  stant.** then do
5010: 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20   nothing..**.** 
5020: 41 66 74 65 72 20 77 61 6c 6b 69 6e 67 20 74 68  After walking th
5030: 65 20 77 68 6f 6c 65 20 74 72 65 65 2c 20 69 66  e whole tree, if
5040: 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65 20 66 6f   no nodes are fo
5050: 75 6e 64 20 74 68 61 74 20 64 69 73 71 75 61 6c  und that disqual
5060: 69 66 79 0a 2a 2a 20 74 68 65 20 65 78 70 72 65  ify.** the expre
5070: 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73 74 61 6e  ssion as constan
5080: 74 2c 20 74 68 65 6e 20 77 65 20 61 73 73 75 6d  t, then we assum
5090: 65 20 74 68 65 20 77 68 6f 6c 65 20 65 78 70 72  e the whole expr
50a0: 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e  ession.** is con
50b0: 73 74 61 6e 74 2e 20 20 53 65 65 20 73 71 6c 69  stant.  See sqli
50c0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
50d0: 74 28 29 20 66 6f 72 20 61 64 64 69 74 69 6f 6e  t() for addition
50e0: 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a  al information..
50f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65 78  */.static int ex
5100: 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74  prNodeIsConstant
5110: 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45 78 70  (void *pArg, Exp
5120: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 73 77 69  r *pExpr){.  swi
5130: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
5140: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  {.    case TK_ID
5150: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
5160: 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  LUMN:.    case T
5170: 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  K_DOT:.    case 
5180: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
5190: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
51a0: 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65 66 20 53  CTION:.#ifndef S
51b0: 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55  QLITE_OMIT_SUBQU
51c0: 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ERY.    case TK_
51d0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 63 61 73 65  SELECT:.    case
51e0: 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23 65 6e 64   TK_EXISTS:.#end
51f0: 69 66 0a 20 20 20 20 20 20 2a 28 28 69 6e 74 2a  if.      *((int*
5200: 29 70 41 72 67 29 20 3d 20 30 3b 0a 20 20 20 20  )pArg) = 0;.    
5210: 20 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20    return 2;.    
5220: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
5230: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a  eturn 0;.  }.}..
5240: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
5250: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
5260: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
5270: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
5280: 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20  nstant.** and 0 
5290: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
52a0: 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20  ariables..**.** 
52b0: 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65 73  For the purposes
52c0: 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f   of this functio
52d0: 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74  n, a double-quot
52e0: 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22  ed string (ex: "
52f0: 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73  abc").** is cons
5300: 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62 6c  idered a variabl
5310: 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71  e but a single-q
5320: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
5330: 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61  : 'abc') is.** a
5340: 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e   constant..*/.in
5350: 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  t sqlite3ExprIsC
5360: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29  onstant(Expr *p)
5370: 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e 73 74 20  {.  int isConst 
5380: 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54  = 1;.  walkExprT
5390: 72 65 65 28 70 2c 20 65 78 70 72 4e 6f 64 65 49  ree(p, exprNodeI
53a0: 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69 73 43 6f  sConstant, &isCo
53b0: 6e 73 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 69  nst);.  return i
53c0: 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  sConst;.}../*.**
53d0: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
53e0: 6f 6e 20 70 20 63 6f 64 65 73 20 61 20 63 6f 6e  on p codes a con
53f0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
5400: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
5410: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
5420: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
5430: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
5440: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
5450: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
5460: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
5470: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
5480: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
5490: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
54a0: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
54b0: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
54c0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
54d0: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
54e0: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
54f0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
5500: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
5510: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
5520: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
5530: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
5540: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
5550: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
5560: 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e  tInt32(p->token.
5570: 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20  z, pValue) ){.  
5580: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
5590: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
55a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
55b0: 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a  ase TK_UPLUS: {.
55c0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
55d0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
55e0: 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c  r(p->pLeft, pVal
55f0: 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  ue);.    }.    c
5600: 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b  ase TK_UMINUS: {
5610: 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20  .      int v;.  
5620: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
5630: 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e  xprIsInteger(p->
5640: 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20  pLeft, &v) ){.  
5650: 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20        *pValue = 
5660: 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75  -v;.        retu
5670: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
5680: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
5690: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
56a0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
56b0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65  n 0;.}../*.** Re
56c0: 74 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65  turn TRUE if the
56d0: 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73   given string is
56e0: 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e   a row-id column
56f0: 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71   name..*/.int sq
5700: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e  lite3IsRowid(con
5710: 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69  st char *z){.  i
5720: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
5730: 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d  p(z, "_ROWID_")=
5740: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
5750: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5760: 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d  Cmp(z, "ROWID")=
5770: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
5780: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
5790: 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30  Cmp(z, "OID")==0
57a0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72   ) return 1;.  r
57b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
57c0: 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65  * Given the name
57d0: 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20   of a column of 
57e0: 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f  the form X.Y.Z o
57f0: 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c  r Y.Z or just Z,
5800: 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74   look up.** that
5810: 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74   name in the set
5820: 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65   of source table
5830: 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e  s in pSrcList an
5840: 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72  d make the pExpr
5850: 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20   .** expression 
5860: 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20  node refer back 
5870: 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63  to that source c
5880: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c  olumn.  The foll
5890: 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a  owing changes.**
58a0: 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78   are made to pEx
58b0: 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78  pr:.**.**    pEx
58c0: 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20  pr->iDb         
58d0: 20 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20    Set the index 
58e0: 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20  in db->aDb[] of 
58f0: 74 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c  the database hol
5900: 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20  ding.**         
5910: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5920: 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20  the table..**   
5930: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20   pExpr->iTable  
5940: 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65        Set to the
5950: 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66   cursor number f
5960: 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74  or the table obt
5970: 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20  ained.**        
5980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5990: 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a   from pSrcList..
59a0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  **    pExpr->iCo
59b0: 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74  lumn       Set t
59c0: 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d  o the column num
59d0: 62 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74  ber within the t
59e0: 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70  able..**    pExp
59f0: 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20  r->op           
5a00: 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d   Set to TK_COLUM
5a10: 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  N..**    pExpr->
5a20: 70 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e  pLeft         An
5a30: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
5a40: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
5a50: 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78  eleted.**    pEx
5a60: 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20  pr->pRight      
5a70: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
5a80: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
5a90: 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a  is deleted..**.*
5aa0: 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69  * The pDbToken i
5ab0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  s the name of th
5ac0: 65 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20  e database (the 
5ad0: 22 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75  "X").  This valu
5ae0: 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c  e may be.** NULL
5af0: 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61   meaning that na
5b00: 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  me is of the for
5b10: 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79  m Y.Z or Z.  Any
5b20: 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62   available datab
5b30: 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ase.** can be us
5b40: 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54  ed.  The pTableT
5b50: 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65  oken is the name
5b60: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74   of the table (t
5b70: 68 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a  he "Y").  This.*
5b80: 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e  * value can be N
5b90: 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20  ULL if pDbToken 
5ba0: 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49  is also NULL.  I
5bb0: 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  f pTableToken is
5bc0: 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e   NULL it.** mean
5bd0: 73 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20  s that the form 
5be0: 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a  of the name is Z
5bf0: 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e   and that column
5c00: 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65  s from any table
5c10: 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e  .** can be used.
5c20: 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61  .**.** If the na
5c30: 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73  me cannot be res
5c40: 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75  olved unambiguou
5c50: 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72  sly, leave an er
5c60: 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69  ror message.** i
5c70: 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74  n pParse and ret
5c80: 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52  urn non-zero.  R
5c90: 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75  eturn zero on su
5ca0: 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63  ccess..*/.static
5cb0: 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   int lookupName(
5cc0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
5cd0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  ,      /* The pa
5ce0: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
5cf0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b  .  Token *pDbTok
5d00: 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  en,     /* Name 
5d10: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
5d20: 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65  containing table
5d30: 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54  , or NULL */.  T
5d40: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65  oken *pTableToke
5d50: 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  n,  /* Name of t
5d60: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20  able containing 
5d70: 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20  column, or NULL 
5d80: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c  */.  Token *pCol
5d90: 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d  umnToken, /* Nam
5da0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
5db0: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
5dc0: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 54 68  t *pNC,    /* Th
5dd0: 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 20 75  e name context u
5de0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 74  sed to resolve t
5df0: 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 45 78 70  he name */.  Exp
5e00: 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20  r *pExpr        
5e10: 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45    /* Make this E
5e20: 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74  XPR node point t
5e30: 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63  o the selected c
5e40: 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68  olumn */.){.  ch
5e50: 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20  ar *zDb = 0;    
5e60: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
5e70: 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65  e database.  The
5e80: 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f   "X" in X.Y.Z */
5e90: 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20  .  char *zTab = 
5ea0: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
5eb0: 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54  of the table.  T
5ec0: 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20  he "Y" in X.Y.Z 
5ed0: 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72  or Y.Z */.  char
5ee0: 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20   *zCol = 0;     
5ef0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5f00: 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22  column.  The "Z"
5f10: 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20   */.  int i, j; 
5f20: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f             /* Lo
5f30: 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20  op counters */. 
5f40: 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20   int cnt = 0;   
5f50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5f60: 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75  of matching colu
5f70: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e  mn names */.  in
5f80: 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20  t cntTab = 0;   
5f90: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
5fa0: 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e  matching table n
5fb0: 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65  ames */.  sqlite
5fc0: 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  3 *db = pParse->
5fd0: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
5fe0: 62 61 73 65 20 2a 2f 0a 20 20 73 74 72 75 63 74  base */.  struct
5ff0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
6000: 49 74 65 6d 3b 20 20 20 20 20 20 20 2f 2a 20 55  Item;       /* U
6010: 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f  se for looping o
6020: 76 65 72 20 70 53 72 63 4c 69 73 74 20 69 74 65  ver pSrcList ite
6030: 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53  ms */.  struct S
6040: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4d 61  rcList_item *pMa
6050: 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20 54 68 65  tch = 0;  /* The
6060: 20 6d 61 74 63 68 69 6e 67 20 70 53 72 63 4c 69   matching pSrcLi
6070: 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d  st item */.  Nam
6080: 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f 70 4e 43  eContext *pTopNC
6090: 20 3d 20 70 4e 43 3b 20 20 20 20 20 20 20 20 2f   = pNC;        /
60a0: 2a 20 46 69 72 73 74 20 6e 61 6d 65 63 6f 6e 74  * First namecont
60b0: 65 78 74 20 69 6e 20 74 68 65 20 6c 69 73 74 20  ext in the list 
60c0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
60d0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
60e0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
60f0: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
6100: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
6110: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
6120: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
6130: 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  n(pDbToken);.  z
6140: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
6150: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
6160: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
6170: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
6180: 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f  mToken(pColumnTo
6190: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
61a0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
61b0: 64 20 29 7b 0a 20 20 20 20 67 6f 74 6f 20 6c 6f  d ){.    goto lo
61c0: 6f 6b 75 70 6e 61 6d 65 5f 65 6e 64 3b 0a 20 20  okupname_end;.  
61d0: 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  }..  pExpr->iTab
61e0: 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  le = -1;.  while
61f0: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
6200: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
6210: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
6220: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45 78  pSrcList;.    Ex
6230: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
6240: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   pNC->pEList;.. 
6250: 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a 54     /* assert( zT
6260: 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d  ab==0 || pEList=
6270: 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69 66 28  =0 ); */.    if(
6280: 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
6290: 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74 65     for(i=0, pIte
62a0: 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20 69  m=pSrcList->a; i
62b0: 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b  <pSrcList->nSrc;
62c0: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a   i++, pItem++){.
62d0: 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70          Table *p
62e0: 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61  Tab = pItem->pTa
62f0: 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d  b;.        Colum
6300: 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20 20  n *pCol;.  .    
6310: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
6320: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
6330: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
6340: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
6350: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
6360: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70 49            if( pI
6370: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20  tem->zAlias ){. 
6380: 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20             char 
6390: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
63a0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
63b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
63c0: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
63d0: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
63e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
63f0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
6400: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
6410: 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61  Name = pTab->zNa
6420: 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  me;.            
6430: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
6440: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
6450: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
6460: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
6470: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
6480: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
6490: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
64a0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
64b0: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
64c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e               con
64d0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20  tinue;.         
64e0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d     }.          }
64f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
6500: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
6510: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20 20  b++) ){.        
6520: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6530: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
6540: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
6550: 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  r->iDb = pTab->i
6560: 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d  Db;.          pM
6570: 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20  atch = pItem;.  
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6590: 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(j=0, pCol=pT
65a0: 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
65b0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f  ->nCol; j++, pCo
65c0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  l++){.          
65d0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
65e0: 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20  mp(pCol->zName, 
65f0: 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20  zCol)==0 ){.    
6600: 20 20 20 20 20 20 20 20 49 64 4c 69 73 74 20 2a          IdList *
6610: 70 55 73 69 6e 67 3b 0a 20 20 20 20 20 20 20 20  pUsing;.        
6620: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
6630: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
6640: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
6650: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20  ursor;.         
6660: 20 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65     pMatch = pIte
6670: 6d 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  m;.            p
6680: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
6690: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20  ->iDb;.         
66a0: 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65     /* Substitute
66b0: 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75   the rowid (colu
66c0: 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49  mn -1) for the I
66d0: 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b  NTEGER PRIMARY K
66e0: 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  EY */.          
66f0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
6700: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
6710: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
6720: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61          pExpr->a
6730: 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e  ffinity = pTab->
6740: 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79  aCol[j].affinity
6750: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45  ;.            pE
6760: 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61  xpr->pColl = pTa
6770: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c  b->aCol[j].pColl
6780: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
6790: 28 20 70 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  ( pItem->jointyp
67a0: 65 20 26 20 4a 54 5f 4e 41 54 55 52 41 4c 20 29  e & JT_NATURAL )
67b0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
67c0: 2f 2a 20 49 66 20 74 68 69 73 20 6d 61 74 63 68  /* If this match
67d0: 20 6f 63 63 75 72 72 65 64 20 69 6e 20 74 68 65   occurred in the
67e0: 20 6c 65 66 74 20 74 61 62 6c 65 20 6f 66 20 61   left table of a
67f0: 20 6e 61 74 75 72 61 6c 20 6a 6f 69 6e 2c 0a 20   natural join,. 
6800: 20 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20               ** 
6810: 74 68 65 6e 20 73 6b 69 70 20 74 68 65 20 72 69  then skip the ri
6820: 67 68 74 20 74 61 62 6c 65 20 74 6f 20 61 76 6f  ght table to avo
6830: 69 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d  id a duplicate m
6840: 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 20 20  atch */.        
6850: 20 20 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20        pItem++;. 
6860: 20 20 20 20 20 20 20 20 20 20 20 20 20 69 2b 2b               i++
6870: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a  ;.            }.
6880: 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20              if( 
6890: 28 70 55 73 69 6e 67 20 3d 20 70 49 74 65 6d 2d  (pUsing = pItem-
68a0: 3e 70 55 73 69 6e 67 29 21 3d 30 20 29 7b 0a 20  >pUsing)!=0 ){. 
68b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
68c0: 49 66 20 74 68 69 73 20 6d 61 74 63 68 20 6f 63  If this match oc
68d0: 63 75 72 73 20 6f 6e 20 61 20 63 6f 6c 75 6d 6e  curs on a column
68e0: 20 74 68 61 74 20 69 73 20 69 6e 20 74 68 65 20   that is in the 
68f0: 55 53 49 4e 47 20 63 6c 61 75 73 65 0a 20 20 20  USING clause.   
6900: 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20 6f 66             ** of
6910: 20 61 20 6a 6f 69 6e 2c 20 73 6b 69 70 20 74 68   a join, skip th
6920: 65 20 73 65 61 72 63 68 20 6f 66 20 74 68 65 20  e search of the 
6930: 72 69 67 68 74 20 74 61 62 6c 65 20 6f 66 20 74  right table of t
6940: 68 65 20 6a 6f 69 6e 0a 20 20 20 20 20 20 20 20  he join.        
6950: 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 76 6f 69        ** to avoi
6960: 64 20 61 20 64 75 70 6c 69 63 61 74 65 20 6d 61  d a duplicate ma
6970: 74 63 68 20 74 68 65 72 65 2e 20 2a 2f 0a 20 20  tch there. */.  
6980: 20 20 20 20 20 20 20 20 20 20 20 20 69 6e 74 20              int 
6990: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  k;.             
69a0: 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70 55 73 69   for(k=0; k<pUsi
69b0: 6e 67 2d 3e 6e 49 64 3b 20 6b 2b 2b 29 7b 0a 20  ng->nId; k++){. 
69c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
69d0: 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  f( sqlite3StrICm
69e0: 70 28 70 55 73 69 6e 67 2d 3e 61 5b 6b 5d 2e 7a  p(pUsing->a[k].z
69f0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
6a00: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
6a10: 20 20 20 20 70 49 74 65 6d 2b 2b 3b 0a 20 20 20      pItem++;.   
6a20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69                 i
6a30: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
6a40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6a50: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6a60: 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20               }. 
6a70: 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
6a80: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6a90: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6ab0: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
6ac0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
6ad0: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
6ae0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
6af0: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
6b00: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
6b10: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
6b20: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
6b30: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
6b40: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
6b50: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
6b60: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
6b70: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
6b80: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
6b90: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
6ba0: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
6bb0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
6bc0: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
6bd0: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
6be0: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
6bf0: 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31  ck->newIdx != -1
6c00: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6c10: 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20  mp("new", zTab) 
6c20: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
6c30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
6c40: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
6c50: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61  ewIdx;.        a
6c60: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
6c70: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
6c80: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
6c90: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
6ca0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6cb0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6cc0: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
6cd0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6ce0: 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20  "old", zTab)==0 
6cf0: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
6d00: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
6d10: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
6d20: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6d30: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6d40: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
6d50: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
6d60: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
6d70: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6d80: 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20  pTab ){ .       
6d90: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
6da0: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
6db0: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20  Tab->aCol;..    
6dc0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
6dd0: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
6de0: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
6df0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6e00: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   < pTab->nCol; j
6e10: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
6e20: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6e30: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
6e40: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
6e50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
6e60: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
6e70: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
6e80: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
6e90: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
6ea0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6eb0: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
6ec0: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
6ed0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
6ee0: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54  Expr->pColl = pT
6ef0: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
6f00: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  l;.            p
6f10: 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70 54 61  Expr->pTab = pTa
6f20: 62 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  b;.            b
6f30: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
6f40: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6f50: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
6f60: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
6f70: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
6f80: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
6f90: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
6fa0: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
6fb0: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
6fc0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6fd0: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
6fe0: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  ==1 && sqlite3Is
6ff0: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20  Rowid(zCol) ){. 
7000: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
7010: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
7020: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
7030: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
7040: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
7050: 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  GER;.    }..    
7060: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  /*.    ** If the
7070: 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65   input is of the
7080: 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a   form Z (not Y.Z
7090: 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20   or X.Y.Z) then 
70a0: 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a  the name Z.    *
70b0: 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f  * might refer to
70c0: 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61   an result-set a
70d0: 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70  lias.  This happ
70e0: 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
70f0: 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65  , when.    ** we
7100: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e   are resolving n
7110: 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ames in the WHER
7120: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
7130: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
7140: 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
7150: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
7160: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
7170: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20  WHERE x<10;.    
7180: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73  **.    ** In cas
7190: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
71a0: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
71b0: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
71c0: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
71d0: 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20     ** forms the 
71e0: 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79  result set entry
71f0: 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65   ("a+b" in the e
7200: 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75  xample) and retu
7210: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
7220: 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
7230: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7240: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
7250: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  t should have al
7260: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
7270: 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68  * resolved by th
7280: 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45  e time the WHERE
7290: 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c   clause is resol
72a0: 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ved..    */.    
72b0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45  if( cnt==0 && pE
72c0: 4c 69 73 74 21 3d 30 20 26 26 20 7a 54 61 62 3d  List!=0 && zTab=
72d0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
72e0: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
72f0: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
7300: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
7310: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
7320: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
7330: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
7340: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
7350: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
7360: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
7370: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
7380: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
7390: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  );.          pEx
73a0: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
73b0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
73c0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
73d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
73e0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
73f0: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
7400: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
7410: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
7420: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
7430: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
7440: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 67  0 );.          g
7450: 6f 74 6f 20 6c 6f 6f 6b 75 70 6e 61 6d 65 5f 65  oto lookupname_e
7460: 6e 64 5f 32 3b 0a 20 20 20 20 20 20 20 20 7d 0a  nd_2;.        }.
7470: 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d 0a 0a        } .    }..
7480: 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65 20 74      /* Advance t
7490: 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d 65 20  o the next name 
74a0: 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20 6c 6f  context.  The lo
74b0: 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77 68 65  op will exit whe
74c0: 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a 2a 20  n either.    ** 
74d0: 77 65 20 68 61 76 65 20 61 20 6d 61 74 63 68 20  we have a match 
74e0: 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65 6e 20  (cnt>0) or when 
74f0: 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20 6e 61  we run out of na
7500: 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20 20 20  me contexts..   
7510: 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d   */.    if( cnt=
7520: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e 43 20  =0 ){.      pNC 
7530: 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a 20 20  = pNC->pNext;.  
7540: 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20    }.  }..  /*.  
7550: 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72  ** If X and Y ar
7560: 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72  e NULL (in other
7570: 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74   words if only t
7580: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a  he column name Z
7590: 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65   is.  ** supplie
75a0: 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  d) and the value
75b0: 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65   of Z is enclose
75c0: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
75d0: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20  es, then.  ** Z 
75e0: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
75f0: 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ral if it doesn'
7600: 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75  t match any colu
7610: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68  mn names.  In th
7620: 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65  at.  ** case, we
7630: 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20   need to return 
7640: 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e  right away and n
7650: 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  ot make any chan
7660: 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70  ges to.  ** pExp
7670: 72 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20 42 65 63  r..  **.  ** Bec
7680: 61 75 73 65 20 6e 6f 20 72 65 66 65 72 65 6e 63  ause no referenc
7690: 65 20 77 61 73 20 6d 61 64 65 20 74 6f 20 6f 75  e was made to ou
76a0: 74 65 72 20 63 6f 6e 74 65 78 74 73 2c 20 74 68  ter contexts, th
76b0: 65 20 70 4e 43 2d 3e 6e 52 65 66 0a 20 20 2a 2a  e pNC->nRef.  **
76c0: 20 66 69 65 6c 64 73 20 61 72 65 20 6e 6f 74 20   fields are not 
76d0: 63 68 61 6e 67 65 64 20 69 6e 20 61 6e 79 20 63  changed in any c
76e0: 6f 6e 74 65 78 74 2e 0a 20 20 2a 2f 0a 20 20 69  ontext..  */.  i
76f0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
7700: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
7710: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
7720: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
7730: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
7740: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
7750: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
7760: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
7770: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
7780: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
7790: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
77a0: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
77b0: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
77c0: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
77d0: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
77e0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
77f0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
7800: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
7810: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
7820: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
7830: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
7840: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
7850: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
7860: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
7870: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
7880: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
7890: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
78a0: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
78b0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
78c0: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
78d0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
78e0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
78f0: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
7900: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
7910: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
7920: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
7930: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
7940: 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b    pTopNC->nErr++
7950: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61  ;.  }..  /* If a
7960: 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74   column from a t
7970: 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73 74  able in pSrcList
7980: 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c 20   is referenced, 
7990: 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a  then record.  **
79a0: 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74 68   this fact in th
79b0: 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63  e pSrcList.a[].c
79c0: 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e 20  olUsed bitmask. 
79d0: 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65 73   Column 0 causes
79e0: 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20 62  .  ** bit 0 to b
79f0: 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31  e set.  Column 1
7a00: 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41 6e   sets bit 1.  An
7a10: 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66 20  d so forth.  If 
7a20: 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20  the.  ** column 
7a30: 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74 65  number is greate
7a40: 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62 65  r than the numbe
7a50: 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68 65  r of bits in the
7a60: 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68   bitmask.  ** th
7a70: 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68 2d  en set the high-
7a80: 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68 65  order bit of the
7a90: 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20   bitmask..  */. 
7aa0: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
7ab0: 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63 68  umn>=0 && pMatch
7ac0: 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e  !=0 ){.    int n
7ad0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
7ae0: 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73 69  n;.    if( n>=si
7af0: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 20  zeof(Bitmask)*8 
7b00: 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69 7a  ){.      n = siz
7b10: 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31  eof(Bitmask)*8-1
7b20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
7b30: 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75 72  rt( pMatch->iCur
7b40: 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  sor==pExpr->iTab
7b50: 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63 68  le );.    pMatch
7b60: 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c 3c  ->colUsed |= 1<<
7b70: 6e 3b 0a 20 20 7d 0a 0a 6c 6f 6f 6b 75 70 6e 61  n;.  }..lookupna
7b80: 6d 65 5f 65 6e 64 3a 0a 20 20 2f 2a 20 43 6c 65  me_end:.  /* Cle
7b90: 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72 6e  an up and return
7ba0: 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72  .  */.  sqliteFr
7bb0: 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74  ee(zDb);.  sqlit
7bc0: 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20 73  eFree(zTab);.  s
7bd0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
7be0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
7bf0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
7c00: 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70   0;.  sqlite3Exp
7c10: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
7c20: 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d  Right);.  pExpr-
7c30: 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70  >pRight = 0;.  p
7c40: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f  Expr->op = TK_CO
7c50: 4c 55 4d 4e 3b 0a 6c 6f 6f 6b 75 70 6e 61 6d 65  LUMN;.lookupname
7c60: 5f 65 6e 64 5f 32 3a 0a 20 20 73 71 6c 69 74 65  _end_2:.  sqlite
7c70: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 69 66  Free(zCol);.  if
7c80: 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20  ( cnt==1 ){.    
7c90: 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29  assert( pNC!=0 )
7ca0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74  ;.    sqlite3Aut
7cb0: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
7cc0: 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69  xpr, pNC->pSrcLi
7cd0: 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70 4d 61  st);.    if( pMa
7ce0: 74 63 68 20 26 26 20 21 70 4d 61 74 63 68 2d 3e  tch && !pMatch->
7cf0: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
7d00: 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d 20 70   pExpr->pTab = p
7d10: 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20 20 20  Match->pTab;.   
7d20: 20 7d 0a 20 20 20 20 2f 2a 20 49 6e 63 72 65 6d   }.    /* Increm
7d30: 65 6e 74 20 74 68 65 20 6e 52 65 66 20 76 61 6c  ent the nRef val
7d40: 75 65 20 6f 6e 20 61 6c 6c 20 6e 61 6d 65 20 63  ue on all name c
7d50: 6f 6e 74 65 78 74 73 20 66 72 6f 6d 20 54 6f 70  ontexts from Top
7d60: 4e 43 20 75 70 20 74 6f 0a 20 20 20 20 2a 2a 20  NC up to.    ** 
7d70: 74 68 65 20 70 6f 69 6e 74 20 77 68 65 72 65 20  the point where 
7d80: 74 68 65 20 6e 61 6d 65 20 6d 61 74 63 68 65 64  the name matched
7d90: 2e 20 2a 2f 0a 20 20 20 20 66 6f 72 28 3b 3b 29  . */.    for(;;)
7da0: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
7db0: 70 54 6f 70 4e 43 21 3d 30 20 29 3b 0a 20 20 20  pTopNC!=0 );.   
7dc0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 52 65 66 2b     pTopNC->nRef+
7dd0: 2b 3b 0a 20 20 20 20 20 20 69 66 28 20 70 54 6f  +;.      if( pTo
7de0: 70 4e 43 3d 3d 70 4e 43 20 29 20 62 72 65 61 6b  pNC==pNC ) break
7df0: 3b 0a 20 20 20 20 20 20 70 54 6f 70 4e 43 20 3d  ;.      pTopNC =
7e00: 20 70 54 6f 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a   pTopNC->pNext;.
7e10: 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
7e20: 20 30 3b 0a 20 20 7d 20 65 6c 73 65 20 7b 0a 20   0;.  } else {. 
7e30: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
7e40: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
7e50: 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67 6e  outine is design
7e60: 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20 66  ed as an xFunc f
7e70: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
7e80: 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65  )..**.** Resolve
7e90: 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20   symbolic names 
7ea0: 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f  into TK_COLUMN o
7eb0: 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68 65  perators for the
7ec0: 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65   current.** node
7ed0: 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   in the expressi
7ee0: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
7ef0: 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74   0 to continue t
7f00: 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a  he search down.*
7f10: 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32 20  * the tree or 2 
7f20: 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72 65  to abort the tre
7f30: 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68  e walk..**.** Th
7f40: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
7f50: 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63 6b  does error check
7f60: 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65 73  ing and name res
7f70: 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66  olution for.** f
7f80: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20  unction names.  
7f90: 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f 72  The operator for
7fa0: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7fb0: 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64 0a  ions is changed.
7fc0: 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e  ** to TK_AGG_FUN
7fd0: 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63  CTION..*/.static
7fe0: 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65   int nameResolve
7ff0: 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72 67  rStep(void *pArg
8000: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
8010: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
8020: 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78  NC = (NameContex
8030: 74 2a 29 70 41 72 67 3b 0a 20 20 53 72 63 4c 69  t*)pArg;.  SrcLi
8040: 73 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a 20 20  st *pSrcList;.  
8050: 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a 0a  Parse *pParse;..
8060: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
8070: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 61 73 73   return 1;.  ass
8080: 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b 0a 20  ert( pNC!=0 );. 
8090: 20 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d   pSrcList = pNC-
80a0: 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 70 50 61  >pSrcList;.  pPa
80b0: 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  rse = pNC->pPars
80c0: 65 3b 0a 0a 20 20 69 66 28 20 45 78 70 72 48 61  e;..  if( ExprHa
80d0: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
80e0: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
80f0: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45   ) return 1;.  E
8100: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
8110: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
8120: 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  d);.#ifndef NDEB
8130: 55 47 0a 20 20 69 66 28 20 70 53 72 63 4c 69 73  UG.  if( pSrcLis
8140: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
8150: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
8160: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
8170: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
8180: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
8190: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
81a0: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
81b0: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
81c0: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
81d0: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
81e0: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
81f0: 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74    /* Double-quot
8200: 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ed strings (ex: 
8210: 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20  "abc") are used 
8220: 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  as identifiers i
8230: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  f.    ** possibl
8240: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
8250: 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72  ey remain as str
8260: 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75  ings.  Single-qu
8270: 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69  oted.    ** stri
8280: 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20  ngs (ex: 'abc') 
8290: 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e  are always strin
82a0: 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20  g literals..    
82b0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  */.    case TK_S
82c0: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
82d0: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
82e0: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65  z[0]=='\'' ) bre
82f0: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  ak;.      /* Fal
8300: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
8310: 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68  TK_ID case if th
8320: 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71  is is a double-q
8330: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  uoted string */.
8340: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c      }.    /* A l
8350: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69  one identifier i
8360: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
8370: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
8380: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
8390: 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d  .      lookupNam
83a0: 65 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  e(pParse, 0, 0, 
83b0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70  &pExpr->token, p
83c0: 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  NC, pExpr);.    
83d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
83e0: 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61  }.  .    /* A ta
83f0: 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c  ble name and col
8400: 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44  umn name:     ID
8410: 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20  .ID.    ** Or a 
8420: 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20  database, table 
8430: 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e  and column:  ID.
8440: 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20  ID.ID.    */.   
8450: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a   case TK_DOT: {.
8460: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f        Token *pCo
8470: 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65  lumn;.      Toke
8480: 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20  n *pTable;.     
8490: 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20   Token *pDb;.   
84a0: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b     Expr *pRight;
84b0: 0a 0a 20 20 20 20 20 20 2f 2a 20 69 66 28 20 70  ..      /* if( p
84c0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 62 72 65  SrcList==0 ) bre
84d0: 61 6b 3b 20 2a 2f 0a 20 20 20 20 20 20 70 52 69  ak; */.      pRi
84e0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
84f0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
8500: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
8510: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20   ){.        pDb 
8520: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
8530: 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  ble = &pExpr->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 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
8570: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8580: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
8590: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
85a0: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26  .        pDb = &
85b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
85c0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ken;.        pTa
85d0: 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  ble = &pRight->p
85e0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
85f0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
8600: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
8610: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  token;.      }. 
8620: 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28       lookupName(
8630: 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61  pParse, pDb, pTa
8640: 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 4e  ble, pColumn, pN
8650: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
8660: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
8670: 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f 6c 76 65  ..    /* Resolve
8680: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 0a   function names.
8690: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
86a0: 54 4b 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20  TK_CONST_FUNC:. 
86b0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
86c0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
86d0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
86e0: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20 20  Expr->pList;    
86f0: 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74 20  /* The argument 
8700: 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e  list */.      in
8710: 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  t n = pList ? pL
8720: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20  ist->nExpr : 0; 
8730: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
8740: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
8750: 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   int no_such_fun
8760: 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  c = 0;       /* 
8770: 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20  True if no such 
8780: 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20  function exists 
8790: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f  */.      int wro
87a0: 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b  ng_num_args = 0;
87b0: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
87c0: 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20  wrong number of 
87d0: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
87e0: 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20     int is_agg = 
87f0: 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  0;             /
8800: 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e 20  * True if is an 
8810: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8820: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  on */.      int 
8830: 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64  i;.      int nId
8840: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
8850: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
8860: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
8870: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f  function name */
8880: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
8890: 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20  r *zId;         
88a0: 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69     /* The functi
88b0: 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20  on name. */.    
88c0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
88d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
88e0: 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62 6f   Information abo
88f0: 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  ut the function 
8900: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e 63  */.      int enc
8910: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
8920: 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  nc;  /* The data
8930: 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  base encoding */
8940: 0a 0a 20 20 20 20 20 20 7a 49 64 20 3d 20 70 45  ..      zId = pE
8950: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
8960: 20 20 20 20 6e 49 64 20 3d 20 70 45 78 70 72 2d      nId = pExpr-
8970: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
8980: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
8990: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
89a0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
89b0: 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   n, enc, 0);.   
89c0: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
89d0: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
89e0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
89f0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
8a00: 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65   zId, nId, -1, e
8a10: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
8a20: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
8a30: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
8a40: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
8a50: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8a60: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
8a70: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
8a80: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8a90: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
8aa0: 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a  pDef->xFunc==0;.
8ab0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8ac0: 28 20 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43  ( is_agg && !pNC
8ad0: 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20  ->allowAgg ){.  
8ae0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8af0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d  orMsg(pParse, "m
8b00: 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67 61  isuse of aggrega
8b10: 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  te function %.*s
8b20: 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20  ()", nId,zId);. 
8b30: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
8b40: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61  ++;.        is_a
8b50: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65  gg = 0;.      }e
8b60: 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f  lse if( no_such_
8b70: 66 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20  func ){.        
8b80: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8b90: 70 50 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68  pParse, "no such
8ba0: 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22   function: %.*s"
8bb0: 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20  , nId, zId);.   
8bc0: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
8bd0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8be0: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
8bf0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8c00: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8c10: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
8c20: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
8c30: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
8c40: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8c50: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
8c60: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
8c70: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8c80: 28 20 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20  ( is_agg ){.    
8c90: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20      pExpr->op = 
8ca0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b  TK_AGG_FUNCTION;
8cb0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61  .        pNC->ha
8cc0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
8cd0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
8ce0: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
8cf0: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f  gg = 0;.      fo
8d00: 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72  r(i=0; pNC->nErr
8d10: 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29  ==0 && i<n; i++)
8d20: 7b 0a 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78  {.        walkEx
8d30: 70 72 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b  prTree(pList->a[
8d40: 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  i].pExpr, nameRe
8d50: 73 6f 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29  solverStep, pNC)
8d60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8d70: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
8d80: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a  ->allowAgg = 1;.
8d90: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
8da0: 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d    Compute pExpr-
8db0: 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20  >affinity based 
8dc0: 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  on the expected 
8dd0: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  return.      ** 
8de0: 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63  type of the func
8df0: 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  tion .      */. 
8e00: 20 20 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61       return is_a
8e10: 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  gg;.    }.#ifnde
8e20: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
8e30: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
8e40: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
8e50: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
8e60: 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54  endif.    case T
8e70: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66  K_IN: {.      if
8e80: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
8e90: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
8ea0: 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e 52 65 66  nRef = pNC->nRef
8eb0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
8ec0: 33 53 65 6c 65 63 74 52 65 73 6f 6c 76 65 28 70  3SelectResolve(p
8ed0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
8ee0: 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a 20 20 20  elect, pNC);.   
8ef0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43       assert( pNC
8f00: 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20 29 3b 0a  ->nRef>=nRef );.
8f10: 20 20 20 20 20 20 20 20 69 66 28 20 6e 52 65 66          if( nRef
8f20: 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29 7b 0a 20  !=pNC->nRef ){. 
8f30: 20 20 20 20 20 20 20 20 20 45 78 70 72 53 65 74           ExprSet
8f40: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
8f50: 45 50 5f 56 61 72 53 65 6c 65 63 74 29 3b 0a 20  EP_VarSelect);. 
8f60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
8f70: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
8f80: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
8f90: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 77 61 6c  This routine wal
8fa0: 6b 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ks an expression
8fb0: 20 74 72 65 65 20 61 6e 64 20 72 65 73 6f 6c 76   tree and resolv
8fc0: 65 73 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  es references to
8fd0: 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e  .** table column
8fe0: 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20 74 68 65  s.  Nodes of the
8ff0: 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f 72 20 49   form ID.ID or I
9000: 44 20 72 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61  D resolve into a
9010: 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f 20 74 68  n.** index to th
9020: 65 20 74 61 62 6c 65 20 69 6e 20 74 68 65 20 74  e table in the t
9030: 61 62 6c 65 20 6c 69 73 74 20 61 6e 64 20 61 20  able list and a 
9040: 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20  column offset.  
9050: 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63  The .** Expr.opc
9060: 6f 64 65 20 66 6f 72 20 73 75 63 68 20 6e 6f 64  ode for such nod
9070: 65 73 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  es is changed to
9080: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65   TK_COLUMN.  The
9090: 20 45 78 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20   Expr.iTable.** 
90a0: 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64  value is changed
90b0: 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66   to the index of
90c0: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
90d0: 74 61 62 6c 65 20 69 6e 20 70 54 61 62 4c 69 73  table in pTabLis
90e0: 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65 20 22 62  t.** plus the "b
90f0: 61 73 65 22 20 76 61 6c 75 65 2e 20 20 54 68 65  ase" value.  The
9100: 20 62 61 73 65 20 76 61 6c 75 65 20 77 69 6c 6c   base value will
9110: 20 75 6c 74 69 6d 61 74 65 6c 79 20 62 65 63 6f   ultimately beco
9120: 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42 45 20 63  me the.** VDBE c
9130: 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72  ursor number for
9140: 20 61 20 63 75 72 73 6f 72 20 74 68 61 74 20 69   a cursor that i
9150: 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20  s pointing into 
9160: 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a  the referenced.*
9170: 2a 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78  * table.  The Ex
9180: 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65  pr.iColumn value
9190: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
91a0: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
91b0: 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68  column .** of th
91c0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
91d0: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
91e0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20  olumn value for 
91f0: 74 68 65 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52  the special.** R
9200: 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d  OWID column is -
9210: 31 2e 20 20 41 6e 79 20 49 4e 54 45 47 45 52 20  1.  Any INTEGER 
9220: 50 52 49 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75  PRIMARY KEY colu
9230: 6d 6e 20 69 73 20 74 72 69 65 64 20 61 73 20 61  mn is tried as a
9240: 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f 72 20 52  n.** alias for R
9250: 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f  OWID..**.** Also
9260: 20 72 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   resolve functio
9270: 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63 68 65 63  n names and chec
9280: 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20  k the functions 
9290: 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73  for proper.** us
92a0: 61 67 65 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  age.  Make sure 
92b0: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  all function nam
92c0: 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65  es are recognize
92d0: 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69  d and all functi
92e0: 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74 68 65 20  ons.** have the 
92f0: 63 6f 72 72 65 63 74 20 6e 75 6d 62 65 72 20 6f  correct number o
9300: 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65  f arguments.  Le
9310: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
9320: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
9330: 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66 20 61 6e  e->zErrMsg if an
9340: 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e  ything is amiss.
9350: 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d    Return the num
9360: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
9370: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
9380: 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20  ession contains 
9390: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
93a0: 6f 6e 73 20 74 68 65 6e 20 73 65 74 20 74 68 65  ons then set the
93b0: 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65   EP_Agg.** prope
93c0: 72 74 79 20 6f 6e 20 74 68 65 20 65 78 70 72 65  rty on the expre
93d0: 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71  ssion..*/.int sq
93e0: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
93f0: 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65 43 6f 6e  Names(.  NameCon
9400: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 20 20  text *pNC,      
9410: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 74 6f   /* Namespace to
9420: 20 72 65 73 6f 6c 76 65 20 65 78 70 72 65 73 73   resolve express
9430: 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20 20 45 78  ions in. */.  Ex
9440: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
9450: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
9460: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
9470: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
9480: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
9490: 65 74 75 72 6e 20 30 3b 0a 20 20 77 61 6c 6b 45  eturn 0;.  walkE
94a0: 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e  xprTree(pExpr, n
94b0: 61 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c  ameResolverStep,
94c0: 20 70 4e 43 29 3b 0a 20 20 69 66 28 20 70 4e 43   pNC);.  if( pNC
94d0: 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20 20 20 20  ->nErr>0 ){.    
94e0: 45 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28  ExprSetProperty(
94f0: 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29  pExpr, EP_Error)
9500: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 45  ;.  }.  return E
9510: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
9520: 45 78 70 72 2c 20 45 50 5f 45 72 72 6f 72 29 3b  Expr, EP_Error);
9530: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70 6f 69 6e  .}../*.** A poin
9540: 74 65 72 20 69 6e 73 74 61 6e 63 65 20 6f 66 20  ter instance of 
9550: 74 68 69 73 20 73 74 72 75 63 74 75 72 65 20 69  this structure i
9560: 73 20 75 73 65 64 20 74 6f 20 70 61 73 73 20 69  s used to pass i
9570: 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a 20 74 68  nformation.** th
9580: 72 6f 75 67 68 20 77 61 6c 6b 45 78 70 72 54 72  rough walkExprTr
9590: 65 65 20 69 6e 74 6f 20 63 6f 64 65 53 75 62 71  ee into codeSubq
95a0: 75 65 72 79 53 74 65 70 28 29 2e 0a 2a 2f 0a 74  ueryStep()..*/.t
95b0: 79 70 65 64 65 66 20 73 74 72 75 63 74 20 51 75  ypedef struct Qu
95c0: 65 72 79 43 6f 64 65 72 20 51 75 65 72 79 43 6f  eryCoder QueryCo
95d0: 64 65 72 3b 0a 73 74 72 75 63 74 20 51 75 65 72  der;.struct Quer
95e0: 79 43 6f 64 65 72 20 7b 0a 20 20 50 61 72 73 65  yCoder {.  Parse
95f0: 20 2a 70 50 61 72 73 65 3b 20 20 20 20 20 20 20   *pParse;       
9600: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
9610: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e 61 6d 65  ontext */.  Name
9620: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b 20 20 20  Context *pNC;   
9630: 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65 20 6f 66   /* Namespace of
9640: 20 66 69 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67   first enclosing
9650: 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a 0a 0a 2f   query */.};.../
9660: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
9670: 64 65 20 66 6f 72 20 73 75 62 71 75 65 72 69 65  de for subquerie
9680: 73 20 61 6e 64 20 49 4e 20 6f 70 65 72 61 74 6f  s and IN operato
9690: 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f 70 65  rs..**.** IN ope
96a0: 72 61 74 6f 72 73 20 63 6f 6d 65 73 20 69 6e 20  rators comes in 
96b0: 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a  two forms:.**.**
96c0: 20 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20             expr 
96d0: 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a  IN (exprlist).**
96e0: 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20   and.**         
96f0: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
9700: 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65  T ...).**.** The
9710: 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68   first form is h
9720: 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74 69  andled by creati
9730: 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67  ng a set holding
9740: 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20   the list.** of 
9750: 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20  allowed values. 
9760: 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d   The second form
9770: 20 63 61 75 73 65 73 20 74 68 65 20 53 45 4c 45   causes the SELE
9780: 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a  CT to generate .
9790: 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74  ** a temporary t
97a0: 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  able..*/.#ifndef
97b0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
97c0: 51 55 45 52 59 0a 76 6f 69 64 20 73 71 6c 69 74  QUERY.void sqlit
97d0: 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28  e3CodeSubselect(
97e0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
97f0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
9800: 6e 74 20 6c 61 62 65 6c 20 3d 20 30 3b 20 20 20  nt label = 0;   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
9830: 20 61 66 74 65 72 20 73 75 62 2d 73 65 6c 65 63   after sub-selec
9840: 74 20 63 6f 64 65 20 2a 2f 0a 20 20 56 64 62 65  t code */.  Vdbe
9850: 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74   *v = sqlite3Get
9860: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
9870: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
9880: 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74 68 69 73  n;..  /* If this
9890: 20 69 73 20 6e 6f 74 20 61 20 76 61 72 69 61 62   is not a variab
98a0: 6c 65 20 28 63 6f 72 72 65 6c 61 74 65 64 29 20  le (correlated) 
98b0: 73 65 6c 65 63 74 2c 20 74 68 65 6e 20 65 78 65  select, then exe
98c0: 63 75 74 65 0a 20 20 2a 2a 20 69 74 20 6f 6e 6c  cute.  ** it onl
98d0: 79 20 6f 6e 63 65 2e 20 55 6e 6c 65 73 73 20 74  y once. Unless t
98e0: 68 69 73 20 69 73 20 70 61 72 74 20 6f 66 20 61  his is part of a
98f0: 20 74 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d   trigger program
9900: 2e 20 49 6e 0a 20 20 2a 2a 20 74 68 61 74 20 63  . In.  ** that c
9910: 61 73 65 20 72 65 2d 65 78 65 63 75 74 65 20 65  ase re-execute e
9920: 76 65 72 79 20 74 69 6d 65 20 28 74 68 69 73 20  very time (this 
9930: 63 6f 75 6c 64 20 62 65 20 6f 70 74 69 6d 69 7a  could be optimiz
9940: 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ed)..  */.  if( 
9950: 21 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65  !ExprHasAnyPrope
9960: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61  rty(pExpr, EP_Va
9970: 72 53 65 6c 65 63 74 29 20 26 26 20 21 70 50 61  rSelect) && !pPa
9980: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
9990: 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d 20 3d 20  {.    int mem = 
99a0: 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a  pParse->nMem++;.
99b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
99c0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
99d0: 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a 20 20 20  ad, mem, 0);.   
99e0: 20 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33   label = sqlite3
99f0: 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
9a00: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  ;.    sqlite3Vdb
9a10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c  eAddOp(v, OP_If,
9a20: 20 30 2c 20 6c 61 62 65 6c 29 3b 0a 20 20 20 20   0, label);.    
9a30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9a40: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9a50: 31 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c 69 74  1, 0);.    sqlit
9a60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9a70: 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d 65 6d 2c  P_MemStore, mem,
9a80: 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20   1);.  }..  if( 
9a90: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
9aa0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
9ab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
9ac0: 43 6f 6e 74 65 78 74 50 75 73 68 2c 20 30 2c 20  ContextPush, 0, 
9ad0: 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77 69 74 63  0);.  }..  switc
9ae0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
9af0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9b00: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
9b10: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 4b 65 79  inity;.      Key
9b20: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
9b30: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
9b40: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
9b50: 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  of OP_OpenTemp i
9b60: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
9b70: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
9b80: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
9b90: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
9ba0: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
9bb0: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
9bc0: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
9bd0: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
9be0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
9bf0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
9c00: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
9c10: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d   same way. A tem
9c20: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20  porary table is 
9c30: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
9c40: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
9c50: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
9c60: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
9c70: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
9c80: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
9c90: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
9ca0: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
9cb0: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
9cc0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
9cd0: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
9ce0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
9cf0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
9d00: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
9d10: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
9d20: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
9d30: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
9d40: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
9d50: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
9d60: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
9d70: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
9d80: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
9d90: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
9da0: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
9db0: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
9dc0: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
9dd0: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
9de0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
9df0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
9e00: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
9e10: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
9e20: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
9e30: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
9e40: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
9e50: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
9e60: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
9e70: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
9e80: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
9e90: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
9ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9eb0: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
9ec0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
9ed0: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
9ee0: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
9ef0: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
9f00: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
9f10: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
9f20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9f30: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
9f40: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
9f50: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
9f60: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
9f70: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
9f80: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
9f90: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
9fa0: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
9fb0: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
9fc0: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
9fd0: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
9fe0: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
9ff0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
a000: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
a010: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
a020: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
a030: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
a040: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
a050: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
a060: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
a070: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
a080: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
a090: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
a0a0: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
a0b0: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
a0c0: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
a0d0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
a0e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
a0f0: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
a100: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
a110: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
a120: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
a130: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
a140: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
a150: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
a160: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
a170: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
a180: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
a190: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
a1a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
a1b0: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
a1c0: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a1d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
a1f0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
a200: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
a210: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
a220: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
a230: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
a240: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
a250: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
a260: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
a270: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
a280: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
a290: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
a2a0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
a2b0: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
a2c0: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
a2d0: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
a2e0: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
a2f0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
a300: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
a310: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
a320: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
a330: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
a340: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
a350: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
a360: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
a370: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
a380: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
a390: 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
a3a0: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
a3b0: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
a3c0: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
a3d0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
a3e0: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
a3f0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
a400: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
a410: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
a420: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
a430: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
a440: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
a450: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
a460: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
a470: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
a480: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
a490: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61   constant and va
a4a0: 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lid. */.        
a4b0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
a4c0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
a4d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
a4e0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a4f0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a500: 20 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61         "right-ha
a510: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70  nd side of IN op
a520: 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63  erator must be c
a530: 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20  onstant");.     
a540: 20 20 20 20 20 20 20 72 65 74 75 72 6e 3b 0a 20         return;. 
a550: 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20           }..    
a560: 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74        /* Evaluat
a570: 65 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  e the expression
a580: 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69   and insert it i
a590: 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62  nto the temp tab
a5a0: 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  le */.          
a5b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a5c0: 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20  pParse, pE2);.  
a5d0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a5e0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b  dbeOp3(v, OP_Mak
a5f0: 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26  eRecord, 1, 0, &
a600: 61 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20  affinity, 1);.  
a610: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a620: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
a630: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
a640: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a650: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a660: 50 75 74 53 74 72 4b 65 79 2c 20 70 45 78 70 72  PutStrKey, pExpr
a670: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
a680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
a690: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a6a0: 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64 64  eChangeP3(v, add
a6b0: 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79 49  r, (void *)&keyI
a6c0: 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f 29  nfo, P3_KEYINFO)
a6d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a6e0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
a6f0: 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61  K_EXISTS:.    ca
a700: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
a710: 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61        /* This ha
a720: 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72  s to be a scalar
a730: 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61   SELECT.  Genera
a740: 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74  te code to put t
a750: 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75  he.      ** valu
a760: 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74  e of this select
a770: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c   in a memory cel
a780: 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65  l and record the
a790: 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a   number.      **
a7a0: 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63   of the memory c
a7b0: 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a  ell in iColumn..
a7c0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69        */.      i
a7d0: 6e 74 20 73 6f 70 3b 0a 20 20 20 20 20 20 53 65  nt sop;.      Se
a7e0: 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 0a 20 20 20  lect *pSel;..   
a7f0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
a800: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n = pParse->nMem
a810: 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20 3d  ++;.      pSel =
a820: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 3b   pExpr->pSelect;
a830: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
a840: 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ->op==TK_SELECT 
a850: 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20 3d  ){.        sop =
a860: 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20 20   SRT_Mem;.      
a870: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73  }else{.        s
a880: 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b 65  tatic const Toke
a890: 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20 30  n one = { "1", 0
a8a0: 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 20 20 73  , 1 };.        s
a8b0: 6f 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  op = SRT_Exists;
a8c0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a8d0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
a8e0: 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  Sel->pEList);.  
a8f0: 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c 69        pSel->pELi
a900: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
a910: 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 0a 20  ListAppend(0, . 
a920: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a930: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a940: 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52 2c  Expr(TK_INTEGER,
a950: 20 30 2c 20 30 2c 20 26 6f 6e 65 29 2c 20 30 29   0, 0, &one), 0)
a960: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a970: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
a980: 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70 2c  arse, pSel, sop,
a990: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c   pExpr->iColumn,
a9a0: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
a9b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a9c0: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 45 78 70  .  }..  if( pExp
a9d0: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
a9e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a9f0: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 43 6f 6e 74  Op(v, OP_AggCont
aa00: 65 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  extPop, 0, 0);. 
aa10: 20 7d 0a 20 20 69 66 28 20 6c 61 62 65 6c 3c 30   }.  if( label<0
aa20: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
aa30: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
aa40: 76 2c 20 6c 61 62 65 6c 29 3b 0a 20 20 7d 0a 20  v, label);.  }. 
aa50: 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65 6e 64 69   return;.}.#endi
aa60: 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54  f /* SQLITE_OMIT
aa70: 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a  _SUBQUERY */../*
aa80: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61 6e 20  .** Generate an 
aa90: 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68 61 74  instruction that
aaa0: 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20 69 6e   will put the in
aab0: 74 65 67 65 72 20 64 65 73 63 72 69 62 65 20 62  teger describe b
aac0: 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e  y.** text z[0..n
aad0: 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  -1] on the stack
aae0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
aaf0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56 64 62   codeInteger(Vdb
ab00: 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72  e *v, const char
ab10: 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69   *z, int n){.  i
ab20: 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71 6c 69  nt i;.  if( sqli
ab30: 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c 20 26  te3GetInt32(z, &
ab40: 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  i) ){.    sqlite
ab50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ab60: 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 29 3b  _Integer, i, 0);
ab70: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73 71 6c  .  }else if( sql
ab80: 69 74 65 33 46 69 74 73 49 6e 36 34 42 69 74 73  ite3FitsIn64Bits
ab90: 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  (z) ){.    sqlit
aba0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
abb0: 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 2c 20 7a  Integer, 0, 0, z
abc0: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
abd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
abe0: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
abf0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   0, z, n);.  }.}
ac00: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
ac10: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
ac20: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
ac30: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
ac40: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
ac50: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
ac60: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
ac70: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20  of stack..**.** 
ac80: 54 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64  This code depend
ac90: 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68  s on the fact th
aca0: 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e  at certain token
acb0: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f   values (ex: TK_
acc0: 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73  EQ).** are the s
acd0: 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61  ame as opcode va
ace0: 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29  lues (ex: OP_Eq)
acf0: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20   that implement 
ad00: 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e  the correspondin
ad10: 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20  g.** operation. 
ad20: 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74   Special comment
ad30: 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20  s in vdbe.c and 
ad40: 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77  the mkopcodeh.aw
ad50: 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74  k script in.** t
ad60: 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20  he make process 
ad70: 63 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75  cause these valu
ad80: 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73  es to align.  As
ad90: 73 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63  sert()s in the c
ada0: 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72  ode.** below ver
adb0: 69 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d  ify that the num
adc0: 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64  bers are aligned
add0: 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76   correctly..*/.v
ade0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
adf0: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
ae00: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
ae10: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
ae20: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
ae30: 74 20 6f 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30  t op;.  if( v==0
ae40: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
ae50: 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20   pExpr==0 ){.   
ae60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ae70: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
ae80: 20 30 2c 20 30 29 3b 20 20 2f 2a 20 45 6d 70 74   0, 0);  /* Empt
ae90: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  y expression eva
aea0: 6c 73 20 74 6f 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ls to NULL */.  
aeb0: 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 0a 20 20    return;.  }.  
aec0: 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a  op = pExpr->op;.
aed0: 20 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a    switch( op ){.
aee0: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
aef0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
af00: 21 70 50 61 72 73 65 2d 3e 66 69 6c 6c 41 67 67  !pParse->fillAgg
af10: 20 26 26 20 70 45 78 70 72 2d 3e 69 41 67 67 3e   && pExpr->iAgg>
af20: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
af30: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
af40: 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 70 45 78  , OP_AggGet, pEx
af50: 70 72 2d 3e 69 41 67 67 43 74 78 2c 20 70 45 78  pr->iAggCtx, pEx
af60: 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20  pr->iAgg);.     
af70: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
af80: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
af90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
afa0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
afb0: 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
afc0: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
afd0: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 20 20 73  lumn);.        s
afe0: 71 6c 69 74 65 33 43 6f 6c 75 6d 6e 44 65 66 61  qlite3ColumnDefa
aff0: 75 6c 74 28 76 2c 20 70 45 78 70 72 2d 3e 70 54  ult(v, pExpr->pT
b000: 61 62 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ab, pExpr->iColu
b010: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
b020: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
b030: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b040: 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69  _Recno, pExpr->i
b050: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
b060: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b070: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b080: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
b090: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
b0a0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
b0b0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
b0c0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b0d0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b0e0: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
b0f0: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
b100: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b110: 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29  FLOAT==OP_Real )
b120: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b130: 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74  TK_STRING==OP_St
b140: 72 69 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73  ring8 );.      s
b150: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
b160: 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72   op, 0, 0, pExpr
b170: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
b180: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
b190: 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 71    sqlite3VdbeDeq
b1a0: 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20  uoteP3(v, -1);. 
b1b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b1c0: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
b1d0: 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52  _OMIT_BLOB_LITER
b1e0: 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  AL.    case TK_B
b1f0: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 61 73 73  LOB: {.      ass
b200: 65 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50  ert( TK_BLOB==OP
b210: 5f 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20  _HexBlob );.    
b220: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
b230: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45  (v, op, 0, 0, pE
b240: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20  xpr->token.z+1, 
b250: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31  pExpr->token.n-1
b260: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b270: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
b280: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
b290: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
b2a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c      case TK_NULL
b2b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b2c0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b2d0: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
b2e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b2f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b300: 56 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20  VARIABLE: {.    
b310: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b320: 4f 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c  Op(v, OP_Variabl
b330: 65 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  e, pExpr->iTable
b340: 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20  , 0);.      if( 
b350: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31  pExpr->token.n>1
b360: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
b370: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28  te3VdbeChangeP3(
b380: 76 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f  v, -1, pExpr->to
b390: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
b3a0: 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a  ken.n);.      }.
b3b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52   }.    case TK_R
b3d0: 45 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20  EGISTER: {.     
b3e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b3f0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c  p(v, OP_MemLoad,
b400: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
b410: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
b420: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b430: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
b440: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
b450: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
b460: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
b470: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
b480: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61  TK_EQ: {.      a
b490: 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50  ssert( TK_LT==OP
b4a0: 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Lt );.      ass
b4b0: 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c  ert( TK_LE==OP_L
b4c0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b4d0: 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20  t( TK_GT==OP_Gt 
b4e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b4f0: 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b   TK_GE==OP_Ge );
b500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b510: 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20  K_EQ==OP_Eq );. 
b520: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b530: 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20  NE==OP_Ne );.   
b540: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b550: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b560: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b570: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b580: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b590: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
b5a0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
b5b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
b5c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
b5d0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b5e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b5f0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
b600: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
b610: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
b620: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
b630: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
b640: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
b650: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
b660: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
b670: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
b680: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
b690: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
b6a0: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
b6b0: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
b6c0: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
b6d0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b6e0: 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20  AND==OP_And );. 
b6f0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b700: 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20  OR==OP_Or );.   
b710: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c     assert( TK_PL
b720: 55 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20  US==OP_Add );.  
b730: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d      assert( TK_M
b740: 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63  INUS==OP_Subtrac
b750: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
b760: 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65  t( TK_REM==OP_Re
b770: 6d 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20  mainder );.     
b780: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41   assert( TK_BITA
b790: 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b  ND==OP_BitAnd );
b7a0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b7b0: 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f  K_BITOR==OP_BitO
b7c0: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
b7d0: 74 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f  t( TK_SLASH==OP_
b7e0: 44 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20  Divide );.      
b7f0: 61 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46  assert( TK_LSHIF
b800: 54 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20  T==OP_ShiftLeft 
b810: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b820: 20 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53   TK_RSHIFT==OP_S
b830: 68 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20  hiftRight );.   
b840: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f     assert( TK_CO
b850: 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20  NCAT==OP_Concat 
b860: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b870: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b880: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b8a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
b8b0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
b8c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b8d0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
b8e0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b8f0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b900: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
b910: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
b920: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
b930: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
b940: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
b950: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
b960: 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
b970: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
b980: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20         Token *p 
b990: 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  = &pLeft->token;
b9a0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
b9b0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
b9c0: 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20   p->n + 2 );.   
b9d0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20       sprintf(z, 
b9e0: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
b9f0: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
ba00: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
ba10: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
ba20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
ba30: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
ba40: 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a   0, z, p->n+1);.
ba50: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
ba60: 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74           codeInt
ba70: 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b  eger(v, z, p->n+
ba80: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
ba90: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
baa0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
bab0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
bac0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
bad0: 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f  h into TK_NOT */
bae0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
baf0: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
bb00: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
bb10: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42      assert( TK_B
bb20: 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74  ITNOT==OP_BitNot
bb30: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
bb40: 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74  ( TK_NOT==OP_Not
bb50: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
bb60: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
bb70: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
bb80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bb90: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
bba0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
bbb0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bbc0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
bbd0: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
bbe0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
bbf0: 73 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  st;.      assert
bc00: 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f  ( TK_ISNULL==OP_
bc10: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20  IsNull );.      
bc20: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55  assert( TK_NOTNU
bc30: 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  LL==OP_NotNull )
bc40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bc50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
bc60: 6e 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20  nteger, 1, 0);. 
bc70: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bc80: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
bc90: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
bca0: 20 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33    dest = sqlite3
bcb0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
bcc0: 76 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71  v) + 2;.      sq
bcd0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bce0: 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a  , op, 1, dest);.
bcf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bd00: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
bd10: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20  Imm, -1, 0);.   
bd20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bd30: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
bd40: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
bd50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bd60: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
bd70: 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29   0, pExpr->iAgg)
bd80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bd90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
bda0: 5f 43 4f 4e 53 54 5f 46 55 4e 43 3a 0a 20 20 20  _CONST_FUNC:.   
bdb0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
bdc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
bdd0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
bde0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
bdf0: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
be00: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
be10: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
be20: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
be30: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
be40: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
be50: 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  ;.      int p2 =
be60: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
be70: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
be80: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
be90: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
bea0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
beb0: 20 7a 49 64 20 3d 20 70 45 78 70 72 2d 3e 74 6f   zId = pExpr->to
bec0: 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 6e 49 64  ken.z;.      nId
bed0: 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e   = pExpr->token.
bee0: 6e 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  n;.      pDef = 
bef0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
bf00: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
bf10: 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
bf20: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
bf30: 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
bf40: 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
bf50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bf60: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
bf70: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66   pList);.      f
bf80: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
bf90: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
bfa0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
bfb0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
bfc0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
bfd0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
bfe0: 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20   p2 |= (1<<i);. 
bff0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
c000: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
c010: 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
c020: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
c030: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
c040: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
c050: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
c060: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
c070: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
c080: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
c090: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
c0a0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
c0b0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
c0c0: 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
c0d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c0e0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
c0f0: 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
c100: 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
c110: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c120: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c130: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
c140: 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72  nExpr, p2, (char
c150: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
c160: 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  EF);.      break
c170: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c180: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c190: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
c1a0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
c1b0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
c1c0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
c1d0: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
c1e0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
c1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c200: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
c210: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
c220: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
c230: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61  mment((v, "# loa
c240: 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
c250: 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  t"));.      brea
c260: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c270: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
c280: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c290: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
c2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
c2b0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
c2c0: 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  e, pExpr);..    
c2d0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c2e0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
c2f0: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
c300: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
c310: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
c320: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
c330: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
c340: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
c350: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
c360: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
c370: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
c380: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
c390: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
c3a0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
c3b0: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
c3c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c3d0: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
c3e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
c3f0: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
c400: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
c410: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
c420: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
c430: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
c440: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
c450: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
c460: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
c470: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
c480: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c490: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c4a0: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
c4b0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c4c0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
c4d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c4e0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
c4f0: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
c500: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
c510: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
c520: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c530: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
c540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c560: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
c570: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c580: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
c590: 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20  o, 0, addr+7);. 
c5a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c5b0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
c5c0: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
c5d0: 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20  inity, 1);   /* 
c5e0: 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20  addr + 4 */.    
c5f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c600: 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  Op(v, OP_Found, 
c610: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
c620: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
c630: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c640: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
c650: 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
c660: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
c670: 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61  6 */..      brea
c680: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
c690: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
c6a0: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
c6b0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c6c0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
c6d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c6e0: 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
c6f0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
c700: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
c710: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
c720: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
c730: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c740: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
c750: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c760: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
c770: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c780: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c790: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
c7a0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c7b0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
c7c0: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Ge, 0, 0);.
c7d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c7e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
c7f0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
c800: 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
c810: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
c820: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
c830: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c840: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
c850: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
c860: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
c870: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30  pRight, OP_Le, 0
c880: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c890: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c8a0: 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_And, 0, 0);. 
c8b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c8c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
c8d0: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
c8e0: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
c8f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c900: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c910: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
c920: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c930: 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
c940: 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61   int expr_end_la
c950: 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  bel;.      int j
c960: 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69  umpInst;.      i
c970: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69  nt addr;.      i
c980: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  nt nExpr;.      
c990: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70  int i;.      Exp
c9a0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
c9b0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
c9c0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
c9d0: 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73  elem;..      ass
c9e0: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
c9f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
ca00: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
ca10: 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
ca20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
ca30: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
ca40: 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
ca50: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
ca60: 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
ca70: 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
ca80: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
ca90: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
caa0: 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61       expr_end_la
cab0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
cac0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
cad0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
cae0: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
caf0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
cb00: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
cb10: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
cb20: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cb30: 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
cb40: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cb50: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cb60: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
cb70: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
cb80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
cb90: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cbb0: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
cbc0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
cbd0: 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70   = codeCompare(p
cbe0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
cbf0: 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  eft, aListelem[i
cc00: 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ].pExpr,.       
cc10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc20: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c            OP_Ne,
cc30: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
cc40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cc50: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
cc60: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
cc70: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  se{.          ju
cc80: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33  mpInst = sqlite3
cc90: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cca0: 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  IfNot, 1, 0);.  
ccb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
ccc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ccd0: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
cce0: 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  m[i+1].pExpr);. 
ccf0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cd00: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
cd10: 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f  to, 0, expr_end_
cd20: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  label);.        
cd30: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cd40: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
cd50: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cd60: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
cd70: 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72 29   jumpInst, addr)
cd80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cd90: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
cda0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
cdb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
cdc0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
cdd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cde0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
cdf0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ce00: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ce10: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
ce20: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
ce30: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ce40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
ce50: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
ce60: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
ce70: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
ce80: 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f  bel(v, expr_end_
ce90: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  label);.      br
cea0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
ceb0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cec0: 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
ced0: 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
cee0: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
cef0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
cf00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
cf10: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
cf20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf30: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
cf40: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
cf50: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
cf60: 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e  ogram");..return
cf70: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cf80: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
cf90: 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  mn!=OE_Ignore ){
cfa0: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
cfb0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
cfc0: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c  ==OE_Rollback ||
cfd0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cfe0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
cff0: 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a   == OE_Abort ||.
d000: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d010: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
d020: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20  == OE_Fail );.  
d030: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d040: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
d050: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
d060: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
d070: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
d080: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
d090: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
d0a0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
d0b0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d0c0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
d0d0: 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
d0e0: 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
d0f0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
d100: 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
d110: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
d120: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d130: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
d140: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
d150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d160: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
d170: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
d180: 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
d190: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d1a0: 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65  ent((v, "# raise
d1b0: 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
d1c0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
d1d0: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
d1e0: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d1f0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
d200: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d210: 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
d220: 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
d230: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
d240: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
d250: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  on the stack.  S
d260: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45  ee also sqlite3E
d270: 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprCode()..**.**
d280: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
d290: 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74  ght also cache t
d2a0: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f  he result and mo
d2b0: 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74  dify the pExpr t
d2c0: 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ree.** so that i
d2d0: 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20  t will make use 
d2e0: 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65  of the cached re
d2f0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
d300: 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a  nt evaluations.*
d310: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76  * rather than ev
d320: 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65  aluate the whole
d330: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
d340: 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72  n.  Trivial expr
d350: 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e  essions are.** n
d360: 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74  ot cached.  If t
d370: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d380: 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73   cached, its res
d390: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
d3a0: 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f   a .** memory lo
d3b0: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
d3c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
d3d0: 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
d3e0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d3f0: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
d400: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d410: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e    int iMem;.  in
d420: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
d430: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
d440: 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  urn;.  addr1 = s
d450: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d460: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69  tAddr(v);.  sqli
d470: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d480: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61 64  se, pExpr);.  ad
d490: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
d4a0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d4b0: 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64 64  .  if( addr2>add
d4c0: 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33 56  r1+1 || sqlite3V
d4d0: 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
d4e0: 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  1)->opcode==OP_F
d4f0: 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  unction ){.    i
d500: 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Mem = pExpr->iTa
d510: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
d520: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
d530: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d540: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
d550: 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e   0);.    pExpr->
d560: 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
d570: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
d580: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d590: 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
d5a0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
d5b0: 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
d5c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
d5d0: 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20  ssion list onto 
d5e0: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
d5f0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d600: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
d610: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
d620: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
d630: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
d640: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d650: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
d660: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d670: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d680: 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st    /* The exp
d690: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
d6a0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  be coded */.){. 
d6b0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d6c0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
d6d0: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65  int i, n;.  Vdbe
d6e0: 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69 73 74   *v;.  if( pList
d6f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d700: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
d710: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d720: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
d730: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
d740: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
d750: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
d760: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d770: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
d780: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  em->pExpr);.  }.
d790: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
d7a0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d7b0: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
d7c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
d7d0: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
d7e0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
d7f0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
d800: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d810: 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
d820: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
d830: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
d840: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d850: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
d860: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d870: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
d880: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
d890: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
d8a0: 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
d8b0: 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
d8c0: 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
d8d0: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rue..**.** This 
d8e0: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
d8f0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
d900: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
d910: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
d920: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
d930: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
d940: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
d950: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
d960: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
d970: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
d980: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
d990: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
d9a0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
d9b0: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
d9c0: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
d9d0: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
d9e0: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
d9f0: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
da00: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
da10: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
da20: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
da30: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
da40: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
da50: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
da60: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
da70: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
da80: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
da90: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
daa0: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
dab0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
dac0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
dad0: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
dae0: 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
daf0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
db00: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
db10: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
db20: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
db30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
db40: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
db50: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
db60: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
db70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
db80: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
db90: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
dba0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
dbb0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dbc0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dbd0: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
dbe0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dbf0: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
dc00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
dc10: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
dc20: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
dc30: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
dc40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
dc50: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
dc60: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
dc70: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
dc80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dc90: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
dca0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
dcb0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
dcc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dcd0: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
dce0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
dcf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dd00: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
dd10: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
dd20: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
dd30: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
dd40: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
dd50: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
dd60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
dd70: 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
dd80: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
dd90: 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
dda0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
ddb0: 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
ddc0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
ddd0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
dde0: 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
ddf0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
de00: 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
de10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
de20: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
de30: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
de40: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
de50: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
de60: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
de70: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
de80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
de90: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
dea0: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
deb0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
dec0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ded0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
dee0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
def0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
df00: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
df10: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
df20: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
df30: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
df40: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
df50: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
df60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
df70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
df80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
df90: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
dfa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dfb0: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
dfc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
dfd0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20  e expression "x 
dfe0: 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
dff0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
e000: 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
e010: 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20     ** 1 IF (x < 
e020: 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
e030: 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29  ** 2 IF (x <= z)
e040: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
e050: 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20     ** 3 ....    
e060: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
e070: 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
e080: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
e090: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
e0a0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
e0b0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
e0c0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
e0d0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e0e0: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
e0f0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e100: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
e110: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e120: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e130: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
e140: 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d    addr = codeCom
e150: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
e160: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
e170: 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  t, 0, !jumpIfNul
e180: 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  l);..      pRigh
e190: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
e1a0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
e1b0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e1c0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
e1d0: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
e1e0: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e1f0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
e200: 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  _Le, dest, jumpI
e210: 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
e220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e230: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e240: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e250: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e260: 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  v, addr, sqlite3
e270: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e280: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
e290: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e2a0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e2c0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
e2d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e2e0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e2f0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
e300: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e310: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
e320: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
e330: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e340: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e350: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
e360: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
e370: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
e380: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
e390: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
e3a0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e3b0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
e3c0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
e3d0: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
e3e0: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
e3f0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
e400: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e410: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
e420: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
e430: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
e440: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
e450: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
e460: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
e470: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
e480: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
e490: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e4a0: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
e4b0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e4c0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
e4d0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
e4e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e4f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e500: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
e510: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e520: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
e530: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
e540: 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
e550: 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
e560: 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
e570: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e580: 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
e590: 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
e5a0: 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
e5b0: 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
e5c0: 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
e5d0: 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
e5e0: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
e5f0: 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
e600: 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
e610: 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
e620: 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
e630: 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
e640: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
e650: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
e660: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
e670: 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
e680: 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
e690: 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
e6a0: 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
e6b0: 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
e6c0: 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
e6d0: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
e6e0: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
e6f0: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
e700: 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
e710: 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
e720: 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
e730: 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
e740: 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
e750: 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
e760: 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
e770: 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
e780: 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
e790: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
e7a0: 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
e7b0: 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
e7c0: 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
e7d0: 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
e7e0: 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
e7f0: 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
e800: 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
e810: 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
e820: 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
e830: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
e840: 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
e850: 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
e860: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
e870: 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
e880: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
e890: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e8a0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
e8b0: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
e8c0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e8d0: 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
e8e0: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
e8f0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e900: 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
e910: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
e920: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
e930: 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
e940: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e950: 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
e960: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
e970: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e980: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
e990: 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
e9a0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
e9b0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
e9c0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
e9d0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
e9e0: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
e9f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
ea00: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
ea10: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ea20: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ea30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ea40: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ea50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ea60: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ea70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ea80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
ea90: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
eaa0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
eab0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eac0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ead0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
eae0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
eaf0: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
eb00: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
eb10: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
eb20: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
eb30: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
eb40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
eb50: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
eb60: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
eb70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eb80: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
eb90: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
eba0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
ebb0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ebc0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ebd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ebe0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
ebf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
ec00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
ec10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
ec20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
ec30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
ec40: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ec50: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ec60: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ec70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ec80: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ec90: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
eca0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ecb0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ecc0: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
ecd0: 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
ece0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ecf0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ed00: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
ed10: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
ed20: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
ed30: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ed40: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ed50: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ed60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ed70: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
ed80: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ed90: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
eda0: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  TWEEN: {.      /
edb0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
edc0: 20 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79   is "x BETWEEN y
edd0: 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69   AND z". It is i
ede0: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
edf0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ee00: 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47   1 IF (x >= y) G
ee10: 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
ee20: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
ee30: 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20     ** 3 IF (x > 
ee40: 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
ee50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ee60: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
ee70: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
ee80: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
ee90: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
eea0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
eeb0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
eec0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
eed0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
eee0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
eef0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
ef00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
ef10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ef20: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
ef30: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
ef40: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ef50: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64  dr(v);.      cod
ef60: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
ef70: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
ef80: 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21  OP_Ge, addr+3, !
ef90: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  jumpIfNull);..  
efa0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
efb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
efc0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
efd0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
efe0: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
eff0: 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  t);.      pRight
f000: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
f010: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f020: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f030: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
f040: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
f050: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
f060: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
f070: 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Gt, dest, jumpIf
f080: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
f090: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
f0a0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
f0b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f0c0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
f0d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f0e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f  AddOp(v, OP_IfNo
f0f0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  t, jumpIfNull, d
f100: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f110: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
f120: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
f130: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
f140: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
f150: 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
f160: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
f170: 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
f180: 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
f190: 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
f1a0: 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
f1b0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f1c0: 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
f1d0: 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a  *pA, Expr *pB){.
f1e0: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f1f0: 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  A==0 ){.    retu
f200: 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73  rn pB==0;.  }els
f210: 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20  e if( pB==0 ){. 
f220: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f230: 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
f240: 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
f250: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
f260: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f270: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
f280: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
f290: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
f2a0: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
f2b0: 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
f2c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f2d0: 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
f2e0: 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
f2f0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f300: 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
f310: 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
f320: 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
f330: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
f340: 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
f350: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
f360: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
f370: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f380: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f390: 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
f3a0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
f3b0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f3c0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f3d0: 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
f3e0: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
f3f0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
f400: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
f410: 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
f420: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
f430: 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
f440: 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
f450: 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
f460: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f470: 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
f480: 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
f490: 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
f4a0: 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
f4b0: 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
f4c0: 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
f4d0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
f4e0: 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e  rNICmp(pA->token
f4f0: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c  .z, pB->token.z,
f500: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30   pB->token.n)!=0
f510: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
f520: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f530: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
f540: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
f550: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
f560: 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ray and return i
f570: 74 73 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  ts index..** The
f580: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 69 73 20   new element is 
f590: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
f5a0: 65 72 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ero.  The callin
f5b0: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  g function is.**
f5c0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 69 6c   expected to fil
f5d0: 6c 20 69 74 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74  l it in..*/.stat
f5e0: 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67  ic int appendAgg
f5f0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
f600: 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72  se){.  if( (pPar
f610: 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d  se->nAgg & 0x7)=
f620: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d  =0 ){.    int am
f630: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  t = pParse->nAgg
f640: 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70   + 8;.    AggExp
f650: 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65  r *aAgg = sqlite
f660: 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  Realloc(pParse->
f670: 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66  aAgg, amt*sizeof
f680: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
f690: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67  ));.    if( aAgg
f6a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
f6b0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
f6c0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
f6d0: 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aAgg;.  }.  mem
f6e0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67  set(&pParse->aAg
f6f0: 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c  g[pParse->nAgg],
f700: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73   0, sizeof(pPars
f710: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
f720: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
f730: 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Agg++;.}../*.** 
f740: 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63  This is an xFunc
f750: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
f760: 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  e() used to impl
f770: 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65  ement .** sqlite
f780: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
f790: 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
f7a0: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
f7b0: 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
f7c0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f7d0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
f7e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
f7f0: 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65  alyzes the aggre
f800: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74  gate function at
f810: 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69   pExpr..*/.stati
f820: 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
f830: 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72  regate(void *pAr
f840: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
f850: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45  .  int i;.  AggE
f860: 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 4e 61 6d  xpr *aAgg;.  Nam
f870: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
f880: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
f890: 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
f8a0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
f8b0: 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
f8c0: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
f8d0: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 73 77 69 74  SrcList;..  swit
f8e0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f8f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
f900: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72  UMN: {.      for
f910: 28 69 3d 30 3b 20 70 53 72 63 4c 69 73 74 20 26  (i=0; pSrcList &
f920: 26 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  & i<pSrcList->nS
f930: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
f940: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
f950: 62 6c 65 3d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  ble==pSrcList->a
f960: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 7b 0a 20  [i].iCursor ){. 
f970: 20 20 20 20 20 20 20 20 20 61 41 67 67 20 3d 20           aAgg = 
f980: 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
f990: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
f9a0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
f9b0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
f9c0: 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69     if( aAgg[i].i
f9d0: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
f9e0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
f9f0: 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e   aAgg[i].pExpr->
fa00: 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
fa10: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
fa20: 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45     && aAgg[i].pE
fa30: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  xpr->iColumn==pE
fa40: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
fa50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
fa60: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
fa70: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
fa80: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
fa90: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
faa0: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
fab0: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
fac0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
fad0: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
fae0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
faf0: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
fb00: 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20  i].isAgg = 0;.  
fb10: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
fb20: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
fb30: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
fb40: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
fb50: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
fb60: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
fb70: 3e 69 41 67 67 43 74 78 20 3d 20 70 4e 43 2d 3e  >iAggCtx = pNC->
fb80: 6e 44 65 70 74 68 3b 0a 20 20 20 20 20 20 20 20  nDepth;.        
fb90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
fba0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fbb0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fbc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fbd0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
fbe0: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e        if( pNC->n
fbf0: 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Depth==0 ){.    
fc00: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
fc10: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 20  e->aAgg;.       
fc20: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
fc30: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
fc40: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
fc50: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
fc60: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
fc70: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fc80: 70 72 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69  prCompare(aAgg[i
fc90: 5d 2e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ].pExpr, pExpr) 
fca0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
fcb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
fcc0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
fcd0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
fce0: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
fcf0: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
fd00: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
fd10: 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70           i = app
fd20: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
fd30: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
fd40: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
fd50: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
fd60: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
fd70: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
fd80: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
fd90: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
fda0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
fdb0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20  ->aAgg[i].pFunc 
fdc0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
fdd0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
fde0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fdf0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
fe00: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
fe10: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fe20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
fe30: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
fe40: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
fe50: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fe60: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
fe70: 20 69 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   i;.        retu
fe80: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
fe90: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45    }.  }.  if( pE
fea0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
feb0: 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
fec0: 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
fed0: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
fee0: 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
fef0: 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
ff00: 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
ff10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
ff20: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
ff30: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
ff40: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
ff50: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
ff60: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
ff70: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
ff80: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
ff90: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
ffa0: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
ffb0: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
ffc0: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
ffd0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
ffe0: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
fff0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
10000 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
10010 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
10020 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
10030 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
10040 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
10050 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
10060 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
10070 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
10080 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
10090 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
100a0 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
100b0 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
100c0 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
100d0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
100e0 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
100f0 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
10100 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e  *pExpr){.  int n
10110 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  Err = pNC->pPars
10120 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45  e->nErr;.  walkE
10130 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61  xprTree(pExpr, a
10140 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
10150 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20   pNC);.  return 
10160 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  pNC->pParse->nEr
10170 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a              r - nErr;.}.