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

Artifact 34fceec0ae7d9108d6cf98b0685d3d2afa962728:


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 33 20 32 30 30 34 2f 30 35 2f 31 39 20  .123 2004/05/19 
0220: 32 30 3a 34 31 3a 30 33 20 64 72 68 20 45 78 70  20:41:03 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 63 68 61 72 20 73 71 6c 69  ty;.}..char sqli
0690: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
06a0: 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  ty(Expr *pExpr, 
06b0: 63 68 61 72 20 61 66 66 32 29 7b 0a 20 20 63 68  char aff2){.  ch
06c0: 61 72 20 61 66 66 31 20 3d 20 73 71 6c 69 74 65  ar aff1 = sqlite
06d0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
06e0: 78 70 72 29 3b 0a 20 20 69 66 28 20 61 66 66 31  xpr);.  if( aff1
06f0: 20 26 26 20 61 66 66 32 20 29 7b 0a 20 20 20 20   && aff2 ){.    
0700: 2f 2a 20 42 6f 74 68 20 73 69 64 65 73 20 6f 66  /* Both sides of
0710: 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   the comparison 
0720: 61 72 65 20 63 6f 6c 75 6d 6e 73 2e 20 49 66 20  are columns. If 
0730: 6f 6e 65 20 68 61 73 20 6e 75 6d 65 72 69 63 20  one has numeric 
0740: 6f 72 0a 20 20 20 20 2a 2a 20 69 6e 74 65 67 65  or.    ** intege
0750: 72 20 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20  r affinity, use 
0760: 74 68 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20  that. Otherwise 
0770: 75 73 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e  use no affinity.
0780: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
0790: 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46 46  aff1==SQLITE_AFF
07a0: 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66 66 32  _INTEGER || aff2
07b0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
07c0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 72 65  EGER ){.      re
07d0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
07e0: 49 4e 54 45 47 45 52 3b 0a 20 20 20 20 7d 65 6c  INTEGER;.    }el
07f0: 73 65 20 69 66 28 20 61 66 66 31 3d 3d 53 51 4c  se if( aff1==SQL
0800: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
0810: 7c 7c 20 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f  || aff2==SQLITE_
0820: 41 46 46 5f 4e 55 4d 45 52 49 43 20 29 7b 0a 20  AFF_NUMERIC ){. 
0830: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0840: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
0850: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
0860: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0870: 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20  FF_NONE;.    }. 
0880: 20 7d 65 6c 73 65 20 69 66 28 20 21 61 66 66 31   }else if( !aff1
0890: 20 26 26 20 21 61 66 66 32 20 29 7b 0a 20 20 20   && !aff2 ){.   
08a0: 20 2f 2a 20 4e 65 69 74 68 65 72 20 73 69 64 65   /* Neither side
08b0: 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69 73   of the comparis
08c0: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2e 20  on is a column. 
08d0: 55 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  Use numeric affi
08e0: 6e 69 74 79 0a 20 20 20 20 2a 2a 20 66 6f 72 20  nity.    ** for 
08f0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a  the comparison..
0900: 20 20 20 20 2a 2f 0a 20 20 20 20 72 65 74 75 72      */.    retur
0910: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
0920: 45 52 49 43 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  ERIC;.  }else{. 
0930: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
0940: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
0950: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
0960: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
0970: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
0980: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
0990: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 73 74 61 74  f2);.  }.}..stat
09a0: 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73  ic char comparis
09b0: 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  onAffinity(Expr 
09c0: 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20  *pExpr){.  char 
09d0: 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70  aff;.  assert( p
09e0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20  Expr->op==TK_EQ 
09f0: 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  || pExpr->op==TK
0a00: 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70  _IN || pExpr->op
0a10: 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20  ==TK_LT ||.     
0a20: 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d       pExpr->op==
0a30: 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_GT || pExpr->
0a40: 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78  op==TK_GE || pEx
0a50: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c  pr->op==TK_LE ||
0a60: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
0a70: 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20  ->op==TK_NE );. 
0a80: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
0a90: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
0aa0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
0ab0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
0ac0: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
0ad0: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
0ae0: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0af0: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0b00: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
0b10: 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20  .  }.  else if( 
0b20: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
0b30: 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69  {.    aff = sqli
0b40: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
0b50: 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  ty(pExpr->pSelec
0b60: 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e  t->pEList->a[0].
0b70: 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d  pExpr, aff);.  }
0b80: 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66  .  else if( !aff
0b90: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51   ){.    aff = SQ
0ba0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0bb0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61  ;.  }.  return a
0bc0: 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78  ff;.}../*.** pEx
0bd0: 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73  pr is a comparis
0be0: 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65  on expression, e
0bf0: 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28  g. '=', '<', IN(
0c00: 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78  ...) etc..** idx
0c10: 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65  _affinity is the
0c20: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20   affinity of an 
0c30: 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20  indexed column. 
0c40: 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69  Return true.** i
0c50: 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68  f the index with
0c60: 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66   affinity idx_af
0c70: 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73  finity may be us
0c80: 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a  ed to implement.
0c90: 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  ** the compariso
0ca0: 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69  n in pExpr..*/.i
0cb0: 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41  nt sqlite3IndexA
0cc0: 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a  ffinityOk(Expr *
0cd0: 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f  pExpr, char idx_
0ce0: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61  affinity){.  cha
0cf0: 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73  r aff = comparis
0d00: 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  onAffinity(pExpr
0d10: 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20 20  );.  return .   
0d20: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
0d30: 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20 28  F_NONE) ||.    (
0d40: 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  aff==SQLITE_AFF_
0d50: 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f 61  NUMERIC && idx_a
0d60: 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
0d70: 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c 0a  AFF_INTEGER) ||.
0d80: 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45      (aff==SQLITE
0d90: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26 20  _AFF_INTEGER && 
0da0: 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51  idx_affinity==SQ
0db0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0dc0: 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 69  ) ||.    (aff==i
0dd0: 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d 0a  dx_affinity);.}.
0de0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0df0: 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20  e P1 value that 
0e00: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
0e10: 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70  or a binary comp
0e20: 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65  arison.** opcode
0e30: 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65   (OP_Eq, OP_Ge e
0e40: 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d  tc.) used to com
0e50: 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20  pare pExpr1 and 
0e60: 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75  pExpr2..** If ju
0e70: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
0e80: 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c  , then set the l
0e90: 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72  ow byte of the r
0ea0: 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61  eturned.** P1 va
0eb0: 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20  lue to tell the 
0ec0: 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69  opcode to jump i
0ed0: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
0ee0: 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73  ion.** evaluates
0ef0: 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61   to NULL..*/.sta
0f00: 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43 6f  tic int binaryCo
0f10: 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70 45  mpareP1(Expr *pE
0f20: 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70  xpr1, Expr *pExp
0f30: 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75  r2, int jumpIfNu
0f40: 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20  ll){.  char aff 
0f50: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0f60: 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20  inity(pExpr2);. 
0f70: 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29 73   return (((int)s
0f80: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
0f90: 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66  inity(pExpr1, af
0fa0: 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66 4e  f))<<8)+(jumpIfN
0fb0: 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a  ull?1:0);.}../*.
0fc0: 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20 6e  ** Construct a n
0fd0: 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f  ew expression no
0fe0: 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61 20  de and return a 
0ff0: 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e 20 20  pointer to it.  
1000: 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20 74 68  Memory.** for th
1010: 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74 61 69  is node is obtai
1020: 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74 65 4d  ned from sqliteM
1030: 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20 63 61  alloc().  The ca
1040: 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a  lling function.*
1050: 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62 6c 65  * is responsible
1060: 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75 72 65   for making sure
1070: 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e 74 75   the node eventu
1080: 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65 64 2e  ally gets freed.
1090: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
10a0: 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20 45 78  3Expr(int op, Ex
10b0: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
10c0: 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e 20 2a  *pRight, Token *
10d0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
10e0: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
10f0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1100: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
1110: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1120: 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f     /* When mallo
1130: 63 20 66 61 69 6c 73 2c 20 77 65 20 6c 65 61 6b  c fails, we leak
1140: 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 70 4c 65   memory from pLe
1150: 66 74 20 61 6e 64 20 70 52 69 67 68 74 20 2a 2f  ft and pRight */
1160: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
1170: 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20   }.  pNew->op = 
1180: 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66  op;.  pNew->pLef
1190: 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70 4e 65  t = pLeft;.  pNe
11a0: 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52 69 67  w->pRight = pRig
11b0: 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e  ht;.  if( pToken
11c0: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
11d0: 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29  pToken->dyn==0 )
11e0: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
11f0: 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20  n = *pToken;.   
1200: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 2a 70   pNew->span = *p
1210: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Token;.  }else{.
1220: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
1230: 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29  ->token.dyn==0 )
1240: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1250: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29  ew->token.z==0 )
1260: 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  ;.    assert( pN
1270: 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 30 20 29  ew->token.n==0 )
1280: 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  ;.    if( pLeft 
1290: 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20  && pRight ){.   
12a0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70     sqlite3ExprSp
12b0: 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d  an(pNew, &pLeft-
12c0: 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e  >span, &pRight->
12d0: 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c 73 65  span);.    }else
12e0: 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 73 70  {.      pNew->sp
12f0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1300: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
1310: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
1320: 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70 72  .** Set the Expr
1330: 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74  .span field of t
1340: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
1350: 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a  ion to span all.
1360: 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e 20  ** text between 
1370: 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f  the two given to
1380: 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  kens..*/.void sq
1390: 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45 78  lite3ExprSpan(Ex
13a0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
13b0: 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a   *pLeft, Token *
13c0: 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72  pRight){.  asser
13d0: 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a  t( pRight!=0 );.
13e0: 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 21    assert( pLeft!
13f0: 3d 30 20 29 3b 0a 20 20 2f 2a 20 4e 6f 74 65 3a  =0 );.  /* Note:
1400: 20 70 45 78 70 72 20 6d 69 67 68 74 20 62 65 20   pExpr might be 
1410: 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 20 70 72  NULL due to a pr
1420: 69 6f 72 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75  ior malloc failu
1430: 72 65 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  re */.  if( pExp
1440: 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26  r && pRight->z &
1450: 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20  & pLeft->z ){.  
1460: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64 79 6e    if( pLeft->dyn
1470: 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d 3e 64  ==0 && pRight->d
1480: 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 70  yn==0 ){.      p
1490: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70  Expr->span.z = p
14a0: 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20 20 70  Left->z;.      p
14b0: 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70  Expr->span.n = p
14c0: 52 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64 72 28  Right->n + Addr(
14d0: 70 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41 64 64  pRight->z) - Add
14e0: 72 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20 20 20  r(pLeft->z);.   
14f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 45   }else{.      pE
1500: 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b  xpr->span.z = 0;
1510: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
1520: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
1530: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
1540: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
1550: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
1560: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
1570: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
1580: 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72  xprFunction(Expr
1590: 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b  List *pList, Tok
15a0: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
15b0: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
15c0: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
15d0: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
15e0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
15f0: 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  ){.    /* sqlite
1600: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1610: 70 4c 69 73 74 29 3b 20 2f 2f 20 4c 65 61 6b 20  pList); // Leak 
1620: 70 4c 69 73 74 20 77 68 65 6e 20 6d 61 6c 6c 6f  pList when mallo
1630: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 72  c fails */.    r
1640: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1650: 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e  New->op = TK_FUN
1660: 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70  CTION;.  pNew->p
1670: 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20  List = pList;.  
1680: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1690: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
16a0: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
16b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70  pNew->token = *p
16c0: 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Token;.  }else{.
16d0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
16e0: 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65  z = 0;.  }.  pNe
16f0: 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e  w->span = pNew->
1700: 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72 6e 20  token;.  return 
1710: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  pNew;.}../*.** R
1720: 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74  ecursively delet
1730: 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  e an expression 
1740: 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  tree..*/.void sq
1750: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
1760: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
1770: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  p==0 ) return;. 
1780: 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e   if( p->span.dyn
1790: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
17a0: 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b  har*)p->span.z);
17b0: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
17c0: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
17d0: 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e  ((char*)p->token
17e0: 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  .z);.  sqlite3Ex
17f0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66  prDelete(p->pLef
1800: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1810: 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68  rDelete(p->pRigh
1820: 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  t);.  sqlite3Exp
1830: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70  rListDelete(p->p
1840: 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33  List);.  sqlite3
1850: 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e  SelectDelete(p->
1860: 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69  pSelect);.  sqli
1870: 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f  teFree(p);.}.../
1880: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
1890: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
18a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
18b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
18c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
18d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
18e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
18f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
1900: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
1910: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
1920: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
1930: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
1940: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
1950: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
1960: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
1970: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
1980: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
1990: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
19a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
19b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
19c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
19d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
19e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
19f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
1a00: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
1a10: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
1a20: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
1a30: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
1a40: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
1a50: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
1a60: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
1a70: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
1a80: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
1a90: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1aa0: 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20 2a  e3ExprDup(Expr *
1ab0: 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77  p){.  Expr *pNew
1ac0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
1ad0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
1ae0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
1af0: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
1b00: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
1b10: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d   return 0;.  mem
1b20: 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a  cpy(pNew, p, siz
1b30: 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69  eof(*pNew));.  i
1b40: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30  f( p->token.z!=0
1b50: 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   ){.    pNew->to
1b60: 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74  ken.z = sqliteSt
1b70: 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29  rDup(p->token.z)
1b80: 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  ;.    pNew->toke
1b90: 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  n.dyn = 1;.  }el
1ba0: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1bb0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
1bc0: 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   );.  }.  pNew->
1bd0: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e  span.z = 0;.  pN
1be0: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
1bf0: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c  te3ExprDup(p->pL
1c00: 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 52  eft);.  pNew->pR
1c10: 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78  ight = sqlite3Ex
1c20: 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74 29  prDup(p->pRight)
1c30: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
1c40: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
1c50: 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b 0a  tDup(p->pList);.
1c60: 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74 20    pNew->pSelect 
1c70: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
1c80: 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  up(p->pSelect);.
1c90: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1ca0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f 6b  .void sqlite3Tok
1cb0: 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70 54  enCopy(Token *pT
1cc0: 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29  o, Token *pFrom)
1cd0: 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79 6e  {.  if( pTo->dyn
1ce0: 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63   ) sqliteFree((c
1cf0: 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20  har*)pTo->z);.  
1d00: 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a  if( pFrom->z ){.
1d10: 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46 72      pTo->n = pFr
1d20: 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e  om->n;.    pTo->
1d30: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  z = sqliteStrNDu
1d40: 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f  p(pFrom->z, pFro
1d50: 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d 3e  m->n);.    pTo->
1d60: 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65  dyn = 1;.  }else
1d70: 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 30  {.    pTo->z = 0
1d80: 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73 74  ;.  }.}.ExprList
1d90: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73   *sqlite3ExprLis
1da0: 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a 70  tDup(ExprList *p
1db0: 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  ){.  ExprList *p
1dc0: 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45 78  New;.  struct Ex
1dd0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
1de0: 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  em;.  int i;.  i
1df0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
1e00: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
1e10: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
1e20: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
1e30: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
1e40: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45  rn 0;.  pNew->nE
1e50: 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  xpr = pNew->nAll
1e60: 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20  oc = p->nExpr;. 
1e70: 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d   pNew->a = pItem
1e80: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
1e90: 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66   p->nExpr*sizeof
1ea0: 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69  (p->a[0]) );.  i
1eb0: 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 20 72 65  f( pItem==0 ) re
1ec0: 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4c 65 61 6b  turn 0;  /* Leak
1ed0: 73 20 6d 65 6d 6f 72 79 20 61 66 74 65 72 20 61  s memory after a
1ee0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20   malloc failure 
1ef0: 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  */.  for(i=0; i<
1f00: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
1f10: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
1f20: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
1f30: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
1f40: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
1f50: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
1f60: 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20  rDup(pOldExpr = 
1f70: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  p->a[i].pExpr);.
1f80: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
1f90: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70  ->span.z!=0 && p
1fa0: 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20  NewExpr ){.     
1fb0: 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20   /* Always make 
1fc0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70  a copy of the sp
1fd0: 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c  an for top-level
1fe0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
1ff0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
2000: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54  ression list.  T
2010: 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45  he logic in SELE
2020: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  CT processing th
2030: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20  at determines.  
2040: 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73      ** the names
2050: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2060: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65  he result set ne
2070: 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  eds this informa
2080: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2090: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
20a0: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20  pNewExpr->span, 
20b0: 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29  &pOldExpr->span)
20c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
20d0: 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20  rt( pNewExpr==0 
20e0: 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  || pNewExpr->spa
20f0: 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20  n.z!=0 .        
2100: 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d      || pOldExpr-
2110: 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71  >span.z==0 || sq
2120: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
2130: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
2140: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2150: 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a  StrDup(p->a[i].z
2160: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
2170: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d  ->sortOrder = p-
2180: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2190: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
21a0: 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67  g = p->a[i].isAg
21b0: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
21c0: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
21d0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63  turn pNew;.}.Src
21e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
21f0: 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74 20  ListDup(SrcList 
2200: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
2210: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
2220: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
2230: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
2240: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
2250: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
2260: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
2270: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
2280: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
2290: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
22a0: 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  Raw( nByte );.  
22b0: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
22c0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
22d0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
22e0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
22f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2300: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
2310: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2320: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
2330: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
2340: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2350: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
2360: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
2370: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
2380: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
2390: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61  (pOldItem->zData
23a0: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
23b0: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
23c0: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
23d0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
23e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
23f0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2400: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
2410: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2420: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
2430: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
2440: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
2450: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
2460: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
2470: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
2480: 30 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  0;.    pNewItem-
2490: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
24a0: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64  e3SelectDup(pOld
24b0: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
24c0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
24d0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
24e0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  up(pOldItem->pOn
24f0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2500: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
2510: 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49  3IdListDup(pOldI
2520: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
2530: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
2540: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
2550: 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69  e3IdListDup(IdLi
2560: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
2570: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
2580: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2590: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
25a0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
25b0: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
25c0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
25d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
25e0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d  New->nId = pNew-
25f0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64  >nAlloc = p->nId
2600: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
2610: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
2620: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
2630: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
2640: 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75  New->a==0 ) retu
2650: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
2660: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
2670: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
2680: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
2690: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
26a0: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
26b0: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
26c0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
26d0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
26e0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
26f0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
2700: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2710: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
2720: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
2730: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
2740: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
2750: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
2760: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
2770: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2780: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
2790: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
27a0: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
27b0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
27c0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
27d0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
27e0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
27f0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
2800: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2810: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
2820: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
2830: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
2840: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
2850: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
2860: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
2870: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
2880: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
2890: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
28a0: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
28b0: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
28c0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
28d0: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
28e0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
28f0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
2900: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
2910: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
2920: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
2930: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
2940: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
2950: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  ew->nLimit = p->
2960: 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  nLimit;.  pNew->
2970: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
2980: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53  fset;.  pNew->zS
2990: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e 65  elect = 0;.  pNe
29a0: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
29b0: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
29c0: 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e 20 70  = -1;.  return p
29d0: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  New;.}.../*.** A
29e0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
29f0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
2a00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
2a10: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
2a20: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
2a30: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
2a40: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
2a50: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
2a60: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
2a70: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
2a80: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
2a90: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
2aa0: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
2ab0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
2ac0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
2ad0: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
2ae0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
2af0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
2b00: 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  /* sqlite3ExprDe
2b10: 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20  lete(pExpr); // 
2b20: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d  Leak memory if m
2b30: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
2b40: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
2b50: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
2b60: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
2b70: 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
2b80: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c  List->nAlloc<=pL
2b90: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
2ba0: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
2bb0: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
2bc0: 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73 74  2 + 4;.    pList
2bd0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ->a = sqliteReal
2be0: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
2bf0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
2c00: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
2c10: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
2c20: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >a==0 ){.      /
2c30: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  * sqlite3ExprDel
2c40: 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c  ete(pExpr); // L
2c50: 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  eak memory if ma
2c60: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
2c70: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
2c80: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
2c90: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
2ca0: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
2cb0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
2cc0: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
2cd0: 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d  f( pExpr || pNam
2ce0: 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
2cf0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
2d00: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
2d10: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
2d20: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
2d30: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
2d40: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
2d50: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
2d60: 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d 65 20  ;.    if( pName 
2d70: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
2d80: 53 65 74 4e 53 74 72 69 6e 67 28 26 70 49 74 65  SetNString(&pIte
2d90: 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d 65 2d  m->zName, pName-
2da0: 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20 30 29  >z, pName->n, 0)
2db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 44  ;.      sqlite3D
2dc0: 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e  equote(pItem->zN
2dd0: 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ame);.    }.  }.
2de0: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
2df0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
2e00: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
2e10: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
2e20: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
2e30: 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73  stDelete(ExprLis
2e40: 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74  t *pList){.  int
2e50: 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d   i;.  if( pList=
2e60: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61  =0 ) return;.  a
2e70: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
2e80: 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45  =0 || (pList->nE
2e90: 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d  xpr==0 && pList-
2ea0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20  >nAlloc==0) );. 
2eb0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
2ec0: 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41  nExpr<=pList->nA
2ed0: 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d  lloc );.  for(i=
2ee0: 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70  0; i<pList->nExp
2ef0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  r; i++){.    sql
2f00: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
2f10: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
2f20: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
2f30: 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e  e(pList->a[i].zN
2f40: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
2f50: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
2f60: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
2f70: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
2f80: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
2f90: 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e  on tree.  Return
2fa0: 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73   1 if the expres
2fb0: 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74  sion is constant
2fc0: 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20  .** and 0 if it 
2fd0: 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c  involves variabl
2fe0: 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  es..**.** For th
2ff0: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
3000: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
3010: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
3020: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
3030: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
3040: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
3050: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
3060: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
3070: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
3080: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
3090: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
30a0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77  t(Expr *p){.  sw
30b0: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
30c0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20     case TK_ID:. 
30d0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
30e0: 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  N:.    case TK_D
30f0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
3100: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20  FUNCTION:.      
3110: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61  return 0;.    ca
3120: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
3130: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a  case TK_STRING:.
3140: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
3150: 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  GER:.    case TK
3160: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
3170: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
3180: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
3190: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
31a0: 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20     if( p->pLeft 
31b0: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
31c0: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65  sConstant(p->pLe
31d0: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
31e0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69        if( p->pRi
31f0: 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 33 45  ght && !sqlite3E
3200: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
3210: 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75 72  >pRight) ) retur
3220: 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  n 0;.      if( p
3230: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
3240: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
3250: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
3260: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
3270: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66  +){.          if
3280: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
3290: 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73  Constant(p->pLis
32a0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
32b0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
32c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
32d0: 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65     return p->pLe
32e0: 66 74 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67  ft!=0 || p->pRig
32f0: 68 74 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69  ht!=0 || (p->pLi
3300: 73 74 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e  st && p->pList->
3310: 6e 45 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a  nExpr>0);.    }.
3320: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
3330: 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20  }../*.** If the 
3340: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
3350: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
3360: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
3370: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
3380: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
3390: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
33a0: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
33b0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
33c0: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
33d0: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
33e0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
33f0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
3400: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
3410: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
3420: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
3430: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
3440: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
3450: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
3460: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
3470: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
3480: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
3490: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
34a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
34b0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
34c0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
34d0: 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  32(p->token.z, p
34e0: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
34f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3500: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3510: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3520: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
3530: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
3540: 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20   = p->token.z;. 
3550: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e       int n = p->
3560: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  token.n;.      i
3570: 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d  f( n>0 && z[0]==
3580: 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b  '-' ){ z++; n--;
3590: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
35a0: 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73 64  n>0 && *z && isd
35b0: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
35c0: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69 66   n--; }.      if
35d0: 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ( n==0 && sqlite
35e0: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
35f0: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
3600: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3610: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3620: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3630: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
3640: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
3650: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
3660: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
3670: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
3680: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
3690: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
36a0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
36b0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
36c0: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
36d0: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
36e0: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
36f0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3700: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3710: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
3720: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
3730: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3740: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
3750: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
3760: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
3770: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
3780: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
3790: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
37a0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
37b0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
37c0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
37d0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
37e0: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
37f0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
3800: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
3810: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
3820: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
3830: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3840: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
3850: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
3860: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
3870: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
3880: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
3890: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
38a0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
38b0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
38c0: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
38d0: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
38e0: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
38f0: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
3900: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
3910: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
3920: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
3930: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
3940: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
3950: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
3960: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
3970: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
3980: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
3990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
39a0: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
39b0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
39c0: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
39d0: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
39e0: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
39f0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
3a00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3a10: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
3a20: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
3a30: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
3a40: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
3a50: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
3a60: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
3a70: 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20 20  Expr->dataType  
3a80: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 61      Set to the a
3a90: 70 70 72 6f 70 72 69 61 74 65 20 64 61 74 61 20  ppropriate data 
3aa0: 74 79 70 65 20 66 6f 72 20 74 68 65 20 63 6f 6c  type for the col
3ab0: 75 6d 6e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  umn..**    pExpr
3ac0: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
3ad0: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
3ae0: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
3af0: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
3b00: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
3b10: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
3b20: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
3b30: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
3b40: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
3b50: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
3b60: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
3b70: 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73   The pDbToken is
3b80: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
3b90: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
3ba0: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
3bb0: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
3bc0: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
3bd0: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
3be0: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
3bf0: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
3c00: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
3c10: 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f  d.  The pTableTo
3c20: 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ken is the name 
3c30: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
3c40: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
3c50: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
3c60: 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69  LL if pDbToken i
3c70: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66  s also NULL.  If
3c80: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
3c90: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
3ca0: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
3cb0: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
3cc0: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
3cd0: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
3ce0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
3cf0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
3d00: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
3d10: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
3d20: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
3d30: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
3d40: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
3d50: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
3d60: 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63  turn zero on suc
3d70: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
3d80: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
3d90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
3da0: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
3db0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
3dc0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
3dd0: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
3de0: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
3df0: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
3e00: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
3e10: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
3e20: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
3e30: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
3e40: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
3e50: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
3e60: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
3e70: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
3e80: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
3e90: 72 63 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73  rcList,   /* Lis
3ea0: 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  t of tables used
3eb0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75   to resolve colu
3ec0: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78  mn names */.  Ex
3ed0: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
3ee0: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78     /* List of ex
3ef0: 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74  pressions used t
3f00: 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a  o resolve "AS" *
3f10: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
3f20: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
3f30: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
3f40: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
3f50: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
3f60: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
3f70: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
3f80: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3f90: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
3fa0: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
3fb0: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
3fc0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
3fd0: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
3fe0: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
3ff0: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
4000: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
4010: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
4020: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
4030: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
4040: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
4050: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
4060: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
4070: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
4080: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
4090: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
40a0: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
40b0: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
40c0: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
40d0: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
40e0: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
40f0: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
4100: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
4110: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
4120: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
4130: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
4140: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
4150: 20 20 69 66 28 20 70 44 62 54 6f 6b 65 6e 20 26    if( pDbToken &
4160: 26 20 70 44 62 54 6f 6b 65 6e 2d 3e 7a 20 29 7b  & pDbToken->z ){
4170: 0a 20 20 20 20 7a 44 62 20 3d 20 73 71 6c 69 74  .    zDb = sqlit
4180: 65 53 74 72 4e 44 75 70 28 70 44 62 54 6f 6b 65  eStrNDup(pDbToke
4190: 6e 2d 3e 7a 2c 20 70 44 62 54 6f 6b 65 6e 2d 3e  n->z, pDbToken->
41a0: 6e 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 44  n);.    sqlite3D
41b0: 65 71 75 6f 74 65 28 7a 44 62 29 3b 0a 20 20 7d  equote(zDb);.  }
41c0: 65 6c 73 65 7b 0a 20 20 20 20 7a 44 62 20 3d 20  else{.    zDb = 
41d0: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 54 61  0;.  }.  if( pTa
41e0: 62 6c 65 54 6f 6b 65 6e 20 26 26 20 70 54 61 62  bleToken && pTab
41f0: 6c 65 54 6f 6b 65 6e 2d 3e 7a 20 29 7b 0a 20 20  leToken->z ){.  
4200: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 53    zTab = sqliteS
4210: 74 72 4e 44 75 70 28 70 54 61 62 6c 65 54 6f 6b  trNDup(pTableTok
4220: 65 6e 2d 3e 7a 2c 20 70 54 61 62 6c 65 54 6f 6b  en->z, pTableTok
4230: 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20 73 71 6c 69  en->n);.    sqli
4240: 74 65 33 44 65 71 75 6f 74 65 28 7a 54 61 62 29  te3Dequote(zTab)
4250: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61  ;.  }else{.    a
4260: 73 73 65 72 74 28 20 7a 44 62 3d 3d 30 20 29 3b  ssert( zDb==0 );
4270: 0a 20 20 20 20 7a 54 61 62 20 3d 20 30 3b 0a 20  .    zTab = 0;. 
4280: 20 7d 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69   }.  zCol = sqli
4290: 74 65 53 74 72 4e 44 75 70 28 70 43 6f 6c 75 6d  teStrNDup(pColum
42a0: 6e 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 43 6f 6c 75  nToken->z, pColu
42b0: 6d 6e 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 73  mnToken->n);.  s
42c0: 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a 43  qlite3Dequote(zC
42d0: 6f 6c 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  ol);.  if( sqlit
42e0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
42f0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4300: 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72  ;  /* Leak memor
4310: 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62 29  y (zDb and zTab)
4320: 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
4330: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
4340: 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c  ( zTab==0 || pEL
4350: 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45 78  ist==0 );..  pEx
4360: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
4370: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
4380: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
4390: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
43a0: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
43b0: 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d 3e  em = &pSrcList->
43c0: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
43d0: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
43e0: 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  Tab;.    Column 
43f0: 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28 20  *pCol;..    if( 
4400: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
4410: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
4420: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
4430: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
4440: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
4450: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
4460: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
4470: 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  e = pItem->zAlia
4480: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  s;.        if( s
4490: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
44a0: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
44b0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
44c0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
44d0: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
44e0: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
44f0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
4500: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
4510: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
4520: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
4530: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4540: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
4550: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
4560: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
4570: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
4580: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
4590: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
45a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
45b0: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
45c0: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70 45  b++) ){.      pE
45d0: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
45e0: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
45f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
4600: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
4610: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  }.    for(j=0, p
4620: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
4630: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
4640: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
4650: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4660: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
4670: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
4680: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
4690: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
46a0: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
46b0: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45 78  sor;.        pEx
46c0: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
46d0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  iDb;.        /* 
46e0: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
46f0: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
4700: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
4710: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
4720: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4730: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
4740: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
4750: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
4760: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
4770: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
4780: 74 79 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20  ty;..        /* 
4790: 46 49 58 20 4d 45 3a 20 45 78 70 72 3a 3a 64 61  FIX ME: Expr::da
47a0: 74 61 54 79 70 65 20 77 69 6c 6c 20 62 65 20 72  taType will be r
47b0: 65 6d 6f 76 65 64 2e 2e 2e 20 2a 2f 0a 20 20 20  emoved... */.   
47c0: 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74 61       pExpr->data
47d0: 54 79 70 65 20 3d 0a 20 20 20 20 20 20 20 20 20  Type =.         
47e0: 20 20 20 28 70 43 6f 6c 2d 3e 61 66 66 69 6e 69     (pCol->affini
47f0: 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54  ty==SQLITE_AFF_T
4800: 45 58 54 3f 53 51 4c 49 54 45 5f 53 4f 5f 54 45  EXT?SQLITE_SO_TE
4810: 58 54 3a 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d  XT:SQLITE_SO_NUM
4820: 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
4830: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
4840: 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20    }..  /* If we 
4850: 68 61 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79  have not already
4860: 20 72 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61   resolved the na
4870: 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a  me, then maybe .
4880: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
4890: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
48a0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
48b0: 65 72 65 6e 63 65 0a 20 20 2a 2f 0a 20 20 69 66  erence.  */.  if
48c0: 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62  ( zDb==0 && zTab
48d0: 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26  !=0 && cnt==0 &&
48e0: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
48f0: 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 54 72 69  ck!=0 ){.    Tri
4900: 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67  ggerStack *pTrig
4910: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
4920: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
4930: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
4940: 30 3b 0a 20 20 20 20 69 66 28 20 70 54 72 69 67  0;.    if( pTrig
4950: 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78  gerStack->newIdx
4960: 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65   != -1 && sqlite
4970: 33 53 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20  3StrICmp("new", 
4980: 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20  zTab) == 0 ){.  
4990: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
49a0: 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63  e = pTriggerStac
49b0: 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20  k->newIdx;.     
49c0: 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67 65   assert( pTrigge
49d0: 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a  rStack->pTab );.
49e0: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
49f0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
4a00: 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20  ;.    }else if( 
4a10: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f  pTriggerStack->o
4a20: 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73  ldIdx != -1 && s
4a30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f  qlite3StrICmp("o
4a40: 6c 64 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20  ld", zTab) == 0 
4a50: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
4a60: 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65  iTable = pTrigge
4a70: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a  rStack->oldIdx;.
4a80: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
4a90: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
4aa0: 62 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20  b );.      pTab 
4ab0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
4ac0: 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a 0a 20 20  >pTab;.    }..  
4ad0: 20 20 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20    if( pTab ){ . 
4ae0: 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20       int j;.    
4af0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d    Column *pCol =
4b00: 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20   pTab->aCol;.   
4b10: 20 20 20 0a 20 20 20 20 20 20 70 45 78 70 72 2d     .      pExpr-
4b20: 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62  >iDb = pTab->iDb
4b30: 3b 0a 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b  ;.      cntTab++
4b40: 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b  ;.      for(j=0;
4b50: 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b   j < pTab->nCol;
4b60: 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a   j++, pCol++) {.
4b70: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
4b80: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
4b90: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
4ba0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e   ){.          cn
4bb0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70  t++;.          p
4bc0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
4bd0: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
4be0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
4bf0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
4c00: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
4c10: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
4c20: 20 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45         /* FIX ME
4c30: 3a 20 45 78 70 72 3a 3a 64 61 74 61 54 79 70 65  : Expr::dataType
4c40: 20 77 69 6c 6c 20 62 65 20 72 65 6d 6f 76 65 64   will be removed
4c50: 2e 2e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  ... */.         
4c60: 20 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65   pExpr->dataType
4c70: 20 3d 0a 20 20 20 20 20 20 20 20 20 20 20 20 20   =.             
4c80: 20 28 70 43 6f 6c 2d 3e 61 66 66 69 6e 69 74 79   (pCol->affinity
4c90: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
4ca0: 54 3f 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58 54  T?SQLITE_SO_TEXT
4cb0: 3a 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 29 3b  :SQLITE_SO_NUM);
4cc0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4cd0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4ce0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4cf0: 20 2f 2a 0a 20 20 2a 2a 20 50 65 72 68 61 70 73   /*.  ** Perhaps
4d00: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72   the name is a r
4d10: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
4d20: 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 69 66 28  ROWID.  */.  if(
4d30: 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61   cnt==0 && cntTa
4d40: 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49  b==1 && sqlite3I
4d50: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a  sRowid(zCol) ){.
4d60: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
4d70: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4d80: 3d 20 2d 31 3b 0a 20 20 20 20 70 45 78 70 72 2d  = -1;.    pExpr-
4d90: 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49  >dataType = SQLI
4da0: 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 70  TE_SO_NUM;.    p
4db0: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
4dc0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
4dd0: 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  GER;.  }..  /*. 
4de0: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
4df0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
4e00: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
4e10: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
4e20: 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74 20  me Z.  ** might 
4e30: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
4e40: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
4e50: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
4e60: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
4e70: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
4e80: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
4e90: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
4ea0: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4eb0: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20 20  command:.  **.  
4ec0: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
4ed0: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
4ee0: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
4ef0: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  **.  ** In cases
4f00: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
4f10: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
4f20: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
4f30: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 2a  ression that.  *
4f40: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
4f50: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
4f60: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
4f70: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
4f80: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2a  mmediately..  **
4f90: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
4fa0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
4fb0: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
4fc0: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
4fd0: 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  been.  ** resolv
4fe0: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
4ff0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5000: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a  is resolved..  *
5010: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
5020: 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20  & pEList!=0 ){. 
5030: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
5040: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
5050: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5060: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  As = pEList->a[j
5070: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
5080: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
5090: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
50a0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
50b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
50c0: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
50d0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
50e0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
50f0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20  r->op = TK_AS;. 
5100: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
5110: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
5120: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
5130: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5140: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  (pEList->a[j].pE
5150: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
5160: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
5170: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5180: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
5190: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
51a0: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
51b0: 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a     } .  }..  /*.
51c0: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
51d0: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
51e0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
51f0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
5200: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
5210: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
5220: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
5230: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
5240: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
5250: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
5260: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
5270: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
5280: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
5290: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
52a0: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
52b0: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
52c0: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
52d0: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
52e0: 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xpr..  */.  if( 
52f0: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
5300: 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  0 && pColumnToke
5310: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a  n->z[0]=='"' ){.
5320: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
5330: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
5340: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
5350: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
5360: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
5370: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
5380: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
5390: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
53a0: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
53b0: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
53c0: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
53d0: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
53e0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
53f0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
5400: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
5410: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
5420: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
5430: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
5440: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
5450: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5460: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
5470: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
5480: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
5490: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20   }else if( zTab 
54a0: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
54b0: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54  SetString(&z, zT
54c0: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
54d0: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
54e0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74      z = sqliteSt
54f0: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
5500: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
5510: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
5520: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
5530: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 0a  teFree(z);.  }..
5540: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
5550: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
5560: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
5570: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
5580: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ab);.  sqliteFre
5590: 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zCol);.  sqlit
55a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
55b0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
55c0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
55d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
55e0: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
55f0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
5600: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
5610: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
5620: 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 52  ;.  sqlite3AuthR
5630: 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  ead(pParse, pExp
5640: 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a 20 20  r, pSrcList);.  
5650: 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a 7d  return cnt!=1;.}
5660: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5670: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
5680: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
5690: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
56a0: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
56b0: 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65  e columns.  Node
56c0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44  s of the form ID
56d0: 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76  .ID or ID resolv
56e0: 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64  e into an.** ind
56f0: 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ex to the table 
5700: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
5710: 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f  t and a column o
5720: 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20  ffset.  The .** 
5730: 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20  Expr.opcode for 
5740: 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68  such nodes is ch
5750: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
5760: 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54  MN.  The Expr.iT
5770: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73  able.** value is
5780: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
5790: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66  index of the ref
57a0: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e  erenced table in
57b0: 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75   pTabList.** plu
57c0: 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c  s the "base" val
57d0: 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61  ue.  The base va
57e0: 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  lue will ultimat
57f0: 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a  ely become the.*
5800: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
5810: 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f  mber for a curso
5820: 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
5830: 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65  ng into the refe
5840: 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e  renced.** table.
5850: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
5860: 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  mn value is chan
5870: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
5880: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a   of the column .
5890: 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ** of the refere
58a0: 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65  nced table.  The
58b0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
58c0: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63  lue for the spec
58d0: 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c  ial.** ROWID col
58e0: 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20  umn is -1.  Any 
58f0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
5900: 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72  KEY column is tr
5910: 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69  ied as an.** ali
5920: 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a  as for ROWID..**
5930: 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68 65 63  .** We also chec
5940: 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20  k for instances 
5950: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
5960: 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69 6e  or.  IN comes in
5970: 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a   two.** forms:.*
5980: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  *.**           e
5990: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
59a0: 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ).** and.**     
59b0: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53        expr IN (S
59c0: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
59d0: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
59e0: 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72  is handled by cr
59f0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c  eating a set hol
5a00: 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a  ding the list.**
5a10: 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75   of allowed valu
5a20: 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  es.  The second 
5a30: 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20  form causes the 
5a40: 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61  SELECT to genera
5a50: 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  te .** a tempora
5a60: 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ry table..**.** 
5a70: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
5a80: 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c  o looks for scal
5a90: 61 72 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  ar SELECTs that 
5aa0: 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65  are part of an e
5ab0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66  xpression..** If
5ac0: 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69   it finds any, i
5ad0: 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  t generates code
5ae0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 76 61   to write the va
5af0: 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65  lue of that sele
5b00: 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d  ct.** into a mem
5b10: 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
5b20: 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73 20  Unknown columns 
5b30: 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76 6f 6b  or tables provok
5b40: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  e an error.  The
5b50: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5b60: 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
5b70: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 61  of errors seen a
5b80: 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  nd leaves an err
5b90: 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 70 50  or message on pP
5ba0: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
5bb0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5bc0: 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20 50  rResolveIds(.  P
5bd0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5be0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5bf0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5c00: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20  List *pSrcList, 
5c10: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
5c20: 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  s used to resolv
5c30: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
5c40: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5c50: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
5c60: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  f expressions us
5c70: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41  ed to resolve "A
5c80: 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  S" */.  Expr *pE
5c90: 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54 68  xpr        /* Th
5ca0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
5cb0: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
5cc0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ){.  int i;..  i
5cd0: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
5ce0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
5cf0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
5d00: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
5d10: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  rc; i++){.    as
5d20: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
5d30: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
5d40: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
5d50: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
5d60: 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20 20  ->nTab );.  }.  
5d70: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5d80: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
5d90: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5da0: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
5db0: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
5dc0: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
5dd0: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
5de0: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
5df0: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
5e00: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
5e10: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
5e20: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
5e30: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
5e40: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
5e50: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
5e60: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5e70: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
5e80: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
5e90: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
5ea0: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
5eb0: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
5ec0: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
5ed0: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
5ee0: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
5ef0: 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d  ifier is the nam
5f00: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e 0a  e of a columnd..
5f10: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5f20: 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 69  TK_ID: {.      i
5f30: 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50  f( lookupName(pP
5f40: 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78  arse, 0, 0, &pEx
5f50: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63 4c  pr->token, pSrcL
5f60: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78  ist, pEList, pEx
5f70: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
5f80: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5f90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20  .      break; . 
5fa0: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
5fb0: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
5fc0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
5fd0: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
5fe0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
5ff0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
6000: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
6010: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
6020: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
6030: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
6040: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
6050: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
6060: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
6070: 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  ht;..      pRigh
6080: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
6090: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
60a0: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
60b0: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
60c0: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
60d0: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
60e0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
60f0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
6100: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
6110: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
6120: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
6130: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
6140: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
6150: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
6160: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
6170: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
6180: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
6190: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
61a0: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
61b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
61c0: 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d     if( lookupNam
61d0: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
61e0: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
61f0: 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70 45 78  pSrcList, 0, pEx
6200: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
6210: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
6220: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
6230: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
6240: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
6250: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
6260: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
6270: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
6280: 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 76 3d  e);.      if( v=
6290: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
62a0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
62b0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
62c0: 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c  Parse, pSrcList,
62d0: 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e   pEList, pExpr->
62e0: 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
62f0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6300: 20 20 7d 0a 20 20 20 20 20 20 61 66 66 69 6e 69    }.      affini
6310: 74 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ty = sqlite3Expr
6320: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
6330: 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f  pLeft);..      /
6340: 2a 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69  * Whether this i
6350: 73 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43  s an 'x IN(SELEC
6360: 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20  T...)' or an 'x 
6370: 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a  IN(<exprlist>)'.
6380: 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73        ** express
6390: 69 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65  ion it is handle
63a0: 64 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20  d the same way. 
63b0: 41 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  A temporary tabl
63c0: 65 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66  e is .      ** f
63d0: 69 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c  illed with singl
63e0: 65 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65  e-field index ke
63f0: 79 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20  ys representing 
6400: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
6410: 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45    ** from the SE
6420: 4c 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70  LECT or the <exp
6430: 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a  rlist>..      **
6440: 0a 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65  .      ** If the
6450: 20 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20   'x' expression 
6460: 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75  is a column valu
6470: 65 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54  e, or the SELECT
6480: 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61  ....      ** sta
6490: 74 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61  tement returns a
64a0: 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74   column value, t
64b0: 68 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79  hen the affinity
64c0: 20 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a   of that.      *
64d0: 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64  * column is used
64e0: 20 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e   to build the in
64f0: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74  dex keys. If bot
6500: 68 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20  h 'x' and the.  
6510: 20 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e      ** SELECT...
6520: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
6530: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
6540: 65 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73  eric affinity is
6550: 20 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69   used.      ** i
6560: 66 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20  f either column 
6570: 68 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49  has NUMERIC or I
6580: 4e 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e  NTEGER affinity.
6590: 20 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20   If neither.    
65a0: 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65    ** 'x' nor the
65b0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
65c0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
65d0: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
65e0: 66 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a  ffinity.      **
65f0: 20 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20   is used..      
6600: 2a 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  */.      pExpr->
6610: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
6620: 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 73  >nTab++;.      s
6630: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6640: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
6650: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31  pExpr->iTable, 1
6660: 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45  );..      if( pE
6670: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
6680: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
6690: 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  1:     expr IN (
66a0: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20  SELECT ...).    
66b0: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a      **.        *
66c0: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
66d0: 74 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73  to write the res
66e0: 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65  ults of the sele
66f0: 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  ct into the temp
6700: 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a  orary.        **
6710: 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64   table allocated
6720: 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76   and opened abov
6730: 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  e..        */.  
6740: 20 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20        int iParm 
6750: 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  = pExpr->iTable 
6760: 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69  +  (((int)affini
6770: 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20  ty)<<16);.      
6780: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
6790: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
67a0: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
67b0: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ble );.        s
67c0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
67d0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
67e0: 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50  ect, SRT_Set, iP
67f0: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  arm, 0, 0, 0, 0)
6800: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6810: 28 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29  ( pExpr->pList )
6820: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
6830: 65 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 2:     expr IN
6840: 20 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20   (exprlist).    
6850: 20 20 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65      **..** For e
6860: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  ach expression, 
6870: 62 75 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b  build an index k
6880: 65 79 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c  ey from the eval
6890: 75 61 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20  uation and.     
68a0: 20 20 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69     ** store it i
68b0: 6e 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20  n the temporary 
68c0: 74 61 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e  table. If <expr>
68d0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
68e0: 65 6e 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a  en use.        *
68f0: 2a 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61  * that columns a
6900: 66 66 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69  ffinity when bui
6910: 6c 64 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73  lding index keys
6920: 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e  . If <expr> is n
6930: 6f 74 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20  ot.        ** a 
6940: 63 6f 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65  column, use nume
6950: 72 69 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20  ric affinity..  
6960: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
6970: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
6980: 63 68 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53  char const *affS
6990: 74 72 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  tr;.        if( 
69a0: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
69b0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
69c0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
69d0: 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERIC;.        }.
69e0: 20 20 20 20 20 20 20 20 61 66 66 53 74 72 20 3d          affStr =
69f0: 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79   sqlite3Affinity
6a00: 53 74 72 69 6e 67 28 61 66 66 69 6e 69 74 79 29  String(affinity)
6a10: 3b 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f  ;..        /* Lo
6a20: 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20  op through each 
6a30: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65  expression in <e
6a40: 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20  xprlist>. */.   
6a50: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
6a60: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
6a70: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
6a80: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
6a90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
6aa0: 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20  [i].pExpr;..    
6ab0: 20 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74        /* Check t
6ac0: 68 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69  hat the expressi
6ad0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 20 61  on is constant a
6ae0: 6e 64 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20  nd valid. */.   
6af0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
6b00: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
6b10: 74 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20  t(pE2) ){.      
6b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
6b30: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20  orMsg(pParse,.  
6b40: 20 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67              "rig
6b50: 68 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20  ht-hand side of 
6b60: 49 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74  IN operator must
6b70: 20 62 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a   be constant");.
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
6b90: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
6ba0: 7d 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  }.          if( 
6bb0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
6bc0: 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c  (pParse, pE2, 0,
6bd0: 20 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20   0) ){.         
6be0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
6bf0: 20 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20         }..      
6c00: 20 20 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20      /* Evaluate 
6c10: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
6c20: 6e 64 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74  nd insert it int
6c30: 6f 20 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65  o the temp table
6c40: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71   */.          sq
6c50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
6c60: 61 72 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20  arse, pE2);.    
6c70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
6c80: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  eOp3(v, OP_MakeK
6c90: 65 79 2c 20 31 2c 20 30 2c 20 61 66 66 53 74 72  ey, 1, 0, affStr
6ca0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20 20  , P3_STATIC);.  
6cb0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6cc0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
6cd0: 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20  tring, 0, 0);.  
6ce0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
6cf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
6d00: 75 74 53 74 72 4b 65 79 2c 20 70 45 78 70 72 2d  utStrKey, pExpr-
6d10: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
6d20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
6d30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6d40: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  }..    case TK_S
6d50: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
6d60: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
6d70: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
6d80: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
6d90: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
6da0: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
6db0: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
6dc0: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
6dd0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
6de0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
6df0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
6e00: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
6e10: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
6e20: 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d  Column = pParse-
6e30: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
6e40: 66 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  f(sqlite3Select(
6e50: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
6e60: 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c  Select, SRT_Mem,
6e70: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30  pExpr->iColumn,0
6e80: 2c 30 2c 30 2c 30 29 29 7b 0a 20 20 20 20 20 20  ,0,0,0)){.      
6e90: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6ea0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6eb0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
6ec0: 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73  or all else, jus
6ed0: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61  t recursively wa
6ee0: 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20  lk the tree */. 
6ef0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
6f00: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
6f10: 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71  Left.      && sq
6f20: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
6f30: 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72 63  Ids(pParse, pSrc
6f40: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
6f50: 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20  xpr->pLeft) ){. 
6f60: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
6f70: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
6f80: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
6f90: 20 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74   .      && sqlit
6fa0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
6fb0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
6fc0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
6fd0: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
6fe0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6ff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7000: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
7010: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
7020: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
7030: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
7040: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
7050: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
7060: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7070: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7080: 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  Arg = pList->a[i
7090: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
70a0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
70b0: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
70c0: 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70  rse, pSrcList, p
70d0: 45 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a  EList, pArg) ){.
70e0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
70f0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
7100: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
7110: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
7120: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7130: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f  ** pExpr is a no
7140: 64 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  de that defines 
7150: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f  a function of so
7160: 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67  me kind.  It mig
7170: 68 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61  ht.** be a synta
7180: 63 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69  ctic function li
7190: 6b 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72  ke "count(x)" or
71a0: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66   it might be a f
71b0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  unction.** that 
71c0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70  implements an op
71d0: 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20  erator, like "a 
71e0: 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a  LIKE b".  .**.**
71f0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
7200: 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e  kes *pzName poin
7210: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  t to the name of
7220: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e   the function an
7230: 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f  d .** *pnName ho
7240: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
7250: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7260: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
7270: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7280: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
7290: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f  (Expr *pExpr, co
72a0: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d  nst char **pzNam
72b0: 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b  e, int *pnName){
72c0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
72d0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
72e0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
72f0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
7300: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
7310: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7320: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
7330: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7340: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
7350: 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  IKE: {.      *pz
7360: 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20  Name = "like";. 
7370: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
7380: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7390: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
73a0: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a  _GLOB: {.      *
73b0: 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b  pzName = "glob";
73c0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
73d0: 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   4;.      break;
73e0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
73f0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  lt: {.      *pzN
7400: 61 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70  ame = "can't hap
7410: 70 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  pen";.      *pnN
7420: 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20  ame = 12;.      
7430: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7440: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  .}../*.** Error 
7450: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
7460: 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ons in an expres
7470: 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65  sion.  Make sure
7480: 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   all.** function
7490: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
74a0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
74b0: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65  nctions have the
74c0: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62   correct.** numb
74d0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
74e0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
74f0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
7500: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69  se->zErrMsg.** i
7510: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
7520: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
7530: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
7540: 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41  s..**.** if pIsA
7550: 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61  gg is not null a
7560: 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69  nd this expressi
7570: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
7580: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28  te function.** (
7590: 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72  like count(*) or
75a0: 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65   max(value)) the
75b0: 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f  n write a 1 into
75c0: 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74   *pIsAgg..*/.int
75d0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
75e0: 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
75f0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
7600: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20  t allowAgg, int 
7610: 2a 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20  *pIsAgg){.  int 
7620: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
7630: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
7640: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
7650: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7660: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
7670: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
7680: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
7690: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TION: {.      in
76a0: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
76b0: 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
76c0: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
76d0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
76e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
76f0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
7700: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
7710: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
7720: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
7730: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
7740: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
7750: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
7760: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
7770: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
7780: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
7790: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
77a0: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
77b0: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
77c0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
77d0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
77e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
77f0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
7800: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
7810: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
7820: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
7830: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
7840: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
7850: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
7860: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 0a  FuncDef *pDef;..
7870: 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f        getFunctio
7880: 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49  nName(pExpr, &zI
7890: 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20  d, &nId);.      
78a0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
78b0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
78c0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
78d0: 20 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 69 66   n, 0);.      if
78e0: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
78f0: 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
7900: 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28  te3FindFunction(
7910: 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c  pParse->db, zId,
7920: 20 6e 49 64 2c 20 2d 31 2c 20 30 29 3b 0a 20 20   nId, -1, 0);.  
7930: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
7940: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
7950: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
7960: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7970: 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f            wrong_
7980: 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20  num_args = 1;.  
7990: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
79a0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f  lse{.        is_
79b0: 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e  agg = pDef->xFun
79c0: 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  c==0;.      }.  
79d0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26      if( is_agg &
79e0: 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  & !allowAgg ){. 
79f0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7a00: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7a10: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
7a20: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
7a30: 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  s()", nId, zId);
7a40: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
7a50: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
7a60: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7a70: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
7a80: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7a90: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7aa0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  rse, "no such fu
7ab0: 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e  nction: %.*s", n
7ac0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
7ad0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
7ae0: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
7af0: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
7b00: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
7b10: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
7b20: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
7b30: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
7b40: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
7b50: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
7b60: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
7b70: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
7b80: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
7b90: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
7ba0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
7bb0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ON;.        if( 
7bc0: 70 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67  pIsAgg ) *pIsAgg
7bd0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
7be0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
7bf0: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
7c00: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
7c10: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  = sqlite3ExprChe
7c20: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
7c30: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
7c40: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
7c50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7c60: 20 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20      allowAgg && 
7c70: 21 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29  !is_agg, pIsAgg)
7c80: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7c90: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
7ca0: 20 20 20 20 20 20 20 2f 2a 20 41 6c 72 65 61 64         /* Alread
7cb0: 79 20 72 65 70 6f 72 74 65 64 20 61 6e 20 65 72  y reported an er
7cc0: 72 6f 72 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c  ror */.      }el
7cd0: 73 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74  se if( pDef->dat
7ce0: 61 54 79 70 65 3e 3d 30 20 29 7b 0a 20 20 20 20  aType>=0 ){.    
7cf0: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 64 61      if( pDef->da
7d00: 74 61 54 79 70 65 3c 6e 20 29 7b 0a 20 20 20 20  taType<n ){.    
7d10: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
7d20: 61 54 79 70 65 20 3d 20 0a 20 20 20 20 20 20 20  aType = .       
7d30: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
7d40: 72 54 79 70 65 28 70 45 78 70 72 2d 3e 70 4c 69  rType(pExpr->pLi
7d50: 73 74 2d 3e 61 5b 70 44 65 66 2d 3e 64 61 74 61  st->a[pDef->data
7d60: 54 79 70 65 5d 2e 70 45 78 70 72 29 3b 0a 20 20  Type].pExpr);.  
7d70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7d80: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61         pExpr->da
7d90: 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f  taType = SQLITE_
7da0: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 20 20  SO_NUM;.        
7db0: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  }.      }else if
7dc0: 28 20 70 44 65 66 2d 3e 64 61 74 61 54 79 70 65  ( pDef->dataType
7dd0: 3d 3d 53 51 4c 49 54 45 5f 41 52 47 53 20 29 7b  ==SQLITE_ARGS ){
7de0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 64  .        pDef->d
7df0: 61 74 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45  ataType = SQLITE
7e00: 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20  _SO_TEXT;.      
7e10: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 3b 20    for(i=0; i<n; 
7e20: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7e30: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 54  if( sqlite3ExprT
7e40: 79 70 65 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ype(pExpr->pList
7e50: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53  ->a[i].pExpr)==S
7e60: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a  QLITE_SO_NUM ){.
7e70: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
7e80: 72 2d 3e 64 61 74 61 54 79 70 65 20 3d 20 53 51  r->dataType = SQ
7e90: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 20  LITE_SO_NUM;.   
7ea0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
7eb0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
7ec0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
7ed0: 65 20 69 66 28 20 70 44 65 66 2d 3e 64 61 74 61  e if( pDef->data
7ee0: 54 79 70 65 3d 3d 53 51 4c 49 54 45 5f 4e 55 4d  Type==SQLITE_NUM
7ef0: 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 20 20  ERIC ){.        
7f00: 70 45 78 70 72 2d 3e 64 61 74 61 54 79 70 65 20  pExpr->dataType 
7f10: 3d 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  = SQLITE_SO_NUM;
7f20: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
7f30: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 64 61 74        pExpr->dat
7f40: 61 54 79 70 65 20 3d 20 53 51 4c 49 54 45 5f 53  aType = SQLITE_S
7f50: 4f 5f 54 45 58 54 3b 0a 20 20 20 20 20 20 7d 0a  O_TEXT;.      }.
7f60: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
7f70: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
7f80: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
7f90: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
7fa0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
7fb0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
7fc0: 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70  eft, allowAgg, p
7fd0: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
7fe0: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
7ff0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67  0 && pExpr->pRig
8000: 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45  ht ){.        nE
8010: 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rr = sqlite3Expr
8020: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
8030: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c  xpr->pRight, all
8040: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
8050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8060: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
8070: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
8080: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
8090: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
80a0: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
80b0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
80c0: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
80d0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
80e0: 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45    Expr *pE2 = pE
80f0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
8100: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
8110: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33    nErr = sqlite3
8120: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
8130: 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c  , pE2, allowAgg,
8140: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
8150: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
8160: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8170: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
8180: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
8190: 6e 20 65 69 74 68 65 72 20 53 51 4c 49 54 45 5f  n either SQLITE_
81a0: 53 4f 5f 4e 55 4d 20 6f 72 20 53 51 4c 49 54 45  SO_NUM or SQLITE
81b0: 5f 53 4f 5f 54 45 58 54 20 74 6f 20 69 6e 64 69  _SO_TEXT to indi
81c0: 63 61 74 65 20 77 68 65 74 68 65 72 20 74 68 65  cate whether the
81d0: 0a 2a 2a 20 67 69 76 65 6e 20 65 78 70 72 65 73  .** given expres
81e0: 73 69 6f 6e 20 73 68 6f 75 6c 64 20 73 6f 72 74  sion should sort
81f0: 20 61 73 20 6e 75 6d 65 72 69 63 20 76 61 6c 75   as numeric valu
8200: 65 73 20 6f 72 20 61 73 20 74 65 78 74 2e 0a 2a  es or as text..*
8210: 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69 74 65 33  *.** The sqlite3
8220: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29  ExprResolveIds()
8230: 20 61 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72   and sqlite3Expr
8240: 43 68 65 63 6b 28 29 20 72 6f 75 74 69 6e 65 73  Check() routines
8250: 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a 20 62 6f   must have.** bo
8260: 74 68 20 62 65 65 6e 20 63 61 6c 6c 65 64 20 6f  th been called o
8270: 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
8280: 20 62 65 66 6f 72 65 20 69 74 20 69 73 20 70 61   before it is pa
8290: 73 73 65 64 20 74 6f 20 74 68 69 73 20 72 6f 75  ssed to this rou
82a0: 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tine..*/.int sql
82b0: 69 74 65 33 45 78 70 72 54 79 70 65 28 45 78 70  ite3ExprType(Exp
82c0: 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d  r *p){.  if( p==
82d0: 30 20 29 20 72 65 74 75 72 6e 20 53 51 4c 49 54  0 ) return SQLIT
82e0: 45 5f 53 4f 5f 4e 55 4d 3b 0a 20 20 77 68 69 6c  E_SO_NUM;.  whil
82f0: 65 28 20 70 20 29 20 73 77 69 74 63 68 28 20 70  e( p ) switch( p
8300: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
8310: 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
8320: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
8330: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
8340: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
8350: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  :.    case TK_AN
8360: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
8370: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  R:.    case TK_I
8380: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
8390: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 0a 20 20 20 20  TK_NOTNULL:.    
83a0: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 0a 20 20 20  case TK_NOT:.   
83b0: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
83c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c  .    case TK_UPL
83d0: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
83e0: 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  BITAND:.    case
83f0: 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63   TK_BITOR:.    c
8400: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
8410: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8420: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
8430: 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20  SHIFT:.    case 
8440: 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65  TK_REM:.    case
8450: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
8460: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a   case TK_FLOAT:.
8470: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 0a      case TK_IN:.
8480: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
8490: 45 45 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  EEN:.    case TK
84a0: 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20  _GLOB:.    case 
84b0: 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 20 20 72  TK_LIKE:.      r
84c0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f  eturn SQLITE_SO_
84d0: 4e 55 4d 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  NUM;..    case T
84e0: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
84f0: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20  se TK_NULL:.    
8500: 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 0a  case TK_CONCAT:.
8510: 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49      case TK_VARI
8520: 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74 75  ABLE:.      retu
8530: 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 54 45 58  rn SQLITE_SO_TEX
8540: 54 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T;..    case TK_
8550: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
8560: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
8570: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
8580: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
8590: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
85a0: 45 51 3a 0a 20 20 20 20 20 20 69 66 28 20 73 71  EQ:.      if( sq
85b0: 6c 69 74 65 33 45 78 70 72 54 79 70 65 28 70 2d  lite3ExprType(p-
85c0: 3e 70 4c 65 66 74 29 3d 3d 53 51 4c 49 54 45 5f  >pLeft)==SQLITE_
85d0: 53 4f 5f 4e 55 4d 20 29 7b 0a 20 20 20 20 20 20  SO_NUM ){.      
85e0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
85f0: 53 4f 5f 4e 55 4d 3b 0a 20 20 20 20 20 20 7d 0a  SO_NUM;.      }.
8600: 20 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 52 69        p = p->pRi
8610: 67 68 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ght;.      break
8620: 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ;..    case TK_A
8630: 53 3a 0a 20 20 20 20 20 20 70 20 3d 20 70 2d 3e  S:.      p = p->
8640: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 62 72 65  pLeft;.      bre
8650: 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b  ak;..    case TK
8660: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
8670: 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20  e TK_FUNCTION:. 
8680: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
8690: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72  UNCTION:.      r
86a0: 65 74 75 72 6e 20 70 2d 3e 64 61 74 61 54 79 70  eturn p->dataTyp
86b0: 65 3b 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  e;..    case TK_
86c0: 53 45 4c 45 43 54 3a 0a 20 20 20 20 20 20 61 73  SELECT:.      as
86d0: 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74  sert( p->pSelect
86e0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
86f0: 28 20 70 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45  ( p->pSelect->pE
8700: 4c 69 73 74 20 29 3b 0a 20 20 20 20 20 20 61 73  List );.      as
8710: 73 65 72 74 28 20 70 2d 3e 70 53 65 6c 65 63 74  sert( p->pSelect
8720: 2d 3e 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  ->pEList->nExpr>
8730: 30 20 29 3b 0a 20 20 20 20 20 20 70 20 3d 20 70  0 );.      p = p
8740: 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73  ->pSelect->pELis
8750: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
8760: 20 20 20 20 20 62 72 65 61 6b 3b 0a 0a 20 20 20       break;..   
8770: 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b   case TK_CASE: {
8780: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52  .      if( p->pR
8790: 69 67 68 74 20 26 26 20 73 71 6c 69 74 65 33 45  ight && sqlite3E
87a0: 78 70 72 54 79 70 65 28 70 2d 3e 70 52 69 67 68  xprType(p->pRigh
87b0: 74 29 3d 3d 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  t)==SQLITE_SO_NU
87c0: 4d 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  M ){.        ret
87d0: 75 72 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55  urn SQLITE_SO_NU
87e0: 4d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  M;.      }.     
87f0: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
8800: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
8810: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
8820: 20 2a 70 4c 69 73 74 20 3d 20 70 2d 3e 70 4c 69   *pList = p->pLi
8830: 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28  st;.        for(
8840: 69 3d 31 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=1; i<pList->nE
8850: 78 70 72 3b 20 69 2b 3d 32 29 7b 0a 20 20 20 20  xpr; i+=2){.    
8860: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
8870: 33 45 78 70 72 54 79 70 65 28 70 4c 69 73 74 2d  3ExprType(pList-
8880: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3d 3d 53 51  >a[i].pExpr)==SQ
8890: 4c 49 54 45 5f 53 4f 5f 4e 55 4d 20 29 7b 0a 20  LITE_SO_NUM ){. 
88a0: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
88b0: 6e 20 53 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b  n SQLITE_SO_NUM;
88c0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
88d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
88e0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
88f0: 54 45 5f 53 4f 5f 54 45 58 54 3b 0a 20 20 20 20  TE_SO_TEXT;.    
8900: 7d 0a 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  }..    default:.
8910: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 2d        assert( p-
8920: 3e 6f 70 3d 3d 54 4b 5f 41 42 4f 52 54 20 29 3b  >op==TK_ABORT );
8930: 20 20 2f 2a 20 43 61 6e 27 74 20 48 61 70 70 65    /* Can't Happe
8940: 6e 20 2a 2f 0a 20 20 20 20 20 20 62 72 65 61 6b  n */.      break
8950: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 53  ;.  }.  return S
8960: 51 4c 49 54 45 5f 53 4f 5f 4e 55 4d 3b 0a 7d 0a  QLITE_SO_NUM;.}.
8970: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
8980: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
8990: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
89a0: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
89b0: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
89c0: 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74  ..n-1] on the st
89d0: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
89e0: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
89f0: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
8a00: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
8a10: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73    int i;.  if( s
8a20: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
8a30: 2c 20 26 69 29 20 7c 7c 20 28 69 3d 30 2c 20 73  , &i) || (i=0, s
8a40: 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69  qlite3FitsIn64Bi
8a50: 74 73 28 7a 29 29 21 3d 30 20 29 7b 0a 20 20 20  ts(z))!=0 ){.   
8a60: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8a70: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
8a80: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
8a90: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
8aa0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
8ab0: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
8ac0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
8ad0: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
8ae0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
8af0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
8b00: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
8b10: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
8b20: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
8b30: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
8b40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8b50: 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
8b60: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
8b70: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
8b80: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8b90: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20    int op;.  if( 
8ba0: 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
8bb0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69   ) return;.  swi
8bc0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8bd0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  {.    case TK_PL
8be0: 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  US:     op = OP_
8bf0: 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  Add;      break;
8c00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
8c10: 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53  US:    op = OP_S
8c20: 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b 0a  ubtract; break;.
8c30: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
8c40: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 75  :     op = OP_Mu
8c50: 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a 20  ltiply; break;. 
8c60: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
8c70: 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69 76  :    op = OP_Div
8c80: 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ide;   break;.  
8c90: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
8ca0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b      op = OP_And;
8cb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8cc0: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
8cd0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20 20     op = OP_Or;  
8ce0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8cf0: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8d00: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
8d10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8d20: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
8d30: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
8d40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8d50: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
8d60: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
8d70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8d80: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
8d90: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
8da0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8db0: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
8dc0: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
8dd0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8de0: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
8df0: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
8e00: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8e10: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
8e20: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
8e30: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8e40: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
8e50: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
8e60: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8e70: 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  NOT:      op = O
8e80: 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61  P_Not;      brea
8e90: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
8ea0: 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50  MINUS:   op = OP
8eb0: 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b  _Negative; break
8ec0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8ed0: 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TAND:   op = OP_
8ee0: 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b  BitAnd;   break;
8ef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8f00: 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42  OR:    op = OP_B
8f10: 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a  itOr;    break;.
8f20: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
8f30: 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  OT:   op = OP_Bi
8f40: 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  tNot;   break;. 
8f50: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8f60: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
8f70: 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a  ftLeft;  break;.
8f80: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
8f90: 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68  FT:   op = OP_Sh
8fa0: 69 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b  iftRight; break;
8fb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
8fc0: 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52  :      op = OP_R
8fd0: 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b  emainder;  break
8fe0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  ;.    case TK_FL
8ff0: 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  OAT:    op = OP_
9000: 52 65 61 6c 3b 20 20 20 20 20 20 20 62 72 65 61  Real;       brea
9010: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
9020: 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d 20 4f 50  TRING:   op = OP
9030: 5f 53 74 72 69 6e 67 3b 20 20 20 20 20 62 72 65  _String;     bre
9040: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
9050: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77   break;.  }.  sw
9060: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9070: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
9080: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
9090: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  f( pParse->useAg
90a0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
90b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
90c0: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
90d0: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
90e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
90f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
9100: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9110: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9120: 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
9130: 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
9140: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
9150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9160: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9170: 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70  , OP_Recno, pExp
9180: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
9190: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
91a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
91b0: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
91c0: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
91d0: 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  er(v, pExpr->tok
91e0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
91f0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
9200: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9210: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
9220: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
9230: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9240: 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30  VdbeOp3(v, op, 0
9250: 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  , 0, pExpr->toke
9260: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
9270: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  n.n);.      sqli
9280: 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33  te3VdbeDequoteP3
9290: 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62  (v, -1);.      b
92a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
92b0: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a  case TK_NULL: {.
92c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
92d0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72  eAddOp(v, OP_Str
92e0: 69 6e 67 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ing, 0, 0);.    
92f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9300: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
9310: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
9320: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9330: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
9340: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
9350: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9360: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9370: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
9380: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
9390: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
93a0: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
93b0: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
93c0: 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  EQ: {.      int 
93d0: 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p1 = binaryCompa
93e0: 72 65 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66  reP1(pExpr->pLef
93f0: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
9400: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
9410: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9420: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9430: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9440: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9450: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
9460: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9470: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 70  beAddOp(v, op, p
9480: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
9490: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
94a0: 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
94b0: 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
94c0: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
94d0: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
94e0: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
94f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
9500: 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
9510: 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
9520: 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
9530: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20  se TK_SLASH: {. 
9540: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9550: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9560: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9570: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9580: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9590: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
95a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
95b0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
95c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
95d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  }.    case TK_LS
95e0: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
95f0: 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20  K_RSHIFT: {.    
9600: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9610: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9620: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9630: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9640: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9650: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
9660: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9670: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
9680: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9690: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
96a0: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
96b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
96c0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
96d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
96e0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
96f0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
9720: 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cat, 2, 0);.    
9730: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9740: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
9750: 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
9760: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
9770: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
9780: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
9790: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
97a0: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
97b0: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
97c0: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
97d0: 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66  Token *p = &pLef
97e0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
97f0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
9800: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b  teMalloc( p->n +
9810: 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70   2 );.        sp
9820: 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22  rintf(z, "-%.*s"
9830: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20  , p->n, p->z);. 
9840: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
9850: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
9860: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
9870: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
9880: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
9890: 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  p->n+1);.       
98a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
98b0: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
98c0: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
98d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
98e0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
98f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9900: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
9910: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
9920: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
9930: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
9940: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
9950: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
9960: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9970: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9980: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9990: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
99a0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
99b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
99c0: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
99d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
99e0: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
99f0: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c   dest;.      sql
9a00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9a10: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
9a20: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
9a30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9a40: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9a50: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
9a60: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
9a70: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
9a80: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9a90: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
9aa0: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
9ab0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9ac0: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
9ad0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
9ae0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
9af0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
9b00: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9b10: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47  AddOp(v, OP_AggG
9b20: 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41  et, 0, pExpr->iA
9b30: 67 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  gg);.      break
9b40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9b50: 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61   TK_GLOB:.    ca
9b60: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
9b70: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
9b80: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
9b90: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
9ba0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
9bb0: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
9bc0: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
9bd0: 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
9be0: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
9bf0: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
9c00: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
9c10: 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69  .      getFuncti
9c20: 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a  onName(pExpr, &z
9c30: 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20  Id, &nId);.     
9c40: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
9c50: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
9c60: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
9c70: 2c 20 6e 45 78 70 72 2c 20 30 29 3b 0a 20 20 20  , nExpr, 0);.   
9c80: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
9c90: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  =0 );.      nExp
9ca0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
9cb0: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
9cc0: 73 65 2c 20 70 4c 69 73 74 2c 20 70 44 65 66 2d  se, pList, pDef-
9cd0: 3e 69 6e 63 6c 75 64 65 54 79 70 65 73 29 3b 0a  >includeTypes);.
9ce0: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
9cf0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 69   The following i
9d00: 73 20 61 20 74 65 6d 70 6f 72 61 72 79 20 68 61  s a temporary ha
9d10: 63 6b 2e 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  ck. */.      if(
9d20: 20 30 3d 3d 73 71 6c 69 74 65 33 53 74 72 4e 49   0==sqlite3StrNI
9d30: 43 6d 70 28 7a 49 64 2c 20 22 63 6c 61 73 73 6f  Cmp(zId, "classo
9d40: 66 22 2c 20 6e 49 64 29 20 29 7b 0a 20 20 20 20  f", nId) ){.    
9d50: 20 20 20 20 61 73 73 65 72 74 28 20 6e 45 78 70      assert( nExp
9d60: 72 3d 3d 31 20 29 3b 0a 20 20 20 20 20 20 20 20  r==1 );.        
9d70: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9d80: 28 76 2c 20 4f 50 5f 43 6c 61 73 73 2c 20 6e 45  (v, OP_Class, nE
9d90: 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  xpr, 0);.      }
9da0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
9db0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
9dc0: 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78  OP_Function, nEx
9dd0: 70 72 2c 20 30 2c 20 28 63 68 61 72 2a 29 70 44  pr, 0, (char*)pD
9de0: 65 66 2c 20 50 33 5f 50 4f 49 4e 54 45 52 29 3b  ef, P3_POINTER);
9df0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9e00: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9e10: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
9e20: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9e30: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
9e40: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
9e50: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
9e60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9e70: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
9e80: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9e90: 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73  .      char cons
9ea0: 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20 20  t *affStr;..    
9eb0: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
9ec0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
9ed0: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
9ee0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
9ef0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
9f00: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
9f10: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
9f20: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
9f30: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
9f40: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
9f50: 4f 50 5f 4d 61 6b 65 4b 65 79 2e 0a 20 20 20 20  OP_MakeKey..    
9f60: 20 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 53 74    */.      affSt
9f70: 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e  r = sqlite3Affin
9f80: 69 74 79 53 74 72 69 6e 67 28 63 6f 6d 70 61 72  ityString(compar
9f90: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
9fa0: 70 72 29 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  pr));..      sql
9fb0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9fc0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
9fd0: 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f  0);..      /* Co
9fe0: 64 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72  de the <expr> fr
9ff0: 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e  om "<expr> IN (.
a000: 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72  ..)". The tempor
a010: 61 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20  ary table.      
a020: 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  ** pExpr->iTable
a030: 20 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61   contains the va
a040: 6c 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75  lues that make u
a050: 70 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e  p the (...) set.
a060: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
a070: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a080: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a090: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64  Left);.      add
a0a0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
a0b0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
a0c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a0d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e  AddOp(v, OP_NotN
a0e0: 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29  ull, -1, addr+4)
a0f0: 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;            /* 
a100: 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20  addr + 0 */.    
a110: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a120: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c  Op(v, OP_Pop, 2,
a130: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a140: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a150: 50 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b  P_String, 0, 0);
a160: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a170: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
a180: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
a190: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a1a0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 4b  eOp3(v, OP_MakeK
a1b0: 65 79 2c 20 31 2c 20 30 2c 20 61 66 66 53 74 72  ey, 1, 0, affStr
a1c0: 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 20 2f 2a  , P3_STATIC); /*
a1d0: 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
a1e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a1f0: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
a200: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
a210: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
a220: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a230: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
a240: 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  , 0);           
a250: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
a260: 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65   6 */..      bre
a270: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a280: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
a290: 0a 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 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
a2c0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a2d0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a2e0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a2f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a300: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a310: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
a320: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a330: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 65 2c  eAddOp(v, OP_Ge,
a340: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a350: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a360: 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29  , OP_Pull, 1, 0)
a370: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
a380: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
a390: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
a3a0: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
a3b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a3c0: 70 28 76 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  p(v, OP_Le, 0, 0
a3d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a3e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a3f0: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
a400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a410: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
a420: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
a430: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a440: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a450: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a460: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a470: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a480: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
a490: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
a4a0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
a4b0: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
a4c0: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
a4d0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
a4e0: 20 69 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72   i;..      asser
a4f0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b  t(pExpr->pList);
a500: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70  .      assert((p
a510: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
a520: 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20  pr % 2) == 0);. 
a530: 20 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70       assert(pExp
a540: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20  r->pList->nExpr 
a550: 3e 20 30 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  > 0);.      nExp
a560: 72 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  r = pExpr->pList
a570: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
a580: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
a590: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
a5a0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
a5b0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
a5c0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
a5d0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a5e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
a5f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a600: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
a610: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
a620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a630: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a640: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
a650: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
a660: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
a670: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a680: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a690: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
a6a0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
a6b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
a6c0: 64 4f 70 28 76 2c 20 4f 50 5f 4e 65 2c 20 31 2c  dOp(v, OP_Ne, 1,
a6d0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   0);.          s
a6e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a6f0: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
a700: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
a710: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
a720: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
a730: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
a740: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
a750: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
a760: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a770: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
a780: 74 2d 3e 61 5b 69 2b 31 5d 2e 70 45 78 70 72 29  t->a[i+1].pExpr)
a790: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a7a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a7b0: 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65  _Goto, 0, expr_e
a7c0: 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20  nd_label);.     
a7d0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a7e0: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
a7f0: 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
a800: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32  ite3VdbeChangeP2
a810: 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64  (v, jumpInst, ad
a820: 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  dr);.      }.   
a830: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
a840: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  eft ){.        s
a850: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a860: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
a870: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
a880: 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68  if( pExpr->pRigh
a890: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
a8a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a8b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
a8c0: 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ht);.      }else
a8d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a8e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a8f0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 29 3b 0a  _String, 0, 0);.
a900: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a910: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a920: 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
a930: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
a940: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a950: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
a960: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
a970: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
a980: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a990: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a9a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a9b0: 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
a9c0: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
a9d0: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
a9e0: 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
a9f0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
aa00: 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b 0a  Err++;..return;.
aa10: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aa20: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
aa30: 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20   == OE_Rollback 
aa40: 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f  ||..  pExpr->iCo
aa50: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
aa60: 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43   ||..  pExpr->iC
aa70: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c  olumn == OE_Fail
aa80: 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 33 56 64   ){..  sqlite3Vd
aa90: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
aaa0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
aab0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
aac0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
aad0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aae0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
aaf0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
ab00: 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ..  sqlite3VdbeD
ab10: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
ab20: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
ab30: 09 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
ab40: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
ab50: 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c  Ignore );..  sql
ab60: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
ab70: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
ab80: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
ab90: 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20  noreJump,.      
aba0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abb0: 20 20 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75       "(IGNORE ju
abc0: 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  mp)", 0);.      
abd0: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
abe0: 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
abf0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
ac00: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
ac10: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
ac20: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
ac30: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
ac40: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
ac50: 61 63 6b 2e 20 20 49 66 20 74 68 65 20 69 6e 63  ack.  If the inc
ac60: 6c 75 64 65 54 79 70 65 73 20 66 6c 61 67 20 69  ludeTypes flag i
ac70: 73 20 74 72 75 65 2c 0a 2a 2a 20 74 68 65 6e 20  s true,.** then 
ac80: 61 6c 73 6f 20 70 75 73 68 20 61 20 73 74 72 69  also push a stri
ac90: 6e 67 20 74 68 61 74 20 69 73 20 74 68 65 20 64  ng that is the d
aca0: 61 74 61 74 79 70 65 20 6f 66 20 65 61 63 68 20  atatype of each 
acb0: 65 6c 65 6d 65 6e 74 20 6f 6e 74 6f 0a 2a 2a 20  element onto.** 
acc0: 74 68 65 20 73 74 61 63 6b 20 61 66 74 65 72 20  the stack after 
acd0: 74 68 65 20 76 61 6c 75 65 2e 0a 2a 2a 0a 2a 2a  the value..**.**
ace0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
acf0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
ad00: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
ad10: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
ad20: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
ad30: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
ad40: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
ad50: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
ad60: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
ad70: 73 74 2c 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st,   /* The exp
ad80: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
ad90: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 20 20 69 6e  be coded */.  in
ada0: 74 20 69 6e 63 6c 75 64 65 54 79 70 65 73 20 20  t includeTypes  
adb0: 20 2f 2a 20 54 52 55 45 20 74 6f 20 70 75 74 20   /* TRUE to put 
adc0: 64 61 74 61 74 79 70 65 73 20 6f 6e 20 74 68 65  datatypes on the
add0: 20 73 74 61 63 6b 20 74 6f 6f 20 2a 2f 0a 29 7b   stack too */.){
ade0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
adf0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
ae00: 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64    int i, n;.  Vd
ae10: 62 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69  be *v;.  if( pLi
ae20: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
ae30: 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47  ;.  v = sqlite3G
ae40: 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a  etVdbe(pParse);.
ae50: 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78    n = pList->nEx
ae60: 70 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d  pr;.  for(pItem=
ae70: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
ae80: 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  <n; i++, pItem++
ae90: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
aea0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
aeb0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
aec0: 20 20 69 66 28 20 69 6e 63 6c 75 64 65 54 79 70    if( includeTyp
aed0: 65 73 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  es ){.      sqli
aee0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
aef0: 5f 53 74 72 69 6e 67 2c 20 30 2c 20 30 2c 20 0a  _String, 0, 0, .
af00: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
af10: 45 78 70 72 54 79 70 65 28 70 49 74 65 6d 2d 3e  ExprType(pItem->
af20: 70 45 78 70 72 29 3d 3d 53 51 4c 49 54 45 5f 53  pExpr)==SQLITE_S
af30: 4f 5f 4e 55 4d 20 3f 20 22 6e 75 6d 65 72 69 63  O_NUM ? "numeric
af40: 22 20 3a 20 22 74 65 78 74 22 2c 0a 20 20 20 20  " : "text",.    
af50: 20 20 20 20 20 50 33 5f 53 54 41 54 49 43 29 3b       P3_STATIC);
af60: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
af70: 75 72 6e 20 69 6e 63 6c 75 64 65 54 79 70 65 73  urn includeTypes
af80: 20 3f 20 6e 2a 32 20 3a 20 6e 3b 0a 7d 0a 0a 2f   ? n*2 : n;.}../
af90: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
afa0: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
afb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
afc0: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
afd0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
afe0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
aff0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
b000: 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
b010: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
b020: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
b030: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
b040: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
b050: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
b060: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
b070: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
b080: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
b090: 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
b0a0: 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
b0b0: 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
b0c0: 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  rue..*/.void sql
b0d0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 50  ite3ExprIfTrue(P
b0e0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
b0f0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
b100: 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
b110: 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
b120: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
b130: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
b140: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
b150: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
b160: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
b170: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
b180: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
b190: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
b1a0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b1b0: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
b1c0: 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72   OP_Le;       br
b1d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b1e0: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
b1f0: 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65  OP_Gt;       bre
b200: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
b210: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
b220: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
b230: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
b240: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
b250: 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ne;       break
b260: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
b270: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
b280: 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Eq;       break;
b290: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
b2a0: 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49  ULL:   op = OP_I
b2b0: 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a  sNull;   break;.
b2c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
b2d0: 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f  ULL:  op = OP_No
b2e0: 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20  tNull;  break;. 
b2f0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65     default:  bre
b300: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
b310: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
b320: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
b330: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
b340: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
b350: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
b360: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
b370: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
b380: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
b390: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
b3a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
b3b0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
b3c0: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
b3d0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b3e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
b3f0: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
b400: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b410: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b420: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
b430: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
b440: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b450: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
b460: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
b470: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
b480: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b490: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
b4a0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
b4b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b4c0: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
b4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b4e0: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
b4f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
b500: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
b510: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b520: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b530: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
b540: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
b550: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
b560: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
b570: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
b580: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_EQ: {.      in
b590: 74 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d  t p1 = binaryCom
b5a0: 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e 70 4c  pareP1(pExpr->pL
b5b0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
b5c0: 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  ht, jumpIfNull);
b5d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b5e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b5f0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
b600: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b610: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b620: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
b630: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b640: 4f 70 28 76 2c 20 6f 70 2c 20 70 31 2c 20 64 65  Op(v, op, p1, de
b650: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
b660: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b670: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
b680: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
b690: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b6a0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b6b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b6c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b6d0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
b6e0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
b6f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 20 30  eak;.    }.#if 0
b700: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
b710: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
b720: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
b730: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b740: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b750: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
b760: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
b770: 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71  ddr(v);.      sq
b780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b790: 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31  , OP_NotNull, -1
b7a0: 2c 20 61 64 64 72 2b 33 29 3b 0a 20 20 20 20 20  , addr+3);.     
b7b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b7c0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
b7d0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
b7e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b7f0: 5f 47 6f 74 6f 2c 20 30 2c 20 6a 75 6d 70 49 66  _Goto, 0, jumpIf
b800: 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20 61 64  Null ? dest : ad
b810: 64 72 2b 34 29 3b 0a 20 20 20 20 20 20 69 66 28  dr+4);.      if(
b820: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
b830: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b840: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b850: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
b860: 69 54 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20  iTable, dest);. 
b870: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
b880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b890: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 46 6f  ddOp(v, OP_SetFo
b8a0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
b8b0: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
b8c0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
b8d0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
b8e0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
b8f0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
b900: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
b910: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b920: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
b930: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b940: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
b950: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
b960: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b970: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b980: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
b990: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
b9a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b9b0: 28 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70  (v, OP_Lt, !jump
b9c0: 49 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20  IfNull, 0);.    
b9d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b9e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b9f0: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
ba00: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
ba10: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ba20: 50 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  P_Le, jumpIfNull
ba30: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
ba40: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ba50: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
ba60: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
ba70: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
ba80: 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  v, addr, sqlite3
ba90: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
baa0: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
bab0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bac0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
bad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
bae0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
baf0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
bb00: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
bb10: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
bb20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bb30: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
bb40: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
bb50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
bb60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
bb70: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
bb80: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
bb90: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
bba0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
bbb0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
bbc0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
bbd0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
bbe0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
bbf0: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
bc00: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
bc10: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
bc20: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
bc30: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
bc40: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
bc50: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
bc60: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
bc70: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
bc80: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
bc90: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
bca0: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
bcb0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
bcc0: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
bcd0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
bce0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
bcf0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
bd00: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
bd10: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
bd20: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
bd30: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
bd40: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
bd50: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
bd60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
bd70: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
bd80: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
bd90: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
bda0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74        op = OP_Gt
bdb0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
bdc0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
bdd0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
bde0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bdf0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
be00: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
be10: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
be20: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
be30: 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20     op = OP_Eq;  
be40: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
be50: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
be60: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
be70: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
be80: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
be90: 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c   op = OP_NotNull
bea0: 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
beb0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20  se TK_NOTNULL:  
bec0: 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20  op = OP_IsNull; 
bed0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
bee0: 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20  ault:  break;.  
bef0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
bf00: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
bf10: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
bf20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
bf30: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
bf40: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
bf50: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
bf60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
bf70: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
bf80: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
bf90: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
bfa0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bfb0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bfc0: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
bfd0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
bfe0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
bff0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
c000: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
c010: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
c020: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
c030: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
c040: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
c050: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
c060: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
c070: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c080: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
c090: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
c0a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c0b0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
c0c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
c0d0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
c0e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
c0f0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
c100: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c110: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
c120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
c130: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
c140: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
c150: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
c160: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
c170: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20   {.      int p1 
c180: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
c190: 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  1(pExpr->pLeft, 
c1a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6a  pExpr->pRight, j
c1b0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
c1c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c1d0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c1e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c1f0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c200: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
c210: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  ight);.      sql
c220: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c230: 20 6f 70 2c 20 70 31 2c 20 64 65 73 74 29 3b 0a   op, p1, dest);.
c240: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c250: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
c260: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
c270: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
c280: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c290: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c2a0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
c2c0: 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74  p(v, op, 1, dest
c2d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c2e0: 20 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20 20      }.#if 0.    
c2f0: 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20  case TK_IN: {.  
c300: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c310: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c320: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c330: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c340: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
c350: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
c360: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c370: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c380: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
c390: 72 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+3);.      sqli
c3a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c3b0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
c3c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c3d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f  AddOp(v, OP_Goto
c3e0: 2c 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  , 0, jumpIfNull 
c3f0: 3f 20 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29  ? dest : addr+4)
c400: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
c410: 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20  r->pSelect ){.  
c420: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c430: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74  eAddOp(v, OP_Not
c440: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
c450: 61 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20  able, dest);.   
c460: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
c470: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c480: 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46  Op(v, OP_SetNotF
c490: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
c4a0: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
c4b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
c4c0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
c4d0: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
c4e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
c4f0: 64 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ddr;.      sqlit
c500: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c510: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c520: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c530: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
c540: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
c550: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c560: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c570: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c580: 72 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  r);.      addr =
c590: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
c5a0: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
c5b0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5c0: 4f 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75  Op(v, OP_Ge, !ju
c5d0: 6d 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33  mpIfNull, addr+3
c5e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c5f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c600: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
c610: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c620: 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  Op(v, OP_Goto, 0
c630: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
c640: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c650: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c660: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29  ist->a[1].pExpr)
c670: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c680: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
c690: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  t, jumpIfNull, d
c6a0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
c6b0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  k;.    }.    def
c6c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71  ault: {.      sq
c6d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c6e0: 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20  arse, pExpr);.  
c6f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c700: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74  ddOp(v, OP_IfNot
c710: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
c720: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
c730: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c740: 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63  *.** Do a deep c
c750: 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f  omparison of two
c760: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
c770: 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20  s.  Return TRUE 
c780: 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66  (non-zero).** if
c790: 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69   they are identi
c7a0: 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46  cal and return F
c7b0: 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66  ALSE if they dif
c7c0: 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a  fer in any way..
c7d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
c7e0: 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a  prCompare(Expr *
c7f0: 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20  pA, Expr *pB){. 
c800: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41   int i;.  if( pA
c810: 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ==0 ){.    retur
c820: 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65  n pB==0;.  }else
c830: 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20   if( pB==0 ){.  
c840: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
c850: 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42    if( pA->op!=pB
c860: 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b  ->op ) return 0;
c870: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
c880: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
c890: 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29  Left, pB->pLeft)
c8a0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c8b0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
c8c0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68  ompare(pA->pRigh
c8d0: 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29  t, pB->pRight) )
c8e0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
c8f0: 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20   pA->pList ){.  
c900: 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d    if( pB->pList=
c910: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
c920: 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74     if( pA->pList
c930: 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69  ->nExpr!=pB->pLi
c940: 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75  st->nExpr ) retu
c950: 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d  rn 0;.    for(i=
c960: 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e  0; i<pA->pList->
c970: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
c980: 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45     if( !sqlite3E
c990: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
c9a0: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
c9b0: 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  , pB->pList->a[i
c9c0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
c9d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
c9e0: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65      }.    }.  }e
c9f0: 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73  lse if( pB->pLis
ca00: 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  t ){.    return 
ca10: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
ca20: 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e  >pSelect || pB->
ca30: 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e  pSelect ) return
ca40: 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54   0;.  if( pA->iT
ca50: 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65  able!=pB->iTable
ca60: 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21   || pA->iColumn!
ca70: 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72  =pB->iColumn ) r
ca80: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70  eturn 0;.  if( p
ca90: 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20  A->token.z ){.  
caa0: 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e    if( pB->token.
cab0: 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  z==0 ) return 0;
cac0: 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
cad0: 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e  en.n!=pA->token.
cae0: 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  n ) return 0;.  
caf0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
cb00: 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e  NICmp(pA->token.
cb10: 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  z, pB->token.z, 
cb20: 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20  pB->token.n)!=0 
cb30: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a  ) return 0;.  }.
cb40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f    return 1;.}../
cb50: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
cb60: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50  lement to the pP
cb70: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
cb80: 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  ay and return it
cb90: 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74  s index..*/.stat
cba0: 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67  ic int appendAgg
cbb0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
cbc0: 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72  se){.  if( (pPar
cbd0: 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d  se->nAgg & 0x7)=
cbe0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d  =0 ){.    int am
cbf0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  t = pParse->nAgg
cc00: 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70   + 8;.    AggExp
cc10: 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65  r *aAgg = sqlite
cc20: 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  Realloc(pParse->
cc30: 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66  aAgg, amt*sizeof
cc40: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
cc50: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67  ));.    if( aAgg
cc60: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
cc70: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
cc80: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
cc90: 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aAgg;.  }.  mem
cca0: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67  set(&pParse->aAg
ccb0: 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c  g[pParse->nAgg],
ccc0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73   0, sizeof(pPars
ccd0: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
cce0: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
ccf0: 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Agg++;.}../*.** 
cd00: 41 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65  Analyze the give
cd10: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f  n expression loo
cd20: 6b 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61  king for aggrega
cd30: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64  te functions and
cd40: 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65  .** for variable
cd50: 73 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62  s that need to b
cd60: 65 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70  e added to the p
cd70: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
cd80: 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64  ray..** Make add
cd90: 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20  itional entries 
cda0: 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61  to the pParse->a
cdb0: 41 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e  Agg[] array as n
cdc0: 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20  ecessary..**.** 
cdd0: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f  This routine sho
cde0: 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c  uld only be call
cdf0: 65 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70  ed after the exp
ce00: 72 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e  ression has been
ce10: 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20  .** analyzed by 
ce20: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
ce30: 76 65 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69  veIds() and sqli
ce40: 74 65 33 45 78 70 72 43 68 65 63 6b 28 29 2e 0a  te3ExprCheck()..
ce50: 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20  **.** If errors 
ce60: 61 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20  are seen, leave 
ce70: 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65  an error message
ce80: 20 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20   in zErrMsg and 
ce90: 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75  return.** the nu
cea0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
ceb0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
cec0: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
ced0: 74 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73  tes(Parse *pPars
cee0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
cef0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45  .  int i;.  AggE
cf00: 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74  xpr *aAgg;.  int
cf10: 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66   nErr = 0;..  if
cf20: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
cf30: 75 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28  urn 0;.  switch(
cf40: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
cf50: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
cf60: 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d  : {.      aAgg =
cf70: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20   pParse->aAgg;. 
cf80: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
cf90: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
cfa0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
cfb0: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20  aAgg[i].isAgg ) 
cfc0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
cfd0: 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45    if( aAgg[i].pE
cfe0: 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78  xpr->iTable==pEx
cff0: 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20  pr->iTable.     
d000: 20 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70      && aAgg[i].p
d010: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70  Expr->iColumn==p
d020: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b  Expr->iColumn ){
d030: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
d040: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
d050: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e    }.      if( i>
d060: 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b  =pParse->nAgg ){
d070: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70  .        i = app
d080: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
d090: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
d0a0: 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i<0 ) return 1;.
d0b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d0c0: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20  aAgg[i].isAgg = 
d0d0: 30 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  0;.        pPars
d0e0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
d0f0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
d100: 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  }.      pExpr->i
d110: 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62  Agg = i;.      b
d120: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
d130: 63 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43  case TK_AGG_FUNC
d140: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  TION: {.      aA
d150: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
d160: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
d170: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
d180: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d190: 69 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41  if( !aAgg[i].isA
d1a0: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
d1b0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
d1c0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41  e3ExprCompare(aA
d1d0: 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78  gg[i].pExpr, pEx
d1e0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
d1f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
d200: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
d210: 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e  if( i>=pParse->n
d220: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69  Agg ){.        i
d230: 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f   = appendAggInfo
d240: 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
d250: 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75    if( i<0 ) retu
d260: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50  rn 1;.        pP
d270: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73  arse->aAgg[i].is
d280: 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  Agg = 1;.       
d290: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
d2a0: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
d2b0: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
d2c0: 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20  aAgg[i].pFunc = 
d2d0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
d2e0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a  ion(pParse->db,.
d2f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
d300: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
d310: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20  pr->token.n,.   
d320: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
d330: 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e  >pList ? pExpr->
d340: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
d350: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
d360: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
d370: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
d380: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
d390: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
d3a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
d3b0: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
d3c0: 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
d3d0: 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61  zeAggregates(pPa
d3e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
d3f0: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d400: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
d410: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
d420: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
d430: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
d440: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
d450: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
d460: 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ght);.      }.  
d470: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
d480: 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20  && pExpr->pList 
d490: 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e  ){.        int n
d4a0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
d4b0: 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  >nExpr;.        
d4c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
d4d0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
d4e0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
d4f0: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
d500: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
d510: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
d520: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
d530: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
d540: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
d550: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d560: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
d570: 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   nErr;.}../*.** 
d580: 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20 66 75  Locate a user fu
d590: 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e  nction given a n
d5a0: 61 6d 65 20 61 6e 64 20 61 20 6e 75 6d 62 65 72  ame and a number
d5b0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a   of arguments..*
d5c0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
d5d0: 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65  er to the FuncDe
d5e0: 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  f structure that
d5f0: 20 64 65 66 69 6e 65 73 20 74 68 61 74 0a 2a 2a   defines that.**
d600: 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65   function, or re
d610: 74 75 72 6e 20 4e 55 4c 4c 20 69 66 20 74 68 65  turn NULL if the
d620: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
d630: 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ot exist..**.** 
d640: 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61  If the createFla
d650: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  g argument is tr
d660: 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28  ue, then a new (
d670: 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a  blank) FuncDef.*
d680: 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  * structure is c
d690: 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64  reated and liked
d6a0: 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73   into the "db" s
d6b0: 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a  tructure if a.**
d6c0: 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e   no matching fun
d6d0: 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
d6e0: 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20   existed.  When 
d6f0: 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74 72  createFlag is tr
d700: 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41  ue.** and the nA
d710: 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rg parameter is 
d720: 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20  -1, then only a 
d730: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63  function that ac
d740: 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d  cepts.** any num
d750: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d760: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d770: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  d..**.** If crea
d780: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20  teFlag is false 
d790: 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20  and nArg is -1, 
d7a0: 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 76  then the first v
d7b0: 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  alid.** function
d7c0: 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e   found is return
d7d0: 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20  ed.  A function 
d7e0: 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74 68  is valid if eith
d7f0: 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78  er xFunc.** or x
d800: 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Step is non-zero
d810: 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71  ..*/.FuncDef *sq
d820: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
d830: 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  n(.  sqlite *db,
d840: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
d850: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
d860: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d870: 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me, /* Name of t
d880: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f  he function.  No
d890: 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  t null-terminate
d8a0: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  d */.  int nName
d8b0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ,         /* Num
d8c0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
d8d0: 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f  s in the name */
d8e0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
d8f0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d900: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d  of arguments.  -
d910: 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62  1 means any numb
d920: 65 72 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  er */.  int crea
d930: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
d940: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
d950: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
d960: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
d970: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
d980: 44 65 66 20 2a 70 46 69 72 73 74 2c 20 2a 70 2c  Def *pFirst, *p,
d990: 20 2a 70 4d 61 79 62 65 3b 0a 20 20 70 46 69 72   *pMaybe;.  pFir
d9a0: 73 74 20 3d 20 70 20 3d 20 28 46 75 6e 63 44 65  st = p = (FuncDe
d9b0: 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  f*)sqlite3HashFi
d9c0: 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a  nd(&db->aFunc, z
d9d0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
d9e0: 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65  if( p && !create
d9f0: 46 6c 61 67 20 26 26 20 6e 41 72 67 3c 30 20 29  Flag && nArg<0 )
da00: 7b 0a 20 20 20 20 77 68 69 6c 65 28 20 70 20 26  {.    while( p &
da10: 26 20 70 2d 3e 78 46 75 6e 63 3d 3d 30 20 26 26  & p->xFunc==0 &&
da20: 20 70 2d 3e 78 53 74 65 70 3d 3d 30 20 29 7b 20   p->xStep==0 ){ 
da30: 70 20 3d 20 70 2d 3e 70 4e 65 78 74 3b 20 7d 0a  p = p->pNext; }.
da40: 20 20 20 20 72 65 74 75 72 6e 20 70 3b 0a 20 20      return p;.  
da50: 7d 0a 20 20 70 4d 61 79 62 65 20 3d 20 30 3b 0a  }.  pMaybe = 0;.
da60: 20 20 77 68 69 6c 65 28 20 70 20 26 26 20 70 2d    while( p && p-
da70: 3e 6e 41 72 67 21 3d 6e 41 72 67 20 29 7b 0a 20  >nArg!=nArg ){. 
da80: 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3c 30     if( p->nArg<0
da90: 20 26 26 20 21 63 72 65 61 74 65 46 6c 61 67 20   && !createFlag 
daa0: 26 26 20 28 70 2d 3e 78 46 75 6e 63 20 7c 7c 20  && (p->xFunc || 
dab0: 70 2d 3e 78 53 74 65 70 29 20 29 20 70 4d 61 79  p->xStep) ) pMay
dac0: 62 65 20 3d 20 70 3b 0a 20 20 20 20 70 20 3d 20  be = p;.    p = 
dad0: 70 2d 3e 70 4e 65 78 74 3b 0a 20 20 7d 0a 20 20  p->pNext;.  }.  
dae0: 69 66 28 20 70 20 26 26 20 21 63 72 65 61 74 65  if( p && !create
daf0: 46 6c 61 67 20 26 26 20 70 2d 3e 78 46 75 6e 63  Flag && p->xFunc
db00: 3d 3d 30 20 26 26 20 70 2d 3e 78 53 74 65 70 3d  ==0 && p->xStep=
db10: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
db20: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 3d   0;.  }.  if( p=
db30: 3d 30 20 26 26 20 70 4d 61 79 62 65 20 29 7b 0a  =0 && pMaybe ){.
db40: 20 20 20 20 61 73 73 65 72 74 28 20 63 72 65 61      assert( crea
db50: 74 65 46 6c 61 67 3d 3d 30 20 29 3b 0a 20 20 20  teFlag==0 );.   
db60: 20 72 65 74 75 72 6e 20 70 4d 61 79 62 65 3b 0a   return pMaybe;.
db70: 20 20 7d 0a 20 20 69 66 28 20 70 3d 3d 30 20 26    }.  if( p==0 &
db80: 26 20 63 72 65 61 74 65 46 6c 61 67 20 26 26 20  & createFlag && 
db90: 28 70 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  (p = sqliteMallo
dba0: 63 28 73 69 7a 65 6f 66 28 2a 70 29 29 29 21 3d  c(sizeof(*p)))!=
dbb0: 30 20 29 7b 0a 20 20 20 20 70 2d 3e 6e 41 72 67  0 ){.    p->nArg
dbc0: 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 2d 3e   = nArg;.    p->
dbd0: 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a  pNext = pFirst;.
dbe0: 20 20 20 20 70 2d 3e 64 61 74 61 54 79 70 65 20      p->dataType 
dbf0: 3d 20 70 46 69 72 73 74 20 3f 20 70 46 69 72 73  = pFirst ? pFirs
dc00: 74 2d 3e 64 61 74 61 54 79 70 65 20 3a 20 53 51  t->dataType : SQ
dc10: 4c 49 54 45 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  LITE_NUMERIC;.  
dc20: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
dc30: 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ert(&db->aFunc, 
dc40: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76  zName, nName, (v
dc50: 6f 69 64 2a 29 70 29 3b 0a 20 20 7d 0a 20 20 72  oid*)p);.  }.  r
dc60: 65 74 75 72 6e 20 70 3b 0a 7d 0a                 eturn p;.}.