/ Hex Artifact Content
Login

Artifact cba2b8c089ef03de307f028ac51eb53f583700d6:


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 32 35 20 32 30 30 34 2f 30 35 2f 32 30 20  .125 2004/05/20 
0220: 32 32 3a 31 36 3a 32 39 20 64 72 68 20 45 78 70  22:16:29 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 63 68 61 72 20 63 6f 6e 73 74 20 2a 73 71 6c  .char const *sql
0270: 69 74 65 33 41 66 66 69 6e 69 74 79 53 74 72 69  ite3AffinityStri
0280: 6e 67 28 63 68 61 72 20 61 66 66 69 6e 69 74 79  ng(char affinity
0290: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  ){.  switch( aff
02a0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 63 61 73  inity ){.    cas
02b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  e SQLITE_AFF_INT
02c0: 45 47 45 52 3a 20 72 65 74 75 72 6e 20 22 69 22  EGER: return "i"
02d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
02e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 72  E_AFF_NUMERIC: r
02f0: 65 74 75 72 6e 20 22 6e 22 3b 0a 20 20 20 20 63  eturn "n";.    c
0300: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
0310: 45 58 54 3a 20 20 20 20 72 65 74 75 72 6e 20 22  EXT:    return "
0320: 74 22 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  t";.    case SQL
0330: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20  ITE_AFF_NONE:   
0340: 20 72 65 74 75 72 6e 20 22 6f 22 3b 0a 20 20 20   return "o";.   
0350: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
0360: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 7d  assert(0);.  }.}
0370: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
0380: 74 68 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f  the 'affinity' o
0390: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
03a0: 20 70 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a   pExpr if any..*
03b0: 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
03c0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66   a column, a ref
03d0: 65 72 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75  erence to a colu
03e0: 6d 6e 20 76 69 61 20 61 6e 20 27 41 53 27 20 61  mn via an 'AS' a
03f0: 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75  lias,.** or a su
0400: 62 2d 73 65 6c 65 63 74 20 77 69 74 68 20 61 20  b-select with a 
0410: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65  column as the re
0420: 74 75 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  turn value, then
0430: 20 74 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74   the .** affinit
0440: 79 20 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e  y of that column
0450: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
0460: 68 65 72 77 69 73 65 2c 20 30 78 30 30 20 69 73  herwise, 0x00 is
0470: 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e   returned,.** in
0480: 64 69 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69  dicating no affi
0490: 6e 69 74 79 20 66 6f 72 20 74 68 65 20 65 78 70  nity for the exp
04a0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69  ression..**.** i
04b0: 2e 65 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c  .e. the WHERE cl
04c0: 61 75 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e  ause expresssion
04d0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
04e0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c  ng statements al
04f0: 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66  l.** have an aff
0500: 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  inity:.**.** CRE
0510: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
0520: 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  .** SELECT * FRO
0530: 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a  M t1 WHERE a;.**
0540: 20 53 45 4c 45 43 54 20 61 20 41 53 20 62 20 46   SELECT a AS b F
0550: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a  ROM t1 WHERE b;.
0560: 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ** SELECT * FROM
0570: 20 74 31 20 57 48 45 52 45 20 28 73 65 6c 65 63   t1 WHERE (selec
0580: 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f  t a from t1);.*/
0590: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45 78 70  .char sqlite3Exp
05a0: 72 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  rAffinity(Expr *
05b0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
05c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29  xpr->op==TK_AS )
05d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
05e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
05f0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
0600: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
0610: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
0620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
0630: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0640: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d  (pExpr->pSelect-
0650: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0660: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
0670: 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  rn pExpr->affini
0680: 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ty;.}../*.** pEx
0690: 70 72 20 69 73 20 74 68 65 20 6c 65 66 74 20 6f  pr is the left o
06a0: 70 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70  perand of a comp
06b0: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
06c0: 20 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a    aff2 is the.**
06d0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f   type affinity o
06e0: 66 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72  f the right oper
06f0: 61 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69  and.  This routi
0700: 6e 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a  ne returns the.*
0710: 2a 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  * type affinity 
0720: 74 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75  that should be u
0730: 73 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70  sed for the comp
0740: 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e  arison operator.
0750: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0760: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0770: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61  Expr *pExpr, cha
0780: 72 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20  r aff2){.  char 
0790: 61 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78  aff1 = sqlite3Ex
07a0: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
07b0: 29 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26  );.  if( aff1 &&
07c0: 20 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20   aff2 ){.    /* 
07d0: 42 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68  Both sides of th
07e0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65  e comparison are
07f0: 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65   columns. If one
0800: 20 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a   has numeric or.
0810: 20 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61      ** integer a
0820: 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61  ffinity, use tha
0830: 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65  t. Otherwise use
0840: 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20   no affinity..  
0850: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66    */.    if( aff
0860: 31 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  1==SQLITE_AFF_IN
0870: 54 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53  TEGER || aff2==S
0880: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
0890: 52 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72  R ){.      retur
08a0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  n SQLITE_AFF_INT
08b0: 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20  EGER;.    }else 
08c0: 69 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45  if( aff1==SQLITE
08d0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20  _AFF_NUMERIC || 
08e0: 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  aff2==SQLITE_AFF
08f0: 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20  _NUMERIC ){.    
0900: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0910: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
0920: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65   }else{.      re
0930: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0940: 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65  NONE;.    }.  }e
0950: 6c 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26  lse if( !aff1 &&
0960: 20 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a   !aff2 ){.    /*
0970: 20 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66   Neither side of
0980: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0990: 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 55 73 65  is a column. Use
09a0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
09b0: 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65  y.    ** for the
09c0: 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 20 20 20   comparison..   
09d0: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53   */.    return S
09e0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
09f0: 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  C;.  }else{.    
0a00: 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61  /* One side is a
0a10: 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68   column, the oth
0a20: 65 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74  er is not. Use t
0a30: 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  he columns affin
0a40: 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75  ity. */.    retu
0a50: 72 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29  rn (aff1 + aff2)
0a60: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  ;.  }.}../*.** p
0a70: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
0a80: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20  ison operator.  
0a90: 52 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20  Return the type 
0aa0: 61 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68  affinity that sh
0ab0: 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69  ould.** be appli
0ac0: 65 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61  ed to both opera
0ad0: 6e 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69  nds prior to doi
0ae0: 6e 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ng the compariso
0af0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61  n..*/.static cha
0b00: 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  r comparisonAffi
0b10: 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72  nity(Expr *pExpr
0b20: 29 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20  ){.  char aff;. 
0b30: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0b40: 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78  op==TK_EQ || pEx
0b50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c  pr->op==TK_IN ||
0b60: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c   pExpr->op==TK_L
0b70: 54 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70  T ||.          p
0b80: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20  Expr->op==TK_GT 
0b90: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0ba0: 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _GE || pExpr->op
0bb0: 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20  ==TK_LE ||.     
0bc0: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
0bd0: 54 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72  TK_NE );.  asser
0be0: 74 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  t( pExpr->pLeft 
0bf0: 29 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74  );.  aff = sqlit
0c00: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0c10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
0c20: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
0c30: 74 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  t ){.    aff = s
0c40: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0c50: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69  inity(pExpr->pRi
0c60: 67 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20  ght, aff);.  }. 
0c70: 20 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d   else if( pExpr-
0c80: 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20  >pSelect ){.    
0c90: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0ca0: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0cb0: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
0cc0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c  ist->a[0].pExpr,
0cd0: 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73   aff);.  }.  els
0ce0: 65 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20  e if( !aff ){.  
0cf0: 20 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41    aff = SQLITE_A
0d00: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a  FF_NUMERIC;.  }.
0d10: 20 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a    return aff;.}.
0d20: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0d30: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70  a comparison exp
0d40: 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27  ression, eg. '='
0d50: 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65  , '<', IN(...) e
0d60: 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e  tc..** idx_affin
0d70: 69 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e  ity is the affin
0d80: 69 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65  ity of an indexe
0d90: 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e  d column. Return
0da0: 20 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20   true.** if the 
0db0: 69 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e  index with affin
0dc0: 69 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79  ity idx_affinity
0dd0: 20 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20   may be used to 
0de0: 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65  implement.** the
0df0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70   comparison in p
0e00: 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  Expr..*/.int sql
0e10: 69 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74  ite3IndexAffinit
0e20: 79 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c  yOk(Expr *pExpr,
0e30: 20 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69   char idx_affini
0e40: 74 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ty){.  char aff 
0e50: 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69  = comparisonAffi
0e60: 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 72  nity(pExpr);.  r
0e70: 65 74 75 72 6e 20 0a 20 20 20 20 28 61 66 66 3d  eturn .    (aff=
0e80: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45  =SQLITE_AFF_NONE
0e90: 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53  ) ||.    (aff==S
0ea0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0eb0: 43 20 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74  C && idx_affinit
0ec0: 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  y==SQLITE_AFF_IN
0ed0: 54 45 47 45 52 29 20 7c 7c 0a 20 20 20 20 28 61  TEGER) ||.    (a
0ee0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49  ff==SQLITE_AFF_I
0ef0: 4e 54 45 47 45 52 20 26 26 20 69 64 78 5f 61 66  NTEGER && idx_af
0f00: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
0f10: 46 46 5f 4e 55 4d 45 52 49 43 29 20 7c 7c 0a 20  FF_NUMERIC) ||. 
0f20: 20 20 20 28 61 66 66 3d 3d 69 64 78 5f 61 66 66     (aff==idx_aff
0f30: 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  inity);.}../*.**
0f40: 20 52 65 74 75 72 6e 20 74 68 65 20 50 31 20 76   Return the P1 v
0f50: 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64  alue that should
0f60: 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62   be used for a b
0f70: 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e  inary comparison
0f80: 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45  .** opcode (OP_E
0f90: 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75  q, OP_Ge etc.) u
0fa0: 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70  sed to compare p
0fb0: 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32  Expr1 and pExpr2
0fc0: 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75  ..** If jumpIfNu
0fd0: 6c 6c 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  ll is true, then
0fe0: 20 73 65 74 20 74 68 65 20 6c 6f 77 20 62 79 74   set the low byt
0ff0: 65 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65  e of the returne
1000: 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20 74 6f  d.** P1 value to
1010: 20 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65   tell the opcode
1020: 20 74 6f 20 6a 75 6d 70 20 69 66 20 65 69 74 68   to jump if eith
1030: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  er expression.**
1040: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
1050: 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  LL..*/.static in
1060: 74 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  t binaryCompareP
1070: 31 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20  1(Expr *pExpr1, 
1080: 45 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e  Expr *pExpr2, in
1090: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
10a0: 20 63 68 61 72 20 61 66 66 20 3d 20 73 71 6c 69   char aff = sqli
10b0: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
10c0: 70 45 78 70 72 32 29 3b 0a 20 20 72 65 74 75 72  pExpr2);.  retur
10d0: 6e 20 28 28 28 69 6e 74 29 73 71 6c 69 74 65 33  n (((int)sqlite3
10e0: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
10f0: 70 45 78 70 72 31 2c 20 61 66 66 29 29 3c 3c 38  pExpr1, aff))<<8
1100: 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f 31 3a  )+(jumpIfNull?1:
1110: 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  0);.}../*.** Con
1120: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
1130: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
1140: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
1150: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
1160: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
1170: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
1180: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
1190: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
11a0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
11b0: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
11c0: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
11d0: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
11e0: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
11f0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
1200: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1210: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1220: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1230: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
1240: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
1250: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
1260: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
1270: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
1280: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
1290: 73 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72  s, we leak memor
12a0: 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64  y from pLeft and
12b0: 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72   pRight */.    r
12c0: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
12d0: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
12e0: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
12f0: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1300: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1310: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1320: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1330: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
1340: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
1350: 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65 77 2d  Token;.    pNew-
1360: 3e 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  >span = *pToken;
1370: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73  .  }else{.    as
1380: 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65  sert( pNew->toke
1390: 6e 2e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  n.dyn==0 );.    
13a0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
13b0: 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 20 20  ken.z==0 );.    
13c0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
13d0: 6b 65 6e 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ken.n==0 );.    
13e0: 69 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69  if( pLeft && pRi
13f0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  ght ){.      sql
1400: 69 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65  ite3ExprSpan(pNe
1410: 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c  w, &pLeft->span,
1420: 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b   &pRight->span);
1430: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1440: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
1450: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  New->token;.    
1460: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  }.  }.  return p
1470: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  New;.}../*.** Se
1480: 74 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20  t the Expr.span 
1490: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76  field of the giv
14a0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
14b0: 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78   span all.** tex
14c0: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
14d0: 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a  o given tokens..
14e0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
14f0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
1500: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
1510: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
1520: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
1530: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
1540: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
1550: 20 20 2f 2a 20 4e 6f 74 65 3a 20 70 45 78 70 72    /* Note: pExpr
1560: 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 64   might be NULL d
1570: 75 65 20 74 6f 20 61 20 70 72 69 6f 72 20 6d 61  ue to a prior ma
1580: 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a  lloc failure */.
1590: 20 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70    if( pExpr && p
15a0: 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66  Right->z && pLef
15b0: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  t->z ){.    if( 
15c0: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26  pLeft->dyn==0 &&
15d0: 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20   pRight->dyn==0 
15e0: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
15f0: 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e  span.z = pLeft->
1600: 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  z;.      pExpr->
1610: 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d  span.n = pRight-
1620: 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67 68 74  >n + Addr(pRight
1630: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c 65 66  ->z) - Addr(pLef
1640: 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t->z);.    }else
1650: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
1660: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d  pan.z = 0;.    }
1670: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1680: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
1690: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
16a0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
16b0: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
16c0: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
16d0: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
16e0: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
16f0: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1700: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
1710: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
1720: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1730: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
1740: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1750: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c   /* sqlite3ExprL
1760: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
1770: 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74 20  ; // Leak pList 
1780: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
1790: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
17a0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
17b0: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
17c0: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
17d0: 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54   pList;.  if( pT
17e0: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
17f0: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1800: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1810: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
1820: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1830: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  ew->token.z = 0;
1840: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61  .  }.  pNew->spa
1850: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
1860: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1870: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
1880: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
1890: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
18a0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
18b0: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
18c0: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
18d0: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
18e0: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
18f0: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
1900: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28  ->span.z);.  if(
1910: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20   p->token.dyn ) 
1920: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
1930: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  *)p->token.z);. 
1940: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1950: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
1960: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1970: 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  e(p->pRight);.  
1980: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1990: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
19a0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
19b0: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
19c0: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
19d0: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  (p);.}.../*.** T
19e0: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
19f0: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
1a00: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
1a10: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
1a20: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
1a30: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
1a40: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
1a50: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
1a60: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
1a70: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
1a80: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
1a90: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
1aa0: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
1ab0: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
1ac0: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
1ad0: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
1ae0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
1af0: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
1b00: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
1b10: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
1b20: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
1b30: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
1b40: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
1b50: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
1b60: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
1b70: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
1b80: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
1b90: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
1ba0: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
1bb0: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
1bc0: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
1bd0: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
1be0: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45  duplicated..*/.E
1bf0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
1c00: 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  Dup(Expr *p){.  
1c10: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
1c20: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
1c30: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
1c40: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
1c50: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
1c60: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
1c70: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
1c80: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
1c90: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
1ca0: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
1cb0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
1cc0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
1cd0: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  ->token.z);.    
1ce0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
1cf0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
1d00: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
1d10: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
1d20: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
1d30: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
1d40: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
1d50: 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  rDup(p->pLeft);.
1d60: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
1d70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
1d80: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e  p->pRight);.  pN
1d90: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ew->pList = sqli
1da0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
1db0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  ->pList);.  pNew
1dc0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
1dd0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
1de0: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
1df0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
1e00: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
1e10: 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b  (Token *pTo, Tok
1e20: 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  en *pFrom){.  if
1e30: 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c  ( pTo->dyn ) sql
1e40: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
1e50: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
1e60: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
1e70: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
1e80: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71  .    pTo->z = sq
1e90: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f  liteStrNDup(pFro
1ea0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
1eb0: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
1ec0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
1ed0: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
1ee0: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
1ef0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
1f00: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
1f10: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
1f20: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
1f30: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
1f40: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
1f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
1f60: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
1f70: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
1f80: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
1f90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
1fa0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
1fb0: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
1fc0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d  ->nExpr;.  pNew-
1fd0: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
1fe0: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45  iteMalloc( p->nE
1ff0: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
2000: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
2010: 65 6d 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  em==0 ) return 0
2020: 3b 20 20 2f 2a 20 4c 65 61 6b 73 20 6d 65 6d 6f  ;  /* Leaks memo
2030: 72 79 20 61 66 74 65 72 20 61 20 6d 61 6c 6c 6f  ry after a mallo
2040: 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20 20 66  c failure */.  f
2050: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78  or(i=0; i<p->nEx
2060: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
2070: 29 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65  ){.    Expr *pNe
2080: 77 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72  wExpr, *pOldExpr
2090: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
20a0: 70 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20  pr = pNewExpr = 
20b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
20c0: 4f 6c 64 45 78 70 72 20 3d 20 70 2d 3e 61 5b 69  OldExpr = p->a[i
20d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66  ].pExpr);.    if
20e0: 28 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e  ( pOldExpr->span
20f0: 2e 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70  .z!=0 && pNewExp
2100: 72 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c  r ){.      /* Al
2110: 77 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79  ways make a copy
2120: 20 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72   of the span for
2130: 20 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65   top-level expre
2140: 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20  ssions in the.  
2150: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
2160: 6e 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67  n list.  The log
2170: 69 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f  ic in SELECT pro
2180: 63 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74  cessing that det
2190: 65 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a  ermines.      **
21a0: 20 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f   the names of co
21b0: 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73  lumns in the res
21c0: 75 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68  ult set needs th
21d0: 69 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a  is information *
21e0: 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54  /.      sqlite3T
21f0: 6f 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45 78  okenCopy(&pNewEx
2200: 70 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45  pr->span, &pOldE
2210: 78 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20  xpr->span);.    
2220: 7d 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  }.    assert( pN
2230: 65 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65  ewExpr==0 || pNe
2240: 77 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30  wExpr->span.z!=0
2250: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c   .            ||
2260: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
2270: 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f  z==0 || sqlite3_
2280: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b  malloc_failed );
2290: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d  .    pItem->zNam
22a0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
22b0: 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b  (p->a[i].zName);
22c0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74  .    pItem->sort
22d0: 4f 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e  Order = p->a[i].
22e0: 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70  sortOrder;.    p
22f0: 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 2d  Item->isAgg = p-
2300: 3e 61 5b 69 5d 2e 69 73 41 67 67 3b 0a 20 20 20  >a[i].isAgg;.   
2310: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
2320: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
2330: 4e 65 77 3b 0a 7d 0a 53 72 63 4c 69 73 74 20 2a  New;.}.SrcList *
2340: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
2350: 70 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20  p(SrcList *p){. 
2360: 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a   SrcList *pNew;.
2370: 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e    int i;.  int n
2380: 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30  Byte;.  if( p==0
2390: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e   ) return 0;.  n
23a0: 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70  Byte = sizeof(*p
23b0: 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f  ) + (p->nSrc>0 ?
23c0: 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29   sizeof(p->a[0])
23d0: 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a   * (p->nSrc-1) :
23e0: 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71   0);.  pNew = sq
23f0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e  liteMallocRaw( n
2400: 42 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e  Byte );.  if( pN
2410: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
2420: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d  ;.  pNew->nSrc =
2430: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
2440: 70 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69  p->nSrc;.  for(i
2450: 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69  =0; i<p->nSrc; i
2460: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
2470: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e  SrcList_item *pN
2480: 65 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e  ewItem = &pNew->
2490: 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74  a[i];.    struct
24a0: 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70   SrcList_item *p
24b0: 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b  OldItem = &p->a[
24c0: 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  i];.    pNewItem
24d0: 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71  ->zDatabase = sq
24e0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
24f0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b  tem->zDatabase);
2500: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
2510: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
2520: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
2530: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
2540: 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c  em->zAlias = sql
2550: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
2560: 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20  em->zAlias);.   
2570: 20 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74   pNewItem->joint
2580: 79 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  ype = pOldItem->
2590: 6a 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e  jointype;.    pN
25a0: 65 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20  ewItem->iCursor 
25b0: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72  = pOldItem->iCur
25c0: 73 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  sor;.    pNewIte
25d0: 6d 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20  m->pTab = 0;.   
25e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65   pNewItem->pSele
25f0: 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65  ct = sqlite3Sele
2600: 63 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  ctDup(pOldItem->
2610: 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e  pSelect);.    pN
2620: 65 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71  ewItem->pOn = sq
2630: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c  lite3ExprDup(pOl
2640: 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20  dItem->pOn);.   
2650: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e   pNewItem->pUsin
2660: 67 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73  g = sqlite3IdLis
2670: 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  tDup(pOldItem->p
2680: 55 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65  Using);.  }.  re
2690: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c  turn pNew;.}.IdL
26a0: 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69  ist *sqlite3IdLi
26b0: 73 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29  stDup(IdList *p)
26c0: 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77  {.  IdList *pNew
26d0: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
26e0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
26f0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
2700: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
2710: 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69  of(*pNew) );.  i
2720: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
2730: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
2740: 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  Id = pNew->nAllo
2750: 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e  c = p->nId;.  pN
2760: 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61  ew->a = sqliteMa
2770: 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a  llocRaw( p->nId*
2780: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
2790: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61  );.  if( pNew->a
27a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
27b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
27c0: 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  nId; i++){.    s
27d0: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
27e0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
27f0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
2800: 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65  truct IdList_ite
2810: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
2820: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
2830: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
2840: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
2850: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
2860: 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d   pNewItem->idx =
2870: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a   pOldItem->idx;.
2880: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
2890: 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c  w;.}.Select *sql
28a0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65  ite3SelectDup(Se
28b0: 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65  lect *p){.  Sele
28c0: 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20  ct *pNew;.  if( 
28d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
28e0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
28f0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
2900: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
2910: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
2920: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73  0;.  pNew->isDis
2930: 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73  tinct = p->isDis
2940: 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  tinct;.  pNew->p
2950: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
2960: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45  xprListDup(p->pE
2970: 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  List);.  pNew->p
2980: 53 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63  Src = sqlite3Src
2990: 4c 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29  ListDup(p->pSrc)
29a0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65  ;.  pNew->pWhere
29b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
29c0: 70 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20  p(p->pWhere);.  
29d0: 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d  pNew->pGroupBy =
29e0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
29f0: 44 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29  Dup(p->pGroupBy)
2a00: 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e  ;.  pNew->pHavin
2a10: 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  g = sqlite3ExprD
2a20: 75 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a  up(p->pHaving);.
2a30: 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79    pNew->pOrderBy
2a40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2a50: 73 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42  stDup(p->pOrderB
2a60: 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d  y);.  pNew->op =
2a70: 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e   p->op;.  pNew->
2a80: 70 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33  pPrior = sqlite3
2a90: 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72  SelectDup(p->pPr
2aa0: 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c  ior);.  pNew->nL
2ab0: 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74  imit = p->nLimit
2ac0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65  ;.  pNew->nOffse
2ad0: 74 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a  t = p->nOffset;.
2ae0: 20 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20    pNew->zSelect 
2af0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69  = 0;.  pNew->iLi
2b00: 6d 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77  mit = -1;.  pNew
2b10: 2d 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a  ->iOffset = -1;.
2b20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
2b30: 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  .../*.** Add a n
2b40: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
2b50: 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72  e end of an expr
2b60: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66  ession list.  If
2b70: 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69   pList is.** ini
2b80: 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65  tially NULL, the
2b90: 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65  n create a new e
2ba0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
2bb0: 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  */.ExprList *sql
2bc0: 69 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65  ite3ExprListAppe
2bd0: 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  nd(ExprList *pLi
2be0: 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  st, Expr *pExpr,
2bf0: 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a   Token *pName){.
2c00: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
2c10: 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71  {.    pList = sq
2c20: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
2c30: 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a  of(ExprList) );.
2c40: 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30      if( pList==0
2c50: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c   ){.      /* sql
2c60: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2c70: 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d  Expr); // Leak m
2c80: 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20  emory if malloc 
2c90: 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72  fails */.      r
2ca0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20  eturn 0;.    }. 
2cb0: 20 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74     assert( pList
2cc0: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20  ->nAlloc==0 );. 
2cd0: 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e   }.  if( pList->
2ce0: 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e  nAlloc<=pList->n
2cf0: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 4c 69 73  Expr ){.    pLis
2d00: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73  t->nAlloc = pLis
2d10: 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b  t->nAlloc*2 + 4;
2d20: 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20  .    pList->a = 
2d30: 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c  sqliteRealloc(pL
2d40: 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e  ist->a, pList->n
2d50: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69  Alloc*sizeof(pLi
2d60: 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20  st->a[0]));.    
2d70: 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20  if( pList->a==0 
2d80: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  ){.      /* sqli
2d90: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
2da0: 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65  xpr); // Leak me
2db0: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mory if malloc f
2dc0: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 70 4c  ails */.      pL
2dd0: 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 70 4c 69  ist->nExpr = pLi
2de0: 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a  st->nAlloc = 0;.
2df0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69        return pLi
2e00: 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  st;.    }.  }.  
2e10: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
2e20: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78  !=0 );.  if( pEx
2e30: 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20  pr || pName ){. 
2e40: 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
2e50: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
2e60: 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74   &pList->a[pList
2e70: 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20  ->nExpr++];.    
2e80: 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c  memset(pItem, 0,
2e90: 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29   sizeof(*pItem))
2ea0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
2eb0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
2ec0: 69 66 28 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20  if( pName ){.   
2ed0: 20 20 20 73 71 6c 69 74 65 33 53 65 74 4e 53 74     sqlite3SetNSt
2ee0: 72 69 6e 67 28 26 70 49 74 65 6d 2d 3e 7a 4e 61  ring(&pItem->zNa
2ef0: 6d 65 2c 20 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e  me, pName->z, pN
2f00: 61 6d 65 2d 3e 6e 2c 20 30 29 3b 0a 20 20 20 20  ame->n, 0);.    
2f10: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
2f20: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
2f30: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
2f40: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
2f50: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
2f60: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
2f70: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
2f80: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
2f90: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
2fa0: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
2fb0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
2fc0: 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28  eturn;.  assert(
2fd0: 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20   pList->a!=0 || 
2fe0: 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30  (pList->nExpr==0
2ff0: 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f   && pList->nAllo
3000: 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72  c==0) );.  asser
3010: 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c  t( pList->nExpr<
3020: 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29  =pList->nAlloc )
3030: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
3040: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
3050: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
3060: 70 72 44 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e  prDelete(pList->
3070: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
3080: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73   sqliteFree(pLis
3090: 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  t->a[i].zName);.
30a0: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
30b0: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
30c0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
30d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
30e0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
30f0: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
3100: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3110: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
3120: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
3130: 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  es variables..**
3140: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
3150: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
3160: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
3170: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
3180: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
3190: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
31a0: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
31b0: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
31c0: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
31d0: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
31e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
31f0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
3200: 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20   *p){.  switch( 
3210: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
3220: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
3230: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
3240: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20   case TK_DOT:.  
3250: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
3260: 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ON:.      return
3270: 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
3280: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
3290: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
32a0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20  se TK_INTEGER:. 
32b0: 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54     case TK_FLOAT
32c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  :.    case TK_VA
32d0: 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65  RIABLE:.      re
32e0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61  turn 1;.    defa
32f0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
3300: 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71   p->pLeft && !sq
3310: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
3320: 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20  ant(p->pLeft) ) 
3330: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
3340: 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26  if( p->pRight &&
3350: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
3360: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67 68  onstant(p->pRigh
3370: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
3380: 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73       if( p->pLis
3390: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
33a0: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
33b0: 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d  i=0; i<p->pList-
33c0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
33d0: 20 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c          if( !sql
33e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
33f0: 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  nt(p->pList->a[i
3400: 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74 75 72  ].pExpr) ) retur
3410: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
3420: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74       }.      ret
3430: 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d 30 20  urn p->pLeft!=0 
3440: 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d 30 20  || p->pRight!=0 
3450: 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26 26 20  || (p->pList && 
3460: 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  p->pList->nExpr>
3470: 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  0);.    }.  }.  
3480: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
3490: 2a 2a 20 49 66 20 74 68 65 20 67 69 76 65 6e 20  ** If the given 
34a0: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 64 65 73  expression codes
34b0: 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65   a constant inte
34c0: 67 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c  ger that is smal
34d0: 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66  l enough.** to f
34e0: 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69  it in a 32-bit i
34f0: 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31  nteger, return 1
3500: 20 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c   and put the val
3510: 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65  ue of the intege
3520: 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e  r.** in *pValue.
3530: 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73    If the express
3540: 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e  ion is not an in
3550: 74 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69  teger or if it i
3560: 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20  s too big.** to 
3570: 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20  fit in a signed 
3580: 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20  32-bit integer, 
3590: 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61  return 0 and lea
35a0: 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61  ve *pValue uncha
35b0: 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  nged..*/.int sql
35c0: 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65  ite3ExprIsIntege
35d0: 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a  r(Expr *p, int *
35e0: 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63  pValue){.  switc
35f0: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
3600: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
3610: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c   {.      if( sql
3620: 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e  ite3GetInt32(p->
3630: 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29  token.z, pValue)
3640: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
3650: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
3660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
3670: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
3680: 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e  ING: {.      con
3690: 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e  st char *z = p->
36a0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69  token.z;.      i
36b0: 6e 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e  nt n = p->token.
36c0: 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30  n;.      if( n>0
36d0: 20 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b   && z[0]=='-' ){
36e0: 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20   z++; n--; }.   
36f0: 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26     while( n>0 &&
3700: 20 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28 2a   *z && isdigit(*
3710: 7a 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20  z) ){ z++; n--; 
3720: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30  }.      if( n==0
3730: 20 26 26 20 73 71 6c 69 74 65 33 47 65 74 49 6e   && sqlite3GetIn
3740: 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  t32(p->token.z, 
3750: 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  pValue) ){.     
3760: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3770: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3790: 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20   TK_UPLUS: {.   
37a0: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
37b0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
37c0: 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29  ->pLeft, pValue)
37d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
37e0: 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20   TK_UMINUS: {.  
37f0: 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20      int v;.     
3800: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
3810: 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65  IsInteger(p->pLe
3820: 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20  ft, &v) ){.     
3830: 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b     *pValue = -v;
3840: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3850: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3860: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3870: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
3880: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
3890: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
38a0: 6e 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69  n TRUE if the gi
38b0: 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20  ven string is a 
38c0: 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61  row-id column na
38d0: 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  me..*/.int sqlit
38e0: 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20  e3IsRowid(const 
38f0: 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20  char *z){.  if( 
3900: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
3910: 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20  , "_ROWID_")==0 
3920: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
3930: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3940: 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20  (z, "ROWID")==0 
3950: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
3960: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3970: 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20  (z, "OID")==0 ) 
3980: 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75  return 1;.  retu
3990: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn 0;.}../*.** G
39a0: 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66  iven the name of
39b0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65   a column of the
39c0: 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59   form X.Y.Z or Y
39d0: 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f  .Z or just Z, lo
39e0: 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61  ok up.** that na
39f0: 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66  me in the set of
3a00: 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69   source tables i
3a10: 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d  n pSrcList and m
3a20: 61 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a  ake the pExpr .*
3a30: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  * expression nod
3a40: 65 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20  e refer back to 
3a50: 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75  that source colu
3a60: 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69  mn.  The followi
3a70: 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72  ng changes.** ar
3a80: 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a  e made to pExpr:
3a90: 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  .**.**    pExpr-
3aa0: 3e 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53  >iDb           S
3ab0: 65 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20  et the index in 
3ac0: 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65  db->aDb[] of the
3ad0: 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e   database holdin
3ae0: 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  g.**            
3af0: 20 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65               the
3b00: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
3b10: 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20  xpr->iTable     
3b20: 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75     Set to the cu
3b30: 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20  rsor number for 
3b40: 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e  the table obtain
3b50: 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  ed.**           
3b60: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72                fr
3b70: 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20  om pSrcList..** 
3b80: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
3b90: 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74  n       Set to t
3ba0: 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72  he column number
3bb0: 20 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c   within the tabl
3bc0: 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  e..**    pExpr->
3bd0: 64 61 74 61 54 79 70 65 20 20 20 20 20 20 53 65  dataType      Se
3be0: 74 20 74 6f 20 74 68 65 20 61 70 70 72 6f 70 72  t to the appropr
3bf0: 69 61 74 65 20 64 61 74 61 20 74 79 70 65 20 66  iate data type f
3c00: 6f 72 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 0a 2a  or the column..*
3c10: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
3c20: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
3c30: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
3c40: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
3c50: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
3c60: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
3c70: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
3c80: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
3c90: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
3ca0: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
3cb0: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
3cc0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
3cd0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
3ce0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
3cf0: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
3d00: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
3d10: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
3d20: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
3d30: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
3d40: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
3d50: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
3d60: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
3d70: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
3d80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3d90: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
3da0: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
3db0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
3dc0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
3dd0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
3de0: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
3df0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
3e00: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
3e10: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
3e20: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
3e30: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
3e40: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
3e50: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
3e60: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
3e70: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
3e80: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
3e90: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
3ea0: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
3eb0: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
3ec0: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
3ed0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
3ee0: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
3ef0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
3f00: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
3f10: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
3f20: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
3f30: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3f40: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
3f50: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
3f60: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
3f70: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
3f80: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
3f90: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
3fa0: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
3fb0: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
3fc0: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
3fd0: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 53  e column. */.  S
3fe0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
3ff0: 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74  ,   /* List of t
4000: 61 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65  ables used to re
4010: 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  solve column nam
4020: 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  es */.  ExprList
4030: 20 2a 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20   *pEList,    /* 
4040: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
4050: 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  ons used to reso
4060: 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 45 78  lve "AS" */.  Ex
4070: 70 72 20 2a 70 45 78 70 72 20 20 20 20 20 20 20  pr *pExpr       
4080: 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20     /* Make this 
4090: 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20  EXPR node point 
40a0: 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65 64 20  to the selected 
40b0: 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63  column */.){.  c
40c0: 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20  har *zDb = 0;   
40d0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
40e0: 68 65 20 64 61 74 61 62 61 73 65 2e 20 20 54 68  he database.  Th
40f0: 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a  e "X" in X.Y.Z *
4100: 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d  /.  char *zTab =
4110: 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65   0;      /* Name
4120: 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20   of the table.  
4130: 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a  The "Y" in X.Y.Z
4140: 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61   or Y.Z */.  cha
4150: 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20  r *zCol = 0;    
4160: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4170: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a   column.  The "Z
4180: 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b  " */.  int i, j;
4190: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c              /* L
41a0: 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a  oop counters */.
41b0: 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20    int cnt = 0;  
41c0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
41d0: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c   of matching col
41e0: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69  umn names */.  i
41f0: 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20  nt cntTab = 0;  
4200: 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
4210: 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20   matching table 
4220: 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74  names */.  sqlit
4230: 65 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e  e *db = pParse->
4240: 64 62 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61  db;  /* The data
4250: 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72  base */..  asser
4260: 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20  t( pColumnToken 
4270: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
4280: 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69  >z ); /* The Z i
4290: 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62  n X.Y.Z cannot b
42a0: 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20  e NULL */.  if( 
42b0: 70 44 62 54 6f 6b 65 6e 20 26 26 20 70 44 62 54  pDbToken && pDbT
42c0: 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20 20 7a  oken->z ){.    z
42d0: 44 62 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  Db = sqliteStrND
42e0: 75 70 28 70 44 62 54 6f 6b 65 6e 2d 3e 7a 2c 20  up(pDbToken->z, 
42f0: 70 44 62 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20  pDbToken->n);.  
4300: 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65    sqlite3Dequote
4310: 28 7a 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  (zDb);.  }else{.
4320: 20 20 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 7d      zDb = 0;.  }
4330: 0a 20 20 69 66 28 20 70 54 61 62 6c 65 54 6f 6b  .  if( pTableTok
4340: 65 6e 20 26 26 20 70 54 61 62 6c 65 54 6f 6b 65  en && pTableToke
4350: 6e 2d 3e 7a 20 29 7b 0a 20 20 20 20 7a 54 61 62  n->z ){.    zTab
4360: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
4370: 28 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 7a 2c  (pTableToken->z,
4380: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 6e 29   pTableToken->n)
4390: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 65 71  ;.    sqlite3Deq
43a0: 75 6f 74 65 28 7a 54 61 62 29 3b 0a 20 20 7d 65  uote(zTab);.  }e
43b0: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
43c0: 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 7a   zDb==0 );.    z
43d0: 54 61 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a  Tab = 0;.  }.  z
43e0: 43 6f 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  Col = sqliteStrN
43f0: 44 75 70 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e  Dup(pColumnToken
4400: 2d 3e 7a 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ->z, pColumnToke
4410: 6e 2d 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33  n->n);.  sqlite3
4420: 44 65 71 75 6f 74 65 28 7a 43 6f 6c 29 3b 0a 20  Dequote(zCol);. 
4430: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
4440: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
4450: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
4460: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
4470: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
4480: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
4490: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  }.  assert( zTab
44a0: 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ==0 || pEList==0
44b0: 20 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54   );..  pExpr->iT
44c0: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  able = -1;.  for
44d0: 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
44e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
44f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
4500: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
4510: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pSrcList->a[i];.
4520: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
4530: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
4540: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
4550: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ..    if( pTab==
4560: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4570: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
4580: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66  nCol>0 );.    if
4590: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
45a0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
45b0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
45c0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
45d0: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
45e0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
45f0: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
4600: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
4610: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
4620: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
4630: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
4640: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
4650: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
4660: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
4670: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
4680: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
4690: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
46a0: 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  Db!=0 && sqlite3
46b0: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
46c0: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
46d0: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
46e0: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
46f0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
4700: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
4710: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
4720: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
4730: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
4740: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
4750: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
4760: 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >iDb;.    }.    
4770: 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(j=0, pCol=pT
4780: 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
4790: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f  ->nCol; j++, pCo
47a0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
47b0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
47c0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
47d0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
47e0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
47f0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4800: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
4810: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
4820: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
4830: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
4840: 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28  tute the rowid (
4850: 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74  column -1) for t
4860: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
4870: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
4880: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4890: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
48a0: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
48b0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
48c0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
48d0: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
48e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
48f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
4900: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
4910: 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f  not already reso
4920: 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74  lved the name, t
4930: 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a 20  hen maybe .  ** 
4940: 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72  it is a new.* or
4950: 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61   old.* trigger a
4960: 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63  rgument referenc
4970: 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62  e.  */.  if( zDb
4980: 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26  ==0 && zTab!=0 &
4990: 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72  & cnt==0 && pPar
49a0: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30  se->trigStack!=0
49b0: 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53   ){.    TriggerS
49c0: 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74  tack *pTriggerSt
49d0: 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72  ack = pParse->tr
49e0: 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 54 61 62  igStack;.    Tab
49f0: 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20  le *pTab = 0;.  
4a00: 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74    if( pTriggerSt
4a10: 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d  ack->newIdx != -
4a20: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
4a30: 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29  Cmp("new", zTab)
4a40: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70   == 0 ){.      p
4a50: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4a60: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
4a70: 77 49 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65  wIdx;.      asse
4a80: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
4a90: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
4aa0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
4ab0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
4ac0: 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69 67   }else if( pTrig
4ad0: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
4ae0: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
4af0: 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20  3StrICmp("old", 
4b00: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
4b10: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4b20: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
4b30: 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20  k->oldIdx;.     
4b40: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
4b50: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
4b60: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
4b70: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
4b80: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28  ;.    }..    if(
4b90: 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20   pTab ){ .      
4ba0: 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f 6c  int j;.      Col
4bb0: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
4bc0: 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a 20  ->aCol;.      . 
4bd0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
4be0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
4bf0: 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20     cntTab++;.   
4c00: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20     for(j=0; j < 
4c10: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
4c20: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
4c30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4c40: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
4c50: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
4c60: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
4c70: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
4c80: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54  >iColumn = j==pT
4c90: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
4ca0: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45   j;.          pE
4cb0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20  xpr->affinity = 
4cc0: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
4cd0: 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20  finity;.        
4ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
4cf0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
4d00: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
4d10: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
4d20: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
4d30: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 2a  to the ROWID.  *
4d40: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
4d50: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
4d60: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
4d70: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ol) ){.    cnt =
4d80: 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   1;.    pExpr->i
4d90: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
4da0: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
4db0: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
4dc0: 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TEGER;.  }..  /*
4dd0: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  .  ** If the inp
4de0: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
4df0: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
4e00: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
4e10: 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68  name Z.  ** migh
4e20: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
4e30: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
4e40: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
4e50: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
4e60: 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73  .  ** we are res
4e70: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
4e80: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
4e90: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
4ea0: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a  g command:.  **.
4eb0: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
4ec0: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
4ed0: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
4ee0: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
4ef0: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
4f00: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
4f10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
4f20: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
4f30: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
4f40: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
4f50: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
4f60: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
4f70: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
4f80: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
4f90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
4fa0: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
4fb0: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
4fc0: 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f  y been.  ** reso
4fd0: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
4fe0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
4ff0: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
5000: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
5010: 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b   && pEList!=0 ){
5020: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
5030: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
5040: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
5050: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
5060: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
5070: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
5080: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
5090: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
50a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
50b0: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
50c0: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
50d0: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45  =0 );.        pE
50e0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b  xpr->op = TK_AS;
50f0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
5100: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
5110: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
5120: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5130: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  up(pEList->a[j].
5140: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
5150: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29  sqliteFree(zCol)
5160: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
5170: 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62  ( zTab==0 && zDb
5180: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
5190: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
51a0: 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f  .    } .  }..  /
51b0: 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20  *.  ** If X and 
51c0: 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f  Y are NULL (in o
51d0: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e  ther words if on
51e0: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
51f0: 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70  me Z is.  ** sup
5200: 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76  plied) and the v
5210: 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63  alue of Z is enc
5220: 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  losed in double-
5230: 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a  quotes, then.  *
5240: 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20  * Z is a string 
5250: 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f  literal if it do
5260: 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20  esn't match any 
5270: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
5280: 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65  n that.  ** case
5290: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  , we need to ret
52a0: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61  urn right away a
52b0: 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20  nd not make any 
52c0: 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20  changes to.  ** 
52d0: 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pExpr..  */.  if
52e0: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
52f0: 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ==0 && pColumnTo
5300: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29  ken->z[0]=='"' )
5310: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5320: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zCol);.    retu
5330: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rn 0;.  }..  /*.
5340: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
5350: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
5360: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
5370: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
5380: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
5390: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
53a0: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
53b0: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
53c0: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
53d0: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
53e0: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
53f0: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
5400: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
5410: 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75  n: %s" : "ambigu
5420: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
5430: 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44   %s";.    if( zD
5440: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
5450: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
5460: 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20  zDb, ".", zTab, 
5470: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
5480: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
5490: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
54a0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
54b0: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
54c0: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
54d0: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
54e0: 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20  StrDup(zCol);.  
54f0: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
5500: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5510: 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71  zErr, z);.    sq
5520: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d  liteFree(z);.  }
5530: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
5540: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
5550: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62    sqliteFree(zDb
5560: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
5570: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
5580: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c  ree(zCol);.  sql
5590: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
55a0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
55b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
55c0: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
55d0: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69  elete(pExpr->pRi
55e0: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
55f0: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
5600: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
5610: 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74  MN;.  sqlite3Aut
5620: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
5630: 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a  xpr, pSrcList);.
5640: 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b    return cnt!=1;
5650: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5660: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
5670: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5680: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
5690: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
56a0: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
56b0: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
56c0: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
56d0: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
56e0: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
56f0: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
5700: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
5710: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
5720: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
5730: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
5740: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
5750: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
5760: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
5770: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
5780: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
5790: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
57a0: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
57b0: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
57c0: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
57d0: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
57e0: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
57f0: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
5800: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
5810: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
5820: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
5830: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
5840: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
5850: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
5860: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
5870: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
5880: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
5890: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
58a0: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
58b0: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
58c0: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
58d0: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
58e0: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
58f0: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
5900: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
5910: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
5920: 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68  **.** We also ch
5930: 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65  eck for instance
5940: 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  s of the IN oper
5950: 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20  ator.  IN comes 
5960: 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  in two.** forms:
5970: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
5980: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
5990: 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20  st).** and.**   
59a0: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
59b0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
59c0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
59d0: 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  m is handled by 
59e0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68  creating a set h
59f0: 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a  olding the list.
5a00: 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61  ** of allowed va
5a10: 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  lues.  The secon
5a20: 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68  d form causes th
5a30: 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65  e SELECT to gene
5a40: 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f  rate .** a tempo
5a50: 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  rary table..**.*
5a60: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
5a70: 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63  lso looks for sc
5a80: 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61  alar SELECTs tha
5a90: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e  t are part of an
5aa0: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
5ab0: 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c  If it finds any,
5ac0: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
5ad0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
5ae0: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65  value of that se
5af0: 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d  lect.** into a m
5b00: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
5b10: 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e  * Unknown column
5b20: 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76  s or tables prov
5b30: 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54  oke an error.  T
5b40: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
5b50: 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
5b60: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
5b70: 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65   and leaves an e
5b80: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
5b90: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
5ba0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
5bb0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20  xprResolveIds(. 
5bc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
5bd0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
5be0: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
5bf0: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
5c00: 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62  , /* List of tab
5c10: 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  les used to reso
5c20: 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  lve column names
5c30: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
5c40: 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  pEList,  /* List
5c50: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
5c60: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
5c70: 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a  "AS" */.  Expr *
5c80: 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20  pExpr        /* 
5c90: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
5ca0: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
5cb0: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
5cc0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
5cd0: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72   pSrcList==0 ) r
5ce0: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
5cf0: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
5d00: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
5d10: 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74  assert( pSrcList
5d20: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d  ->a[i].iCursor>=
5d30: 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61  0 && pSrcList->a
5d40: 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72  [i].iCursor<pPar
5d50: 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a  se->nTab );.  }.
5d60: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
5d70: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  >op ){.    /* Do
5d80: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
5d90: 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20  ngs (ex: "abc") 
5da0: 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e  are used as iden
5db0: 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a  tifiers if.    *
5dc0: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68  * possible.  Oth
5dd0: 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61  erwise they rema
5de0: 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20  in as strings.  
5df0: 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20  Single-quoted.  
5e00: 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78    ** strings (ex
5e10: 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77  : 'abc') are alw
5e20: 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72  ays string liter
5e30: 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  als..    */.    
5e40: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
5e50: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
5e60: 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
5e70: 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  \'' ) break;.   
5e80: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
5e90: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63  into the TK_ID c
5ea0: 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ase if this is a
5eb0: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
5ec0: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20  tring */.    }. 
5ed0: 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65     /* A lone ide
5ee0: 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e  ntifier is the n
5ef0: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64  ame of a columnd
5f00: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
5f10: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
5f20: 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   if( lookupName(
5f30: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
5f40: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72  Expr->token, pSr
5f50: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
5f60: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
5f70: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
5f80: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20   }.      break; 
5f90: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
5fa0: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
5fb0: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
5fc0: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
5fd0: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
5fe0: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
5ff0: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
6000: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
6010: 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  T: {.      Token
6020: 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20   *pColumn;.     
6030: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a   Token *pTable;.
6040: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62        Token *pDb
6050: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
6060: 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69  ight;..      pRi
6070: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
6080: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
6090: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
60a0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20   ){.        pDb 
60b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
60c0: 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  ble = &pExpr->pL
60d0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
60e0: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
60f0: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
6100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6110: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
6120: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
6130: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26  .        pDb = &
6140: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
6150: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ken;.        pTa
6160: 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  ble = &pRight->p
6170: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
6180: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
6190: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
61a0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  token;.      }. 
61b0: 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e       if( lookupN
61c0: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c  ame(pParse, pDb,
61d0: 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e   pTable, pColumn
61e0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70  , pSrcList, 0, p
61f0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
6200: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6210: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6220: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
6230: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63  TK_IN: {.      c
6240: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
6250: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
6260: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
6270: 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79 49  rse);.      KeyI
6280: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 0a 20 20  nfo keyInfo;..  
6290: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
62a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
62b0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
62c0: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
62d0: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
62e0: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
62f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
6300: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
6310: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
6320: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
6330: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
6340: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
6350: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
6360: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
6370: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
6380: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
6390: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
63a0: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
63b0: 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70  same way. A temp
63c0: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a  orary table is .
63d0: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
63e0: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
63f0: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
6400: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
6410: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
6420: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
6430: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
6440: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
6450: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
6460: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6470: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
6480: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
6490: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
64a0: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
64b0: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
64c0: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
64d0: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
64e0: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
64f0: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
6500: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
6510: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
6520: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
6530: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
6540: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
6550: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
6560: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
6570: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
6580: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
6590: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
65a0: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
65b0: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
65c0: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
65d0: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
65e0: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
65f0: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
6600: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
6610: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6620: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6630: 2b 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  +;.      memset(
6640: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
6650: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
6660: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
6670: 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6b  eld = 1;.      k
6680: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
6690: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44  = pParse->db->pD
66a0: 66 6c 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73  fltColl;.      s
66b0: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
66c0: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45   OP_OpenTemp, pE
66d0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20  xpr->iTable, 0, 
66e0: 5c 0a 20 20 20 20 20 20 20 20 20 20 20 28 63 68  \.           (ch
66f0: 61 72 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33  ar*)&keyInfo, P3
6700: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
6710: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
6720: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
6730: 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65  /* Case 1:     e
6740: 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e  xpr IN (SELECT .
6750: 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20  ..).        **. 
6760: 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61         ** Genera
6770: 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65  te code to write
6780: 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
6790: 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20  the select into 
67a0: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20  the temporary.  
67b0: 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61        ** table a
67c0: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65  llocated and ope
67d0: 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20  ned above..     
67e0: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
67f0: 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d  t iParm = pExpr-
6800: 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e  >iTable +  (((in
6810: 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29  t)affinity)<<16)
6820: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
6830: 28 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ( (pExpr->iTable
6840: 26 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45  &0x0000FFFF)==pE
6850: 78 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20  xpr->iTable );. 
6860: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
6870: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
6880: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
6890: 5f 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20  _Set, iParm, 0, 
68a0: 30 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  0, 0, 0);.      
68b0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
68c0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
68d0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
68e0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
68f0: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  st).        **..
6900: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
6910: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
6920: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
6930: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
6940: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
6950: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
6960: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
6970: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
6980: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
6990: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
69a0: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
69b0: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
69c0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
69d0: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
69e0: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
69f0: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
6a00: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
6a10: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
6a20: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
6a30: 73 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20  st *affStr;.    
6a40: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
6a50: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
6a60: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
6a70: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
6a80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
6a90: 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33  affStr = sqlite3
6aa0: 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61  AffinityString(a
6ab0: 66 66 69 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20  ffinity);..     
6ac0: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
6ad0: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
6ae0: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
6af0: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
6b00: 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70  (i=0; i<pExpr->p
6b10: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
6b20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
6b30: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
6b40: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
6b50: 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
6b60: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
6b70: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
6b80: 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c 69 64  nstant and valid
6b90: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
6ba0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
6bb0: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
6bc0: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
6bd0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
6be0: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
6bf0: 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20      "right-hand 
6c00: 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61  side of IN opera
6c10: 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  tor must be cons
6c20: 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  tant");.        
6c30: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
6c40: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6c50: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
6c60: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
6c70: 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20   pE2, 0, 0) ){. 
6c80: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
6c90: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
6ca0: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
6cb0: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
6cc0: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
6cd0: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
6ce0: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
6cf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
6d00: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
6d10: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
6d20: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
6d30: 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30  OP_MakeKey, 1, 0
6d40: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41  , affStr, P3_STA
6d50: 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20  TIC);.          
6d60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6d70: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
6d80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
6d90: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6da0: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
6db0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6dc0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
6dd0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
6de0: 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63  ak;.    }..    c
6df0: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
6e00: 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68  .      /* This h
6e10: 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
6e20: 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
6e30: 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
6e40: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
6e50: 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
6e60: 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
6e70: 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
6e80: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
6e90: 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
6ea0: 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
6eb0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
6ec0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6ed0: 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b   pParse->nMem++;
6ee0: 0a 20 20 20 20 20 20 69 66 28 73 71 6c 69 74 65  .      if(sqlite
6ef0: 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20  3Select(pParse, 
6f00: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20  pExpr->pSelect, 
6f10: 53 52 54 5f 4d 65 6d 2c 70 45 78 70 72 2d 3e 69  SRT_Mem,pExpr->i
6f20: 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30 2c 30 29 29  Column,0,0,0,0))
6f30: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6f40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6f60: 20 20 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65      /* For all e
6f70: 6c 73 65 2c 20 6a 75 73 74 20 72 65 63 75 72 73  lse, just recurs
6f80: 69 76 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 74  ively walk the t
6f90: 72 65 65 20 2a 2f 0a 20 20 20 20 64 65 66 61 75  ree */.    defau
6fa0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
6fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20  pExpr->pLeft.   
6fc0: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
6fd0: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
6fe0: 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45  se, pSrcList, pE
6ff0: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65  List, pExpr->pLe
7000: 66 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ft) ){.        r
7010: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7020: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
7030: 2d 3e 70 52 69 67 68 74 20 0a 20 20 20 20 20 20  ->pRight .      
7040: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  && sqlite3ExprRe
7050: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
7060: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
7070: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
7080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
7090: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
70a0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
70b0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
70c0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
70d0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
70e0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
70f0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
7100: 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b   i<pList->nExpr;
7110: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
7120: 20 45 78 70 72 20 2a 70 41 72 67 20 3d 20 70 4c   Expr *pArg = pL
7130: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
7140: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73  .          if( s
7150: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
7160: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72  eIds(pParse, pSr
7170: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
7180: 41 72 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20  Arg) ){.        
7190: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
71a0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
71b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
71c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  }.  }.  return 0
71d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72  ;.}../*.** pExpr
71e0: 20 69 73 20 61 20 6e 6f 64 65 20 74 68 61 74 20   is a node that 
71f0: 64 65 66 69 6e 65 73 20 61 20 66 75 6e 63 74 69  defines a functi
7200: 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e  on of some kind.
7210: 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65    It might.** be
7220: 20 61 20 73 79 6e 74 61 63 74 69 63 20 66 75 6e   a syntactic fun
7230: 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63 6f 75 6e  ction like "coun
7240: 74 28 78 29 22 20 6f 72 20 69 74 20 6d 69 67 68  t(x)" or it migh
7250: 74 20 62 65 20 61 20 66 75 6e 63 74 69 6f 6e 0a  t be a function.
7260: 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  ** that implemen
7270: 74 73 20 61 6e 20 6f 70 65 72 61 74 6f 72 2c 20  ts an operator, 
7280: 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20 62 22 2e  like "a LIKE b".
7290: 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f    .**.** This ro
72a0: 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a 70 7a 4e  utine makes *pzN
72b0: 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ame point to the
72c0: 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e   name of the fun
72d0: 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a 70  ction and .** *p
72e0: 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68 65 20 6e  nName hold the n
72f0: 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74  umber of charact
7300: 65 72 73 20 69 6e 20 74 68 65 20 66 75 6e 63 74  ers in the funct
7310: 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61  ion name..*/.sta
7320: 74 69 63 20 76 6f 69 64 20 67 65 74 46 75 6e 63  tic void getFunc
7330: 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72 20 2a 70  tionName(Expr *p
7340: 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72  Expr, const char
7350: 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a   **pzName, int *
7360: 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77 69 74 63  pnName){.  switc
7370: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
7380: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
7390: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2a 70  TION: {.      *p
73a0: 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74  zName = pExpr->t
73b0: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a 70  oken.z;.      *p
73c0: 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74  nName = pExpr->t
73d0: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 62 72  oken.n;.      br
73e0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
73f0: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a 20  ase TK_LIKE: {. 
7400: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22       *pzName = "
7410: 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e  like";.      *pn
7420: 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20  Name = 4;.      
7430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
7440: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b   case TK_GLOB: {
7450: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
7460: 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20 20 20 2a   "glob";.      *
7470: 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20  pnName = 4;.    
7480: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7490: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
74a0: 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63      *pzName = "c
74b0: 61 6e 27 74 20 68 61 70 70 65 6e 22 3b 0a 20 20  an't happen";.  
74c0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32      *pnName = 12
74d0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
74e0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
74f0: 2a 20 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68  * Error check th
7500: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61  e functions in a
7510: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d  n expression.  M
7520: 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20  ake sure all.** 
7530: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61  function names a
7540: 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e  re recognized an
7550: 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20  d all functions 
7560: 68 61 76 65 20 74 68 65 20 63 6f 72 72 65 63 74  have the correct
7570: 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  .** number of ar
7580: 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20  guments.  Leave 
7590: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
75a0: 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72   in pParse->zErr
75b0: 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69  Msg.** if anythi
75c0: 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65  ng is amiss.  Re
75d0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
75e0: 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a  of errors..**.**
75f0: 20 69 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f   if pIsAgg is no
7600: 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20  t null and this 
7610: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e  expression is an
7620: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
7630: 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75  ion.** (like cou
7640: 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c  nt(*) or max(val
7650: 75 65 29 29 20 74 68 65 6e 20 77 72 69 74 65 20  ue)) then write 
7660: 61 20 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67  a 1 into *pIsAgg
7670: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
7680: 45 78 70 72 43 68 65 63 6b 28 50 61 72 73 65 20  ExprCheck(Parse 
7690: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
76a0: 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41  Expr, int allowA
76b0: 67 67 2c 20 69 6e 74 20 2a 70 49 73 41 67 67 29  gg, int *pIsAgg)
76c0: 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  {.  int nErr = 0
76d0: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
76e0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73   ) return 0;.  s
76f0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
7700: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
7710: 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54  GLOB:.    case T
7720: 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65  K_LIKE:.    case
7730: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
7740: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
7750: 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78  xpr->pList ? pEx
7760: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
7770: 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72   : 0;  /* Number
7780: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
7790: 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75  .      int no_su
77a0: 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20  ch_func = 0;    
77b0: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f     /* True if no
77c0: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65   such function e
77d0: 78 69 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  xists */.      i
77e0: 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  nt wrong_num_arg
77f0: 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72  s = 0;     /* Tr
7800: 75 65 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62  ue if wrong numb
7810: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
7820: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f  */.      int is_
7830: 61 67 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20  agg = 0;        
7840: 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20       /* True if 
7850: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
7860: 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  function */.    
7870: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69    int i;.      i
7880: 6e 74 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20  nt nId;         
7890: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75             /* Nu
78a0: 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65  mber of characte
78b0: 72 73 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e  rs in function n
78c0: 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e  ame */.      con
78d0: 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20  st char *zId;   
78e0: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
78f0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a  function name. *
7900: 2f 0a 20 20 20 20 20 20 46 75 6e 63 44 65 66 20  /.      FuncDef 
7910: 2a 70 44 65 66 3b 0a 0a 20 20 20 20 20 20 67 65  *pDef;..      ge
7920: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45  tFunctionName(pE
7930: 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29  xpr, &zId, &nId)
7940: 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73  ;.      pDef = s
7950: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
7960: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
7970: 49 64 2c 20 6e 49 64 2c 20 6e 2c 20 30 29 3b 0a  Id, nId, n, 0);.
7980: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
7990: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
79a0: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
79b0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
79c0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
79d0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
79e0: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
79f0: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
7a00: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
7a10: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7a20: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
7a30: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7a40: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7a50: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
7a60: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
7a70: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7a80: 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77  is_agg && !allow
7a90: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Agg ){.        s
7aa0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7ab0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
7ac0: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
7ad0: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
7ae0: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
7af0: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
7b00: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
7b10: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
7b20: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
7b30: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7b40: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
7b50: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
7b60: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
7b70: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
7b80: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
7b90: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
7ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
7bb0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
7bc0: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
7bd0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
7be0: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
7bf0: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
7c00: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
7c10: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
7c20: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
7c30: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
7c40: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
7c50: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
7c60: 20 20 20 20 69 66 28 20 70 49 73 41 67 67 20 29      if( pIsAgg )
7c70: 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20   *pIsAgg = 1;.  
7c80: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
7c90: 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
7ca0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
7cb0: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
7cc0: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
7cd0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
7ce0: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20  >a[i].pExpr,.   
7cf0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d00: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f              allo
7d10: 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c  wAgg && !is_agg,
7d20: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
7d30: 7d 0a 20 20 20 20 20 20 2f 2a 2a 20 54 4f 44 4f  }.      /** TODO
7d40: 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72  :  Compute pExpr
7d50: 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64  ->affinity based
7d60: 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64   on the expected
7d70: 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a   return.      **
7d80: 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e   type of the fun
7d90: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 7d 0a 20  ction */.    }. 
7da0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
7db0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
7dc0: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
7dd0: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
7de0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
7df0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c  pExpr->pLeft, al
7e00: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
7e10: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7e20: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
7e30: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
7e40: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
7e50: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
7e60: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
7e70: 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20  ight, allowAgg, 
7e80: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  pIsAgg);.      }
7e90: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
7ea0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
7eb0: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
7ec0: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
7ed0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
7ee0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
7ef0: 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d    for(i=0; nErr=
7f00: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
7f10: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
7f20: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
7f30: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
7f40: 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20  .          nErr 
7f50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  = sqlite3ExprChe
7f60: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  ck(pParse, pE2, 
7f70: 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67  allowAgg, pIsAgg
7f80: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
7f90: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
7fa0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
7fb0: 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn nErr;.}../*
7fc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
7fd0: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
7fe0: 5f 2a 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  _* affinity type
7ff0: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  s that indicates
8000: 20 74 68 65 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64   the likely.** d
8010: 61 74 61 20 74 79 70 65 20 6f 66 20 74 68 65 20  ata type of the 
8020: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 67 69  result of the gi
8030: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
8040: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 20  **.** Not every 
8050: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
8060: 20 66 69 78 65 64 20 74 79 70 65 2e 20 20 49 66   fixed type.  If
8070: 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74   the type cannot
8080: 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   be determined.*
8090: 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  * at compile-tim
80a0: 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 72  e, then try to r
80b0: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
80c0: 66 66 69 6e 69 74 79 20 69 66 20 74 68 65 20 65  ffinity if the e
80d0: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
80e0: 61 20 63 6f 6c 75 6d 6e 2e 20 20 4f 74 68 65 72  a column.  Other
80f0: 77 69 73 65 20 6a 75 73 74 20 72 65 74 75 72 6e  wise just return
8100: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8110: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
8120: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
8130: 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 45  s() and sqlite3E
8140: 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75 74 69  xprCheck() routi
8150: 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  nes must have.**
8160: 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c 6c 65   both been calle
8170: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
8180: 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20 69 73  ion before it is
8190: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
81a0: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
81b0: 73 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28  sqlite3ExprType(
81c0: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
81d0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
81e0: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
81f0: 20 77 68 69 6c 65 28 20 70 20 29 20 73 77 69 74   while( p ) swit
8200: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
8210: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
8220: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51  .      return SQ
8230: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 0a  LITE_AFF_TEXT;..
8240: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a      case TK_AS:.
8250: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65        p = p->pLe
8260: 66 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  ft;.      break;
8270: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55  ..    case TK_NU
8280: 4c 4c 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  LL:.      return
8290: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
82a0: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  ;..    case TK_S
82b0: 45 4c 45 43 54 3a 20 20 20 2f 2a 2a 2a 20 46 49  ELECT:   /*** FI
82c0: 58 20 4d 45 20 2a 2a 2a 2a 2f 0a 20 20 20 20 63  X ME ****/.    c
82d0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 20  ase TK_COLUMN:  
82e0: 20 2f 2a 2a 2a 20 46 49 58 20 4d 45 20 2a 2a 2a   /*** FIX ME ***
82f0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  */.    case TK_C
8300: 41 53 45 3a 20 20 20 20 20 2f 2a 2a 2a 20 46 49  ASE:     /*** FI
8310: 58 20 4d 45 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20  X ME ****/..    
8320: 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72  default:.      r
8330: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
8340: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a 20 20  _NUMERIC;.  }.  
8350: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
8360: 46 5f 4e 4f 4e 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  F_NONE;.}../*.**
8370: 20 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73   Generate an ins
8380: 74 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69  truction that wi
8390: 6c 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67  ll put the integ
83a0: 65 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a  er describe by.*
83b0: 2a 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d  * text z[0..n-1]
83c0: 20 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a   on the stack..*
83d0: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f  /.static void co
83e0: 64 65 49 6e 74 65 67 65 72 28 56 64 62 65 20 2a  deInteger(Vdbe *
83f0: 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  v, const char *z
8400: 2c 20 69 6e 74 20 6e 29 7b 0a 20 20 69 6e 74 20  , int n){.  int 
8410: 69 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  i;.  if( sqlite3
8420: 47 65 74 49 6e 74 33 32 28 7a 2c 20 26 69 29 20  GetInt32(z, &i) 
8430: 7c 7c 20 28 69 3d 30 2c 20 73 71 6c 69 74 65 33  || (i=0, sqlite3
8440: 46 69 74 73 49 6e 36 34 42 69 74 73 28 7a 29 29  FitsIn64Bits(z))
8450: 21 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  !=0 ){.    sqlit
8460: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
8470: 49 6e 74 65 67 65 72 2c 20 69 2c 20 30 2c 20 7a  Integer, i, 0, z
8480: 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  , n);.  }else{. 
8490: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
84a0: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
84b0: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 0a 7d   0, z, n);.  }.}
84c0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
84d0: 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65 20 63   code into the c
84e0: 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f 20 65  urrent Vdbe to e
84f0: 76 61 6c 75 61 74 65 20 74 68 65 20 67 69 76 65  valuate the give
8500: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
8510: 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20 72 65  and leave the re
8520: 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f 70 20  sult on the top 
8530: 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76 6f 69  of stack..*/.voi
8540: 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
8550: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
8560: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
8570: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
8580: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
8590: 6f 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c  op;.  if( v==0 |
85a0: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
85b0: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70  urn;.  switch( p
85c0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
85d0: 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20 20 20  case TK_PLUS:   
85e0: 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b 20 20    op = OP_Add;  
85f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8600: 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20 20 20  ase TK_MINUS:   
8610: 20 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72 61 63   op = OP_Subtrac
8620: 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  t; break;.    ca
8630: 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20 20 20  se TK_STAR:     
8640: 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70 6c 79  op = OP_Multiply
8650: 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
8660: 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20 20 6f  e TK_SLASH:    o
8670: 70 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b 20 20  p = OP_Divide;  
8680: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8690: 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20 6f 70   TK_AND:      op
86a0: 20 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20 20 20   = OP_And;      
86b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
86c0: 54 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f 70 20  TK_OR:       op 
86d0: 3d 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20 20 62  = OP_Or;       b
86e0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
86f0: 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LT:       op =
8700: 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72   OP_Lt;       br
8710: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8720: 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _LE:       op = 
8730: 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Le;       bre
8740: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8750: 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GT:       op = O
8760: 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Gt;       brea
8770: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  k;.    case TK_G
8780: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
8790: 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ge;       break
87a0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  ;.    case TK_NE
87b0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
87c0: 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ne;       break;
87d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
87e0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45         op = OP_E
87f0: 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  q;       break;.
8800: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
8810: 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73  LL:   op = OP_Is
8820: 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20  Null;   break;. 
8830: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
8840: 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74  LL:  op = OP_Not
8850: 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20  Null;  break;.  
8860: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 20    case TK_NOT:  
8870: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 3b      op = OP_Not;
8880: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8890: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
88a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67 61 74     op = OP_Negat
88b0: 69 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  ive; break;.    
88c0: 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 20  case TK_BITAND: 
88d0: 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74 41 6e 64    op = OP_BitAnd
88e0: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
88f0: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20 20 20  ase TK_BITOR:   
8900: 20 6f 70 20 3d 20 4f 50 5f 42 69 74 4f 72 3b 20   op = OP_BitOr; 
8910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8920: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 20  se TK_BITNOT:   
8930: 6f 70 20 3d 20 4f 50 5f 42 69 74 4e 6f 74 3b 20  op = OP_BitNot; 
8940: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8950: 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20 20 6f  e TK_LSHIFT:   o
8960: 70 20 3d 20 4f 50 5f 53 68 69 66 74 4c 65 66 74  p = OP_ShiftLeft
8970: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
8980: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 20 20  se TK_RSHIFT:   
8990: 6f 70 20 3d 20 4f 50 5f 53 68 69 66 74 52 69 67  op = OP_ShiftRig
89a0: 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ht; break;.    c
89b0: 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20 20 20  ase TK_REM:     
89c0: 20 6f 70 20 3d 20 4f 50 5f 52 65 6d 61 69 6e 64   op = OP_Remaind
89d0: 65 72 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  er;  break;.    
89e0: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 20  case TK_FLOAT:  
89f0: 20 20 6f 70 20 3d 20 4f 50 5f 52 65 61 6c 3b 20    op = OP_Real; 
8a00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a10: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
8a20: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 74 72 69 6e     op = OP_Strin
8a30: 67 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  g;     break;.  
8a40: 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b    default: break
8a50: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8a60: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8a70: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
8a80: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   {.      if( pPa
8a90: 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20  rse->useAgg ){. 
8aa0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8ab0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
8ac0: 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  gGet, 0, pExpr->
8ad0: 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iAgg);.      }el
8ae0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
8af0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
8b00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8b10: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
8b20: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
8b30: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
8b40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8b50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8b60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
8b70: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
8b80: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
8b90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ba0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8bb0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
8bc0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
8bd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
8be0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
8bf0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8c00: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8c10: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
8c20: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
8c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
8c40: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
8c50: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
8c60: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
8c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c80: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
8c90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8ca0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8cb0: 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  K_NULL: {.      
8cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
8cd0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20 30  (v, OP_String, 0
8ce0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
8cf0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8d00: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b  e TK_VARIABLE: {
8d10: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8d20: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61  beAddOp(v, OP_Va
8d30: 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  riable, pExpr->i
8d40: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
8d50: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
8d60: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20    case TK_LT:.  
8d70: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20    case TK_LE:.  
8d80: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20    case TK_GT:.  
8d90: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20    case TK_GE:.  
8da0: 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20    case TK_NE:.  
8db0: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a    case TK_EQ: {.
8dc0: 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 62        int p1 = b
8dd0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70  inaryCompareP1(p
8de0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
8df0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 30 29 3b 0a  pr->pRight, 0);.
8e00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
8e10: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
8e20: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
8e30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
8e40: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
8e50: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
8e60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8e70: 70 28 76 2c 20 6f 70 2c 20 70 31 2c 20 30 29 3b  p(v, op, p1, 0);
8e80: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8e90: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8ea0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
8eb0: 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
8ec0: 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
8ed0: 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
8ee0: 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
8ef0: 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
8f00: 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
8f10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8f20: 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
8f30: 53 4c 41 53 48 3a 20 7b 0a 20 20 20 20 20 20 73  SLASH: {.      s
8f40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
8f50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
8f60: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
8f70: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8f80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
8f90: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
8fa0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
8fb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
8fc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
8fd0: 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a  case TK_LSHIFT:.
8fe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
8ff0: 46 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  FT: {.      sqli
9000: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9010: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9020: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9030: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9040: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9050: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9060: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30  beAddOp(v, op, 0
9070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
9080: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9090: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
90a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
90c0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
90d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
90e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
90f0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9110: 28 76 2c 20 4f 50 5f 43 6f 6e 63 61 74 2c 20 32  (v, OP_Concat, 2
9120: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
9130: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9140: 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20  e TK_UMINUS: {. 
9150: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
9160: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
9170: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
9180: 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69 66  Left );.      if
9190: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
91a0: 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e  FLOAT || pLeft->
91b0: 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29  op==TK_INTEGER )
91c0: 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e 20  {.        Token 
91d0: 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b  *p = &pLeft->tok
91e0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61 72  en;.        char
91f0: 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c   *z = sqliteMall
9200: 6f 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a  oc( p->n + 2 );.
9210: 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66 28          sprintf(
9220: 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e  z, "-%.*s", p->n
9230: 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20  , p->z);.       
9240: 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d   if( pLeft->op==
9250: 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20  TK_FLOAT ){.    
9260: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9270: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
9280: 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31   0, 0, z, p->n+1
9290: 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65  );.        }else
92a0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64 65  {.          code
92b0: 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d  Integer(v, z, p-
92c0: 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20 7d  >n+1);.        }
92d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
92e0: 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20 20  ree(z);.        
92f0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20  break;.      }. 
9300: 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72       /* Fall thr
9310: 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54  ough into TK_NOT
9320: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63 61   */.    }.    ca
9330: 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20  se TK_BITNOT:.  
9340: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
9350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9360: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9370: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9380: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9390: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
93a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
93b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
93c0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
93d0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
93e0: 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b  .      int dest;
93f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9400: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
9410: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
9420: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9430: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9440: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9450: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56   dest = sqlite3V
9460: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9470: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
9480: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9490: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
94a0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
94b0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
94c0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
94d0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  }.    break;.   
94e0: 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e   case TK_AGG_FUN
94f0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73  CTION: {.      s
9500: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9510: 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c  v, OP_AggGet, 0,
9520: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
9530: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9540: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  }.    case TK_GL
9550: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OB:.    case TK_
9560: 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54  LIKE:.    case T
9570: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
9580: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
9590: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
95a0: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
95b0: 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
95c0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
95d0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
95e0: 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
95f0: 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
9600: 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
9610: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
9620: 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e  (pExpr, &zId, &n
9630: 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20  Id);.      pDef 
9640: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
9650: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
9660: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70  , zId, nId, nExp
9670: 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73  r, 0);.      ass
9680: 65 72 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a  ert( pDef!=0 );.
9690: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71        nExpr = sq
96a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
96b0: 72 4c 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c  rList(pParse, pL
96c0: 69 73 74 2c 20 70 44 65 66 2d 3e 69 6e 63 6c 75  ist, pDef->inclu
96d0: 64 65 54 79 70 65 73 29 3b 0a 20 20 20 20 20 20  deTypes);.      
96e0: 2f 2a 20 46 49 58 20 4d 45 3a 20 54 68 65 20 66  /* FIX ME: The f
96f0: 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 61 20 74 65  ollowing is a te
9700: 6d 70 6f 72 61 72 79 20 68 61 63 6b 2e 20 2a 2f  mporary hack. */
9710: 0a 20 20 20 20 20 20 69 66 28 20 30 3d 3d 73 71  .      if( 0==sq
9720: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 7a 49  lite3StrNICmp(zI
9730: 64 2c 20 22 63 6c 61 73 73 6f 66 22 2c 20 6e 49  d, "classof", nI
9740: 64 29 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73  d) ){.        as
9750: 73 65 72 74 28 20 6e 45 78 70 72 3d 3d 31 20 29  sert( nExpr==1 )
9760: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
9770: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9780: 5f 43 6c 61 73 73 2c 20 6e 45 78 70 72 2c 20 30  _Class, nExpr, 0
9790: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
97a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
97b0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  dbeOp3(v, OP_Fun
97c0: 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 30 2c  ction, nExpr, 0,
97d0: 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33   (char*)pDef, P3
97e0: 5f 50 4f 49 4e 54 45 52 29 3b 0a 20 20 20 20 20  _POINTER);.     
97f0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
9800: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9810: 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20  K_SELECT: {.    
9820: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9830: 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64  Op(v, OP_MemLoad
9840: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
9850: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
9860: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9870: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
9880: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
9890: 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66   char const *aff
98a0: 53 74 72 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46  Str;..      /* F
98b0: 69 67 75 72 65 20 6f 75 74 20 74 68 65 20 61 66  igure out the af
98c0: 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20 74 6f  finity to use to
98d0: 20 63 72 65 61 74 65 20 61 20 6b 65 79 20 66 72   create a key fr
98e0: 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  om the results. 
98f0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 65       ** of the e
9900: 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
9910: 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
9920: 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
9930: 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20 20 20  itable for.     
9940: 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b   ** P3 of OP_Mak
9950: 65 4b 65 79 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  eKey..      */. 
9960: 20 20 20 20 20 61 66 66 53 74 72 20 3d 20 73 71       affStr = sq
9970: 6c 69 74 65 33 41 66 66 69 6e 69 74 79 53 74 72  lite3AffinityStr
9980: 69 6e 67 28 63 6f 6d 70 61 72 69 73 6f 6e 41 66  ing(comparisonAf
9990: 66 69 6e 69 74 79 28 70 45 78 70 72 29 29 3b 0a  finity(pExpr));.
99a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
99b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
99c0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 0a 20  teger, 1, 0);.. 
99d0: 20 20 20 20 20 2f 2a 20 43 6f 64 65 20 74 68 65       /* Code the
99e0: 20 3c 65 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65   <expr> from "<e
99f0: 78 70 72 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20  xpr> IN (...)". 
9a00: 54 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  The temporary ta
9a10: 62 6c 65 0a 20 20 20 20 20 20 2a 2a 20 70 45 78  ble.      ** pEx
9a20: 70 72 2d 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61  pr->iTable conta
9a30: 69 6e 73 20 74 68 65 20 76 61 6c 75 65 73 20 74  ins the values t
9a40: 68 61 74 20 6d 61 6b 65 20 75 70 20 74 68 65 20  hat make up the 
9a50: 28 2e 2e 2e 29 20 73 65 74 2e 0a 20 20 20 20 20  (...) set..     
9a60: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
9a70: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9a80: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9a90: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
9aa0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
9ab0: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73  Addr(v);.      s
9ac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9ad0: 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d  v, OP_NotNull, -
9ae0: 31 2c 20 61 64 64 72 2b 34 29 3b 20 20 20 20 20  1, addr+4);     
9af0: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
9b00: 20 30 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69   0 */.      sqli
9b10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9b20: 4f 50 5f 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20  OP_Pop, 2, 0);. 
9b30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
9b50: 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  ng, 0, 0);.     
9b60: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9b70: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
9b80: 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20   addr+7);.      
9b90: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
9ba0: 2c 20 4f 50 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c  , OP_MakeKey, 1,
9bb0: 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53   0, affStr, P3_S
9bc0: 54 41 54 49 43 29 3b 20 2f 2a 20 61 64 64 72 20  TATIC); /* addr 
9bd0: 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  + 4 */.      sql
9be0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9bf0: 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
9c00: 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37  ->iTable, addr+7
9c10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9c20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9c30: 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20  AddImm, -1, 0); 
9c40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9c50: 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a   /* addr + 6 */.
9c60: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9c70: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9c80: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
9c90: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9ca0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9cb0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
9cc0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9cd0: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
9ce0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9cf0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9d00: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
9d10: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9d20: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d30: 28 76 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29  (v, OP_Ge, 0, 0)
9d40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9d50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
9d60: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
9d70: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9d80: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9d90: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
9da0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
9db0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9dc0: 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Le, 0, 0);.   
9dd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9de0: 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30  dOp(v, OP_And, 0
9df0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
9e00: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9e10: 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20  e TK_UPLUS:.    
9e20: 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
9e30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9e40: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9e50: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9e70: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
9e80: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
9e90: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
9ea0: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
9eb0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
9ec0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
9ed0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20  .      int i;.. 
9ee0: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
9ef0: 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20  r->pList);.     
9f00: 20 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e   assert((pExpr->
9f10: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32  pList->nExpr % 2
9f20: 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61  ) == 0);.      a
9f30: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
9f40: 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a  st->nExpr > 0);.
9f50: 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45        nExpr = pE
9f60: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
9f70: 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e  r;.      expr_en
9f80: 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65  d_label = sqlite
9f90: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
9fa0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
9fb0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
9fc0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9fd0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9fe0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9ff0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
a000: 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b  0; i<nExpr; i=i+
a010: 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  2){.        sqli
a020: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a030: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
a040: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
a050: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
a060: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
a070: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a080: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
a090: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
a0a0: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c    jumpInst = sql
a0b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a0c0: 20 4f 50 5f 4e 65 2c 20 31 2c 20 30 29 3b 0a 20   OP_Ne, 1, 0);. 
a0d0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a0e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a0f0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
a100: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a110: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
a120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a130: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
a140: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
a150: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a160: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a170: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
a180: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
a190: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a1a0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
a1b0: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
a1c0: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  el);.        add
a1d0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
a1e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
a1f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a200: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
a210: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
a220: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a230: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
a240: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a250: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a260: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
a270: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
a280: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
a290: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a2a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a2b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a2c0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a2d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a2e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a2f0: 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  g, 0, 0);.      
a300: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
a310: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
a320: 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65  v, expr_end_labe
a330: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
a340: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a350: 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
a360: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
a370: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
a380: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a390: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
a3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a3b0: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
a3c0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
a3d0: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
a3e0: 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20  ogram");.       
a3f0: 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b   pParse->nErr++;
a400: 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20  ..return;.      
a410: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
a420: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45  r->iColumn == OE
a430: 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20  _Rollback ||..  
a440: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
a450: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20  = OE_Abort ||.. 
a460: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
a470: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20  == OE_Fail ){.. 
a480: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a490: 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49  v, OP_Halt, SQLI
a4a0: 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70  TE_CONSTRAINT, p
a4b0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20  Expr->iColumn,. 
a4c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a4d0: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
a4e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
a4f0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73 71  >token.n);..  sq
a500: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
a510: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
a520: 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73 73   } else {..  ass
a530: 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ert( pExpr->iCol
a540: 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65  umn == OE_Ignore
a550: 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56 64   );..  sqlite3Vd
a560: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 6f 74 6f  beOp3(v, OP_Goto
a570: 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72 69  , 0, pParse->tri
a580: 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75  gStack->ignoreJu
a590: 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mp,.            
a5a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 22                 "
a5b0: 28 49 47 4e 4f 52 45 20 6a 75 6d 70 29 22 2c 20  (IGNORE jump)", 
a5c0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a5d0: 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  }.    break;.  }
a5e0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
a5f0: 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75 73  te code that pus
a600: 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f 66  hes the value of
a610: 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f   every element o
a620: 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65  f the given.** e
a630: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f  xpression list o
a640: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 20 20  nto the stack.  
a650: 49 66 20 74 68 65 20 69 6e 63 6c 75 64 65 54 79  If the includeTy
a660: 70 65 73 20 66 6c 61 67 20 69 73 20 74 72 75 65  pes flag is true
a670: 2c 0a 2a 2a 20 74 68 65 6e 20 61 6c 73 6f 20 70  ,.** then also p
a680: 75 73 68 20 61 20 73 74 72 69 6e 67 20 74 68 61  ush a string tha
a690: 74 20 69 73 20 74 68 65 20 64 61 74 61 74 79 70  t is the datatyp
a6a0: 65 20 6f 66 20 65 61 63 68 20 65 6c 65 6d 65 6e  e of each elemen
a6b0: 74 20 6f 6e 74 6f 0a 2a 2a 20 74 68 65 20 73 74  t onto.** the st
a6c0: 61 63 6b 20 61 66 74 65 72 20 74 68 65 20 76 61  ack after the va
a6d0: 6c 75 65 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  lue..**.** Retur
a6e0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
a6f0: 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20  elements pushed 
a700: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
a710: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
a720: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
a730: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a740: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
a750: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
a760: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20  rList *pList,   
a770: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
a780: 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
a790: 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 63 6c  ed */.  int incl
a7a0: 75 64 65 54 79 70 65 73 20 20 20 2f 2a 20 54 52  udeTypes   /* TR
a7b0: 55 45 20 74 6f 20 70 75 74 20 64 61 74 61 74 79  UE to put dataty
a7c0: 70 65 73 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  pes on the stack
a7d0: 20 74 6f 6f 20 2a 2f 0a 29 7b 0a 20 20 73 74 72   too */.){.  str
a7e0: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
a7f0: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20  m *pItem;.  int 
a800: 69 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b  i, n;.  Vdbe *v;
a810: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
a820: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20  ) return 0;.  v 
a830: 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  = sqlite3GetVdbe
a840: 28 70 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20  (pParse);.  n = 
a850: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
a860: 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d  for(pItem=pList-
a870: 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b  >a, i=0; i<n; i+
a880: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
a890: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a8a0: 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e  (pParse, pItem->
a8b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28 20  pExpr);.    if( 
a8c0: 69 6e 63 6c 75 64 65 54 79 70 65 73 20 29 7b 0a  includeTypes ){.
a8d0: 20 20 20 20 20 20 2f 2a 2a 20 44 45 50 52 45 43        /** DEPREC
a8e0: 41 54 45 44 2e 20 20 54 68 69 73 20 77 69 6c 6c  ATED.  This will
a8f0: 20 67 6f 20 61 77 61 79 20 77 69 74 68 20 74 68   go away with th
a900: 65 20 6e 65 77 20 66 75 6e 63 74 69 6f 6e 20 69  e new function i
a910: 6e 74 65 72 66 61 63 65 20 2a 2a 2f 0a 20 20 20  nterface **/.   
a920: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
a930: 33 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 2c 20  3(v, OP_String, 
a940: 30 2c 20 30 2c 20 22 6e 75 6d 65 72 69 63 22 2c  0, 0, "numeric",
a950: 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20 20   P3_STATIC);.   
a960: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
a970: 69 6e 63 6c 75 64 65 54 79 70 65 73 20 3f 20 6e  includeTypes ? n
a980: 2a 32 20 3a 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  *2 : n;.}../*.**
a990: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
a9a0: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
a9b0: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
a9c0: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
a9d0: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
a9e0: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
a9f0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
aa00: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
aa10: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
aa20: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
aa30: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
aa40: 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  false..**.** If 
aa50: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
aa60: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
aa70: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
aa80: 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a  or false), then.
aa90: 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70  ** take the jump
aaa0: 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75   if the jumpIfNu
aab0: 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e  ll flag is true.
aac0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
aad0: 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73 65  ExprIfTrue(Parse
aae0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
aaf0: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
ab00: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
ab10: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
ab20: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
ab30: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28  nt op = 0;.  if(
ab40: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
ab50: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
ab60: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
ab70: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  ){.    case TK_L
ab80: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
ab90: 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Lt;       break
aba0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
abb0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
abc0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
abd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
abe0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
abf0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
ac00: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
ac10: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65        op = OP_Ge
ac20: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
ac30: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
ac40: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
ac50: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ac60: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
ac70: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20      op = OP_Eq; 
ac80: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ac90: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
aca0: 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c     op = OP_IsNul
acb0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
acc0: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
acd0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c    op = OP_NotNul
ace0: 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  l;  break;.    d
acf0: 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a  efault:  break;.
ad00: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
ad10: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
ad20: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
ad30: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
ad40: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
ad50: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
ad60: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
ad70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
ad80: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
ad90: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
ada0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
adb0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
adc0: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
add0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
ade0: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
adf0: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
ae00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ae10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
ae20: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
ae30: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
ae40: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
ae50: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
ae60: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
ae70: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
ae80: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
ae90: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
aea0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
aeb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
aec0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
aed0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
aee0: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
aef0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
af00: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
af10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
af20: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
af30: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
af40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
af50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
af60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
af70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
af80: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  : {.      int p1
af90: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
afa0: 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  P1(pExpr->pLeft,
afb0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
afc0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
afd0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
afe0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
aff0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b000: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b010: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b020: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
b030: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b040: 2c 20 6f 70 2c 20 70 31 2c 20 64 65 73 74 29 3b  , op, p1, dest);
b050: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b060: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b070: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
b080: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
b090: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b0a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b0b0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b0c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b0d0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
b0e0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
b0f0: 0a 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20  .    }.#if 0.   
b100: 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20   case TK_IN: {. 
b110: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
b120: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b130: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b140: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b150: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
b160: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
b170: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b180: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b190: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
b1a0: 64 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c  dr+3);.      sql
b1b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b1c0: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
b1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b1e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
b1f0: 6f 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  o, 0, jumpIfNull
b200: 20 3f 20 64 65 73 74 20 3a 20 61 64 64 72 2b 34   ? dest : addr+4
b210: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  );.      if( pEx
b220: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
b230: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b240: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f  beAddOp(v, OP_Fo
b250: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
b260: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
b270: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
b280: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b290: 28 76 2c 20 4f 50 5f 53 65 74 46 6f 75 6e 64 2c  (v, OP_SetFound,
b2a0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
b2b0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  dest);.      }. 
b2c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b2d0: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  }.#endif.    cas
b2e0: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
b2f0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
b300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b310: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
b320: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
b330: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b340: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
b350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
b360: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b370: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
b380: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
b390: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
b3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b3b0: 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49 66 4e 75  OP_Lt, !jumpIfNu
b3c0: 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71  ll, 0);.      sq
b3d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b3e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
b3f0: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
b400: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b410: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65  beAddOp(v, OP_Le
b420: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
b430: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
b440: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b450: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29  P_Integer, 0, 0)
b460: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b470: 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61  dbeChangeP2(v, a
b480: 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65  ddr, sqlite3Vdbe
b490: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b  CurrentAddr(v));
b4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b4b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
b4c0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
b4d0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b4e0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
b4f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b500: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
b510: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b520: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b530: 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  f, jumpIfNull, d
b540: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
b550: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
b560: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
b570: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
b580: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
b590: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
b5a0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
b5b0: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
b5c0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
b5d0: 73 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63  s false but exec
b5e0: 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75  ution.** continu
b5f0: 65 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75  es straight thru
b600: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
b610: 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  on is true..**.*
b620: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
b630: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
b640: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
b650: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74  rue nor false) t
b660: 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a  hen.** jump if j
b670: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
b680: 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  e or fall throug
b690: 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  h if jumpIfNull 
b6a0: 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69  is false..*/.voi
b6b0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46  d sqlite3ExprIfF
b6c0: 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72  alse(Parse *pPar
b6d0: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
b6e0: 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
b6f0: 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
b700: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
b710: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
b720: 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20  = 0;.  if( v==0 
b730: 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  || pExpr==0 ) re
b740: 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20  turn;.  switch( 
b750: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
b760: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
b770: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
b780: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b790: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
b7a0: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
b7b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b7c0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
b7d0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
b7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b7f0: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
b800: 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20  op = OP_Lt;     
b810: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b820: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
b830: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
b840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b850: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
b860: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
b870: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b880: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
b890: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
b8a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b8b0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
b8c0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
b8d0: 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  eak;.    default
b8e0: 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20  :  break;.  }.  
b8f0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
b900: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
b910: 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71  _AND: {.      sq
b920: 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65  lite3ExprIfFalse
b930: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b940: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
b950: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
b960: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
b970: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
b980: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
b990: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b9a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b9b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
b9c0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
b9d0: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b9e0: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b9f0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
ba00: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ba10: 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d  >pLeft, d2, !jum
ba20: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ba30: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
ba40: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
ba50: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
ba60: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
ba70: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ba80: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
ba90: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
baa0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
bab0: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73  K_NOT: {.      s
bac0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
bad0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bae0: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
baf0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
bb00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bb10: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20   case TK_LT:.   
bb20: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20   case TK_LE:.   
bb30: 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20   case TK_GT:.   
bb40: 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20   case TK_GE:.   
bb50: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20   case TK_NE:.   
bb60: 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20   case TK_EQ: {. 
bb70: 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20 62 69       int p1 = bi
bb80: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45  naryCompareP1(pE
bb90: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
bba0: 72 2d 3e 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  r->pRight, jumpI
bbb0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
bbc0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bbd0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
bbe0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
bbf0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
bc00: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
bc10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bc20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
bc30: 20 70 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   p1, dest);.    
bc40: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bc50: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
bc60: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
bc70: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
bc80: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bc90: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bca0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
bcb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bcc0: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
bcd0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bce0: 7d 0a 23 69 66 20 30 0a 20 20 20 20 63 61 73 65  }.#if 0.    case
bcf0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
bd00: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
bd10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bd20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bd30: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
bd40: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
bd50: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
bd60: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
bd80: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 33 29  ull, -1, addr+3)
bd90: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bda0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
bdb0: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
bdc0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bdd0: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
bde0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f 20 64 65   jumpIfNull ? de
bdf0: 73 74 20 3a 20 61 64 64 72 2b 34 29 3b 0a 20 20  st : addr+4);.  
be00: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
be10: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
be20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
be30: 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46 6f 75 6e  Op(v, OP_NotFoun
be40: 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
be50: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d  , dest);.      }
be60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
be70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
be80: 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f 75 6e 64  , OP_SetNotFound
be90: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
bea0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 0a   dest);.      }.
beb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bec0: 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
bed0: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
bee0: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
bef0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bf00: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
bf10: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
bf20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bf30: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
bf40: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
bf50: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
bf60: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
bf70: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
bf80: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
bf90: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
bfa0: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
bfb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bfc0: 2c 20 4f 50 5f 47 65 2c 20 21 6a 75 6d 70 49 66  , OP_Ge, !jumpIf
bfd0: 4e 75 6c 6c 2c 20 61 64 64 72 2b 33 29 3b 0a 20  Null, addr+3);. 
bfe0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bff0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
c000: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
c010: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c020: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65  , OP_Goto, 0, de
c030: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
c040: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c050: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
c060: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
c070: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c080: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74 2c 20 6a  ddOp(v, OP_Gt, j
c090: 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29  umpIfNull, dest)
c0a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c0b0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
c0c0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
c0d0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c0e0: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
c0f0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c100: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75  (v, OP_IfNot, ju
c110: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
c120: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c130: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
c140: 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
c150: 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
c160: 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
c170: 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
c180: 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
c190: 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
c1a0: 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
c1b0: 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
c1c0: 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69  in any way..*/.i
c1d0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
c1e0: 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
c1f0: 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
c200: 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
c210: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
c220: 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ==0;.  }else if(
c230: 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
c240: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
c250: 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
c260: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c270: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
c280: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
c290: 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
c2a0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
c2b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
c2c0: 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
c2d0: 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
c2e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
c2f0: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
c300: 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
c310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
c320: 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
c330: 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
c340: 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
c350: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
c360: 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
c370: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
c380: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
c390: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
c3a0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
c3b0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
c3c0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
c3d0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
c3e0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
c3f0: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
c400: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c410: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
c420: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
c430: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
c440: 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
c450: 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
c460: 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
c470: 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
c480: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
c490: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
c4a0: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
c4b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
c4c0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
c4d0: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
c4e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
c4f0: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
c500: 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pA->token.z, p
c510: 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  B->token.z, pB->
c520: 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65  token.n)!=0 ) re
c530: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
c540: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
c550: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
c560: 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  nt to the pParse
c570: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
c580: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e  nd return its in
c590: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
c5a0: 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f  nt appendAggInfo
c5b0: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
c5c0: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
c5d0: 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29  nAgg & 0x7)==0 )
c5e0: 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  {.    int amt = 
c5f0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38  pParse->nAgg + 8
c600: 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61  ;.    AggExpr *a
c610: 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Agg = sqliteReal
c620: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67  loc(pParse->aAgg
c630: 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61  , amt*sizeof(pPa
c640: 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a  rse->aAgg[0]));.
c650: 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20      if( aAgg==0 
c660: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
c670: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  -1;.    }.    pP
c680: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67  arse->aAgg = aAg
c690: 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  g;.  }.  memset(
c6a0: 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50  &pParse->aAgg[pP
c6b0: 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20  arse->nAgg], 0, 
c6c0: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
c6d0: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75  Agg[0]));.  retu
c6e0: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b  rn pParse->nAgg+
c6f0: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  +;.}../*.** Anal
c700: 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
c710: 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
c720: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
c730: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
c740: 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
c750: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
c760: 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
c770: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
c780: 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
c790: 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
c7a0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
c7b0: 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
c7c0: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
c7d0: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
c7e0: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
c7f0: 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
c800: 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
c810: 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
c820: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
c830: 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 45  s() and sqlite3E
c840: 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a  xprCheck()..**.*
c850: 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
c860: 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
c870: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
c880: 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
c890: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
c8a0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
c8b0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
c8c0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
c8d0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
c8e0: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
c8f0: 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20  nt i;.  AggExpr 
c900: 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20 6e 45 72  *aAgg;.  int nEr
c910: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 45  r = 0;..  if( pE
c920: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
c930: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
c940: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
c950: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
c960: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
c970: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
c980: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
c990: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
c9a0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
c9b0: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
c9c0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
c9d0: 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  ( aAgg[i].pExpr-
c9e0: 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
c9f0: 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
ca00: 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  && aAgg[i].pExpr
ca10: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
ca20: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
ca30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
ca40: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
ca50: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
ca60: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
ca70: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
ca80: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
ca90: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
caa0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
cab0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
cac0: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20  [i].isAgg = 0;. 
cad0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
cae0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
caf0: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
cb00: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
cb10: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
cb20: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
cb30: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
cb40: 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d  : {.      aAgg =
cb50: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20   pParse->aAgg;. 
cb60: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cb70: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
cb80: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
cb90: 21 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  !aAgg[i].isAgg )
cba0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
cbb0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
cbc0: 70 72 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69  prCompare(aAgg[i
cbd0: 5d 2e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ].pExpr, pExpr) 
cbe0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
cbf0: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
cc00: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
cc10: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
cc20: 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61  ){.        i = a
cc30: 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61  ppendAggInfo(pPa
cc40: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66  rse);.        if
cc50: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
cc60: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
cc70: 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20  ->aAgg[i].isAgg 
cc80: 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  = 1;.        pPa
cc90: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78  rse->aAgg[i].pEx
cca0: 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20  pr = pExpr;.    
ccb0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
ccc0: 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69  [i].pFunc = sqli
ccd0: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
cce0: 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20  pParse->db,.    
ccf0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
cd00: 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e  token.z, pExpr->
cd10: 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20  token.n,.       
cd20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69        pExpr->pLi
cd30: 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
cd40: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20 30 29  t->nExpr : 0, 0)
cd50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
cd60: 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b  pExpr->iAgg = i;
cd70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
cd80: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
cd90: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
cda0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
cdb0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
cdc0: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
cdd0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
cde0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
cdf0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ce00: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
ce10: 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20  pr->pRight ){.  
ce20: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
ce30: 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
ce40: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
ce50: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
ce60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ce70: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
ce80: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
ce90: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
cea0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
ceb0: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
cec0: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
ced0: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
cee0: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
cef0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
cf00: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
cf10: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
cf20: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
cf30: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
cf40: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
cf50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
cf60: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
cf70: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61  r;.}../*.** Loca
cf80: 74 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69  te a user functi
cf90: 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 20  on given a name 
cfa0: 61 6e 64 20 61 20 6e 75 6d 62 65 72 20 6f 66 20  and a number of 
cfb0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2a 20 52 65  arguments..** Re
cfc0: 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74  turn a pointer t
cfd0: 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  o the FuncDef st
cfe0: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
cff0: 69 6e 65 73 20 74 68 61 74 0a 2a 2a 20 66 75 6e  ines that.** fun
d000: 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e  ction, or return
d010: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75 6e   NULL if the fun
d020: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
d030: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xist..**.** If t
d040: 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61 72  he createFlag ar
d050: 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
d060: 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e  then a new (blan
d070: 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74  k) FuncDef.** st
d080: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
d090: 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74  ed and liked int
d0a0: 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75 63  o the "db" struc
d0b0: 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20  ture if a.** no 
d0c0: 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69 6f  matching functio
d0d0: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  n previously exi
d0e0: 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65 61  sted.  When crea
d0f0: 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a 2a  teFlag is true.*
d100: 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20 70  * and the nArg p
d110: 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c 20  arameter is -1, 
d120: 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63  then only a func
d130: 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70 74  tion that accept
d140: 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20  s.** any number 
d150: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c  of arguments wil
d160: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  l be returned..*
d170: 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c  *.** If createFl
d180: 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
d190: 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65 6e  nArg is -1, then
d1a0: 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69 64   the first valid
d1b0: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75  .** function fou
d1c0: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  nd is returned. 
d1d0: 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 76   A function is v
d1e0: 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20 78  alid if either x
d1f0: 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70  Func.** or xStep
d200: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2f   is non-zero..*/
d210: 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65  .FuncDef *sqlite
d220: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  3FindFunction(. 
d230: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
d240: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
d250: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
d260: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
d270: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
d280: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
d290: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
d2a0: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
d2b0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d2c0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d2d0: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
d2e0: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
d2f0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
d300: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
d310: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
d320: 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c  /.  int createFl
d330: 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65  ag     /* Create
d340: 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72   new entry if tr
d350: 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20  ue and does not 
d360: 6f 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20  otherwise exist 
d370: 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20  */.){.  FuncDef 
d380: 2a 70 46 69 72 73 74 2c 20 2a 70 2c 20 2a 70 4d  *pFirst, *p, *pM
d390: 61 79 62 65 3b 0a 20 20 70 46 69 72 73 74 20 3d  aybe;.  pFirst =
d3a0: 20 70 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73   p = (FuncDef*)s
d3b0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
d3c0: 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65  db->aFunc, zName
d3d0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 69 66 28 20  , nName);.  if( 
d3e0: 70 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67  p && !createFlag
d3f0: 20 26 26 20 6e 41 72 67 3c 30 20 29 7b 0a 20 20   && nArg<0 ){.  
d400: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
d410: 3e 78 46 75 6e 63 3d 3d 30 20 26 26 20 70 2d 3e  >xFunc==0 && p->
d420: 78 53 74 65 70 3d 3d 30 20 29 7b 20 70 20 3d 20  xStep==0 ){ p = 
d430: 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a 20 20 20 20  p->pNext; }.    
d440: 72 65 74 75 72 6e 20 70 3b 0a 20 20 7d 0a 20 20  return p;.  }.  
d450: 70 4d 61 79 62 65 20 3d 20 30 3b 0a 20 20 77 68  pMaybe = 0;.  wh
d460: 69 6c 65 28 20 70 20 26 26 20 70 2d 3e 6e 41 72  ile( p && p->nAr
d470: 67 21 3d 6e 41 72 67 20 29 7b 0a 20 20 20 20 69  g!=nArg ){.    i
d480: 66 28 20 70 2d 3e 6e 41 72 67 3c 30 20 26 26 20  f( p->nArg<0 && 
d490: 21 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 28  !createFlag && (
d4a0: 70 2d 3e 78 46 75 6e 63 20 7c 7c 20 70 2d 3e 78  p->xFunc || p->x
d4b0: 53 74 65 70 29 20 29 20 70 4d 61 79 62 65 20 3d  Step) ) pMaybe =
d4c0: 20 70 3b 0a 20 20 20 20 70 20 3d 20 70 2d 3e 70   p;.    p = p->p
d4d0: 4e 65 78 74 3b 0a 20 20 7d 0a 20 20 69 66 28 20  Next;.  }.  if( 
d4e0: 70 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67  p && !createFlag
d4f0: 20 26 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20   && p->xFunc==0 
d500: 26 26 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29  && p->xStep==0 )
d510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
d520: 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26    }.  if( p==0 &
d530: 26 20 70 4d 61 79 62 65 20 29 7b 0a 20 20 20 20  & pMaybe ){.    
d540: 61 73 73 65 72 74 28 20 63 72 65 61 74 65 46 6c  assert( createFl
d550: 61 67 3d 3d 30 20 29 3b 0a 20 20 20 20 72 65 74  ag==0 );.    ret
d560: 75 72 6e 20 70 4d 61 79 62 65 3b 0a 20 20 7d 0a  urn pMaybe;.  }.
d570: 20 20 69 66 28 20 70 3d 3d 30 20 26 26 20 63 72    if( p==0 && cr
d580: 65 61 74 65 46 6c 61 67 20 26 26 20 28 70 20 3d  eateFlag && (p =
d590: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
d5a0: 7a 65 6f 66 28 2a 70 29 29 29 21 3d 30 20 29 7b  zeof(*p)))!=0 ){
d5b0: 0a 20 20 20 20 70 2d 3e 6e 41 72 67 20 3d 20 6e  .    p->nArg = n
d5c0: 41 72 67 3b 0a 20 20 20 20 70 2d 3e 70 4e 65 78  Arg;.    p->pNex
d5d0: 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
d5e0: 70 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 70 46  p->dataType = pF
d5f0: 69 72 73 74 20 3f 20 70 46 69 72 73 74 2d 3e 64  irst ? pFirst->d
d600: 61 74 61 54 79 70 65 20 3a 20 53 51 4c 49 54 45  ataType : SQLITE
d610: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 73 71  _NUMERIC;.    sq
d620: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
d630: 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d  &db->aFunc, zNam
d640: 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a  e, nName, (void*
d650: 29 70 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  )p);.  }.  retur
d660: 6e 20 70 3b 0a 7d 0a                             n p;.}.