/ Hex Artifact Content
Login

Artifact fdacfb27a5803eadda1a14980553ca394d1d5612:


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 31 38 31 20 32 30 30 35 2f 30 31 2f 31 38 20  .181 2005/01/18 
0220: 31 37 3a 32 30 3a 31 30 20 64 72 68 20 45 78 70  17:20:10 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 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72  s, we leak memor
1800: 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64  y from pLeft and
1810: 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72   pRight */.    r
1820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1830: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1840: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
1850: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1860: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1870: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1880: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1890: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
18a0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
18b0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
18c0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
18d0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
18e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
18f0: 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c  prSpan(pNew, &pL
1900: 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67  eft->span, &pRig
1910: 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 0a 20  ht->span);.  }. 
1920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1930: 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 64 6f 69 6e  ./*.** When doin
1940: 67 20 61 20 6e 65 73 74 65 64 20 70 61 72 73 65  g a nested parse
1950: 2c 20 79 6f 75 20 63 61 6e 20 69 6e 63 6c 75 64  , you can includ
1960: 65 20 74 65 72 6d 73 20 69 6e 20 61 6e 20 65 78  e terms in an ex
1970: 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 74 68 61 74  pression.** that
1980: 20 6c 6f 6f 6b 20 6c 69 6b 65 20 74 68 69 73 3a   look like this:
1990: 20 20 20 23 30 20 23 31 20 23 32 20 2e 2e 2e 20     #0 #1 #2 ... 
19a0: 20 54 68 65 73 65 20 74 65 72 6d 73 20 72 65 66   These terms ref
19b0: 65 72 20 74 6f 20 65 6c 65 6d 65 6e 74 73 0a 2a  er to elements.*
19c0: 2a 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20  * on the stack. 
19d0: 20 22 23 30 22 20 28 6f 72 20 6a 75 73 74 20 22   "#0" (or just "
19e0: 23 22 29 20 6d 65 61 6e 73 20 74 68 65 20 74 6f  #") means the to
19f0: 70 20 6f 66 20 74 68 65 20 73 74 61 63 6b 2e 0a  p of the stack..
1a00: 2a 2a 20 22 23 31 22 20 6d 65 61 6e 73 20 74 68  ** "#1" means th
1a10: 65 20 6e 65 78 74 20 64 6f 77 6e 20 6f 6e 20 74  e next down on t
1a20: 68 65 20 73 74 61 63 6b 2e 20 20 41 6e 64 20 73  he stack.  And s
1a30: 6f 20 66 6f 72 74 68 2e 20 20 23 2d 31 20 6d 65  o forth.  #-1 me
1a40: 61 6e 73 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f  ans.** memory lo
1a50: 63 61 74 69 6f 6e 20 30 2e 20 20 23 2d 32 20 6d  cation 0.  #-2 m
1a60: 65 61 6e 73 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  eans memory loca
1a70: 74 69 6f 6e 20 31 2e 20 20 41 6e 64 20 73 6f 20  tion 1.  And so 
1a80: 66 6f 72 74 68 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  forth..**.** Thi
1a90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 63 61 6c  s routine is cal
1aa0: 6c 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  led by the parse
1ab0: 72 20 74 6f 20 64 65 61 6c 20 77 69 74 68 20 6f  r to deal with o
1ac0: 6e 20 6f 66 20 74 68 6f 73 65 20 74 65 72 6d 73  n of those terms
1ad0: 2e 0a 2a 2a 20 49 74 20 69 6d 6d 65 64 69 61 74  ..** It immediat
1ae0: 65 6c 79 20 67 65 6e 65 72 61 74 65 73 20 63 6f  ely generates co
1af0: 64 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65 20  de to store the 
1b00: 76 61 6c 75 65 20 69 6e 20 61 20 6d 65 6d 6f 72  value in a memor
1b10: 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2a 20 54  y location..** T
1b20: 68 65 20 72 65 74 75 72 6e 73 20 61 6e 20 65 78  he returns an ex
1b30: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 77 69  pression that wi
1b40: 6c 6c 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61  ll code to extra
1b50: 63 74 20 74 68 65 20 76 61 6c 75 65 20 66 72 6f  ct the value fro
1b60: 6d 0a 2a 2a 20 74 68 61 74 20 6d 65 6d 6f 72 79  m.** that memory
1b70: 20 6c 6f 63 61 74 69 6f 6e 20 61 73 20 6e 65 65   location as nee
1b80: 64 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ded..*/.Expr *sq
1b90: 6c 69 74 65 33 52 65 67 69 73 74 65 72 45 78 70  lite3RegisterExp
1ba0: 72 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  r(Parse *pParse,
1bb0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1bc0: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
1bd0: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 45 78  rse->pVdbe;.  Ex
1be0: 70 72 20 2a 70 3b 0a 20 20 69 6e 74 20 64 65 70  pr *p;.  int dep
1bf0: 74 68 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29  th;.  if( v==0 )
1c00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
1c10: 20 70 50 61 72 73 65 2d 3e 6e 65 73 74 65 64 3d   pParse->nested=
1c20: 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  =0 ){.    sqlite
1c30: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
1c40: 2c 20 22 6e 65 61 72 20 5c 22 25 54 5c 22 3a 20  , "near \"%T\": 
1c50: 73 79 6e 74 61 78 20 65 72 72 6f 72 22 2c 20 70  syntax error", p
1c60: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 72 65 74 75  Token);.    retu
1c70: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 20 3d 20  rn 0;.  }.  p = 
1c80: 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 52  sqlite3Expr(TK_R
1c90: 45 47 49 53 54 45 52 2c 20 30 2c 20 30 2c 20 70  EGISTER, 0, 0, p
1ca0: 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 70 3d  Token);.  if( p=
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
1cc0: 20 30 3b 20 20 2f 2a 20 4d 61 6c 6c 6f 63 20 66   0;  /* Malloc f
1cd0: 61 69 6c 65 64 20 2a 2f 0a 20 20 7d 0a 20 20 64  ailed */.  }.  d
1ce0: 65 70 74 68 20 3d 20 61 74 6f 69 28 26 70 54 6f  epth = atoi(&pTo
1cf0: 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 69 66  ken->z[1]);.  if
1d00: 28 20 64 65 70 74 68 3e 3d 30 20 29 7b 0a 20 20  ( depth>=0 ){.  
1d10: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50    p->iTable = pP
1d20: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
1d30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1d40: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 64 65  Op(v, OP_Dup, de
1d50: 70 74 68 2c 20 30 29 3b 0a 20 20 20 20 73 71 6c  pth, 0);.    sql
1d60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1d70: 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 70 2d   OP_MemStore, p-
1d80: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 20 20 7d  >iTable, 1);.  }
1d90: 65 6c 73 65 7b 0a 20 20 20 20 70 2d 3e 69 54 61  else{.    p->iTa
1da0: 62 6c 65 20 3d 20 2d 31 2d 64 65 70 74 68 3b 0a  ble = -1-depth;.
1db0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a    }.  return p;.
1dc0: 7d 0a 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77  }../*.** Join tw
1dd0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  o expressions us
1de0: 69 6e 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61  ing an AND opera
1df0: 74 6f 72 2e 20 20 49 66 20 65 69 74 68 65 72 20  tor.  If either 
1e00: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a  expression is.**
1e10: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74   NULL, then just
1e20: 20 72 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65   return the othe
1e30: 72 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f  r expression..*/
1e40: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
1e50: 70 72 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66  prAnd(Expr *pLef
1e60: 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74 29  t, Expr *pRight)
1e70: 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30  {.  if( pLeft==0
1e80: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1e90: 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69  Right;.  }else i
1ea0: 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a  f( pRight==0 ){.
1eb0: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74      return pLeft
1ec0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72  ;.  }else{.    r
1ed0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
1ee0: 72 28 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c  r(TK_AND, pLeft,
1ef0: 20 70 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d   pRight, 0);.  }
1f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68  .}../*.** Set th
1f10: 65 20 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c  e Expr.span fiel
1f20: 64 20 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65  d of the given e
1f30: 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61  xpression to spa
1f40: 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65  n all.** text be
1f50: 74 77 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69  tween the two gi
1f60: 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76  ven tokens..*/.v
1f70: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 53  oid sqlite3ExprS
1f80: 70 61 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c  pan(Expr *pExpr,
1f90: 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54   Token *pLeft, T
1fa0: 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20  oken *pRight){. 
1fb0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 21   assert( pRight!
1fc0: 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  =0 );.  assert( 
1fd0: 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66  pLeft!=0 );.  if
1fe0: 28 20 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  ( !sqlite3_mallo
1ff0: 63 5f 66 61 69 6c 65 64 20 26 26 20 70 52 69 67  c_failed && pRig
2000: 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e  ht->z && pLeft->
2010: 7a 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  z ){.    assert(
2020: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c   pLeft->dyn==0 |
2030: 7c 20 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74  | pLeft->z[pLeft
2040: 2d 3e 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69  ->n]==0 );.    i
2050: 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30  f( pLeft->dyn==0
2060: 20 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d   && pRight->dyn=
2070: 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70  =0 ){.      pExp
2080: 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66  r->span.z = pLef
2090: 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70  t->z;.      pExp
20a0: 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67  r->span.n = pRig
20b0: 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69  ht->n + Addr(pRi
20c0: 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70  ght->z) - Addr(p
20d0: 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65  Left->z);.    }e
20e0: 6c 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72  lse{.      pExpr
20f0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20  ->span.z = 0;.  
2100: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
2110: 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77   Construct a new
2120: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
2130: 20 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20   for a function 
2140: 77 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a  with multiple.**
2150: 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45   arguments..*/.E
2160: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2170: 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73  Function(ExprLis
2180: 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20  t *pList, Token 
2190: 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72  *pToken){.  Expr
21a0: 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d   *pNew;.  pNew =
21b0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
21c0: 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20  izeof(Expr) );. 
21d0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a   if( pNew==0 ){.
21e0: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78      /* sqlite3Ex
21f0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69  prListDelete(pLi
2200: 73 74 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69  st); // Leak pLi
2210: 73 74 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66  st when malloc f
2220: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75  ails */.    retu
2230: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  rn 0;.  }.  pNew
2240: 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49  ->op = TK_FUNCTI
2250: 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  ON;.  pNew->pLis
2260: 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28  t = pList;.  if(
2270: 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61   pToken ){.    a
2280: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64  ssert( pToken->d
2290: 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65  yn==0 );.    pNe
22a0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
22b0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  en;.  }else{.   
22c0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
22d0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
22e0: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
22f0: 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  en;.  return pNe
2300: 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69  w;.}../*.** Assi
2310: 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75  gn a variable nu
2320: 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65  mber to an expre
2330: 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64  ssion that encod
2340: 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a  es a wildcard.**
2350: 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c   in the original
2360: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20   SQL statement. 
2370: 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64   .**.** Wildcard
2380: 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20  s consisting of 
2390: 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65  a single "?" are
23a0: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65   assigned the ne
23b0: 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a  xt sequential.**
23c0: 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72   variable number
23d0: 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64  ..**.** Wildcard
23e0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  s of the form "?
23f0: 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65  nnn" are assigne
2400: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e  d the number "nn
2410: 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20  n".  We make.** 
2420: 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f  sure "nnn" is no
2430: 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69  t too be to avoi
2440: 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65  d a denial of se
2450: 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68 65  rvice attack whe
2460: 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61  n.** the SQL sta
2470: 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f  tement comes fro
2480: 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f  m an external so
2490: 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64  urce..**.** Wild
24a0: 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72  cards of the for
24b0: 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61  m ":aaa" or "$aa
24c0: 61 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  a" are assigned 
24d0: 74 68 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a  the same number.
24e0: 2a 2a 20 61 73 20 74 68 65 20 70 72 65 76 69 6f  ** as the previo
24f0: 75 73 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74  us instance of t
2500: 68 65 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64  he same wildcard
2510: 2e 20 20 4f 72 20 69 66 20 74 68 69 73 20 69 73  .  Or if this is
2520: 20 74 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e   the first.** in
2530: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69  stance of the wi
2540: 6c 64 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74  ldcard, the next
2550: 20 73 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61   sequenial varia
2560: 62 6c 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a  ble number is.**
2570: 20 61 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f   assigned..*/.vo
2580: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 41 73  id sqlite3ExprAs
2590: 73 69 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61  signVarNumber(Pa
25a0: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
25b0: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b  r *pExpr){.  Tok
25c0: 65 6e 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66  en *pToken;.  if
25d0: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
25e0: 75 72 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20  urn;.  pToken = 
25f0: 26 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20  &pExpr->token;. 
2600: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
2610: 3e 6e 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72  >n>=1 );.  asser
2620: 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20  t( pToken->z!=0 
2630: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f  );.  assert( pTo
2640: 6b 65 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a  ken->z[0]!=0 );.
2650: 20 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d    if( pToken->n=
2660: 3d 31 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  =1 ){.    /* Wil
2670: 64 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72  dcard of the for
2680: 6d 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74  m "?".  Assign t
2690: 68 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65  he next variable
26a0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70   number */.    p
26b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b  Expr->iTable = +
26c0: 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20  +pParse->nVar;. 
26d0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65   }else if( pToke
26e0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  n->z[0]=='?' ){.
26f0: 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20      /* Wildcard 
2700: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
2710: 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e  n".  Convert "nn
2720: 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72  n" to an integer
2730: 20 61 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20   and.    ** use 
2740: 69 74 20 61 73 20 74 68 65 20 76 61 72 69 61 62  it as the variab
2750: 6c 65 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20  le number */.   
2760: 20 69 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70   int i;.    pExp
2770: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20  r->iTable = i = 
2780: 61 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b  atoi(&pToken->z[
2790: 31 5d 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31  1]);.    if( i<1
27a0: 20 7c 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58   || i>SQLITE_MAX
27b0: 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52  _VARIABLE_NUMBER
27c0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
27d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
27e0: 2c 20 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  , "variable numb
27f0: 65 72 20 6d 75 73 74 20 62 65 20 62 65 74 77 65  er must be betwe
2800: 65 6e 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a  en ?1 and ?%d",.
2810: 20 20 20 20 20 20 20 20 20 20 53 51 4c 49 54 45            SQLITE
2820: 5f 4d 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55  _MAX_VARIABLE_NU
2830: 4d 42 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20  MBER);.    }.   
2840: 20 69 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e   if( i>pParse->n
2850: 56 61 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61  Var ){.      pPa
2860: 72 73 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20  rse->nVar = i;. 
2870: 20 20 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20     }.  }else{.  
2880: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f    /* Wildcards o
2890: 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61  f the form ":aaa
28a0: 22 20 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65  " or "$aaa".  Re
28b0: 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72  use the same var
28c0: 69 61 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d  iable.    ** num
28d0: 62 65 72 20 61 73 20 74 68 65 20 70 72 69 6f 72  ber as the prior
28e0: 20 61 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74   appearance of t
28f0: 68 65 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72  he same name, or
2900: 20 69 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20   if the name.   
2910: 20 2a 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70   ** has never ap
2920: 70 65 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72  peared before, r
2930: 65 75 73 65 20 74 68 65 20 73 61 6d 65 20 76 61  euse the same va
2940: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20  riable number.  
2950: 20 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20    */.    int i, 
2960: 6e 3b 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65  n;.    n = pToke
2970: 6e 2d 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d  n->n;.    for(i=
2980: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61  0; i<pParse->nVa
2990: 72 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  rExpr; i++){.   
29a0: 20 20 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20     Expr *pE;.   
29b0: 20 20 20 69 66 28 20 28 70 45 20 3d 20 70 50 61     if( (pE = pPa
29c0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69  rse->apVarExpr[i
29d0: 5d 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20  ])!=0.          
29e0: 26 26 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d  && pE->token.n==
29f0: 6e 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 6d  n.          && m
2a00: 65 6d 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e  emcmp(pE->token.
2a10: 7a 2c 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29  z, pToken->z, n)
2a20: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70  ==0 ){.        p
2a30: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
2a40: 45 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20  E->iTable;.     
2a50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
2a60: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
2a70: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  i>=pParse->nVarE
2a80: 78 70 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78  xpr ){.      pEx
2a90: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2aa0: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20  Parse->nVar;.   
2ab0: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e     if( pParse->n
2ac0: 56 61 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d  VarExpr>=pParse-
2ad0: 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31  >nVarExprAlloc-1
2ae0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72   ){.        pPar
2af0: 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f  se->nVarExprAllo
2b00: 63 20 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61  c += pParse->nVa
2b10: 72 45 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b  rExprAlloc + 10;
2b20: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
2b30: 3e 61 70 56 61 72 45 78 70 72 20 3d 20 73 71 6c  >apVarExpr = sql
2b40: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
2b50: 65 2d 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20  e->apVarExpr,.  
2b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b70: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2b80: 72 45 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f  rExprAlloc*sizeo
2b90: 66 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  f(pParse->apVarE
2ba0: 78 70 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20  xpr[0]) );.     
2bb0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 21 73 71   }.      if( !sq
2bc0: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
2bd0: 6c 65 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61  led ){.        a
2be0: 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61  ssert( pParse->a
2bf0: 70 56 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20  pVarExpr!=0 );. 
2c00: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
2c10: 70 56 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d  pVarExpr[pParse-
2c20: 3e 6e 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70  >nVarExpr++] = p
2c30: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
2c40: 20 20 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a    }.  } .}../*.*
2c50: 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65  * Recursively de
2c60: 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69  lete an expressi
2c70: 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64  on tree..*/.void
2c80: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2c90: 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69  te(Expr *p){.  i
2ca0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2cb0: 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e  ;.  if( p->span.
2cc0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
2cd0: 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e  ((char*)p->span.
2ce0: 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b  z);.  if( p->tok
2cf0: 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46  en.dyn ) sqliteF
2d00: 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f  ree((char*)p->to
2d10: 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65  ken.z);.  sqlite
2d20: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
2d30: 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  Left);.  sqlite3
2d40: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52  ExprDelete(p->pR
2d50: 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  ight);.  sqlite3
2d60: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70  ExprListDelete(p
2d70: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69  ->pList);.  sqli
2d80: 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28  te3SelectDelete(
2d90: 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73  p->pSelect);.  s
2da0: 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a  qliteFree(p);.}.
2db0: 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c  ../*.** The foll
2dc0: 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72  owing group of r
2dd0: 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65  outines make dee
2de0: 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72  p copies of expr
2df0: 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72  essions,.** expr
2e00: 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44  ession lists, ID
2e10: 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65   lists, and sele
2e20: 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20  ct statements.  
2e30: 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a  The copies can.*
2e40: 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79  * be deleted (by
2e50: 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f   being passed to
2e60: 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76   their respectiv
2e70: 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f  e ...Delete() ro
2e80: 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f  utines).** witho
2e90: 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65  ut effecting the
2ea0: 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a   originals..**.*
2eb0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
2ec0: 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73   list, ID, and s
2ed0: 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75  ource lists retu
2ee0: 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70  rn by sqlite3Exp
2ef0: 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73  rListDup(),.** s
2f00: 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28  qlite3IdListDup(
2f10: 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72  ), and sqlite3Sr
2f20: 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e  cListDup() can n
2f30: 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78  ot be further ex
2f40: 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75  panded .** by su
2f50: 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74  bsequent calls t
2f60: 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70  o sqlite*ListApp
2f70: 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a  end() routines..
2f80: 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73  **.** Any tables
2f90: 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73   that the SrcLis
2fa0: 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f  t might point to
2fb0: 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61   are not duplica
2fc0: 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  ted..*/.Expr *sq
2fd0: 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78 70  lite3ExprDup(Exp
2fe0: 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70  r *p){.  Expr *p
2ff0: 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  New;.  if( p==0 
3000: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3010: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
3020: 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29  cRaw( sizeof(*p)
3030: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
3040: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3050: 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20  memcpy(pNew, p, 
3060: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a  sizeof(*pNew));.
3070: 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a    if( p->token.z
3080: 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d  !=0 ){.    pNew-
3090: 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74  >token.z = sqlit
30a0: 65 53 74 72 4e 44 75 70 28 70 2d 3e 74 6f 6b 65  eStrNDup(p->toke
30b0: 6e 2e 7a 2c 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 29  n.z, p->token.n)
30c0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
30d0: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
30e0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
30f0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
3100: 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   );.  }.  pNew->
3110: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e  span.z = 0;.  pN
3120: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
3130: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  te3ExprDup(p->pL
3140: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
3150: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
3160: 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29  prDup(p->pRight)
3170: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
3180: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
3190: 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a  tDup(p->pList);.
31a0: 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20    pNew->pSelect 
31b0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
31c0: 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  up(p->pSelect);.
31d0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
31e0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b  .void sqlite3Tok
31f0: 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54  enCopy(Token *pT
3200: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
3210: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
3220: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
3230: 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20  har*)pTo->z);.  
3240: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a  if( pFrom->z ){.
3250: 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72      pTo->n = pFr
3260: 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e  om->n;.    pTo->
3270: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  z = sqliteStrNDu
3280: 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  p(pFrom->z, pFro
3290: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
32a0: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
32b0: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
32c0: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
32d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
32e0: 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70  tDup(ExprList *p
32f0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
3300: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
3310: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
3320: 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a 20  em, *pOldItem;. 
3330: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3340: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3350: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3360: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
3370: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
3380: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3390: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
33a0: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
33b0: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
33c0: 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71  ->a = pItem = sq
33d0: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
33e0: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
33f0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
3400: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
3410: 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  liteFree(pNew);.
3420: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
3430: 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d 20  } .  pOldItem = 
3440: 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  p->a;.  for(i=0;
3450: 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b   i<p->nExpr; i++
3460: 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64 49  , pItem++, pOldI
3470: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
3480: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
3490: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
34a0: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
34b0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
34c0: 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70  Dup(pOldExpr = p
34d0: 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  OldItem->pExpr);
34e0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
34f0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
3500: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
3510: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
3520: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
3530: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
3540: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
3550: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
3560: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
3570: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
3580: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
3590: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
35a0: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
35b0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
35c0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
35d0: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
35e0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
35f0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
3600: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
3610: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
3620: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
3630: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
3640: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
3650: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
3660: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
3670: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
3680: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
3690: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65  iled );.    pIte
36a0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
36b0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
36c0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49  ->zName);.    pI
36d0: 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d  tem->sortOrder =
36e0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74 4f   pOldItem->sortO
36f0: 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  rder;.    pItem-
3700: 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74 65  >isAgg = pOldIte
3710: 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70 49  m->isAgg;.    pI
3720: 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20  tem->done = 0;. 
3730: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
3740: 3b 0a 7d 0a 53 72 63 4c 69 73 74 20 2a 73 71 6c  ;.}.SrcList *sql
3750: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 53  ite3SrcListDup(S
3760: 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53 72  rcList *p){.  Sr
3770: 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69  cList *pNew;.  i
3780: 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79 74  nt i;.  int nByt
3790: 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  e;.  if( p==0 ) 
37a0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79 74  return 0;.  nByt
37b0: 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20 2b  e = sizeof(*p) +
37c0: 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73 69   (p->nSrc>0 ? si
37d0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a 20  zeof(p->a[0]) * 
37e0: 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30 29  (p->nSrc-1) : 0)
37f0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3800: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79 74  eMallocRaw( nByt
3810: 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  e );.  if( pNew=
3820: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3830: 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70 4e   pNew->nSrc = pN
3840: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3850: 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  nSrc;.  for(i=0;
3860: 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29   i<p->nSrc; i++)
3870: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72 63  {.    struct Src
3880: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
3890: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
38a0: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ];.    struct Sr
38b0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  cList_item *pOld
38c0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
38d0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
38e0: 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69 74  Database = sqlit
38f0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3900: 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20 20  ->zDatabase);.  
3910: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
3920: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
3930: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
3940: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3950: 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74 65  >zAlias = sqlite
3960: 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d  StrDup(pOldItem-
3970: 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70 4e  >zAlias);.    pN
3980: 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ewItem->jointype
3990: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69   = pOldItem->joi
39a0: 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77 49  ntype;.    pNewI
39b0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20 70  tem->iCursor = p
39c0: 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  OldItem->iCursor
39d0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
39e0: 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70 4e  pTab = 0;.    pN
39f0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
3a00: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
3a10: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53 65  up(pOldItem->pSe
3a20: 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77 49  lect);.    pNewI
3a30: 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69 74  tem->pOn = sqlit
3a40: 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49 74  e3ExprDup(pOldIt
3a50: 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70 4e  em->pOn);.    pN
3a60: 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20 3d  ewItem->pUsing =
3a70: 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75   sqlite3IdListDu
3a80: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73 69  p(pOldItem->pUsi
3a90: 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  ng);.  }.  retur
3aa0: 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73 74  n pNew;.}.IdList
3ab0: 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44   *sqlite3IdListD
3ac0: 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a 20  up(IdList *p){. 
3ad0: 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20   IdList *pNew;. 
3ae0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
3af0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3b00: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3b10: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3b20: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
3b30: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
3b40: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64 20   0;.  pNew->nId 
3b50: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
3b60: 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77 2d   p->nId;.  pNew-
3b70: 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  >a = sqliteMallo
3b80: 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69 7a  cRaw( p->nId*siz
3b90: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
3ba0: 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30    if( pNew->a==0
3bb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 66   ) return 0;.  f
3bc0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64  or(i=0; i<p->nId
3bd0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75  ; i++){.    stru
3be0: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
3bf0: 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77  pNewItem = &pNew
3c00: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75  ->a[i];.    stru
3c10: 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20 2a  ct IdList_item *
3c20: 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61  pOldItem = &p->a
3c30: 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  [i];.    pNewIte
3c40: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3c50: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3c60: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
3c70: 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70 4f  ewItem->idx = pO
3c80: 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d  ldItem->idx;.  }
3c90: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
3ca0: 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74 65  }.Select *sqlite
3cb0: 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65 63  3SelectDup(Selec
3cc0: 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74 20  t *p){.  Select 
3cd0: 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d  *pNew;.  if( p==
3ce0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3cf0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3d00: 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a  locRaw( sizeof(*
3d10: 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  p) );.  if( pNew
3d20: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3d30: 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69 6e    pNew->isDistin
3d40: 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69 6e  ct = p->isDistin
3d50: 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69  ct;.  pNew->pELi
3d60: 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  st = sqlite3Expr
3d70: 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69 73  ListDup(p->pELis
3d80: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72 63  t);.  pNew->pSrc
3d90: 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73   = sqlite3SrcLis
3da0: 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a 20  tDup(p->pSrc);. 
3db0: 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d 20   pNew->pWhere = 
3dc0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
3dd0: 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e 65  ->pWhere);.  pNe
3de0: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
3df0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
3e00: 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a 20  (p->pGroupBy);. 
3e10: 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20 3d   pNew->pHaving =
3e20: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3e30: 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20 70  p->pHaving);.  p
3e40: 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d 20  New->pOrderBy = 
3e50: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
3e60: 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29 3b  up(p->pOrderBy);
3e70: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d  .  pNew->op = p-
3e80: 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50 72  >op;.  pNew->pPr
3e90: 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ior = sqlite3Sel
3ea0: 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f 72  ectDup(p->pPrior
3eb0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69  );.  pNew->nLimi
3ec0: 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20  t = p->nLimit;. 
3ed0: 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20 3d   pNew->nOffset =
3ee0: 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20 70   p->nOffset;.  p
3ef0: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
3f00: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
3f10: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
3f20: 70 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a  ppOpenTemp = 0;.
3f30: 20 20 70 4e 65 77 2d 3e 70 46 65 74 63 68 20 3d    pNew->pFetch =
3f40: 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65   0;.  return pNe
3f50: 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64  w;.}.../*.** Add
3f60: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
3f70: 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20  o the end of an 
3f80: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3f90: 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a    If pList is.**
3fa0: 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c   initially NULL,
3fb0: 20 74 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e   then create a n
3fc0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ew expression li
3fd0: 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20  st..*/.ExprList 
3fe0: 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74  *sqlite3ExprList
3ff0: 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20  Append(ExprList 
4000: 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45  *pList, Expr *pE
4010: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d  xpr, Token *pNam
4020: 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d  e){.  if( pList=
4030: 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20  =0 ){.    pList 
4040: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
4050: 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29  sizeof(ExprList)
4060: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73   );.    if( pLis
4070: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a  t==0 ){.      /*
4080: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
4090: 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65  te(pExpr); // Le
40a0: 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c  ak memory if mal
40b0: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
40c0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
40d0: 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70   }.    assert( p
40e0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20  List->nAlloc==0 
40f0: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69  );.  }.  if( pLi
4100: 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73  st->nAlloc<=pLis
4110: 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20  t->nExpr ){.    
4120: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20  pList->nAlloc = 
4130: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20  pList->nAlloc*2 
4140: 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  + 4;.    pList->
4150: 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f  a = sqliteReallo
4160: 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73  c(pList->a, pLis
4170: 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66  t->nAlloc*sizeof
4180: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
4190: 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61      if( pList->a
41a0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  ==0 ){.      /* 
41b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
41c0: 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61  e(pExpr); // Lea
41d0: 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c  k memory if mall
41e0: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20  oc fails */.    
41f0: 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d    pList->nExpr =
4200: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d   pList->nAlloc =
4210: 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   0;.      return
4220: 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20   pList;.    }.  
4230: 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  }.  assert( pLis
4240: 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28  t->a!=0 );.  if(
4250: 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20   pExpr || pName 
4260: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
4270: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
4280: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
4290: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
42a0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
42b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
42c0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
42d0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
42e0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
42f0: 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72   = sqlite3NameFr
4300: 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a  omToken(pName);.
4310: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
4320: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c  st;.}../*.** Del
4330: 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78  ete an entire ex
4340: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
4350: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
4360: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70  prListDelete(Exp
4370: 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20  rList *pList){. 
4380: 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74   int i;.  struct
4390: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
43a0: 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69  pItem;.  if( pLi
43b0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  st==0 ) return;.
43c0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
43d0: 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d  >a!=0 || (pList-
43e0: 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69  >nExpr==0 && pLi
43f0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29  st->nAlloc==0) )
4400: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
4410: 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d  t->nExpr<=pList-
4420: 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72  >nAlloc );.  for
4430: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
4440: 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e   i=0; i<pList->n
4450: 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  Expr; i++, pItem
4460: 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ++){.    sqlite3
4470: 45 78 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d  ExprDelete(pItem
4480: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ->pExpr);.    sq
4490: 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e  liteFree(pItem->
44a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
44b0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
44c0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
44d0: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
44e0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
44f0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c  sion tree.  Call
4500: 20 78 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20   xFunc for each 
4510: 6e 6f 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a  node visited..**
4520: 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76  .** The return v
4530: 61 6c 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20  alue from xFunc 
4540: 64 65 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68  determines wheth
4550: 65 72 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b  er the tree walk
4560: 20 63 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30   continues..** 0
4570: 20 6d 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20   means continue 
4580: 77 61 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65  walking the tree
4590: 2e 20 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f  .  1 means do no
45a0: 74 20 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a  t walk children.
45b0: 2a 2a 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e  ** of the curren
45c0: 74 20 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69  t node but conti
45d0: 6e 75 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67  nue with sibling
45e0: 73 2e 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e  s.  2 means aban
45f0: 64 6f 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20  don.** the tree 
4600: 77 61 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e  walk completely.
4610: 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  .**.** The retur
4620: 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69  n value from thi
4630: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74  s routine is 1 t
4640: 6f 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72  o abandon the tr
4650: 65 65 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30  ee walk.** and 0
4660: 20 74 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f   to continue..*/
4670: 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b  .static int walk
4680: 45 78 70 72 54 72 65 65 28 45 78 70 72 20 2a 70  ExprTree(Expr *p
4690: 45 78 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e  Expr, int (*xFun
46a0: 63 29 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c  c)(void*,Expr*),
46b0: 20 76 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20   void *pArg){.  
46c0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b  ExprList *pList;
46d0: 0a 20 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28  .  int rc;.  if(
46e0: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
46f0: 72 6e 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78  rn 0;.  rc = (*x
4700: 46 75 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70  Func)(pArg, pExp
4710: 72 29 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20  r);.  if( rc==0 
4720: 29 7b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  ){.    if( walkE
4730: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
4740: 4c 65 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72  Left, xFunc, pAr
4750: 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  g) ) return 1;. 
4760: 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54     if( walkExprT
4770: 72 65 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ree(pExpr->pRigh
4780: 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20  t, xFunc, pArg) 
4790: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
47a0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
47b0: 4c 69 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c  List;.    if( pL
47c0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74  ist ){.      int
47d0: 20 69 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74   i;.      struct
47e0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
47f0: 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72  pItem;.      for
4800: 28 69 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c  (i=pList->nExpr,
4810: 20 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b   pItem=pList->a;
4820: 20 69 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d   i>0; i--, pItem
4830: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
4840: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49   walkExprTree(pI
4850: 74 65 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e  tem->pExpr, xFun
4860: 63 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72  c, pArg) ) retur
4870: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
4880: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
4890: 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54  rc>1;.}../*.** T
48a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64  his routine is d
48b0: 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46  esigned as an xF
48c0: 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72  unc for walkExpr
48d0: 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41  Tree()..**.** pA
48e0: 72 67 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70  rg is really a p
48f0: 6f 69 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74  ointer to an int
4900: 65 67 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e  eger.  If we can
4910: 20 74 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67   tell by looking
4920: 0a 2a 2a 20 61 74 20 70 45 78 70 72 20 74 68 61  .** at pExpr tha
4930: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
4940: 20 74 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70   that contains p
4950: 45 78 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f  Expr is not a co
4960: 6e 73 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73  nstant.** expres
4970: 73 69 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a  sion, then set *
4980: 70 41 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65  pArg to 0 and re
4990: 74 75 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f  turn 2 to abando
49a0: 6e 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e  n the tree walk.
49b0: 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65  .** If pExpr doe
49c0: 73 20 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75  s does not disqu
49d0: 61 6c 69 66 79 20 74 68 65 20 65 78 70 72 65 73  alify the expres
49e0: 73 69 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20  sion from being 
49f0: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68  a constant.** th
4a00: 65 6e 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a  en do nothing..*
4a10: 2a 0a 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69  *.** After walki
4a20: 6e 67 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65  ng the whole tre
4a30: 65 2c 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61  e, if no nodes a
4a40: 72 65 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69  re found that di
4a50: 73 71 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20  squalify.** the 
4a60: 65 78 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f  expression as co
4a70: 6e 73 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20  nstant, then we 
4a80: 61 73 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65  assume the whole
4a90: 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69   expression.** i
4aa0: 73 20 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65  s constant.  See
4ab0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f   sqlite3ExprIsCo
4ac0: 6e 73 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64  nstant() for add
4ad0: 69 74 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74  itional informat
4ae0: 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  ion..*/.static i
4af0: 6e 74 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  nt exprNodeIsCon
4b00: 73 74 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67  stant(void *pArg
4b10: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
4b20: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
4b30: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
4b40: 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20  TK_ID:.    case 
4b50: 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63  TK_COLUMN:.    c
4b60: 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20  ase TK_DOT:.    
4b70: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
4b80: 54 49 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54  TION:.    case T
4b90: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
4ba0: 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20    *((int*)pArg) 
4bb0: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
4bc0: 6e 20 32 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 2;.    default
4bd0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
4be0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
4bf0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
4c00: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
4c10: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
4c20: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
4c30: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
4c40: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
4c50: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
4c60: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
4c70: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
4c80: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
4c90: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
4ca0: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
4cb0: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
4cc0: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
4cd0: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
4ce0: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
4cf0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
4d00: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
4d10: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
4d20: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
4d30: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
4d40: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
4d50: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
4d60: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
4d70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
4d80: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
4d90: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
4da0: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
4db0: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
4dc0: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
4dd0: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
4de0: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
4df0: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
4e00: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
4e10: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
4e20: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
4e30: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
4e40: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
4e50: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
4e60: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
4e70: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
4e80: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
4e90: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
4ea0: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
4eb0: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
4ec0: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77  t *pValue){.  sw
4ed0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
4ee0: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
4ef0: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
4f00: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
4f10: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
4f20: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
4f30: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4f40: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
4f50: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
4f60: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
4f70: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
4f80: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
4f90: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
4fa0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
4fb0: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
4fc0: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
4fd0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
4fe0: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
4ff0: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
5000: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
5010: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5020: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
5030: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
5040: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
5050: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
5060: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
5070: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
5080: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
5090: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
50a0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
50b0: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
50c0: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
50d0: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
50e0: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
50f0: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5100: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5110: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
5120: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5130: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5140: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
5150: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
5160: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
5170: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
5180: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
5190: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
51a0: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
51b0: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
51c0: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
51d0: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
51e0: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
51f0: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
5200: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
5210: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
5220: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
5230: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
5240: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
5250: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
5260: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
5270: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
5280: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
5290: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
52a0: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
52b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
52c0: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
52d0: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
52e0: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
52f0: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
5300: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5310: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
5320: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
5330: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
5340: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
5350: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
5360: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
5370: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
5380: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
5390: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
53a0: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
53b0: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
53c0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
53d0: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
53e0: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
53f0: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
5400: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
5410: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
5420: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
5430: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
5440: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
5450: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
5460: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5470: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
5480: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
5490: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
54a0: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
54b0: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
54c0: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
54d0: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
54e0: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
54f0: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
5500: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5510: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
5520: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
5530: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
5540: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
5550: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
5560: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
5570: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
5580: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
5590: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
55a0: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
55b0: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
55c0: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
55d0: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
55e0: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
55f0: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
5600: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5610: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
5620: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
5630: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
5640: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
5650: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
5660: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
5670: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
5680: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
5690: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
56a0: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
56b0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
56c0: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
56d0: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
56e0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
56f0: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
5700: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
5710: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
5720: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
5730: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
5740: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
5750: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
5760: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
5770: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
5780: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
5790: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
57a0: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
57b0: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
57c0: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
57d0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
57e0: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
57f0: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
5800: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
5810: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5820: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
5830: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
5840: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
5850: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5860: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
5870: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
5880: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
5890: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
58a0: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
58b0: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
58c0: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
58d0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
58e0: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
58f0: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
5900: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
5910: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
5920: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
5930: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
5940: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
5950: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
5960: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5970: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
5980: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
5990: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
59a0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
59b0: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
59c0: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
59d0: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
59e0: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
59f0: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
5a00: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
5a10: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
5a20: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
5a30: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
5a40: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5a50: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
5a60: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  the list */..  a
5a70: 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f  ssert( pColumnTo
5a80: 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ken && pColumnTo
5a90: 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65  ken->z ); /* The
5aa0: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
5ab0: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
5ac0: 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  zDb = sqlite3Nam
5ad0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f  eFromToken(pDbTo
5ae0: 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73  ken);.  zTab = s
5af0: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5b00: 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29  ken(pTableToken)
5b10: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
5b20: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5b30: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
5b40: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
5b50: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
5b60: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
5b70: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
5b80: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
5b90: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
5ba0: 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  }..  pExpr->iTab
5bb0: 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  le = -1;.  while
5bc0: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
5bd0: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
5be0: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
5bf0: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45 78  pSrcList;.    Ex
5c00: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
5c10: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   pNC->pEList;.. 
5c20: 20 20 20 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a     pNC->nRef++;.
5c30: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a      /* assert( z
5c40: 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  Tab==0 || pEList
5c50: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 66 6f  ==0 ); */.    fo
5c60: 72 28 69 3d 30 2c 20 70 49 74 65 6d 3d 70 53 72  r(i=0, pItem=pSr
5c70: 63 4c 69 73 74 2d 3e 61 3b 20 69 3c 70 53 72 63  cList->a; i<pSrc
5c80: 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 2c  List->nSrc; i++,
5c90: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20   pItem++){.     
5ca0: 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 70   Table *pTab = p
5cb0: 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20 20  Item->pTab;.    
5cc0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
5cd0: 0a 20 20 20 20 20 20 69 66 28 20 70 54 61 62 3d  .      if( pTab=
5ce0: 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  =0 ) continue;. 
5cf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
5d00: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  b->nCol>0 );.   
5d10: 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20     if( zTab ){. 
5d20: 20 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d         if( pItem
5d30: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
5d40: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62        char *zTab
5d50: 4e 61 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41  Name = pItem->zA
5d60: 6c 69 61 73 3b 0a 20 20 20 20 20 20 20 20 20 20  lias;.          
5d70: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
5d80: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
5d90: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
5da0: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
5db0: 0a 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20  .          char 
5dc0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62  *zTabName = pTab
5dd0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
5de0: 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d     if( zTabName=
5df0: 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72  =0 || sqlite3Str
5e00: 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a  ICmp(zTabName, z
5e10: 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e  Tab)!=0 ) contin
5e20: 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ue;.          if
5e30: 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69  ( zDb!=0 && sqli
5e40: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
5e50: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
5e60: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
5e70: 20 20 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74              cont
5e80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20  inue;.          
5e90: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
5ea0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 30 3d    }.      if( 0=
5eb0: 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20  =(cntTab++) ){. 
5ec0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
5ed0: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
5ee0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70  ursor;.        p
5ef0: 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62  Expr->iDb = pTab
5f00: 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 70  ->iDb;.        p
5f10: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
5f20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
5f30: 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62 2d  (j=0, pCol=pTab-
5f40: 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e 6e  >aCol; j<pTab->n
5f50: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
5f60: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
5f70: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
5f80: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
5f90: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5fa0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
5fb0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
5fc0: 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72  = pItem->iCursor
5fd0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4d 61 74  ;.          pMat
5fe0: 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20  ch = pItem;.    
5ff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62        pExpr->iDb
6000: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
6010: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
6020: 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20  itute the rowid 
6030: 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20  (column -1) for 
6040: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
6050: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
6060: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
6070: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
6080: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
6090: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
60a0: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
60b0: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
60c0: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  y;.          pEx
60d0: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
60e0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
60f0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
6100: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6110: 20 20 7d 0a 20 20 20 20 7d 0a 0a 23 69 66 6e 64    }.    }..#ifnd
6120: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
6130: 52 49 47 47 45 52 0a 20 20 20 20 2f 2a 20 49 66  RIGGER.    /* If
6140: 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72   we have not alr
6150: 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68  eady resolved th
6160: 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79  e name, then may
6170: 62 65 20 0a 20 20 20 20 2a 2a 20 69 74 20 69 73  be .    ** it is
6180: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
6190: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
61a0: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 20  nt reference.   
61b0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 7a 44 62 3d   */.    if( zDb=
61c0: 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26  =0 && zTab!=0 &&
61d0: 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73   cnt==0 && pPars
61e0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20  e->trigStack!=0 
61f0: 29 7b 0a 20 20 20 20 20 20 54 72 69 67 67 65 72  ){.      Trigger
6200: 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53  Stack *pTriggerS
6210: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
6220: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 20 20  rigStack;.      
6230: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
6240: 0a 20 20 20 20 20 20 69 66 28 20 70 54 72 69 67  .      if( pTrig
6250: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
6260: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
6270: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
6280: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
6290: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
62a0: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
62b0: 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20  ack->newIdx;.   
62c0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72       assert( pTr
62d0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
62e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   );.        pTab
62f0: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
6300: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 65  ->pTab;.      }e
6310: 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65 72  lse if( pTrigger
6320: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d  Stack->oldIdx !=
6330: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
6340: 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61  rICmp("old", zTa
6350: 62 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  b)==0 ){.       
6360: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
6370: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
6380: 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 20 20  oldIdx;.        
6390: 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72  assert( pTrigger
63a0: 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20  Stack->pTab );. 
63b0: 20 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54         pTab = pT
63c0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
63d0: 62 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20  b;.      }..    
63e0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20    if( pTab ){ . 
63f0: 20 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20         int j;.  
6400: 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43        Column *pC
6410: 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b  ol = pTab->aCol;
6420: 0a 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ..        pExpr-
6430: 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62  >iDb = pTab->iDb
6440: 3b 0a 20 20 20 20 20 20 20 20 63 6e 74 54 61 62  ;.        cntTab
6450: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  ++;.        for(
6460: 6a 3d 30 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e  j=0; j < pTab->n
6470: 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b  Col; j++, pCol++
6480: 29 20 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  ) {.          if
6490: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
64a0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
64b0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
64c0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
64d0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
64e0: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
64f0: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
6500: 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  j;.            p
6510: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
6520: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
6530: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
6540: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
6550: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
6560: 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].pColl;.       
6570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6580: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6590: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
65a0: 23 65 6e 64 69 66 20 2f 2a 20 21 64 65 66 69 6e  #endif /* !defin
65b0: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ed(SQLITE_OMIT_T
65c0: 52 49 47 47 45 52 29 20 2a 2f 0a 0a 20 20 20 20  RIGGER) */..    
65d0: 2f 2a 0a 20 20 20 20 2a 2a 20 50 65 72 68 61 70  /*.    ** Perhap
65e0: 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20  s the name is a 
65f0: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65  reference to the
6600: 20 52 4f 57 49 44 0a 20 20 20 20 2a 2f 0a 20 20   ROWID.    */.  
6610: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
6620: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
6630: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
6640: 29 20 29 7b 0a 20 20 20 20 20 20 63 6e 74 20 3d  ) ){.      cnt =
6650: 20 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   1;.      pExpr-
6660: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20  >iColumn = -1;. 
6670: 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69       pExpr->affi
6680: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
6690: 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d  F_INTEGER;.    }
66a0: 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20  ..    /*.    ** 
66b0: 49 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20  If the input is 
66c0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e  of the form Z (n
66d0: 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29  ot Y.Z or X.Y.Z)
66e0: 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a   then the name Z
66f0: 0a 20 20 20 20 2a 2a 20 6d 69 67 68 74 20 72 65  .    ** might re
6700: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
6710: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
6720: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
6730: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 20  xample, when.   
6740: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
6750: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
6760: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
6770: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
6780: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20 20 2a 2a 0a  command:.    **.
6790: 20 20 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43      **     SELEC
67a0: 54 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20  T a+b AS x FROM 
67b0: 74 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30  table WHERE x<10
67c0: 3b 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  ;.    **.    ** 
67d0: 49 6e 20 63 61 73 65 73 20 6c 69 6b 65 20 74 68  In cases like th
67e0: 69 73 2c 20 72 65 70 6c 61 63 65 20 70 45 78 70  is, replace pExp
67f0: 72 20 77 69 74 68 20 61 20 63 6f 70 79 20 6f 66  r with a copy of
6800: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6810: 74 68 61 74 0a 20 20 20 20 2a 2a 20 66 6f 72 6d  that.    ** form
6820: 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74  s the result set
6830: 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69 6e   entry ("a+b" in
6840: 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61 6e   the example) an
6850: 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69 61  d return immedia
6860: 74 65 6c 79 2e 0a 20 20 20 20 2a 2a 20 4e 6f 74  tely..    ** Not
6870: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
6880: 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73  ssion in the res
6890: 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68  ult set should h
68a0: 61 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e  ave already been
68b0: 0a 20 20 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  .    ** resolved
68c0: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
68d0: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
68e0: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 20 20 2a   resolved..    *
68f0: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
6900: 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 26 26   && pEList!=0 &&
6910: 20 7a 54 61 62 3d 3d 30 20 29 7b 0a 20 20 20 20   zTab==0 ){.    
6920: 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c    for(j=0; j<pEL
6930: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29  ist->nExpr; j++)
6940: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
6950: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
6960: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
6970: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
6980: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6990: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
69a0: 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74            assert
69b0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d  ( pExpr->pLeft==
69c0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
69d0: 68 74 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20  ht==0 );.       
69e0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54     pExpr->op = T
69f0: 4b 5f 41 53 3b 0a 20 20 20 20 20 20 20 20 20 20  K_AS;.          
6a00: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6a10: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45   j;.          pE
6a20: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
6a30: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
6a40: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
6a50: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6a60: 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  eFree(zCol);.   
6a70: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a         assert( z
6a80: 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30  Tab==0 && zDb==0
6a90: 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 72 65   );.          re
6aa0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
6ab0: 7d 0a 20 20 20 20 20 20 7d 20 0a 20 20 20 20 7d  }.      } .    }
6ac0: 0a 0a 20 20 20 20 2f 2a 20 41 64 76 61 6e 63 65  ..    /* Advance
6ad0: 20 74 6f 20 74 68 65 20 6e 65 78 74 20 6e 61 6d   to the next nam
6ae0: 65 20 63 6f 6e 74 65 78 74 2e 20 20 54 68 65 20  e context.  The 
6af0: 6c 6f 6f 70 20 77 69 6c 6c 20 65 78 69 74 20 77  loop will exit w
6b00: 68 65 6e 20 65 69 74 68 65 72 0a 20 20 20 20 2a  hen either.    *
6b10: 2a 20 77 65 20 68 61 76 65 20 61 20 6d 61 74 63  * we have a matc
6b20: 68 20 28 63 6e 74 3e 30 29 20 6f 72 20 77 68 65  h (cnt>0) or whe
6b30: 6e 20 77 65 20 72 75 6e 20 6f 75 74 20 6f 66 20  n we run out of 
6b40: 6e 61 6d 65 20 63 6f 6e 74 65 78 74 73 2e 0a 20  name contexts.. 
6b50: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
6b60: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 4e  t==0 ){.      pN
6b70: 43 20 3d 20 70 4e 43 2d 3e 70 4e 65 78 74 3b 0a  C = pNC->pNext;.
6b80: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a      }.  }..  /*.
6b90: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
6ba0: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
6bb0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
6bc0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
6bd0: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
6be0: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
6bf0: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
6c00: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
6c10: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
6c20: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
6c30: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
6c40: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
6c50: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
6c60: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
6c70: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
6c80: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
6c90: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
6ca0: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
6cb0: 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xpr..  */.  if( 
6cc0: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
6cd0: 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  0 && pColumnToke
6ce0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a  n->z[0]=='"' ){.
6cf0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
6d00: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
6d10: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
6d20: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
6d30: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
6d40: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
6d50: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
6d60: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
6d70: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
6d80: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
6d90: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
6da0: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
6db0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
6dc0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
6dd0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
6de0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
6df0: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
6e00: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
6e10: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
6e20: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6e30: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
6e40: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
6e50: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
6e60: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20   }else if( zTab 
6e70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
6e80: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54  SetString(&z, zT
6e90: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
6ea0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
6eb0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74      z = sqliteSt
6ec0: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
6ed0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
6ee0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
6ef0: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
6f00: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 70  teFree(z);.    p
6f10: 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20  TopNC->nErr++;. 
6f20: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 61 20 63 6f   }..  /* If a co
6f30: 6c 75 6d 6e 20 66 72 6f 6d 20 61 20 74 61 62 6c  lumn from a tabl
6f40: 65 20 69 6e 20 70 53 72 63 4c 69 73 74 20 69 73  e in pSrcList is
6f50: 20 72 65 66 65 72 65 6e 63 65 64 2c 20 74 68 65   referenced, the
6f60: 6e 20 72 65 63 6f 72 64 0a 20 20 2a 2a 20 74 68  n record.  ** th
6f70: 69 73 20 66 61 63 74 20 69 6e 20 74 68 65 20 70  is fact in the p
6f80: 53 72 63 4c 69 73 74 2e 61 5b 5d 2e 63 6f 6c 55  SrcList.a[].colU
6f90: 73 65 64 20 62 69 74 6d 61 73 6b 2e 20 20 43 6f  sed bitmask.  Co
6fa0: 6c 75 6d 6e 20 30 20 63 61 75 73 65 73 0a 20 20  lumn 0 causes.  
6fb0: 2a 2a 20 62 69 74 20 30 20 74 6f 20 62 65 20 73  ** bit 0 to be s
6fc0: 65 74 2e 20 20 43 6f 6c 75 6d 6e 20 31 20 73 65  et.  Column 1 se
6fd0: 74 73 20 62 69 74 20 31 2e 20 20 41 6e 64 20 73  ts bit 1.  And s
6fe0: 6f 20 66 6f 72 74 68 2e 20 20 49 66 20 74 68 65  o forth.  If the
6ff0: 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 6e 75 6d  .  ** column num
7000: 62 65 72 20 69 73 20 67 72 65 61 74 65 72 20 74  ber is greater t
7010: 68 61 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  han the number o
7020: 66 20 62 69 74 73 20 69 6e 20 74 68 65 20 62 69  f bits in the bi
7030: 74 6d 61 73 6b 0a 20 20 2a 2a 20 74 68 65 6e 20  tmask.  ** then 
7040: 73 65 74 20 74 68 65 20 68 69 67 68 2d 6f 72 64  set the high-ord
7050: 65 72 20 62 69 74 20 6f 66 20 74 68 65 20 62 69  er bit of the bi
7060: 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a 20 20 69 66  tmask..  */.  if
7070: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
7080: 3e 3d 30 20 26 26 20 70 4d 61 74 63 68 21 3d 30  >=0 && pMatch!=0
7090: 20 29 7b 0a 20 20 20 20 69 6e 74 20 6e 20 3d 20   ){.    int n = 
70a0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a  pExpr->iColumn;.
70b0: 20 20 20 20 69 66 28 20 6e 3e 3d 73 69 7a 65 6f      if( n>=sizeo
70c0: 66 28 42 69 74 6d 61 73 6b 29 2a 38 20 29 7b 0a  f(Bitmask)*8 ){.
70d0: 20 20 20 20 20 20 6e 20 3d 20 73 69 7a 65 6f 66        n = sizeof
70e0: 28 42 69 74 6d 61 73 6b 29 2a 38 2d 31 3b 0a 20  (Bitmask)*8-1;. 
70f0: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
7100: 20 70 4d 61 74 63 68 2d 3e 69 43 75 72 73 6f 72   pMatch->iCursor
7110: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
7120: 29 3b 0a 20 20 20 20 70 4d 61 74 63 68 2d 3e 63  );.    pMatch->c
7130: 6f 6c 55 73 65 64 20 7c 3d 20 31 3c 3c 6e 3b 0a  olUsed |= 1<<n;.
7140: 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20    }..  /* Clean 
7150: 75 70 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20  up and return.  
7160: 2a 2f 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  */.  sqliteFree(
7170: 7a 44 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  zDb);.  sqliteFr
7180: 65 65 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69  ee(zTab);.  sqli
7190: 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  teFree(zCol);.  
71a0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
71b0: 65 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  e(pExpr->pLeft);
71c0: 0a 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  .  pExpr->pLeft 
71d0: 3d 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  = 0;.  sqlite3Ex
71e0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
71f0: 70 52 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72  pRight);.  pExpr
7200: 2d 3e 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20  ->pRight = 0;.  
7210: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43  pExpr->op = TK_C
7220: 4f 4c 55 4d 4e 3b 0a 20 20 69 66 28 20 63 6e 74  OLUMN;.  if( cnt
7230: 3d 3d 31 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ==1 ){.    asser
7240: 74 28 20 70 4e 43 21 3d 30 20 26 26 20 70 4e 43  t( pNC!=0 && pNC
7250: 2d 3e 70 53 72 63 4c 69 73 74 21 3d 30 20 29 3b  ->pSrcList!=0 );
7260: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
7270: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
7280: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
7290: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
72a0: 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a   cnt!=1;.}../*.*
72b0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64  * pExpr is a nod
72c0: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
72d0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d   function of som
72e0: 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68  e kind.  It migh
72f0: 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63  t.** be a syntac
7300: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b  tic function lik
7310: 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20  e "count(x)" or 
7320: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75  it might be a fu
7330: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69  nction.** that i
7340: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65  mplements an ope
7350: 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c  rator, like "a L
7360: 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  IKE b".  .**.** 
7370: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
7380: 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74  es *pzName point
7390: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
73a0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  the function and
73b0: 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c   .** *pnName hol
73c0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
73d0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
73e0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
73f0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7400: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
7410: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
7420: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65  st char **pzName
7430: 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a  , int *pnName){.
7440: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7450: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7460: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
7470: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70       *pzName = p
7480: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
7490: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70       *pnName = p
74a0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
74b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
74c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
74d0: 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  KE: {.      *pzN
74e0: 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20  ame = "like";.  
74f0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
7500: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7510: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7520: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70  GLOB: {.      *p
7530: 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a  zName = "glob";.
7540: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7550: 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;.      break;.
7560: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7570: 4b 5f 43 54 49 4d 45 3a 20 7b 0a 20 20 20 20 20  K_CTIME: {.     
7580: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72   *pzName = "curr
7590: 65 6e 74 5f 74 69 6d 65 22 3b 0a 20 20 20 20 20  ent_time";.     
75a0: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
75b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
75c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44  }.    case TK_CD
75d0: 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  ATE: {.      *pz
75e0: 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f  Name = "current_
75f0: 64 61 74 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e  date";.      *pn
7600: 4e 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20  Name = 12;.     
7610: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7620: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 53    case TK_CTIMES
7630: 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20 20 2a 70  TAMP: {.      *p
7640: 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74  zName = "current
7650: 5f 74 69 6d 65 73 74 61 6d 70 22 3b 0a 20 20 20  _timestamp";.   
7660: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 37 3b     *pnName = 17;
7670: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7680: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
7690: 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65   {.      *pzName
76a0: 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e   = "can't happen
76b0: 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65  ";.      *pnName
76c0: 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65   = 12;.      bre
76d0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
76e0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  ./*.** This rout
76f0: 69 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20  ine is designed 
7700: 61 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20  as an xFunc for 
7710: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a  walkExprTree()..
7720: 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76 65 20 73 79  **.** Resolve sy
7730: 6d 62 6f 6c 69 63 20 6e 61 6d 65 73 20 69 6e 74  mbolic names int
7740: 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20 6f 70 65 72  o TK_COLUMN oper
7750: 61 74 6f 72 73 20 66 6f 72 20 74 68 65 20 63 75  ators for the cu
7760: 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64 65 20 69 6e  rrent.** node in
7770: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
7780: 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 30 20  tree.  Return 0 
7790: 74 6f 20 63 6f 6e 74 69 6e 75 65 20 74 68 65 20  to continue the 
77a0: 73 65 61 72 63 68 20 64 6f 77 6e 0a 2a 2a 20 74  search down.** t
77b0: 68 65 20 74 72 65 65 20 6f 72 20 32 20 74 6f 20  he tree or 2 to 
77c0: 61 62 6f 72 74 20 74 68 65 20 74 72 65 65 20 77  abort the tree w
77d0: 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  alk..**.** This 
77e0: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 64 6f 65  routine also doe
77f0: 73 20 65 72 72 6f 72 20 63 68 65 63 6b 69 6e 67  s error checking
7800: 20 61 6e 64 20 6e 61 6d 65 20 72 65 73 6f 6c 75   and name resolu
7810: 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20 66 75 6e 63  tion for.** func
7820: 74 69 6f 6e 20 6e 61 6d 65 73 2e 20 20 54 68 65  tion names.  The
7830: 20 6f 70 65 72 61 74 6f 72 20 66 6f 72 20 61 67   operator for ag
7840: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7850: 73 20 69 73 20 63 68 61 6e 67 65 64 0a 2a 2a 20  s is changed.** 
7860: 74 6f 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  to TK_AGG_FUNCTI
7870: 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ON..*/.static in
7880: 74 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  t nameResolverSt
7890: 65 70 28 76 6f 69 64 20 2a 70 41 72 67 2c 20 45  ep(void *pArg, E
78a0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 4e  xpr *pExpr){.  N
78b0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20  ameContext *pNC 
78c0: 3d 20 28 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 29  = (NameContext*)
78d0: 70 41 72 67 3b 0a 20 20 53 72 63 4c 69 73 74 20  pArg;.  SrcList 
78e0: 2a 70 53 72 63 4c 69 73 74 3b 0a 20 20 50 61 72  *pSrcList;.  Par
78f0: 73 65 20 2a 70 50 61 72 73 65 3b 0a 20 20 69 6e  se *pParse;.  in
7900: 74 20 69 3b 0a 0a 20 20 61 73 73 65 72 74 28 20  t i;..  assert( 
7910: 70 4e 43 21 3d 30 20 29 3b 0a 20 20 70 53 72 63  pNC!=0 );.  pSrc
7920: 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63  List = pNC->pSrc
7930: 4c 69 73 74 3b 0a 20 20 70 50 61 72 73 65 20 3d  List;.  pParse =
7940: 20 70 4e 43 2d 3e 70 50 61 72 73 65 3b 0a 20 20   pNC->pParse;.  
7950: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72  if( pExpr==0 ) r
7960: 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 45  eturn 1;.  if( E
7970: 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65 72 74  xprHasAnyPropert
7980: 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65 73 6f  y(pExpr, EP_Reso
7990: 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e 20 31  lved) ) return 1
79a0: 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f 70 65  ;.  ExprSetPrope
79b0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
79c0: 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64 65 66  solved);.#ifndef
79d0: 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20 70 53   NDEBUG.  if( pS
79e0: 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20 66 6f  rcList ){.    fo
79f0: 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73  r(i=0; i<pSrcLis
7a00: 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20  t->nSrc; i++){. 
7a10: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 53 72       assert( pSr
7a20: 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72  cList->a[i].iCur
7a30: 73 6f 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69  sor>=0 && pSrcLi
7a40: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
7a50: 3c 70 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a  <pParse->nTab);.
7a60: 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66      }.  }.#endif
7a70: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7a80: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
7a90: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
7aa0: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
7ab0: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
7ac0: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
7ad0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
7ae0: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
7af0: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
7b00: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
7b10: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
7b20: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
7b30: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
7b40: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
7b50: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
7b60: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
7b70: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
7b80: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
7b90: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
7ba0: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
7bb0: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
7bc0: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
7bd0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
7be0: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
7bf0: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
7c00: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
7c10: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
7c20: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
7c30: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
7c40: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7c50: 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73  lookupName(pPars
7c60: 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d  e, 0, 0, &pExpr-
7c70: 3e 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78  >token, pNC, pEx
7c80: 70 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72  pr);.      retur
7c90: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20  n 1;.    }.  .  
7ca0: 20 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d    /* A table nam
7cb0: 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  e and column nam
7cc0: 65 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20  e:     ID.ID.   
7cd0: 20 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73   ** Or a databas
7ce0: 65 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c  e, table and col
7cf0: 75 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20  umn:  ID.ID.ID. 
7d00: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
7d10: 4b 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54  K_DOT: {.      T
7d20: 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20  oken *pColumn;. 
7d30: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62       Token *pTab
7d40: 6c 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  le;.      Token 
7d50: 2a 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72  *pDb;.      Expr
7d60: 20 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20   *pRight;..     
7d70: 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d 30   if( pSrcList==0
7d80: 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20   ) break;.      
7d90: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
7da0: 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66  pRight;.      if
7db0: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
7dc0: 5f 49 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70  _ID ){.        p
7dd0: 44 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  Db = 0;.        
7de0: 70 54 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d  pTable = &pExpr-
7df0: 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  >pLeft->token;. 
7e00: 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d         pColumn =
7e10: 20 26 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b   &pRight->token;
7e20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7e30: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 52        assert( pR
7e40: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54  ight->op==TK_DOT
7e50: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20   );.        pDb 
7e60: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
7e70: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
7e80: 70 54 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74  pTable = &pRight
7e90: 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a  ->pLeft->token;.
7ea0: 20 20 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20          pColumn 
7eb0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68  = &pRight->pRigh
7ec0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
7ed0: 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61  }.      lookupNa
7ee0: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
7ef0: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
7f00: 20 70 4e 43 2c 20 70 45 78 70 72 29 3b 0a 20 20   pNC, pExpr);.  
7f10: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7f20: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 52 65 73 6f    }..    /* Reso
7f30: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
7f40: 65 73 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  es.    */.    ca
7f50: 73 65 20 54 4b 5f 43 54 49 4d 45 3a 0a 20 20 20  se TK_CTIME:.   
7f60: 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 53 54   case TK_CTIMEST
7f70: 41 4d 50 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AMP:.    case TK
7f80: 5f 43 44 41 54 45 3a 0a 20 20 20 20 2f 2a 20 4e  _CDATE:.    /* N
7f90: 6f 74 65 3a 20 54 68 65 20 61 62 6f 76 65 20 74  ote: The above t
7fa0: 68 72 65 65 20 77 65 72 65 20 61 20 73 65 70 65  hree were a sepe
7fb0: 72 61 74 65 20 63 61 73 65 20 69 6e 20 73 71 6c  rate case in sql
7fc0: 6d 6f 74 6f 2e 20 52 65 61 73 6f 6e 3f 20 2a 2f  moto. Reason? */
7fd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f  .    case TK_GLO
7fe0: 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  B:.    case TK_L
7ff0: 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IKE:.    case TK
8000: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
8010: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
8020: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
8030: 74 3b 20 20 20 20 2f 2a 20 54 68 65 20 61 72 67  t;    /* The arg
8040: 75 6d 65 6e 74 20 6c 69 73 74 20 2a 2f 0a 20 20  ument list */.  
8050: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 4c 69 73      int n = pLis
8060: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
8070: 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   : 0;  /* Number
8080: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
8090: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75  .      int no_su
80a0: 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20  ch_func = 0;    
80b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
80c0: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65   such function e
80d0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  xists */.      i
80e0: 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  nt wrong_num_arg
80f0: 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  s = 0;     /* Tr
8100: 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62  ue if wrong numb
8110: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
8120: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  */.      int is_
8130: 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  agg = 0;        
8140: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
8150: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
8160: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
8170: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
8180: 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
8190: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
81a0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
81b0: 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e  rs in function n
81c0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ame */.      con
81d0: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
81e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
81f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a  function name. *
8200: 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
8210: 2a 70 44 65 66 3b 20 20 20 20 20 20 20 20 20 20  *pDef;          
8220: 20 20 20 20 2f 2a 20 49 6e 66 6f 72 6d 61 74 69      /* Informati
8230: 6f 6e 20 61 62 6f 75 74 20 74 68 65 20 66 75 6e  on about the fun
8240: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
8250: 6e 74 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  nt enc = pParse-
8260: 3e 64 62 2d 3e 65 6e 63 3b 20 20 2f 2a 20 54 68  >db->enc;  /* Th
8270: 65 20 64 61 74 61 62 61 73 65 20 65 6e 63 6f 64  e database encod
8280: 69 6e 67 20 2a 2f 0a 0a 20 20 20 20 20 20 67 65  ing */..      ge
8290: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45  tFunctionName(pE
82a0: 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29  xpr, &zId, &nId)
82b0: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
82c0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
82d0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
82e0: 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c  Id, nId, n, enc,
82f0: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
8300: 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Def==0 ){.      
8310: 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33    pDef = sqlite3
8320: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
8330: 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49  rse->db, zId, nI
8340: 64 2c 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a  d, -1, enc, 0);.
8350: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
8360: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
8370: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
8380: 31 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  1;.        }else
8390: 7b 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e  {.          wron
83a0: 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a  g_num_args = 1;.
83b0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
83c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69  }else{.        i
83d0: 73 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46  s_agg = pDef->xF
83e0: 75 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a  unc==0;.      }.
83f0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
8400: 20 26 26 20 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41   && !pNC->allowA
8410: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gg ){.        sq
8420: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8430: 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66  arse, "misuse of
8440: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8450: 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64  ion %.*s()", nId
8460: 2c 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70  ,zId);.        p
8470: 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20  NC->nErr++;.    
8480: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
8490: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
84a0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a  no_such_func ){.
84b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
84c0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
84d0: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
84e0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
84f0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  Id);.        pNC
8500: 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20  ->nErr++;.      
8510: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
8520: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
8530: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8540: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
8550: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
8560: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
8570: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
8580: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
8590: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
85a0: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a  nErr++;.      }.
85b0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
85c0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70   ){.        pExp
85d0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f 46  r->op = TK_AGG_F
85e0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20 20  UNCTION;.       
85f0: 20 70 4e 43 2d 3e 68 61 73 41 67 67 20 3d 20 31   pNC->hasAgg = 1
8600: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
8610: 69 66 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43  if( is_agg ) pNC
8620: 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20 30 3b 0a  ->allowAgg = 0;.
8630: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 70        for(i=0; p
8640: 4e 43 2d 3e 6e 45 72 72 3d 3d 30 20 26 26 20 69  NC->nErr==0 && i
8650: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
8660: 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70    walkExprTree(p
8670: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
8680: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
8690: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 20 20 20 20  ep, pNC);.      
86a0: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61  }.      if( is_a
86b0: 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41  gg ) pNC->allowA
86c0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 2f 2a  gg = 1;.      /*
86d0: 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74   FIX ME:  Comput
86e0: 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74  e pExpr->affinit
86f0: 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65 20 65  y based on the e
8700: 78 70 65 63 74 65 64 20 72 65 74 75 72 6e 0a 20  xpected return. 
8710: 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f 66 20       ** type of 
8720: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20  the function .  
8730: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 72 65 74      */.      ret
8740: 75 72 6e 20 69 73 5f 61 67 67 3b 0a 20 20 20 20  urn is_agg;.    
8750: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
8760: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
8770: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
8780: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
8790: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
87a0: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
87b0: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
87c0: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
87d0: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
87e0: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
87f0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
8800: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
8810: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
8820: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
8830: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
8840: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
8850: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
8860: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
8870: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
8880: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
8890: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
88a0: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
88b0: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
88c0: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
88d0: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
88e0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
88f0: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
8900: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
8910: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
8920: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
8930: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
8940: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
8950: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
8960: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
8970: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
8980: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
8990: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
89a0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
89b0: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
89c0: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
89d0: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
89e0: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
89f0: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
8a00: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
8a10: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
8a20: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
8a30: 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65 73 6f  .**.** Also reso
8a40: 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d  lve function nam
8a50: 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74 68 65  es and check the
8a60: 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72 20 70   functions for p
8a70: 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65 2e 20  roper.** usage. 
8a80: 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 20 66   Make sure all f
8a90: 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72  unction names ar
8aa0: 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64  e recognized and
8ab0: 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 0a 2a   all functions.*
8ac0: 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72 72 65  * have the corre
8ad0: 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ct number of arg
8ae0: 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61  uments.  Leave a
8af0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
8b00: 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45  ** in pParse->zE
8b10: 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68 69 6e  rrMsg if anythin
8b20: 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74  g is amiss.  Ret
8b30: 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f  urn the number o
8b40: 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  f errors..**.** 
8b50: 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  If the expressio
8b60: 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67 72 65  n contains aggre
8b70: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 74  gate functions t
8b80: 68 65 6e 20 73 65 74 20 74 68 65 20 45 50 5f 41  hen set the EP_A
8b90: 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79 20 6f  gg.** property o
8ba0: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8bb0: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8bc0: 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65 73  ExprResolveNames
8bd0: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
8be0: 65 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61  e,     /* The pa
8bf0: 72 73 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  rser context */.
8c00: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
8c10: 69 73 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20  ist, /* List of 
8c20: 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72  tables used to r
8c30: 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61  esolve column na
8c40: 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73  mes */.  ExprLis
8c50: 74 20 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c  t *pEList,  /* L
8c60: 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ist of expressio
8c70: 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  ns used to resol
8c80: 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70  ve "AS" */.  Exp
8c90: 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20 20 20  r *pExpr,       
8ca0: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
8cb0: 6e 20 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64  n to be analyzed
8cc0: 2e 20 2a 2f 0a 20 20 69 6e 74 20 61 6c 6c 6f 77  . */.  int allow
8cd0: 41 67 67 2c 20 20 20 20 20 20 2f 2a 20 54 72 75  Agg,      /* Tru
8ce0: 65 20 74 6f 20 61 6c 6c 6f 77 20 61 67 67 72 65  e to allow aggre
8cf0: 67 61 74 65 20 65 78 70 72 65 73 73 69 6f 6e 73  gate expressions
8d00: 20 2a 2f 0a 20 20 69 6e 74 20 63 6f 64 65 53 75   */.  int codeSu
8d10: 62 71 75 65 72 79 20 20 20 2f 2a 20 49 66 20 74  bquery   /* If t
8d20: 72 75 65 2c 20 74 68 65 6e 20 67 65 6e 65 72 61  rue, then genera
8d30: 74 65 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71  te code for subq
8d40: 75 65 72 69 65 73 20 74 6f 6f 20 2a 2f 0a 29 7b  ueries too */.){
8d50: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 73  .  NameContext s
8d60: 4e 43 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72  NC;..  if( pExpr
8d70: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
8d80: 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20 30    memset(&sNC, 0
8d90: 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b 0a  , sizeof(sNC));.
8da0: 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20 3d    sNC.pSrcList =
8db0: 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 73 4e 43   pSrcList;.  sNC
8dc0: 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73 65  .pParse = pParse
8dd0: 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20 3d  ;.  sNC.pEList =
8de0: 20 70 45 4c 69 73 74 3b 0a 20 20 73 4e 43 2e 61   pEList;.  sNC.a
8df0: 6c 6c 6f 77 41 67 67 20 3d 20 61 6c 6c 6f 77 41  llowAgg = allowA
8e00: 67 67 3b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  gg;.  walkExprTr
8e10: 65 65 28 70 45 78 70 72 2c 20 6e 61 6d 65 52 65  ee(pExpr, nameRe
8e20: 73 6f 6c 76 65 72 53 74 65 70 2c 20 26 73 4e 43  solverStep, &sNC
8e30: 29 3b 0a 20 20 69 66 28 20 73 4e 43 2e 68 61 73  );.  if( sNC.has
8e40: 41 67 67 20 29 7b 0a 20 20 20 20 45 78 70 72 53  Agg ){.    ExprS
8e50: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
8e60: 2c 20 45 50 5f 41 67 67 29 3b 0a 20 20 7d 0a 20  , EP_Agg);.  }. 
8e70: 20 69 66 28 20 73 4e 43 2e 6e 45 72 72 3e 30 20   if( sNC.nErr>0 
8e80: 29 7b 0a 20 20 20 20 45 78 70 72 53 65 74 50 72  ){.    ExprSetPr
8e90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
8ea0: 5f 45 72 72 6f 72 29 3b 0a 20 20 7d 65 6c 73 65  _Error);.  }else
8eb0: 20 69 66 28 20 63 6f 64 65 53 75 62 71 75 65 72   if( codeSubquer
8ec0: 79 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70  y  && sqlite3Exp
8ed0: 72 43 6f 64 65 53 75 62 71 75 65 72 79 28 70 50  rCodeSubquery(pP
8ee0: 61 72 73 65 2c 20 70 45 78 70 72 29 20 29 7b 0a  arse, pExpr) ){.
8ef0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8f00: 7d 0a 20 20 72 65 74 75 72 6e 20 45 78 70 72 48  }.  return ExprH
8f10: 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
8f20: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 7d 0a 0a  , EP_Error);.}..
8f30: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8f40: 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65 72  code for subquer
8f50: 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72 61  ies and IN opera
8f60: 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20 6f  tors..**.** IN o
8f70: 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20 69  perators comes i
8f80: 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  n two forms:.**.
8f90: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
8fa0: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
8fb0: 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ** and.**       
8fc0: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
8fd0: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
8fe0: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
8ff0: 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61   handled by crea
9000: 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69  ting a set holdi
9010: 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f  ng the list.** o
9020: 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  f allowed values
9030: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
9040: 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45  rm causes the SE
9050: 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65  LECT to generate
9060: 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79   .** a temporary
9070: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
9080: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
9090: 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c 61 72  looks for scalar
90a0: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 61 72   SELECTs that ar
90b0: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  e part of an exp
90c0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69  ression..** If i
90d0: 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69 74 20  t finds any, it 
90e0: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
90f0: 6f 20 77 72 69 74 65 20 74 68 65 20 76 61 6c 75  o write the valu
9100: 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65 63 74  e of that select
9110: 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  .** into a memor
9120: 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 54 68  y cell..**.** Th
9130: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 61 20  is routine is a 
9140: 63 61 6c 6c 62 61 63 6b 20 66 6f 72 20 77 61 6c  callback for wal
9150: 6c 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64  lExprTree() used
9160: 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a   to implement.**
9170: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9180: 53 75 62 71 75 65 72 79 28 29 2e 20 20 53 65 65  Subquery().  See
9190: 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e 20 74 68 6f   comments on tho
91a0: 73 65 20 72 6f 75 74 69 6e 65 73 20 66 6f 72 0a  se routines for.
91b0: 2a 2a 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  ** additional in
91c0: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74  formation..*/.st
91d0: 61 74 69 63 20 69 6e 74 20 63 6f 64 65 53 75 62  atic int codeSub
91e0: 71 75 65 72 79 53 74 65 70 28 76 6f 69 64 20 2a  queryStep(void *
91f0: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
9200: 72 29 7b 0a 20 20 50 61 72 73 65 20 2a 70 50 61  r){.  Parse *pPa
9210: 72 73 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41  rse = (Parse*)pA
9220: 72 67 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70  rg;..  switch( p
9230: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
9240: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
9250: 20 20 20 20 63 68 61 72 20 61 66 66 69 6e 69 74      char affinit
9260: 79 3b 0a 20 20 20 20 20 20 56 64 62 65 20 2a 76  y;.      Vdbe *v
9270: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
9280: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  e(pParse);.     
9290: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
92a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
92b0: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
92c0: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 54 65  ess of OP_OpenTe
92d0: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  mp instruction *
92e0: 2f 0a 0a 20 20 20 20 20 20 69 66 28 20 76 3d 3d  /..      if( v==
92f0: 30 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  0 ) return 2;.  
9300: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
9310: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
9320: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
9330: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
9340: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
9350: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
9360: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
9370: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
9380: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
9390: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
93a0: 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70  same way. A temp
93b0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a  orary table is .
93c0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
93d0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
93e0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
93f0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
9400: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
9410: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
9420: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
9430: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
9440: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
9450: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
9460: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
9470: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
9480: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
9490: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
94a0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
94b0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
94c0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
94d0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
94e0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
94f0: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
9500: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
9510: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
9520: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
9530: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
9540: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
9550: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
9560: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
9570: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
9580: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
9590: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
95a0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
95b0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
95c0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
95d0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
95e0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
95f0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
9600: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
9610: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
9620: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
9630: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9640: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
9650: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
9660: 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  0);.      memset
9670: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
9680: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
9690: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
96a0: 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ield = 1;.      
96b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
96c0: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
96d0: 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  umns, pExpr->iTa
96e0: 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ble, 1);..      
96f0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
9700: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
9710: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
9720: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
9730: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
9740: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
9750: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
9760: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
9770: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
9780: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
9790: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
97a0: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
97b0: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
97c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
97d0: 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69  iParm = pExpr->i
97e0: 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29  Table +  (((int)
97f0: 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a  affinity)<<16);.
9800: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
9810: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
9820: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
9830: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
9840: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
9850: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ble );.        s
9860: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
9870: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
9880: 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50  ect, SRT_Set, iP
9890: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  arm, 0, 0, 0, 0)
98a0: 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
98b0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
98c0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
98d0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
98e0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
98f0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
9900: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
9910: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
9920: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9930: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
9940: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
9950: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
9960: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9970: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
9980: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
9990: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
99a0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
99b0: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  st).        **..
99c0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
99d0: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
99e0: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
99f0: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
9a00: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
9a10: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
9a20: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
9a30: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
9a40: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
9a50: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
9a60: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
9a70: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
9a80: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
9a90: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
9aa0: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
9ab0: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
9ac0: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
9ad0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
9ae0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
9af0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
9b00: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
9b10: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9b20: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9b30: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
9b40: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
9b50: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
9b60: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
9b70: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
9b80: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
9b90: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
9ba0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
9bb0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
9bc0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
9bd0: 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72  xpr *pE2 = pExpr
9be0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
9bf0: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
9c00: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
9c10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
9c20: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c  constant and val
9c30: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  id. */.         
9c40: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
9c50: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
9c60: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
9c70: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
9c80: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
9c90: 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e        "right-han
9ca0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65  d side of IN ope
9cb0: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f  rator must be co
9cc0: 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20  nstant");.      
9cd0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
9ce0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
9cf0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
9d00: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
9d10: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  s(pParse, 0, 0, 
9d20: 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  pE2, 0, 0) ){.  
9d30: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
9d40: 20 32 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   2;.          }.
9d50: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
9d60: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
9d70: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
9d80: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
9d90: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
9da0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9db0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
9dc0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9dd0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
9de0: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
9df0: 20 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31   0, &affinity, 1
9e00: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
9e10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9e20: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
9e30: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
9e40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9e50: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
9e60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
9e70: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9e80: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
9e90: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
9ea0: 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29  , addr, (void *)
9eb0: 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59  &keyInfo, P3_KEY
9ec0: 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 72 65 74  INFO);.      ret
9ed0: 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20  urn 1;.    }..  
9ee0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
9ef0: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
9f00: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
9f10: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
9f20: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
9f30: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
9f40: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
9f50: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
9f60: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
9f70: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
9f80: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
9f90: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
9fa0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
9fb0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
9fc0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n = pParse->nMem
9fd0: 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
9fe0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
9ff0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
a000: 53 52 54 5f 4d 65 6d 2c 70 45 78 70 72 2d 3e 69  SRT_Mem,pExpr->i
a010: 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30 2c 30 29 3b  Column,0,0,0,0);
a020: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b  .      return 1;
a030: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
a040: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
a050: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
a060: 20 65 76 61 6c 75 61 74 65 20 73 75 62 71 75 65   evaluate subque
a070: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
a080: 61 74 6f 72 73 20 63 6f 6e 74 61 69 6e 65 64 0a  ators contained.
a090: 2a 2a 20 69 6e 20 65 78 70 72 65 73 73 69 6f 6e  ** in expression
a0a0: 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73   pExpr..*/.int s
a0b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 53 75  qlite3ExprCodeSu
a0c0: 62 71 75 65 72 79 28 50 61 72 73 65 20 2a 70 50  bquery(Parse *pP
a0d0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
a0e0: 72 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 54 72  r){.  walkExprTr
a0f0: 65 65 28 70 45 78 70 72 2c 20 63 6f 64 65 53 75  ee(pExpr, codeSu
a100: 62 71 75 65 72 79 53 74 65 70 2c 20 70 50 61 72  bqueryStep, pPar
a110: 73 65 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  se);.  return 0;
a120: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a130: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
a140: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
a150: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
a160: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
a170: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
a180: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   stack..*/.stati
a190: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
a1a0: 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  er(Vdbe *v, cons
a1b0: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
a1c0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
a1d0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
a1e0: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
a1f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a200: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a210: 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  i, 0);.  }else i
a220: 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  f( sqlite3FitsIn
a230: 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20  64Bits(z) ){.   
a240: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a250: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
a260: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
a270: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
a280: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
a290: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
a2a0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
a2b0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
a2c0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
a2d0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
a2e0: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
a2f0: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
a300: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
a310: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
a320: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
a330: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
a340: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
a350: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
a360: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
a370: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
a380: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
a390: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
a3a0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
a3b0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
a3c0: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
a3d0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
a3e0: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
a3f0: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
a400: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
a410: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
a420: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
a430: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
a440: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
a450: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
a460: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
a470: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
a480: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
a490: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
a4a0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
a4b0: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
a4c0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
a4d0: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
a4e0: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( v==0 ) return;
a4f0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
a500: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  ){.    sqlite3Vd
a510: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
a520: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 20 20 2f  ring8, 0, 0);  /
a530: 2a 20 45 6d 70 74 79 20 65 78 70 72 65 73 73 69  * Empty expressi
a540: 6f 6e 20 65 76 61 6c 73 20 74 6f 20 4e 55 4c 4c  on evals to NULL
a550: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a   */.    return;.
a560: 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72    }.  op = pExpr
a570: 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20  ->op;.  switch( 
a580: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
a590: 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
a5a0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75 73    if( pParse->us
a5b0: 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  eAgg ){.        
a5c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a5d0: 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30  (v, OP_AggGet, 0
a5e0: 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a  , pExpr->iAgg);.
a5f0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
a600: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d  pExpr->iColumn>=
a610: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  0 ){.        sql
a620: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a630: 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70   OP_Column, pExp
a640: 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72  r->iTable, pExpr
a650: 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e  ->iColumn);.#ifn
a660: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20 20  def NDEBUG.     
a670: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73 70     if( pExpr->sp
a680: 61 6e 2e 7a 20 26 26 20 70 45 78 70 72 2d 3e 73  an.z && pExpr->s
a690: 70 61 6e 2e 6e 3e 30 20 26 26 20 70 45 78 70 72  pan.n>0 && pExpr
a6a0: 2d 3e 73 70 61 6e 2e 6e 3c 31 30 30 20 29 7b 0a  ->span.n<100 ){.
a6b0: 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43 6f            VdbeCo
a6c0: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 54 22  mment((v, "# %T"
a6d0: 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29 29  , &pExpr->span))
a6e0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e 64  ;.        }.#end
a6f0: 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  if.      }else{.
a700: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a710: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
a720: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
a730: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
a740: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a750: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a760: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
a770: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
a780: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
a790: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
a7a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a7b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a7c0: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
a7d0: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
a7e0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46 4c     assert( TK_FL
a7f0: 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a  OAT==OP_Real );.
a800: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
a810: 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69  _STRING==OP_Stri
a820: 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  ng8 );.      sql
a830: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
a840: 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e  p, 0, 0, pExpr->
a850: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
a860: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20  token.n);.      
a870: 73 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f  sqlite3VdbeDequo
a880: 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20  teP3(v, -1);.   
a890: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a8a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42      case TK_BLOB
a8b0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
a8c0: 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65  ( TK_BLOB==OP_He
a8d0: 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 73  xBlob );.      s
a8e0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
a8f0: 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72   op, 0, 0, pExpr
a900: 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45 78  ->token.z+1, pEx
a910: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b 0a  pr->token.n-1);.
a920: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a930: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
a940: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a950: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a960: 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
a970: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a980: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a990: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
a9a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a9b0: 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
a9c0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
a9d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56  dbeAddOp(v, OP_V
a9e0: 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e  ariable, pExpr->
a9f0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
aa00: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b    if( pExpr->tok
aa10: 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20  en.n>1 ){.      
aa20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
aa30: 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78  ngeP3(v, -1, pEx
aa40: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
aa50: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
aa60: 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
aa70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
aa80: 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b  e TK_REGISTER: {
aa90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
aaa0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
aab0: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54  mLoad, pExpr->iT
aac0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
aad0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
aae0: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
aaf0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
ab00: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
ab10: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
ab20: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
ab30: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
ab40: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
ab50: 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20  LT==OP_Lt );.   
ab60: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45     assert( TK_LE
ab70: 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20  ==OP_Le );.     
ab80: 20 61 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d   assert( TK_GT==
ab90: 4f 50 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Gt );.      a
aba0: 73 73 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50  ssert( TK_GE==OP
abb0: 5f 47 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Ge );.      ass
abc0: 65 72 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45  ert( TK_EQ==OP_E
abd0: 71 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  q );.      asser
abe0: 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20  t( TK_NE==OP_Ne 
abf0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ac00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ac10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ac20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ac30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ac40: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
ac50: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ac60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ac70: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
ac80: 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  ght, op, 0, 0);.
ac90: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
aca0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
acb0: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
acc0: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
acd0: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
ace0: 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65  K_STAR:.    case
acf0: 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63   TK_MINUS:.    c
ad00: 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20  ase TK_REM:.    
ad10: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a  case TK_BITAND:.
ad20: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
ad30: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  R:.    case TK_S
ad40: 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54  LASH:.    case T
ad50: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
ad60: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20  se TK_RSHIFT: . 
ad70: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
ad80: 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  T: {.      asser
ad90: 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e  t( TK_AND==OP_An
ada0: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
adb0: 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20  t( TK_OR==OP_Or 
adc0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
add0: 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64   TK_PLUS==OP_Add
ade0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
adf0: 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53  ( TK_MINUS==OP_S
ae00: 75 62 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20  ubtract );.     
ae10: 20 61 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d   assert( TK_REM=
ae20: 3d 4f 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b  =OP_Remainder );
ae30: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
ae40: 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74  K_BITAND==OP_Bit
ae50: 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73  And );.      ass
ae60: 65 72 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f  ert( TK_BITOR==O
ae70: 50 5f 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20  P_BitOr );.     
ae80: 20 61 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53   assert( TK_SLAS
ae90: 48 3d 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a  H==OP_Divide );.
aea0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
aeb0: 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66  _LSHIFT==OP_Shif
aec0: 74 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61  tLeft );.      a
aed0: 73 73 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54  ssert( TK_RSHIFT
aee0: 3d 3d 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20  ==OP_ShiftRight 
aef0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
af00: 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
af10: 6f 6e 63 61 74 20 29 3b 0a 20 20 20 20 20 20 73  oncat );.      s
af20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
af30: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
af40: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
af50: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
af60: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
af70: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
af80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
af90: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
afa0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
afb0: 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
afc0: 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c  {.      Expr *pL
afd0: 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  eft = pExpr->pLe
afe0: 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  ft;.      assert
aff0: 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20  ( pLeft );.     
b000: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
b010: 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66  TK_FLOAT || pLef
b020: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45  t->op==TK_INTEGE
b030: 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b  R ){.        Tok
b040: 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e  en *p = &pLeft->
b050: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63  token;.        c
b060: 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d  har *z = sqliteM
b070: 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b 20 32 20  alloc( p->n + 2 
b080: 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e  );.        sprin
b090: 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20 70  tf(z, "-%.*s", p
b0a0: 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20  ->n, p->z);.    
b0b0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
b0c0: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20  p==TK_FLOAT ){. 
b0d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
b0e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
b0f0: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e  al, 0, 0, z, p->
b100: 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  n+1);.        }e
b110: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63  lse{.          c
b120: 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c  odeInteger(v, z,
b130: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
b140: 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69    }.        sqli
b150: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20  teFree(z);.     
b160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
b170: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20  }.      /* Fall 
b180: 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f  through into TK_
b190: 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  NOT */.    }.   
b1a0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
b1b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
b1c0: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b1d0: 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
b1e0: 42 69 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  BitNot );.      
b1f0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d  assert( TK_NOT==
b200: 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20  OP_Not );.      
b210: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b220: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b230: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
b240: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b250: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
b260: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b270: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
b280: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
b290: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
b2a0: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
b2b0: 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
b2c0: 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a  L==OP_IsNull );.
b2d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b2e0: 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74  _NOTNULL==OP_Not
b2f0: 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71  Null );.      sq
b300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b310: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c  , OP_Integer, 1,
b320: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b330: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b340: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b350: 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73  ;.      dest = s
b360: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b370: 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20  tAddr(v) + 2;.  
b380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b390: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
b3a0: 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  est);.      sqli
b3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b3c0: 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30  OP_AddImm, -1, 0
b3d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b3e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b3f0: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
b400: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
b410: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
b420: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
b430: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62 72  >iAgg);.      br
b440: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b450: 61 73 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20  ase TK_CDATE:.  
b460: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 3a    case TK_CTIME:
b470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49  .    case TK_CTI
b480: 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63 61 73  MESTAMP:.    cas
b490: 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63  e TK_GLOB:.    c
b4a0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20  ase TK_LIKE:.   
b4b0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
b4c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c  N: {.      ExprL
b4d0: 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78  ist *pList = pEx
b4e0: 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20  pr->pList;.     
b4f0: 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69   int nExpr = pLi
b500: 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70  st ? pList->nExp
b510: 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e  r : 0;.      Fun
b520: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
b530: 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20    int nId;.     
b540: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64   const char *zId
b550: 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d  ;.      int p2 =
b560: 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   0;.      int i;
b570: 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20  .      u8 enc = 
b580: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
b590: 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a  .      CollSeq *
b5a0: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20  pColl = 0;.     
b5b0: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
b5c0: 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e  (pExpr, &zId, &n
b5d0: 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
b5e0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
b5f0: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
b600: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70  , zId, nId, nExp
b610: 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  r, enc, 0);.    
b620: 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21 3d    assert( pDef!=
b630: 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72  0 );.      nExpr
b640: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
b650: 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73  deExprList(pPars
b660: 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  e, pList);.     
b670: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
b680: 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b  r && i<32; i++){
b690: 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c  .        if( sql
b6a0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
b6b0: 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  nt(pList->a[i].p
b6c0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
b6d0: 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b     p2 |= (1<<i);
b6e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
b6f0: 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65     if( pDef->nee
b700: 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f  dCollSeq && !pCo
b710: 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
b720: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
b730: 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
b740: 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  e, pList->a[i].p
b750: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
b760: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
b770: 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c  f( pDef->needCol
b780: 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20  lSeq ){.        
b790: 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f  if( !pColl ) pCo
b7a0: 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  ll = pParse->db-
b7b0: 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20  >pDfltColl; .   
b7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b7d0: 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65  Op3(v, OP_CollSe
b7e0: 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a  q, 0, 0, (char *
b7f0: 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53  )pColl, P3_COLLS
b800: 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  EQ);.      }.   
b810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
b820: 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e  3(v, OP_Function
b830: 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68  , nExpr, p2, (ch
b840: 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e  ar*)pDef, P3_FUN
b850: 43 44 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65  CDEF);.      bre
b860: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b870: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
b880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d  eAddOp(v, OP_Mem
b8a0: 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f  Load, pExpr->iCo
b8b0: 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20  lumn, 0);.      
b8c0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
b8d0: 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72 79  "# load subquery
b8e0: 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
b8f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b900: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
b910: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
b920: 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66 69  .      char affi
b930: 6e 69 74 79 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  nity;..      /* 
b940: 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61  Figure out the a
b950: 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74  ffinity to use t
b960: 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66  o create a key f
b970: 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a  rom the results.
b980: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
b990: 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69  expression. affi
b9a0: 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61  nityStr stores a
b9b0: 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73   static string s
b9c0: 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20  uitable for.    
b9d0: 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61    ** P3 of OP_Ma
b9e0: 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20 20  keRecord..      
b9f0: 2a 2f 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  */.      affinit
ba00: 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66  y = comparisonAf
ba10: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 0a  finity(pExpr);..
ba20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ba30: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ba40: 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20  eger, 1, 0);..  
ba50: 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20      /* Code the 
ba60: 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78  <expr> from "<ex
ba70: 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54  pr> IN (...)". T
ba80: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
ba90: 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70  le.      ** pExp
baa0: 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69  r->iTable contai
bab0: 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74 68  ns the values th
bac0: 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28  at make up the (
bad0: 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20  ...) set..      
bae0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
baf0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bb00: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
bb10: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
bb20: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
bb30: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
bb40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bb50: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
bb60: 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20  , addr+4);      
bb70: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
bb80: 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  0 */.      sqlit
bb90: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bba0: 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20  P_Pop, 2, 0);.  
bbb0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbc0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
bbd0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
bbe0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bbf0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
bc00: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
bc10: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
bc20: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
bc30: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
bc40: 2c 20 31 29 3b 20 20 20 2f 2a 20 61 64 64 72 20  , 1);   /* addr 
bc50: 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 4 */.      sql
bc60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bc70: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
bc80: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37  ->iTable, addr+7
bc90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bca0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bcb0: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20  AddImm, -1, 0); 
bcc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
bcd0: 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a   /* addr + 6 */.
bce0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bcf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bd00: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
bd10: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
bd20: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
bd30: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
bd40: 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
bd50: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
bd60: 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  a;.      Expr *p
bd70: 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e  Right = pLItem->
bd80: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
bd90: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
bda0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
bdb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bdc0: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
bdd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
bde0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
bdf0: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
be00: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
be10: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
be20: 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20  ight, OP_Ge, 0, 
be30: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
be40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
be50: 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20  _Pull, 1, 0);.  
be60: 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20      pLItem++;.  
be70: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49      pRight = pLI
be80: 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20  tem->pExpr;.    
be90: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
bea0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
beb0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
bec0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
bed0: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
bee0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
bef0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bf00: 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30  (v, OP_And, 0, 0
bf10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bf20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
bf30: 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
bf40: 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
bf50: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
bf60: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bf70: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
bf80: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
bf90: 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
bfa0: 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e       int expr_en
bfb0: 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69  d_label;.      i
bfc0: 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20  nt jumpInst;.   
bfd0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
bfe0: 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20     int nExpr;.  
bff0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
c000: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
c010: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
c020: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61  ExprList_item *a
c030: 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20  Listelem;..     
c040: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
c050: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73  List);.      ass
c060: 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73  ert((pExpr->pLis
c070: 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
c080: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
c090: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  t(pExpr->pList->
c0a0: 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
c0b0: 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72    pEList = pExpr
c0c0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61  ->pList;.      a
c0d0: 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73  Listelem = pELis
c0e0: 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70  t->a;.      nExp
c0f0: 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70  r = pEList->nExp
c100: 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e  r;.      expr_en
c110: 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  d_label = sqlite
c120: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
c130: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
c140: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
c150: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c160: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c170: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c180: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
c190: 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b  0; i<nExpr; i=i+
c1a0: 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
c1b0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c1c0: 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d  se, aListelem[i]
c1d0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
c1e0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
c1f0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  t ){.          s
c200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c210: 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29  v, OP_Dup, 1, 1)
c220: 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70  ;.          jump
c230: 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61  Inst = codeCompa
c240: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
c250: 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c  ->pLeft, aListel
c260: 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20  em[i].pExpr,.   
c270: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
c290: 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20  _Ne, 0, 1);.    
c2a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c2b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
c2c0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 1, 0);.       
c2d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
c2e0: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c    jumpInst = sql
c2f0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c300: 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29   OP_IfNot, 1, 0)
c310: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
c320: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c330: 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73  ode(pParse, aLis
c340: 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72  telem[i+1].pExpr
c350: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
c360: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c370: 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f  P_Goto, 0, expr_
c380: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
c390: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
c3a0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
c3b0: 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71  r(v);.        sq
c3c0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
c3d0: 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61  2(v, jumpInst, a
c3e0: 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ddr);.      }.  
c3f0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c400: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
c410: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c420: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30  (v, OP_Pop, 1, 0
c430: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c440: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67   if( pExpr->pRig
c450: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ht ){.        sq
c460: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c470: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
c480: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  ght);.      }els
c490: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
c4a0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c4b0: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
c4c0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
c4d0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
c4e0: 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f  veLabel(v, expr_
c4f0: 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20  end_label);.    
c500: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c510: 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45     case TK_RAISE
c520: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70  : {.      if( !p
c530: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
c540: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
c550: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
c560: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
c570: 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53             "RAIS
c580: 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20  E() may only be 
c590: 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72  used within a tr
c5a0: 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b  igger-program");
c5b0: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
c5c0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
c5d0: 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49  r->iColumn!=OE_I
c5e0: 67 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20  gnore ){.       
c5f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
c600: 3e 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c  >iColumn==OE_Rol
c610: 6c 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20  lback ||.       
c620: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
c630: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41  >iColumn == OE_A
c640: 62 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20  bort ||.        
c650: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
c660: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61  iColumn == OE_Fa
c670: 69 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73  il );.         s
c680: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
c690: 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45   OP_Halt, SQLITE
c6a0: 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78  _CONSTRAINT, pEx
c6b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20  pr->iColumn,.   
c6c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c6d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
c6e0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
c6f0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73  n.n);.         s
c700: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
c710: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
c720: 20 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20    } else {.     
c730: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
c740: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
c750: 5f 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20  _Ignore );.     
c760: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c770: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65  ddOp(v, OP_Conte
c780: 78 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  xtPop, 0, 0);.  
c790: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
c7a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
c7b0: 74 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74  to, 0, pParse->t
c7c0: 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65  rigStack->ignore
c7d0: 4a 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20  Jump);.         
c7e0: 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20  VdbeComment((v, 
c7f0: 22 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29  "# raise(IGNORE)
c800: 22 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  "));.      }.   
c810: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
c820: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
c830: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 65 76  ate code that ev
c840: 61 6c 75 74 65 73 20 74 68 65 20 67 69 76 65 6e  alutes the given
c850: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
c860: 6c 65 61 76 65 73 20 74 68 65 20 72 65 73 75 6c  leaves the resul
c870: 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74 61 63  t.** on the stac
c880: 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73 71 6c  k.  See also sql
c890: 69 74 65 33 45 78 70 72 43 6f 64 65 28 29 2e 0a  ite3ExprCode()..
c8a0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
c8b0: 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20 63 61  ne might also ca
c8c0: 63 68 65 20 74 68 65 20 72 65 73 75 6c 74 20 61  che the result a
c8d0: 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20 70 45  nd modify the pE
c8e0: 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f 20 74  xpr tree.** so t
c8f0: 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61 6b 65  hat it will make
c900: 20 75 73 65 20 6f 66 20 74 68 65 20 63 61 63 68   use of the cach
c910: 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73 75 62  ed result on sub
c920: 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61 74 69  sequent evaluati
c930: 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20 74 68  ons.** rather th
c940: 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  an evaluate the 
c950: 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e  whole expression
c960: 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69 61 6c   again.  Trivial
c970: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
c980: 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64 2e 20  .** not cached. 
c990: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
c9a0: 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20 69 74  on is cached, it
c9b0: 73 20 72 65 73 75 6c 74 20 69 73 20 73 74 6f 72  s result is stor
c9c0: 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65 6d 6f  ed in a .** memo
c9d0: 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a 2f 0a  ry location..*/.
c9e0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
c9f0: 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61 72  CodeAndCache(Par
ca00: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
ca10: 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65   *pExpr){.  Vdbe
ca20: 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
ca30: 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b  dbe;.  int iMem;
ca40: 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20 61 64  .  int addr1, ad
ca50: 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  dr2;.  if( v==0 
ca60: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64 64 72  ) return;.  addr
ca70: 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  1 = sqlite3VdbeC
ca80: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ca90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
caa0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
cab0: 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c 69 74  .  addr2 = sqlit
cac0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
cad0: 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64 64 72  r(v);.  if( addr
cae0: 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73 71 6c  2>addr1+1 || sql
caf0: 69 74 65 33 56 64 62 65 47 65 74 4f 70 28 76 2c  ite3VdbeGetOp(v,
cb00: 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64 65 3d   addr1)->opcode=
cb10: 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29 7b 0a  =OP_Function ){.
cb20: 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78 70 72      iMem = pExpr
cb30: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73  ->iTable = pPars
cb40: 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73  e->nMem++;.    s
cb50: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
cb60: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
cb70: 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20 70 45  iMem, 0);.    pE
cb80: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52 45 47  xpr->op = TK_REG
cb90: 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  ISTER;.  }.}../*
cba0: 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64  .** Generate cod
cbb0: 65 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68  e that pushes th
cbc0: 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79  e value of every
cbd0: 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20   element of the 
cbe0: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
cbf0: 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68  ion list onto th
cc00: 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52  e stack..**.** R
cc10: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
cc20: 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73   of elements pus
cc30: 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  hed onto the sta
cc40: 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ck..*/.int sqlit
cc50: 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69  e3ExprCodeExprLi
cc60: 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  st(.  Parse *pPa
cc70: 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73  rse,     /* Pars
cc80: 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20  ing context */. 
cc90: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
cca0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
ccb0: 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65  ssion list to be
ccc0: 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73   coded */.){.  s
ccd0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
cce0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e  tem *pItem;.  in
ccf0: 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a  t i, n;.  Vdbe *
cd00: 76 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  v;.  if( pList==
cd10: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cd20: 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64  v = sqlite3GetVd
cd30: 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 6e 20  be(pParse);.  n 
cd40: 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  = pList->nExpr;.
cd50: 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73    for(pItem=pLis
cd60: 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20  t->a, i=0; i<n; 
cd70: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
cd80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
cd90: 64 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d  de(pParse, pItem
cda0: 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20  ->pExpr);.  }.  
cdb0: 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a  return n;.}../*.
cdc0: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
cdd0: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
cde0: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
cdf0: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
ce00: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
ce10: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
ce20: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
ce30: 72 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f  rue but executio
ce40: 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73  n.** continues s
ce50: 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20  traight thru if 
ce60: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
ce70: 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49  s false..**.** I
ce80: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
ce90: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
cea0: 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
ceb0: 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65   nor false), the
cec0: 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75  n.** take the ju
ced0: 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66  mp if the jumpIf
cee0: 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75  Null flag is tru
cef0: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f  e..**.** This co
cf00: 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68  de depends on th
cf10: 65 20 66 61 63 74 20 74 68 61 74 20 63 65 72 74  e fact that cert
cf20: 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73  ain token values
cf30: 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20   (ex: TK_EQ).** 
cf40: 61 72 65 20 74 68 65 20 73 61 6d 65 20 61 73 20  are the same as 
cf50: 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65  opcode values (e
cf60: 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69  x: OP_Eq) that i
cf70: 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72  mplement the cor
cf80: 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70  responding.** op
cf90: 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61  eration.  Specia
cfa0: 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64  l comments in vd
cfb0: 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f  be.c and the mko
cfc0: 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70  pcodeh.awk scrip
cfd0: 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65  t in.** the make
cfe0: 20 70 72 6f 63 65 73 73 20 63 61 75 73 65 20 74   process cause t
cff0: 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61  hese values to a
d000: 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73  lign.  Assert()s
d010: 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20   in the code.** 
d020: 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61  below verify tha
d030: 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72  t the numbers ar
d040: 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63  e aligned correc
d050: 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  tly..*/.void sql
d060: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
d070: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
d080: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
d090: 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
d0a0: 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
d0b0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
d0c0: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
d0d0: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
d0e0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
d0f0: 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70    op = pExpr->op
d100: 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20 29  ;.  switch( op )
d110: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
d120: 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  D: {.      int d
d130: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
d140: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
d150: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
d160: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
d170: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
d180: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
d190: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
d1a0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
d1b0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
d1c0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
d1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
d1e0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
d1f0: 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
d200: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d210: 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20  e TK_OR: {.     
d220: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
d230: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
d240: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
d250: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
d260: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
d270: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
d280: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
d290: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
d2a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
d2b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
d2c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d2d0: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
d2e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d2f0: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
d300: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
d310: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
d320: 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73  e TK_LT:.    cas
d330: 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73  e TK_LE:.    cas
d340: 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73  e TK_GT:.    cas
d350: 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73  e TK_GE:.    cas
d360: 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73  e TK_NE:.    cas
d370: 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20  e TK_EQ: {.     
d380: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d   assert( TK_LT==
d390: 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20 20 61  OP_Lt );.      a
d3a0: 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50  ssert( TK_LE==OP
d3b0: 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Le );.      ass
d3c0: 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47  ert( TK_GT==OP_G
d3d0: 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
d3e0: 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20  t( TK_GE==OP_Ge 
d3f0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
d400: 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b   TK_EQ==OP_Eq );
d410: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
d420: 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20  K_NE==OP_Ne );. 
d430: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
d440: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
d450: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
d460: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d470: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
d480: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
d490: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
d4a0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d4b0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
d4c0: 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49   op, dest, jumpI
d4d0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
d4e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d4f0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
d500: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
d510: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  LL: {.      asse
d520: 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
d530: 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  P_IsNull );.    
d540: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54    assert( TK_NOT
d550: 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c  NULL==OP_NotNull
d560: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
d570: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d580: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
d590: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
d5a0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
d5b0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
d5c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d5d0: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
d5e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
d5f0: 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45  expression "x BE
d600: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69  TWEEN y AND z" i
d610: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
d620: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
d630: 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29   ** 1 IF (x < y)
d640: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
d650: 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47   2 IF (x <= z) G
d660: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
d670: 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20   ** 3 ....      
d680: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
d690: 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
d6a0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d6b0: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
d6c0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
d6d0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
d6e0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
d6f0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d700: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
d710: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d720: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
d730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d740: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d750: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
d760: 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61  addr = codeCompa
d770: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
d780: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c  , pRight, OP_Lt,
d790: 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29   0, !jumpIfNull)
d7a0: 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  ;..      pRight 
d7b0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
d7c0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
d7d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
d7e0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
d7f0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
d800: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
d810: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
d820: 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  e, dest, jumpIfN
d830: 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      sql
d840: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
d850: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
d860: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
d870: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
d880: 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64   addr, sqlite3Vd
d890: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d8a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d8b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
d8c0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
d8d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d8e0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
d8f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
d900: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
d910: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
d920: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d930: 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _If, jumpIfNull,
d940: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
d950: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
d960: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
d970: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
d980: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
d990: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
d9a0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
d9b0: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
d9c0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d9d0: 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
d9e0: 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
d9f0: 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
da00: 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
da10: 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
da20: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
da30: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
da40: 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
da50: 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
da60: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
da70: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74   jumpIfNull is t
da80: 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  rue or fall thro
da90: 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
daa0: 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76  l is false..*/.v
dab0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
dac0: 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
dad0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
dae0: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
daf0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
db00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
db10: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
db20: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
db30: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
db40: 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68  return;..  /* Th
db50: 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70 72  e value of pExpr
db60: 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65 20  ->op and op are 
db70: 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f  related as follo
db80: 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ws:.  **.  **   
db90: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20      pExpr->op   
dba0: 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a           op.  **
dbb0: 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
dbc0: 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d            ------
dbd0: 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20  ----.  **       
dbe0: 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20 20  TK_ISNULL       
dbf0: 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20     OP_NotNull.  
dc00: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e  **       TK_NOTN
dc10: 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f 49  ULL         OP_I
dc20: 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20  sNull.  **      
dc30: 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20 20   TK_NE          
dc40: 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20      OP_Eq.  **  
dc50: 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20 20       TK_EQ      
dc60: 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20          OP_Ne.  
dc70: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20 20  **       TK_GT  
dc80: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4c              OP_L
dc90: 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  e.  **       TK_
dca0: 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20 20  LE              
dcb0: 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20 20  OP_Gt.  **      
dcc0: 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20 20   TK_GE          
dcd0: 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20      OP_Lt.  **  
dce0: 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20 20       TK_LT      
dcf0: 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20 20          OP_Ge.  
dd00: 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65  **.  ** For othe
dd10: 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78 70  r values of pExp
dd20: 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64  r->op, op is und
dd30: 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73 65  efined and unuse
dd40: 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c 75  d..  ** The valu
dd50: 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f  e of TK_ and OP_
dd60: 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20 61   constants are a
dd70: 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68 61  rranged such tha
dd80: 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f  t we.  ** can co
dd90: 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69 6e  mpute the mappin
dda0: 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74 68  g above using th
ddb0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72  e following expr
ddc0: 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73  ession..  ** Ass
ddd0: 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74 68  ert()s verify th
dde0: 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74 69  at the computati
ddf0: 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a 20  on is correct.. 
de00: 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45 78   */.  op = ((pEx
de10: 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c  pr->op+(TK_ISNUL
de20: 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e  L&1))^1)-(TK_ISN
de30: 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65  ULL&1);..  /* Ve
de40: 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c 69  rify correct ali
de50: 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e  gnment of TK_ an
de60: 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a  d OP_ constants.
de70: 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 70    */.  assert( p
de80: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e  Expr->op!=TK_ISN
de90: 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f  ULL || op==OP_No
dea0: 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72  tNull );.  asser
deb0: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
dec0: 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d  _NOTNULL || op==
ded0: 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61  OP_IsNull );.  a
dee0: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
def0: 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_NE || op==O
df00: 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72 74  P_Eq );.  assert
df10: 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f  ( pExpr->op!=TK_
df20: 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20  EQ || op==OP_Ne 
df30: 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78  );.  assert( pEx
df40: 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c  pr->op!=TK_LT ||
df50: 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20   op==OP_Ge );.  
df60: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
df70: 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_LE || op==
df80: 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65 72  OP_Gt );.  asser
df90: 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
dfa0: 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65  _GT || op==OP_Le
dfb0: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
dfc0: 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c  xpr->op!=TK_GE |
dfd0: 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a  | op==OP_Lt );..
dfe0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
dff0: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
e000: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
e010: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
e020: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
e030: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
e040: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
e050: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
e060: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
e070: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
e080: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e090: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
e0a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
e0b0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
e0c0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
e0d0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
e0e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
e0f0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
e100: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
e110: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
e120: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
e130: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
e140: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
e150: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
e160: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
e170: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
e180: 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
e190: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e1a0: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
e1b0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
e1c0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
e1d0: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
e1e0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
e1f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
e200: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
e210: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
e220: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
e230: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
e240: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
e250: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
e260: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e270: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e280: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
e290: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e2a0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
e2b0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
e2c0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
e2d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e2e0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
e2f0: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
e300: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
e310: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
e320: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
e330: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
e340: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
e350: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
e360: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
e370: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
e380: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
e390: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
e3a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
e3b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
e3c0: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
e3d0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
e3e0: 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41  s "x BETWEEN y A
e3f0: 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70  ND z". It is imp
e400: 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20  lemented as:.   
e410: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31     **.      ** 1
e420: 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54   IF (x >= y) GOT
e430: 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47  O 3.      ** 2 G
e440: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
e450: 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29   ** 3 IF (x > z)
e460: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
e470: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
e480: 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
e490: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
e4a0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
e4b0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
e4c0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
e4d0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
e4e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e4f0: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
e500: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e510: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
e520: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e530: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e540: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
e550: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
e560: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
e570: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  (v);.      codeC
e580: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e590: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
e5a0: 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75  _Ge, addr+3, !ju
e5b0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
e5c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e5d0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
e5e0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e5f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e600: 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
e610: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
e620: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
e630: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
e640: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
e650: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
e660: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
e670: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
e680: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74  t, pRight, OP_Gt
e690: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e6a0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
e6b0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
e6c0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
e6d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e6e0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
e6f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
e700: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
e710: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
e720: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
e730: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
e740: 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
e750: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
e760: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
e770: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
e780: 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
e790: 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
e7a0: 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
e7b0: 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
e7c0: 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
e7d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
e7e0: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
e7f0: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
e800: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
e810: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
e820: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
e830: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
e840: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
e850: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
e860: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
e870: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
e880: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
e890: 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
e8a0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
e8b0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
e8c0: 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
e8d0: 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
e8e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
e8f0: 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pA->pList ){.   
e900: 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d   if( pB->pList==
e910: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
e920: 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d    if( pA->pList-
e930: 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73  >nExpr!=pB->pLis
e940: 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  t->nExpr ) retur
e950: 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  n 0;.    for(i=0
e960: 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  ; i<pA->pList->n
e970: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
e980: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
e990: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
e9a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
e9b0: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
e9c0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
e9d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
e9e0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
e9f0: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
ea00: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ea10: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
ea20: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
ea30: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
ea40: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  0;.  if( pA->iTa
ea50: 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
ea60: 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
ea70: 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
ea80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
ea90: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
eaa0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
eab0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
eac0: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
ead0: 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
eae0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
eaf0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
eb00: 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  ICmp(pA->token.z
eb10: 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pB->token.z, p
eb20: 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29  B->token.n)!=0 )
eb30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
eb40: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
eb50: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
eb60: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61  ement to the pPa
eb70: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
eb80: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  y and return its
eb90: 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65 20 6e   index..** The n
eba0: 65 77 20 65 6c 65 6d 65 6e 74 20 69 73 20 69 6e  ew element is in
ebb0: 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a 65 72  itialized to zer
ebc0: 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  o.  The calling 
ebd0: 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a 20 65  function is.** e
ebe0: 78 70 65 63 74 65 64 20 74 6f 20 66 69 6c 6c 20  xpected to fill 
ebf0: 69 74 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63  it in..*/.static
ec00: 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e   int appendAggIn
ec10: 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  fo(Parse *pParse
ec20: 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73 65  ){.  if( (pParse
ec30: 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30  ->nAgg & 0x7)==0
ec40: 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20   ){.    int amt 
ec50: 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b  = pParse->nAgg +
ec60: 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20   8;.    AggExpr 
ec70: 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65  *aAgg = sqliteRe
ec80: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41  alloc(pParse->aA
ec90: 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70  gg, amt*sizeof(p
eca0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
ecb0: 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d  ;.    if( aAgg==
ecc0: 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  0 ){.      retur
ecd0: 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  n -1;.    }.    
ece0: 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61  pParse->aAgg = a
ecf0: 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65  Agg;.  }.  memse
ed00: 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  t(&pParse->aAgg[
ed10: 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30  pParse->nAgg], 0
ed20: 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d  , sizeof(pParse-
ed30: 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65  >aAgg[0]));.  re
ed40: 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67  turn pParse->nAg
ed50: 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68  g++;.}../*.** Th
ed60: 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63 20 66  is is an xFunc f
ed70: 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  or walkExprTree(
ed80: 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d  ) used to implem
ed90: 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65 33 45  ent .** sqlite3E
eda0: 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67  xprAnalyzeAggreg
edb0: 61 74 65 73 28 29 2e 20 20 53 65 65 20 73 71 6c  ates().  See sql
edc0: 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
edd0: 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66 6f 72  ggregates.** for
ede0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
edf0: 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 54  rmation..**.** T
ee00: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e 61 6c  his routine anal
ee10: 79 7a 65 73 20 74 68 65 20 61 67 67 72 65 67 61  yzes the aggrega
ee20: 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 70  te function at p
ee30: 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  Expr..*/.static 
ee40: 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67 72 65  int analyzeAggre
ee50: 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72 67 2c  gate(void *pArg,
ee60: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
ee70: 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70   int i;.  AggExp
ee80: 72 20 2a 61 41 67 67 3b 0a 20 20 50 61 72 73 65  r *aAgg;.  Parse
ee90: 20 2a 70 50 61 72 73 65 20 3d 20 28 50 61 72 73   *pParse = (Pars
eea0: 65 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77 69 74  e*)pArg;..  swit
eeb0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
eec0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
eed0: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  UMN: {.      aAg
eee0: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
eef0: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
ef00: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
ef10: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
ef20: 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  f( aAgg[i].isAgg
ef30: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
ef40: 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
ef50: 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
ef60: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
ef70: 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69         && aAgg[i
ef80: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
ef90: 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
efa0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
efb0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
efc0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
efd0: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67   i>=pParse->nAgg
efe0: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
eff0: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
f000: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
f010: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
f020: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
f030: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
f040: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
f050: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
f060: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
f070: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
f080: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
f090: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
f0a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  }.    case TK_AG
f0b0: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
f0c0: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
f0d0: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66  e->aAgg;.      f
f0e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65  or(i=0; i<pParse
f0f0: 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20  ->nAgg; i++){.  
f100: 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67 5b        if( !aAgg[
f110: 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69  i].isAgg ) conti
f120: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
f130: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
f140: 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70  are(aAgg[i].pExp
f150: 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20  r, pExpr) ){.   
f160: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f170: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f180: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
f190: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
f1a0: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
f1b0: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
f1c0: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
f1d0: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
f1e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
f1f0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
f200: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
f210: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b  gg[i].isAgg = 1;
f220: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
f230: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
f240: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
f250: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
f260: 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
f270: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
f280: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
f290: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
f2a0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
f2b0: 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
f2c0: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f    pExpr->pList ?
f2d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
f2e0: 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30  Expr : 0, enc, 0
f2f0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
f300: 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69   pExpr->iAgg = i
f310: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
f320: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
f330: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
f340: 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76   Analyze the giv
f350: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f  en expression lo
f360: 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67  oking for aggreg
f370: 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e  ate functions an
f380: 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c  d.** for variabl
f390: 65 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20  es that need to 
f3a0: 62 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20  be added to the 
f3b0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61  pParse->aAgg[] a
f3c0: 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64  rray..** Make ad
f3d0: 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73  ditional entries
f3e0: 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e   to the pParse->
f3f0: 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20  aAgg[] array as 
f400: 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a  necessary..**.**
f410: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68   This routine sh
f420: 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c  ould only be cal
f430: 6c 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78  led after the ex
f440: 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65  pression has bee
f450: 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79  n.** analyzed by
f460: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
f470: 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a 0a 2a  lveNames()..**.*
f480: 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
f490: 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
f4a0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
f4b0: 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
f4c0: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
f4d0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
f4e0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
f4f0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
f500: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
f510: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
f520: 6e 74 20 6e 45 72 72 20 3d 20 70 50 61 72 73 65  nt nErr = pParse
f530: 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45 78  ->nErr;.  walkEx
f540: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61 6e  prTree(pExpr, an
f550: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c 20  alyzeAggregate, 
f560: 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74 75 72  pParse);.  retur
f570: 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 20 2d  n pParse->nErr -
f580: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
f590: 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66 75  Locate a user fu
f5a0: 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e  nction given a n
f5b0: 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f 66  ame, a number of
f5c0: 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 61   arguments and a
f5d0: 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61 74   flag.** indicat
f5e0: 69 6e 67 20 77 68 65 74 68 65 72 20 74 68 65 20  ing whether the 
f5f0: 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65 72 73  function prefers
f600: 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55 54 46   UTF-16 over UTF
f610: 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a  -8.  Return a.**
f620: 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20   pointer to the 
f630: 46 75 6e 63 44 65 66 20 73 74 72 75 63 74 75 72  FuncDef structur
f640: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 74  e that defines t
f650: 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72  hat function, or
f660: 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20   return.** NULL 
f670: 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20  if the function 
f680: 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a  does not exist..
f690: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65  **.** If the cre
f6a0: 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74  ateFlag argument
f6b0: 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61   is true, then a
f6c0: 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e   new (blank) Fun
f6d0: 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72  cDef.** structur
f6e0: 65 20 69 73 20 63 72 65 61 74 65 64 20 61 6e 64  e is created and
f6f0: 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20   liked into the 
f700: 22 64 62 22 20 73 74 72 75 63 74 75 72 65 20 69  "db" structure i
f710: 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69  f a.** no matchi
f720: 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76  ng function prev
f730: 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20  iously existed. 
f740: 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67   When createFlag
f750: 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20   is true.** and 
f760: 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74  the nArg paramet
f770: 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f  er is -1, then o
f780: 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74  nly a function t
f790: 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61  hat accepts.** a
f7a0: 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ny number of arg
f7b0: 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72  uments will be r
f7c0: 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49  eturned..**.** I
f7d0: 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20  f createFlag is 
f7e0: 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69  false and nArg i
f7f0: 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66  s -1, then the f
f800: 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75  irst valid.** fu
f810: 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20  nction found is 
f820: 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e  returned.  A fun
f830: 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69  ction is valid i
f840: 66 20 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a  f either xFunc.*
f850: 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f  * or xStep is no
f860: 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66  n-zero..**.** If
f870: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66   createFlag is f
f880: 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66 75 6e  alse, then a fun
f890: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72  ction with the r
f8a0: 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61 6e 64  equired name and
f8b0: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
f8c0: 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 72  guments may be r
f8d0: 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69 66 20  eturned even if 
f8e0: 74 68 65 20 65 54 65 78 74 52 65 70 20 66 6c 61  the eTextRep fla
f8f0: 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 61  g does not.** ma
f900: 74 63 68 20 74 68 61 74 20 72 65 71 75 65 73 74  tch that request
f910: 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a  ed..*/.FuncDef *
f920: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
f930: 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33 20 2a  ion(.  sqlite3 *
f940: 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41 6e 20  db,       /* An 
f950: 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f  open database */
f960: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
f970: 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  Name, /* Name of
f980: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20   the function.  
f990: 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61  Not null-termina
f9a0: 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61  ted */.  int nNa
f9b0: 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e  me,         /* N
f9c0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
f9d0: 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20  ers in the name 
f9e0: 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20  */.  int nArg,  
f9f0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
fa00: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
fa10: 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75   -1 means any nu
fa20: 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e 63  mber */.  u8 enc
fa30: 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ,            /* 
fa40: 50 72 65 66 65 72 72 65 64 20 74 65 78 74 20 65  Preferred text e
fa50: 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74  ncoding */.  int
fa60: 20 63 72 65 61 74 65 46 6c 61 67 20 20 20 20 20   createFlag     
fa70: 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e  /* Create new en
fa80: 74 72 79 20 69 66 20 74 72 75 65 20 61 6e 64 20  try if true and 
fa90: 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69  does not otherwi
faa0: 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20  se exist */.){. 
fab0: 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20 20 20   FuncDef *p;    
fac0: 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72       /* Iterator
fad0: 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46   variable */.  F
fae0: 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74 3b 20  uncDef *pFirst; 
faf0: 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75 6e 63     /* First func
fb00: 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73 20 6e  tion with this n
fb10: 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ame */.  FuncDef
fb20: 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a 20   *pBest = 0; /* 
fb30: 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75 6e 64  Best match found
fb40: 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74   so far */.  int
fb50: 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30 3b 20   bestmatch = 0; 
fb60: 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e   ...  assert( en
fb70: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c  c==SQLITE_UTF8 |
fb80: 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  | enc==SQLITE_UT
fb90: 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51  F16LE || enc==SQ
fba0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a  LITE_UTF16BE );.
fbb0: 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29 20    if( nArg<-1 ) 
fbc0: 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46  nArg = -1;..  pF
fbd0: 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66 2a  irst = (FuncDef*
fbe0: 29 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64  )sqlite3HashFind
fbf0: 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61  (&db->aFunc, zNa
fc00: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f  me, nName);.  fo
fc10: 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20 70  r(p=pFirst; p; p
fc20: 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20  =p->pNext){.    
fc30: 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20 73 65  /* During the se
fc40: 61 72 63 68 20 66 6f 72 20 74 68 65 20 62 65 73  arch for the bes
fc50: 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e  t function defin
fc60: 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63 68  ition, bestmatch
fc70: 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a 20 61   is set.    ** a
fc80: 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e 64  s follows to ind
fc90: 69 63 61 74 65 20 74 68 65 20 71 75 61 6c 69 74  icate the qualit
fca0: 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68 20 77  y of the match w
fcb0: 69 74 68 20 74 68 65 20 64 65 66 69 6e 69 74 69  ith the definiti
fcc0: 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65  on.    ** pointe
fcd0: 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a 0a 20  d to by pBest:. 
fce0: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a 20     **.    ** 0: 
fcf0: 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20 4e  pBest is NULL. N
fd00: 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65 65 6e  o match has been
fd10: 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20 31   found..    ** 1
fd20: 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67  : A variable arg
fd30: 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20  uments function 
fd40: 74 68 61 74 20 70 72 65 66 65 72 73 20 55 54 46  that prefers UTF
fd50: 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36  -8 when a UTF-16
fd60: 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f 64  .    **    encod
fd70: 69 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64  ing is requested
fd80: 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e  , or vice versa.
fd90: 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76 61 72  .    ** 2: A var
fda0: 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
fdb0: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73  function that us
fdc0: 65 73 20 55 54 46 2d 31 36 42 45 20 77 68 65 6e  es UTF-16BE when
fdd0: 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20 20 20   UTF-16LE is.   
fde0: 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74 65 64   **    requested
fdf0: 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e  , or vice versa.
fe00: 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76 61 72  .    ** 3: A var
fe10: 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
fe20: 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74  function using t
fe30: 68 65 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63  he same text enc
fe40: 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34 3a  oding..    ** 4:
fe50: 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   A function with
fe60: 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65   the exact numbe
fe70: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72  r of arguments r
fe80: 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20 20  equested that.  
fe90: 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20    **    prefers 
fea0: 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46  UTF-8 when a UTF
feb0: 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69 73 20  -16 encoding is 
fec0: 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
fed0: 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
fee0: 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77   5: A function w
fef0: 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75  ith the exact nu
ff00: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
ff10: 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74  s requested that
ff20: 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65  .    **    prefe
ff30: 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68 65 6e  rs UTF-16LE when
ff40: 20 55 54 46 2d 31 36 42 45 20 69 73 20 72 65 71   UTF-16BE is req
ff50: 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
ff60: 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36 3a  versa..    ** 6:
ff70: 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2e   An exact match.
ff80: 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41  .    **.    ** A
ff90: 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20 6f 66   larger value of
ffa0: 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69 6e 64   'matchqual' ind
ffb0: 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20 64 65  icates a more de
ffc0: 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a 20  sirable match.. 
ffd0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d     */.    if( p-
ffe0: 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d 3e  >nArg==-1 || p->
fff0: 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41  nArg==nArg || nA
10000 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20  rg==-1 ){.      
10010 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b 20 20  int match = 1;  
10020 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61 6c 69          /* Quali
10030 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74 63 68  ty of this match
10040 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d   */.      if( p-
10050 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e  >nArg==nArg || n
10060 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20  Arg==-1 ){.     
10070 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20 20     match = 4;.  
10080 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
10090 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e 63  enc==p->iPrefEnc
100a0 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
100b0 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a  h += 2;.      }.
100c0 20 20 20 20 20 20 65 6c 73 65 20 69 66 28 20 28        else if( (
100d0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
100e0 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45  6LE && p->iPrefE
100f0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
10100 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  BE) ||.         
10110 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c 49        (enc==SQLI
10120 54 45 5f 55 54 46 31 36 42 45 20 26 26 20 70 2d  TE_UTF16BE && p-
10130 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54  >iPrefEnc==SQLIT
10140 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a 20 20  E_UTF16LE) ){.  
10150 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 31        match += 1
10160 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
10170 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73 74 6d   if( match>bestm
10180 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20  atch ){.        
10190 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20 20  pBest = p;.     
101a0 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d 20 6d     bestmatch = m
101b0 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20  atch;.      }.  
101c0 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66    }.  }..  /* If
101d0 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67 20   the createFlag 
101e0 70 61 72 61 6d 65 74 65 72 20 69 73 20 74 72 75  parameter is tru
101f0 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61 63 68  e, and the seach
10200 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61 6c 20   did not reveal 
10210 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d 61  an.  ** exact ma
10220 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61 6d 65  tch for the name
10230 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  , number of argu
10240 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64 69  ments and encodi
10250 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61 0a 20  ng, then add a. 
10260 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20 74 6f   ** new entry to
10270 20 74 68 65 20 68 61 73 68 20 74 61 62 6c 65 20   the hash table 
10280 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e 0a 20  and return it.. 
10290 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61 74 65   */.  if( create
102a0 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61 74 63  Flag && bestmatc
102b0 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20 28 70  h<6 && .      (p
102c0 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Best = sqliteMal
102d0 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42 65 73  loc(sizeof(*pBes
102e0 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20 29 7b 0a  t)+nName+1)) ){.
102f0 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72 67 20      pBest->nArg 
10300 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42 65 73  = nArg;.    pBes
10310 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73  t->pNext = pFirs
10320 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a 4e  t;.    pBest->zN
10330 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26 70 42  ame = (char*)&pB
10340 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70 42 65 73  est[1];.    pBes
10350 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d 20 65 6e  t->iPrefEnc = en
10360 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42  c;.    memcpy(pB
10370 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d  est->zName, zNam
10380 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70  e, nName);.    p
10390 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d  Best->zName[nNam
103a0 65 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20  e] = 0;.    if( 
103b0 70 42 65 73 74 3d 3d 73 71 6c 69 74 65 33 48 61  pBest==sqlite3Ha
103c0 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46  shInsert(&db->aF
103d0 75 6e 63 2c 70 42 65 73 74 2d 3e 7a 4e 61 6d 65  unc,pBest->zName
103e0 2c 6e 4e 61 6d 65 2c 28 76 6f 69 64 2a 29 70 42  ,nName,(void*)pB
103f0 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 73 71  est) ){.      sq
10400 6c 69 74 65 46 72 65 65 28 70 42 65 73 74 29 3b  liteFree(pBest);
10410 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
10420 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66  .    }.  }..  if
10430 28 20 70 42 65 73 74 20 26 26 20 28 70 42 65 73  ( pBest && (pBes
10440 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42 65 73  t->xStep || pBes
10450 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72 65 61  t->xFunc || crea
10460 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20 20 72  teFlag) ){.    r
10470 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20 20 7d  eturn pBest;.  }
10480 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a     .  return 0;.}.