/ Hex Artifact Content
Login

Artifact 3c3dd119fd7910dca40676a46c85785222cdf311:


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 35 38 20 32 30 30 34 2f 30 38 2f 33 31 20  .158 2004/08/31 
0220: 31 33 3a 34 35 3a 31 32 20 64 72 68 20 45 78 70  13:45:12 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 20  assert(0);.  }. 
0370: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
0380: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0390: 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68  'affinity' of th
03a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
03b0: 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  pr if any..**.**
03c0: 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
03d0: 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e  olumn, a referen
03e0: 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76  ce to a column v
03f0: 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73  ia an 'AS' alias
0400: 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65  ,.** or a sub-se
0410: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75  lect with a colu
0420: 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  mn as the return
0430: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
0440: 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66   .** affinity of
0450: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20   that column is 
0460: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
0470: 69 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74  ise, 0x00 is ret
0480: 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61  urned,.** indica
0490: 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79  ting no affinity
04a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
04b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20  ion..**.** i.e. 
04c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
04d0: 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e   expresssions in
04e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
04f0: 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a  tatements all.**
0500: 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74   have an affinit
0510: 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  y:.**.** CREATE 
0520: 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20  TABLE t1(a);.** 
0530: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0540: 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c   WHERE a;.** SEL
0550: 45 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20  ECT a AS b FROM 
0560: 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53  t1 WHERE b;.** S
0570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0580: 57 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20  WHERE (select a 
0590: 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61  from t1);.*/.cha
05a0: 72 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r sqlite3ExprAff
05b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
05c0: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
05d0: 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20 20  >op==TK_AS ){.  
05e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05f0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0600: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  pr->pLeft);.  }.
0610: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
0620: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
0630: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0640: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0650: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
0660: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
0670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0680: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a  Expr->affinity;.
0690: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
06a0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
06b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
06c0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
06d0: 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74  n pExpr. If.** t
06e0: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75  here is no defau
06f0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  lt collation typ
0700: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  e, return 0..*/.
0710: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
0720: 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73  ExprCollSeq(Pars
0730: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0740: 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c 53  *pExpr){.  CollS
0750: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
0760: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
0770: 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d    pColl = pExpr-
0780: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  >pColl;.    if( 
0790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  pExpr->op==TK_AS
07a0: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
07b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
07c0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
07d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
07e0: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ft);.    }.  }. 
07f0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0800: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0810: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0820: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0830: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0840: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0850: 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
0860: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
0870: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
0880: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
0890: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
08a0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
08b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
08c0: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
08d0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
08e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
08f0: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
0900: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
0910: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
0920: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
0930: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
0940: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
0950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0960: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
0970: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
0980: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
0990: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
09a0: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
09b0: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
09c0: 6e 75 6d 65 72 69 63 20 6f 72 0a 20 20 20 20 2a  numeric or.    *
09d0: 2a 20 69 6e 74 65 67 65 72 20 61 66 66 69 6e 69  * integer affini
09e0: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
09f0: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
0a00: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
0a10: 20 20 20 20 69 66 28 20 61 66 66 31 3d 3d 53 51      if( aff1==SQ
0a20: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0a30: 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c 49 54 45   || aff2==SQLITE
0a40: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 7b 0a  _AFF_INTEGER ){.
0a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
0a60: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
0a70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61  .    }else if( a
0a80: 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff1==SQLITE_AFF_
0a90: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 32 3d  NUMERIC || aff2=
0aa0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
0ab0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 72 65 74  RIC ){.      ret
0ac0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0ad0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
0ae0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
0af0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
0b00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
0b10: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
0b20: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
0b30: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
0b40: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
0b50: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
0b60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
0b70: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
0b80: 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 72 65 74 75    */.    /* retu
0b90: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0ba0: 4d 45 52 49 43 3b 20 20 2f 2f 20 54 69 63 6b 65  MERIC;  // Ticke
0bb0: 74 20 23 38 30 35 20 2a 2f 0a 20 20 20 20 72 65  t #805 */.    re
0bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0bd0: 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NONE;.  }else{. 
0be0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
0bf0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
0c00: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
0c10: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
0c20: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
0c30: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
0c40: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
0c50: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
0c60: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0c70: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
0c80: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
0c90: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
0ca0: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
0cb0: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
0cc0: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
0cd0: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
0ce0: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
0cf0: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
0d00: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
0d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
0d20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
0d30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
0d40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0d50: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
0d60: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
0d70: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
0d80: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
0d90: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
0da0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
0db0: 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61 73  p==TK_NE );.  as
0dc0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
0dd0: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
0de0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0df0: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
0e00: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
0e10: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
0e20: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
0e30: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0e40: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
0e50: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  }.  else if( pEx
0e60: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
0e70: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
0e80: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0e90: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
0ea0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
0eb0: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  pr, aff);.  }.  
0ec0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
0ed0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
0ee0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
0ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
0f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0f10: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
0f20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
0f30: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
0f40: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
0f50: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
0f60: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
0f70: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
0f80: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
0f90: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
0fa0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
0fb0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
0fc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
0fd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0fe0: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
0ff0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1000: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1010: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1020: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1030: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1040: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1050: 20 20 72 65 74 75 72 6e 20 0a 20 20 20 20 28 61    return .    (a
1060: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
1070: 4f 4e 45 29 20 7c 7c 0a 20 20 20 20 28 61 66 66  ONE) ||.    (aff
1080: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
1090: 45 52 49 43 20 26 26 20 69 64 78 5f 61 66 66 69  ERIC && idx_affi
10a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
10b0: 5f 49 4e 54 45 47 45 52 29 20 7c 7c 0a 20 20 20  _INTEGER) ||.   
10c0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
10d0: 46 5f 49 4e 54 45 47 45 52 20 26 26 20 69 64 78  F_INTEGER && idx
10e0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
10f0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 20 7c  E_AFF_NUMERIC) |
1100: 7c 0a 20 20 20 20 28 61 66 66 3d 3d 69 64 78 5f  |.    (aff==idx_
1110: 61 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a  affinity);.}../*
1120: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
1130: 31 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f  1 value that sho
1140: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
1150: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
1160: 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f  son.** opcode (O
1170: 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e  P_Eq, OP_Ge etc.
1180: 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  ) used to compar
1190: 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78  e pExpr1 and pEx
11a0: 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49  pr2..** If jumpI
11b0: 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74  fNull is true, t
11c0: 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20  hen set the low 
11d0: 62 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75  byte of the retu
11e0: 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65  rned.** P1 value
11f0: 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63   to tell the opc
1200: 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65  ode to jump if e
1210: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
1220: 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f  .** evaluates to
1230: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
1240: 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61   int binaryCompa
1250: 72 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72  reP1(Expr *pExpr
1260: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1270: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1280: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73  {.  char aff = s
1290: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
12a0: 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65  ty(pExpr2);.  re
12b0: 74 75 72 6e 20 28 28 28 69 6e 74 29 73 71 6c 69  turn (((int)sqli
12c0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
12d0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 29  ty(pExpr1, aff))
12e0: 3c 3c 38 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  <<8)+(jumpIfNull
12f0: 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ?1:0);.}../*.** 
1300: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1310: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1320: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1330: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1340: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1350: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1360: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1370: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1380: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1390: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
13a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
13b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
13c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
13d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
13e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1400: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1410: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1420: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1430: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1440: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1450: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1460: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  ype..*/.static C
1470: 6f 6c 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f  ollSeq* binaryCo
1480: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72  mpareCollSeq(Par
1490: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14a0: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
14b0: 52 69 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65  Right){.  CollSe
14c0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
14d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
14e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
14f0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1500: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1510: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1520: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1530: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1550: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63  ate code for a c
1560: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1570: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1580: 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20  t codeCompare(. 
1590: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
15b0: 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  g (and code gene
15c0: 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20  rating) context 
15d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
15e0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65  ,      /* The le
15f0: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
1600: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
1610: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f    /* The right o
1620: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1630: 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a  opcode,       /*
1640: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
1650: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
1660: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1670: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
1680: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
1690: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
16a0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
16b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
16c0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
16d0: 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f  nt p1 = binaryCo
16e0: 6d 70 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70  mpareP1(pLeft, p
16f0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1700: 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l);.  CollSeq *p
1710: 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  3 = binaryCompar
1720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1730: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1740: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1750: 33 56 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d  3VdbeOp3(pParse-
1760: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
1770: 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 20  p1, dest, (void 
1780: 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  *)p3, P3_COLLSEQ
1790: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  );.}../*.** Cons
17a0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
17b0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
17c0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
17d0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
17e0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
17f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1800: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
1810: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1820: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
1830: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
1840: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
1850: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
1860: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
1870: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 69  r *sqlite3Expr(i
1880: 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65  nt op, Expr *pLe
1890: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
18a0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
18b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
18c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
18d0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
18e0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
18f0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
1900: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
1910: 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72 79  , we leak memory
1920: 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64 20   from pLeft and 
1930: 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72 65  pRight */.    re
1940: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
1950: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
1960: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1970: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1980: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69  ht = pRight;.  i
1990: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
19a0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
19b0: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70  >dyn==0 );.    p
19c0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
19d0: 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  oken;.    pNew->
19e0: 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  span = *pToken;.
19f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1a00: 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  ert( pNew->token
1a10: 2e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 61  .dyn==0 );.    a
1a20: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
1a30: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 20 20 61  en.z==0 );.    a
1a40: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
1a50: 65 6e 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 69  en.n==0 );.    i
1a60: 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  f( pLeft && pRig
1a70: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
1a80: 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77  te3ExprSpan(pNew
1a90: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
1aa0: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
1ab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac0: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
1ad0: 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 7d  ew->token;.    }
1ae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
1af0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ew;.}../*.** Set
1b00: 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66   the Expr.span f
1b10: 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
1b20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1b30: 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74  span all.** text
1b40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
1b50: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a   given tokens..*
1b60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b70: 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78  prSpan(Expr *pEx
1b80: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74  pr, Token *pLeft
1b90: 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29  , Token *pRight)
1ba0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67  {.  assert( pRig
1bb0: 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ht!=0 );.  asser
1bc0: 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
1bd0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61   if( !sqlite3_ma
1be0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 26 26 20 70  lloc_failed && p
1bf0: 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66  Right->z && pLef
1c00: 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20  t->z ){.    if( 
1c10: 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26  pLeft->dyn==0 &&
1c20: 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20   pRight->dyn==0 
1c30: 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  ){.      pExpr->
1c40: 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e  span.z = pLeft->
1c50: 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  z;.      pExpr->
1c60: 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d  span.n = pRight-
1c70: 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67 68 74  >n + Addr(pRight
1c80: 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c 65 66  ->z) - Addr(pLef
1c90: 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65  t->z);.    }else
1ca0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
1cb0: 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d  pan.z = 0;.    }
1cc0: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f  .  }.}../*.** Co
1cd0: 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78  nstruct a new ex
1ce0: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f  pression node fo
1cf0: 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  r a function wit
1d00: 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72  h multiple.** ar
1d10: 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72  guments..*/.Expr
1d20: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e   *sqlite3ExprFun
1d30: 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a  ction(ExprList *
1d40: 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54  pList, Token *pT
1d50: 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70  oken){.  Expr *p
1d60: 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  New;.  pNew = sq
1d70: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65  liteMalloc( size
1d80: 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66  of(Expr) );.  if
1d90: 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20  ( pNew==0 ){.   
1da0: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c   /* sqlite3ExprL
1db0: 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29  istDelete(pList)
1dc0: 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74 20  ; // Leak pList 
1dd0: 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  when malloc fail
1de0: 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  s */.    return 
1df0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
1e00: 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b  p = TK_FUNCTION;
1e10: 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d  .  pNew->pList =
1e20: 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54   pList;.  if( pT
1e30: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1e40: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1e50: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1e60: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
1e70: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e  .  }else{.    pN
1e80: 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b  ew->token.z = 0;
1e90: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61  .  }.  pNew->spa
1ea0: 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b  n = pNew->token;
1eb0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
1ec0: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69  }../*.** Recursi
1ed0: 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65  vely delete an e
1ee0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a  xpression tree..
1ef0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1f00: 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a  xprDelete(Expr *
1f10: 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  p){.  if( p==0 )
1f20: 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70   return;.  if( p
1f30: 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c  ->span.dyn ) sql
1f40: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
1f50: 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28  ->span.z);.  if(
1f60: 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20   p->token.dyn ) 
1f70: 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72  sqliteFree((char
1f80: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20  *)p->token.z);. 
1f90: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
1fa0: 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  te(p->pLeft);.  
1fb0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1fc0: 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  e(p->pRight);.  
1fd0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
1fe0: 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b  elete(p->pList);
1ff0: 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  .  sqlite3Select
2000: 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63  Delete(p->pSelec
2010: 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  t);.  sqliteFree
2020: 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54  (p);.}.../*.** T
2030: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f  he following gro
2040: 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d  up of routines m
2050: 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20  ake deep copies 
2060: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a  of expressions,.
2070: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  ** expression li
2080: 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61  sts, ID lists, a
2090: 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d  nd select statem
20a0: 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65  ents.  The copie
20b0: 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65  s can.** be dele
20c0: 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61  ted (by being pa
20d0: 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65  ssed to their re
20e0: 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65  spective ...Dele
20f0: 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a  te() routines).*
2100: 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74  * without effect
2110: 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c  ing the original
2120: 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70  s..**.** The exp
2130: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44  ression list, ID
2140: 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73  , and source lis
2150: 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c  ts return by sql
2160: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2170: 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c  ),.** sqlite3IdL
2180: 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71  istDup(), and sq
2190: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
21a0: 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72  ) can not be fur
21b0: 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a  ther expanded .*
21c0: 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20  * by subsequent 
21d0: 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a  calls to sqlite*
21e0: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75  ListAppend() rou
21f0: 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79  tines..**.** Any
2200: 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65   tables that the
2210: 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70   SrcList might p
2220: 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20  oint to are not 
2230: 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45  duplicated..*/.E
2240: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
2250: 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  Dup(Expr *p){.  
2260: 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66  Expr *pNew;.  if
2270: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
2280: 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  0;.  pNew = sqli
2290: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a  teMallocRaw( siz
22a0: 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28  eof(*p) );.  if(
22b0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
22c0: 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e  n 0;.  memcpy(pN
22d0: 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70  ew, p, sizeof(*p
22e0: 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e  New));.  if( p->
22f0: 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20  token.z!=0 ){.  
2300: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20    pNew->token.z 
2310: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
2320: 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20  ->token.z);.    
2330: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  pNew->token.dyn 
2340: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
2350: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
2360: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
2370: 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a  }.  pNew->span.z
2380: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c   = 0;.  pNew->pL
2390: 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  eft = sqlite3Exp
23a0: 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  rDup(p->pLeft);.
23b0: 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d    pNew->pRight =
23c0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
23d0: 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e  p->pRight);.  pN
23e0: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69  ew->pList = sqli
23f0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
2400: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  ->pList);.  pNew
2410: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
2420: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
2430: 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75  pSelect);.  retu
2440: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20  rn pNew;.}.void 
2450: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
2460: 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b  (Token *pTo, Tok
2470: 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66  en *pFrom){.  if
2480: 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c  ( pTo->dyn ) sql
2490: 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70  iteFree((char*)p
24a0: 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46  To->z);.  if( pF
24b0: 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54  rom->z ){.    pT
24c0: 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b  o->n = pFrom->n;
24d0: 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71  .    pTo->z = sq
24e0: 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f  liteStrNDup(pFro
24f0: 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b  m->z, pFrom->n);
2500: 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20  .    pTo->dyn = 
2510: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
2520: 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  pTo->z = 0;.  }.
2530: 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  }.ExprList *sqli
2540: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45  te3ExprListDup(E
2550: 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45  xprList *p){.  E
2560: 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  xprList *pNew;. 
2570: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
2580: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
2590: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d  int i;.  if( p==
25a0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
25b0: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
25c0: 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  loc( sizeof(*pNe
25d0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
25e0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
25f0: 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20    pNew->nExpr = 
2600: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
2610: 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d  ->nExpr;.  pNew-
2620: 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c  >a = pItem = sql
2630: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45  iteMalloc( p->nE
2640: 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  xpr*sizeof(p->a[
2650: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74  0]) );.  if( pIt
2660: 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c  em==0 ){.    sql
2670: 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20  iteFree(pNew);. 
2680: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
2690: 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70   .  for(i=0; i<p
26a0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49  ->nExpr; i++, pI
26b0: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72  tem++){.    Expr
26c0: 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c   *pNewExpr, *pOl
26d0: 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d  dExpr;.    pItem
26e0: 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78  ->pExpr = pNewEx
26f0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
2700: 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70  Dup(pOldExpr = p
2710: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[i].pExpr);. 
2720: 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d     if( pOldExpr-
2730: 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e  >span.z!=0 && pN
2740: 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20  ewExpr ){.      
2750: 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61  /* Always make a
2760: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61   copy of the spa
2770: 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20  n for top-level 
2780: 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74  expressions in t
2790: 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  he.      ** expr
27a0: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68  ession list.  Th
27b0: 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43  e logic in SELEC
27c0: 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61  T processing tha
27d0: 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20  t determines.   
27e0: 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20     ** the names 
27f0: 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68  of columns in th
2800: 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65  e result set nee
2810: 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74  ds this informat
2820: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c  ion */.      sql
2830: 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70  ite3TokenCopy(&p
2840: 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26  NewExpr->span, &
2850: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b  pOldExpr->span);
2860: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2870: 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c  t( pNewExpr==0 |
2880: 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  | pNewExpr->span
2890: 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20  .z!=0 .         
28a0: 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e     || pOldExpr->
28b0: 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c  span.z==0 || sql
28c0: 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c  ite3_malloc_fail
28d0: 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ed );.    pItem-
28e0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53  >zName = sqliteS
28f0: 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e  trDup(p->a[i].zN
2900: 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  ame);.    pItem-
2910: 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e  >sortOrder = p->
2920: 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a  a[i].sortOrder;.
2930: 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67      pItem->isAgg
2940: 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67   = p->a[i].isAgg
2950: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
2960: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
2970: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63 4c  urn pNew;.}.SrcL
2980: 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c  ist *sqlite3SrcL
2990: 69 73 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a  istDup(SrcList *
29a0: 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  p){.  SrcList *p
29b0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
29c0: 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28  int nByte;.  if(
29d0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
29e0: 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65  ;.  nByte = size
29f0: 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72  of(*p) + (p->nSr
2a00: 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e  c>0 ? sizeof(p->
2a10: 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63  a[0]) * (p->nSrc
2a20: 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77  -1) : 0);.  pNew
2a30: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2a40: 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69  aw( nByte );.  i
2a50: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
2a60: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e  urn 0;.  pNew->n
2a70: 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c  Src = pNew->nAll
2a80: 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20  oc = p->nSrc;.  
2a90: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53  for(i=0; i<p->nS
2aa0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  rc; i++){.    st
2ab0: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2ac0: 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70  m *pNewItem = &p
2ad0: 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73  New->a[i];.    s
2ae0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2af0: 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26  em *pOldItem = &
2b00: 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65  p->a[i];.    pNe
2b10: 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65  wItem->zDatabase
2b20: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2b30: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pOldItem->zDatab
2b40: 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ase);.    pNewIt
2b50: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
2b60: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
2b70: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
2b80: 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  NewItem->zAlias 
2b90: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
2ba0: 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29  OldItem->zAlias)
2bb0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
2bc0: 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49  jointype = pOldI
2bd0: 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20  tem->jointype;. 
2be0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75     pNewItem->iCu
2bf0: 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  rsor = pOldItem-
2c00: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e  >iCursor;.    pN
2c10: 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30  ewItem->pTab = 0
2c20: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
2c30: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
2c40: 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49  3SelectDup(pOldI
2c50: 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20  tem->pSelect);. 
2c60: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e     pNewItem->pOn
2c70: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2c80: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29  p(pOldItem->pOn)
2c90: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
2ca0: 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  pUsing = sqlite3
2cb0: 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74  IdListDup(pOldIt
2cc0: 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d  em->pUsing);.  }
2cd0: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
2ce0: 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65  }.IdList *sqlite
2cf0: 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73  3IdListDup(IdLis
2d00: 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20  t *p){.  IdList 
2d10: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
2d20: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
2d30: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
2d40: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
2d50: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
2d60: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
2d70: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
2d80: 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e  ew->nId = pNew->
2d90: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b  nAlloc = p->nId;
2da0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c  .  pNew->a = sql
2db0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d  iteMallocRaw( p-
2dc0: 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  >nId*sizeof(p->a
2dd0: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  [0]) );.  if( pN
2de0: 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72  ew->a==0 ) retur
2df0: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
2e00: 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a  i<p->nId; i++){.
2e10: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
2e20: 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d  t_item *pNewItem
2e30: 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a   = &pNew->a[i];.
2e40: 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73      struct IdLis
2e50: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
2e60: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
2e70: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pNewItem->zName
2e80: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2e90: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
2ea0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
2eb0: 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  idx = pOldItem->
2ec0: 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  idx;.  }.  retur
2ed0: 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74  n pNew;.}.Select
2ee0: 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44   *sqlite3SelectD
2ef0: 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20  up(Select *p){. 
2f00: 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20   Select *pNew;. 
2f10: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2f20: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
2f30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2f40: 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20  sizeof(*p) );.  
2f50: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
2f60: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
2f70: 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e  isDistinct = p->
2f80: 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e  isDistinct;.  pN
2f90: 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c  ew->pEList = sql
2fa0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2fb0: 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e  p->pEList);.  pN
2fc0: 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74  ew->pSrc = sqlit
2fd0: 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e  e3SrcListDup(p->
2fe0: 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  pSrc);.  pNew->p
2ff0: 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45  Where = sqlite3E
3000: 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65  xprDup(p->pWhere
3010: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75  );.  pNew->pGrou
3020: 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pBy = sqlite3Exp
3030: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f  rListDup(p->pGro
3040: 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  upBy);.  pNew->p
3050: 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33  Having = sqlite3
3060: 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69  ExprDup(p->pHavi
3070: 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72  ng);.  pNew->pOr
3080: 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45  derBy = sqlite3E
3090: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f  xprListDup(p->pO
30a0: 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d  rderBy);.  pNew-
30b0: 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70  >op = p->op;.  p
30c0: 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71  New->pPrior = sq
30d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
30e0: 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65  ->pPrior);.  pNe
30f0: 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e  w->nLimit = p->n
3100: 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e  Limit;.  pNew->n
3110: 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66  Offset = p->nOff
3120: 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53 65  set;.  pNew->zSe
3130: 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77  lect = 0;.  pNew
3140: 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20  ->iLimit = -1;. 
3150: 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d   pNew->iOffset =
3160: 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f   -1;.  pNew->ppO
3170: 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72  penTemp = 0;.  r
3180: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a  eturn pNew;.}...
3190: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
31a0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65  element to the e
31b0: 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73  nd of an express
31c0: 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c  ion list.  If pL
31d0: 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61  ist is.** initia
31e0: 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63  lly NULL, then c
31f0: 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72  reate a new expr
3200: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
3210: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
3220: 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28  3ExprListAppend(
3230: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
3240: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f   Expr *pExpr, To
3250: 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69  ken *pName){.  i
3260: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20  f( pList==0 ){. 
3270: 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74     pList = sqlit
3280: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
3290: 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20  ExprList) );.   
32a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
32b0: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
32c0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
32d0: 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f  r); // Leak memo
32e0: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ry if malloc fai
32f0: 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75  ls */.      retu
3300: 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20  rn 0;.    }.    
3310: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
3320: 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a  Alloc==0 );.  }.
3330: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c    if( pList->nAl
3340: 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70  loc<=pList->nExp
3350: 72 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e  r ){.    pList->
3360: 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e  nAlloc = pList->
3370: 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20  nAlloc*2 + 4;.  
3380: 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c    pList->a = sql
3390: 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74  iteRealloc(pList
33a0: 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ->a, pList->nAll
33b0: 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d  oc*sizeof(pList-
33c0: 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28  >a[0]));.    if(
33d0: 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a   pList->a==0 ){.
33e0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
33f0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
3400: 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72  ); // Leak memor
3410: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y if malloc fail
3420: 73 20 2a 2f 0a 20 20 20 20 20 20 70 4c 69 73 74  s */.      pList
3430: 2d 3e 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d  ->nExpr = pList-
3440: 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20  >nAlloc = 0;.   
3450: 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b     return pList;
3460: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73  .    }.  }.  ass
3470: 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30  ert( pList->a!=0
3480: 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20   );.  if( pExpr 
3490: 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20  || pName ){.    
34a0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
34b0: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
34c0: 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e  List->a[pList->n
34d0: 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d  Expr++];.    mem
34e0: 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69  set(pItem, 0, si
34f0: 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20  zeof(*pItem));. 
3500: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
3510: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74  = pExpr;.    pIt
3520: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3530: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
3540: 28 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72  (pName);.  }.  r
3550: 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a  eturn pList;.}..
3560: 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20  /*.** Delete an 
3570: 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f  entire expressio
3580: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20  n list..*/.void 
3590: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
35a0: 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a  elete(ExprList *
35b0: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
35c0: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
35d0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
35e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
35f0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
3600: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
3610: 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d  | (pList->nExpr=
3620: 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c  =0 && pList->nAl
3630: 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73  loc==0) );.  ass
3640: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70  ert( pList->nExp
3650: 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  r<=pList->nAlloc
3660: 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d   );.  for(pItem=
3670: 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69  pList->a, i=0; i
3680: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
3690: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
36a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
36b0: 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  ete(pItem->pExpr
36c0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
36d0: 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  e(pItem->zName);
36e0: 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65  .  }.  sqliteFre
36f0: 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73  e(pList->a);.  s
3700: 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29  qliteFree(pList)
3710: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20  ;.}../*.** Walk 
3720: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
3730: 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66  ee.  Return 1 if
3740: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
3750: 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61  is constant.** a
3760: 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c  nd 0 if it invol
3770: 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a  ves variables..*
3780: 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72  *.** For the pur
3790: 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75  poses of this fu
37a0: 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65  nction, a double
37b0: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28  -quoted string (
37c0: 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73  ex: "abc").** is
37d0: 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61   considered a va
37e0: 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e  riable but a sin
37f0: 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  gle-quoted strin
3800: 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73  g (ex: 'abc') is
3810: 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a  .** a constant..
3820: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
3830: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70  prIsConstant(Exp
3840: 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28  r *p){.  switch(
3850: 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61   p->op ){.    ca
3860: 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61  se TK_ID:.    ca
3870: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20  se TK_COLUMN:.  
3880: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20    case TK_DOT:. 
3890: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
38a0: 49 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ION:.      retur
38b0: 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  n 0;.    case TK
38c0: 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  _NULL:.    case 
38d0: 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63  TK_STRING:.    c
38e0: 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20  ase TK_BLOB:.   
38f0: 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52   case TK_INTEGER
3900: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  :.    case TK_FL
3910: 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  OAT:.    case TK
3920: 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20  _VARIABLE:.     
3930: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64   return 1;.    d
3940: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
3950: 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20  if( p->pLeft && 
3960: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
3970: 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29  nstant(p->pLeft)
3980: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
3990: 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74     if( p->pRight
39a0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
39b0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52  IsConstant(p->pR
39c0: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
39d0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70  ;.      if( p->p
39e0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
39f0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66  int i;.        f
3a00: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69  or(i=0; i<p->pLi
3a10: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
3a20: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
3a30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
3a40: 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e  stant(p->pList->
3a50: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65  a[i].pExpr) ) re
3a60: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20  turn 0;.        
3a70: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
3a80: 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21  return p->pLeft!
3a90: 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21  =0 || p->pRight!
3aa0: 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20  =0 || (p->pList 
3ab0: 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  && p->pList->nEx
3ac0: 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  pr>0);.    }.  }
3ad0: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3ae0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76  /*.** If the giv
3af0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f  en expression co
3b00: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
3b10: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
3b20: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
3b30: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
3b40: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
3b50: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
3b60: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
3b70: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
3b80: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
3b90: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
3ba0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
3bb0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
3bc0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
3bd0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
3be0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
3bf0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
3c00: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
3c10: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
3c20: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
3c30: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77  t *pValue){.  sw
3c40: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
3c50: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
3c60: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
3c70: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
3c80: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
3c90: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
3ca0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3cb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3cc0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
3cd0: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
3ce0: 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 28 75  const u8 *z = (u
3cf0: 38 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  8*)p->token.z;. 
3d00: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e       int n = p->
3d10: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69  token.n;.      i
3d20: 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d  f( n>0 && z[0]==
3d30: 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b  '-' ){ z++; n--;
3d40: 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20   }.      while( 
3d50: 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73 64  n>0 && *z && isd
3d60: 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b  igit(*z) ){ z++;
3d70: 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69 66   n--; }.      if
3d80: 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74 65  ( n==0 && sqlite
3d90: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
3da0: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
3db0: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
3dc0: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
3dd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
3de0: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
3df0: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
3e00: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
3e10: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
3e20: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
3e30: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
3e40: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
3e50: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
3e60: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
3e70: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
3e80: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
3e90: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
3ea0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
3eb0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
3ec0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
3ed0: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
3ee0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
3ef0: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
3f00: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
3f10: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
3f20: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
3f30: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
3f40: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
3f50: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
3f60: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
3f70: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
3f80: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
3f90: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
3fa0: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
3fb0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
3fc0: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
3fd0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
3fe0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3ff0: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
4000: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
4010: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
4020: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
4030: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
4040: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
4050: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
4060: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
4070: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
4080: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
4090: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
40a0: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
40b0: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
40c0: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
40d0: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
40e0: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
40f0: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
4100: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
4110: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
4120: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
4130: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
4140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4150: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
4160: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4170: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
4180: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
4190: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
41a0: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
41b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41c0: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
41d0: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
41e0: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
41f0: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
4200: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
4210: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
4220: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
4230: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
4240: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
4250: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
4260: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
4270: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
4280: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
4290: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
42a0: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
42b0: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
42c0: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
42d0: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
42e0: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
42f0: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
4300: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
4310: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
4320: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
4330: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
4340: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
4350: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
4360: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
4370: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
4380: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
4390: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
43a0: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
43b0: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
43c0: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
43d0: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
43e0: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
43f0: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
4400: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
4410: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
4420: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
4430: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
4440: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
4450: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
4460: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
4470: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
4480: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
4490: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
44a0: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
44b0: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
44c0: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
44d0: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
44e0: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
44f0: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
4500: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
4510: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
4520: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
4530: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
4540: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
4550: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
4560: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
4570: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
4580: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
4590: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
45a0: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
45b0: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
45c0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
45d0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
45e0: 6d 6e 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  mn. */.  SrcList
45f0: 20 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 2f 2a   *pSrcList,   /*
4600: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
4610: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
4620: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
4630: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
4640: 73 74 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f  st,    /* List o
4650: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  f expressions us
4660: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41  ed to resolve "A
4670: 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  S" */.  Expr *pE
4680: 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20  xpr          /* 
4690: 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e  Make this EXPR n
46a0: 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65  ode point to the
46b0: 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e   selected column
46c0: 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a   */.){.  char *z
46d0: 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  Db = 0;       /*
46e0: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74   Name of the dat
46f0: 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20  abase.  The "X" 
4700: 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68  in X.Y.Z */.  ch
4710: 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20  ar *zTab = 0;   
4720: 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68     /* Name of th
4730: 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59  e table.  The "Y
4740: 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  " in X.Y.Z or Y.
4750: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f  Z */.  char *zCo
4760: 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  l = 0;      /* N
4770: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
4780: 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20  n.  The "Z" */. 
4790: 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20   int i, j;      
47a0: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f        /* Loop co
47b0: 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20  unters */.  int 
47c0: 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20  cnt = 0;        
47d0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61   /* Number of ma
47e0: 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61  tching column na
47f0: 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74  mes */.  int cnt
4800: 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a  Tab = 0;      /*
4810: 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68   Number of match
4820: 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20  ing table names 
4830: 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20  */.  sqlite *db 
4840: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f  = pParse->db;  /
4850: 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a  * The database *
4860: 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f  /..  assert( pCo
4870: 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f  lumnToken && pCo
4880: 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20  lumnToken->z ); 
4890: 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e  /* The Z in X.Y.
48a0: 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c  Z cannot be NULL
48b0: 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69   */.  zDb = sqli
48c0: 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e  te3NameFromToken
48d0: 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54  (pDbToken);.  zT
48e0: 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ab = sqlite3Name
48f0: 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65  FromToken(pTable
4900: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d  Token);.  zCol =
4910: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4920: 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b  Token(pColumnTok
4930: 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  en);.  if( sqlit
4940: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
4950: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
4960: 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72  ;  /* Leak memor
4970: 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62 29  y (zDb and zTab)
4980: 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
4990: 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74   */.  }.  assert
49a0: 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c  ( zTab==0 || pEL
49b0: 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45 78  ist==0 );..  pEx
49c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b  pr->iTable = -1;
49d0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53  .  for(i=0; i<pS
49e0: 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b  rcList->nSrc; i+
49f0: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
4a00: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  rcList_item *pIt
4a10: 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d 3e  em = &pSrcList->
4a20: 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20  a[i];.    Table 
4a30: 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70  *pTab = pItem->p
4a40: 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20  Tab;.    Column 
4a50: 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28 20  *pCol;..    if( 
4a60: 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e  pTab==0 ) contin
4a70: 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  ue;.    assert( 
4a80: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
4a90: 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a      if( zTab ){.
4aa0: 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d        if( pItem-
4ab0: 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20  >zAlias ){.     
4ac0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
4ad0: 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  e = pItem->zAlia
4ae0: 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  s;.        if( s
4af0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
4b00: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
4b10: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
4b20: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
4b30: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
4b40: 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a   = pTab->zName;.
4b50: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
4b60: 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74  Name==0 || sqlit
4b70: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
4b80: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
4b90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
4ba0: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
4bb0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
4bc0: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
4bd0: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
4be0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e  ){.          con
4bf0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d  tinue;.        }
4c00: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4c10: 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61     if( 0==(cntTa
4c20: 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70 45  b++) ){.      pE
4c30: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
4c40: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
4c50: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
4c60: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
4c70: 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70  }.    for(j=0, p
4c80: 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20  Col=pTab->aCol; 
4c90: 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  j<pTab->nCol; j+
4ca0: 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20  +, pCol++){.    
4cb0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
4cc0: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
4cd0: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
4ce0: 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20        cnt++;.   
4cf0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
4d00: 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72  le = pItem->iCur
4d10: 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45 78  sor;.        pEx
4d20: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
4d30: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20  iDb;.        /* 
4d40: 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72  Substitute the r
4d50: 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29  owid (column -1)
4d60: 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52   for the INTEGER
4d70: 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a   PRIMARY KEY */.
4d80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4d90: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
4da0: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
4db0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
4dc0: 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62  >affinity = pTab
4dd0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69  ->aCol[j].affini
4de0: 74 79 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  ty;.        pExp
4df0: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r->pColl = pTab-
4e00: 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a  >aCol[j].pColl;.
4e10: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
4e20: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
4e30: 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76  ..  /* If we hav
4e40: 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65  e not already re
4e50: 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c  solved the name,
4e60: 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 2a   then maybe .  *
4e70: 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20  * it is a new.* 
4e80: 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72  or old.* trigger
4e90: 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65   argument refere
4ea0: 6e 63 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a  nce.  */.  if( z
4eb0: 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30  Db==0 && zTab!=0
4ec0: 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50   && cnt==0 && pP
4ed0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21  arse->trigStack!
4ee0: 3d 30 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65  =0 ){.    Trigge
4ef0: 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72  rStack *pTrigger
4f00: 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e  Stack = pParse->
4f10: 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 54  trigStack;.    T
4f20: 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a  able *pTab = 0;.
4f30: 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72      if( pTrigger
4f40: 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d  Stack->newIdx !=
4f50: 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74   -1 && sqlite3St
4f60: 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61  rICmp("new", zTa
4f70: 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20  b) == 0 ){.     
4f80: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4f90: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
4fa0: 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 61 73  newIdx;.      as
4fb0: 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74  sert( pTriggerSt
4fc0: 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20  ack->pTab );.   
4fd0: 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67     pTab = pTrigg
4fe0: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
4ff0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72     }else if( pTr
5000: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49  iggerStack->oldI
5010: 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69  dx != -1 && sqli
5020: 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22  te3StrICmp("old"
5030: 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a  , zTab) == 0 ){.
5040: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
5050: 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74  ble = pTriggerSt
5060: 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20  ack->oldIdx;.   
5070: 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67     assert( pTrig
5080: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29  gerStack->pTab )
5090: 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70  ;.      pTab = p
50a0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
50b0: 61 62 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69  ab;.    }..    i
50c0: 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20  f( pTab ){ .    
50d0: 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 43    int j;.      C
50e0: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54  olumn *pCol = pT
50f0: 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20  ab->aCol;.      
5100: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44  .      pExpr->iD
5110: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
5120: 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20       cntTab++;. 
5130: 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20       for(j=0; j 
5140: 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b  < pTab->nCol; j+
5150: 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20  +, pCol++) {.   
5160: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5170: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
5180: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
5190: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  .          cnt++
51a0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
51b0: 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d  r->iColumn = j==
51c0: 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31  pTab->iPKey ? -1
51d0: 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20   : j;.          
51e0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
51f0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
5200: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
5210: 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c      pExpr->pColl
5220: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
5230: 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .pColl;.        
5240: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
5250: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
5260: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
5270: 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65  Perhaps the name
5280: 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20   is a reference 
5290: 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 2a  to the ROWID.  *
52a0: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
52b0: 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73  & cntTab==1 && s
52c0: 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43  qlite3IsRowid(zC
52d0: 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d  ol) ){.    cnt =
52e0: 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69   1;.    pExpr->i
52f0: 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20  Column = -1;.   
5300: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
5310: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e   = SQLITE_AFF_IN
5320: 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  TEGER;.  }..  /*
5330: 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70  .  ** If the inp
5340: 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72  ut is of the for
5350: 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20  m Z (not Y.Z or 
5360: 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20  X.Y.Z) then the 
5370: 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68  name Z.  ** migh
5380: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
5390: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
53a0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
53b0: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
53c0: 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73  .  ** we are res
53d0: 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20  olving names in 
53e0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
53f0: 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e   of the followin
5400: 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a  g command:.  **.
5410: 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20    **     SELECT 
5420: 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61  a+b AS x FROM ta
5430: 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a  ble WHERE x<10;.
5440: 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73    **.  ** In cas
5450: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
5460: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
5470: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
5480: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
5490: 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65   ** forms the re
54a0: 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28  sult set entry (
54b0: 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61  "a+b" in the exa
54c0: 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e  mple) and return
54d0: 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20   immediately..  
54e0: 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65  ** Note that the
54f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74   expression in t
5500: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68  he result set sh
5510: 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64  ould have alread
5520: 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f  y been.  ** reso
5530: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
5540: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5550: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
5560: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
5570: 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b   && pEList!=0 ){
5580: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c  .    for(j=0; j<
5590: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a  pEList->nExpr; j
55a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20  ++){.      char 
55b0: 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61  *zAs = pEList->a
55c0: 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20  [j].zName;.     
55d0: 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73   if( zAs!=0 && s
55e0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41  qlite3StrICmp(zA
55f0: 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  s, zCol)==0 ){. 
5600: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
5610: 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26  Expr->pLeft==0 &
5620: 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d  & pExpr->pRight=
5630: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45  =0 );.        pE
5640: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b  xpr->op = TK_AS;
5650: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
5660: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20  iColumn = j;.   
5670: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
5680: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
5690: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  up(pEList->a[j].
56a0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
56b0: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29  sqliteFree(zCol)
56c0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
56d0: 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62  ( zTab==0 && zDb
56e0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72  ==0 );.        r
56f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
5700: 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f  .    } .  }..  /
5710: 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20  *.  ** If X and 
5720: 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f  Y are NULL (in o
5730: 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e  ther words if on
5740: 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61  ly the column na
5750: 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70  me Z is.  ** sup
5760: 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76  plied) and the v
5770: 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63  alue of Z is enc
5780: 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d  losed in double-
5790: 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a  quotes, then.  *
57a0: 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20  * Z is a string 
57b0: 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f  literal if it do
57c0: 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20  esn't match any 
57d0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49  column names.  I
57e0: 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65  n that.  ** case
57f0: 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74  , we need to ret
5800: 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61  urn right away a
5810: 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20  nd not make any 
5820: 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20  changes to.  ** 
5830: 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  pExpr..  */.  if
5840: 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62  ( cnt==0 && zTab
5850: 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ==0 && pColumnTo
5860: 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29  ken->z[0]=='"' )
5870: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
5880: 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75  (zCol);.    retu
5890: 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  rn 0;.  }..  /*.
58a0: 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e    ** cnt==0 mean
58b0: 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20  s there was not 
58c0: 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65  match.  cnt>1 me
58d0: 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74  ans there were t
58e0: 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20  wo or.  ** more 
58f0: 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72  matches.  Either
5900: 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e   way, we have an
5910: 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69   error..  */.  i
5920: 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20  f( cnt!=1 ){.   
5930: 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20   char *z = 0;.  
5940: 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20    char *zErr;.  
5950: 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20    zErr = cnt==0 
5960: 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d  ? "no such colum
5970: 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75  n: %s" : "ambigu
5980: 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  ous column name:
5990: 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44   %s";.    if( zD
59a0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
59b0: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
59c0: 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20  zDb, ".", zTab, 
59d0: 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20  ".", zCol, 0);. 
59e0: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61     }else if( zTa
59f0: 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  b ){.      sqlit
5a00: 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20  e3SetString(&z, 
5a10: 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c  zTab, ".", zCol,
5a20: 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
5a30: 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65        z = sqlite
5a40: 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20  StrDup(zCol);.  
5a50: 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45    }.    sqlite3E
5a60: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
5a70: 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71  zErr, z);.    sq
5a80: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d  liteFree(z);.  }
5a90: 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20  ..  /* Clean up 
5aa0: 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a  and return.  */.
5ab0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62    sqliteFree(zDb
5ac0: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
5ad0: 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46  zTab);.  sqliteF
5ae0: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c  ree(zCol);.  sql
5af0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
5b00: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
5b10: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30  pExpr->pLeft = 0
5b20: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
5b30: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69  elete(pExpr->pRi
5b40: 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70  ght);.  pExpr->p
5b50: 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78  Right = 0;.  pEx
5b60: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55  pr->op = TK_COLU
5b70: 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74  MN;.  sqlite3Aut
5b80: 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45  hRead(pParse, pE
5b90: 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a  xpr, pSrcList);.
5ba0: 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b    return cnt!=1;
5bb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72  .}../*.** This r
5bc0: 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20  outine walks an 
5bd0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20  expression tree 
5be0: 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66  and resolves ref
5bf0: 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61  erences to.** ta
5c00: 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f  ble columns.  No
5c10: 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  des of the form 
5c20: 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f  ID.ID or ID reso
5c30: 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69  lve into an.** i
5c40: 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c  ndex to the tabl
5c50: 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c  e in the table l
5c60: 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e  ist and a column
5c70: 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a   offset.  The .*
5c80: 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f  * Expr.opcode fo
5c90: 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20  r such nodes is 
5ca0: 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f  changed to TK_CO
5cb0: 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e  LUMN.  The Expr.
5cc0: 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20  iTable.** value 
5cd0: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68  is changed to th
5ce0: 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72  e index of the r
5cf0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20  eferenced table 
5d00: 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70  in pTabList.** p
5d10: 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76  lus the "base" v
5d20: 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20  alue.  The base 
5d30: 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d  value will ultim
5d40: 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65  ately become the
5d50: 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20  .** VDBE cursor 
5d60: 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72  number for a cur
5d70: 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e  sor that is poin
5d80: 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65  ting into the re
5d90: 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c  ferenced.** tabl
5da0: 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f  e.  The Expr.iCo
5db0: 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68  lumn value is ch
5dc0: 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64  anged to the ind
5dd0: 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  ex of the column
5de0: 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65   .** of the refe
5df0: 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54  renced table.  T
5e00: 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20  he Expr.iColumn 
5e10: 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70  value for the sp
5e20: 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63  ecial.** ROWID c
5e30: 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e  olumn is -1.  An
5e40: 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  y INTEGER PRIMAR
5e50: 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20  Y KEY column is 
5e60: 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61  tried as an.** a
5e70: 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a  lias for ROWID..
5e80: 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68  **.** We also ch
5e90: 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65  eck for instance
5ea0: 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72  s of the IN oper
5eb0: 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20  ator.  IN comes 
5ec0: 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a  in two.** forms:
5ed0: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
5ee0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
5ef0: 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20  st).** and.**   
5f00: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
5f10: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
5f20: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
5f30: 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  m is handled by 
5f40: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68  creating a set h
5f50: 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a  olding the list.
5f60: 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61  ** of allowed va
5f70: 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  lues.  The secon
5f80: 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68  d form causes th
5f90: 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65  e SELECT to gene
5fa0: 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f  rate .** a tempo
5fb0: 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  rary table..**.*
5fc0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
5fd0: 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63  lso looks for sc
5fe0: 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61  alar SELECTs tha
5ff0: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e  t are part of an
6000: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
6010: 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c  If it finds any,
6020: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
6030: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
6040: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65  value of that se
6050: 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d  lect.** into a m
6060: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
6070: 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e  * Unknown column
6080: 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76  s or tables prov
6090: 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54  oke an error.  T
60a0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75  he function retu
60b0: 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65  rns.** the numbe
60c0: 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e  r of errors seen
60d0: 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65   and leaves an e
60e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20  rror message on 
60f0: 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e  pParse->zErrMsg.
6100: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
6110: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20  xprResolveIds(. 
6120: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
6130: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65      /* The parse
6140: 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53  r context */.  S
6150: 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74  rcList *pSrcList
6160: 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62  , /* List of tab
6170: 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  les used to reso
6180: 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  lve column names
6190: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
61a0: 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74  pEList,  /* List
61b0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20   of expressions 
61c0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
61d0: 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a  "AS" */.  Expr *
61e0: 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20  pExpr        /* 
61f0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  The expression t
6200: 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a  o be analyzed. *
6210: 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20  /.){.  int i;.. 
6220: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c   if( pExpr==0 ||
6230: 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72   pSrcList==0 ) r
6240: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
6250: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
6260: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
6270: 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74  assert( pSrcList
6280: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d  ->a[i].iCursor>=
6290: 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61  0 && pSrcList->a
62a0: 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72  [i].iCursor<pPar
62b0: 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a  se->nTab );.  }.
62c0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
62d0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f  >op ){.    /* Do
62e0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
62f0: 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20  ngs (ex: "abc") 
6300: 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e  are used as iden
6310: 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a  tifiers if.    *
6320: 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68  * possible.  Oth
6330: 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61  erwise they rema
6340: 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20  in as strings.  
6350: 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20  Single-quoted.  
6360: 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78    ** strings (ex
6370: 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77  : 'abc') are alw
6380: 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72  ays string liter
6390: 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  als..    */.    
63a0: 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20  case TK_STRING: 
63b0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
63c0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27  r->token.z[0]=='
63d0: 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20  \'' ) break;.   
63e0: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20     /* Fall thru 
63f0: 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63  into the TK_ID c
6400: 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61  ase if this is a
6410: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
6420: 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20  tring */.    }. 
6430: 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65     /* A lone ide
6440: 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e  ntifier is the n
6450: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64  ame of a columnd
6460: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73  ..    */.    cas
6470: 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20  e TK_ID: {.     
6480: 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   if( lookupName(
6490: 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70  pParse, 0, 0, &p
64a0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72  Expr->token, pSr
64b0: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
64c0: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
64d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
64e0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20   }.      break; 
64f0: 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a  .    }.  .    /*
6500: 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e   A table name an
6510: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20  d column name:  
6520: 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20     ID.ID.    ** 
6530: 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74  Or a database, t
6540: 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a  able and column:
6550: 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a    ID.ID.ID.    *
6560: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  /.    case TK_DO
6570: 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  T: {.      Token
6580: 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20   *pColumn;.     
6590: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a   Token *pTable;.
65a0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62        Token *pDb
65b0: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
65c0: 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69  ight;..      pRi
65d0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69  ght = pExpr->pRi
65e0: 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ght;.      if( p
65f0: 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44  Right->op==TK_ID
6600: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20   ){.        pDb 
6610: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61  = 0;.        pTa
6620: 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  ble = &pExpr->pL
6630: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
6640: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
6650: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
6660: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6670: 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68     assert( pRigh
6680: 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b  t->op==TK_DOT );
6690: 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26  .        pDb = &
66a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
66b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61  ken;.        pTa
66c0: 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  ble = &pRight->p
66d0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
66e0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
66f0: 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e  pRight->pRight->
6700: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  token;.      }. 
6710: 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e       if( lookupN
6720: 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c  ame(pParse, pDb,
6730: 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e   pTable, pColumn
6740: 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70  , pSrcList, 0, p
6750: 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20  Expr) ){.       
6760: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6770: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
6780: 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
6790: 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63  TK_IN: {.      c
67a0: 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20  har affinity;.  
67b0: 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71      Vdbe *v = sq
67c0: 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61  lite3GetVdbe(pPa
67d0: 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79 49  rse);.      KeyI
67e0: 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20  nfo keyInfo;.   
67f0: 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20     int addr;    
6800: 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f      /* Address o
6810: 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e  f OP_OpenTemp in
6820: 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20  struction */..  
6830: 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72      if( v==0 ) r
6840: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69  eturn 1;.      i
6850: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  f( sqlite3ExprRe
6860: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
6870: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
6880: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
6890: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
68a0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
68b0: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73      affinity = s
68c0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
68d0: 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  ty(pExpr->pLeft)
68e0: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74  ;..      /* Whet
68f0: 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27  her this is an '
6900: 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27  x IN(SELECT...)'
6910: 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78   or an 'x IN(<ex
6920: 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20  prlist>)'.      
6930: 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74  ** expression it
6940: 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20   is handled the 
6950: 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70  same way. A temp
6960: 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a  orary table is .
6970: 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20        ** filled 
6980: 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c  with single-fiel
6990: 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70  d index keys rep
69a0: 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65  resenting the re
69b0: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66  sults.      ** f
69c0: 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f  rom the SELECT o
69d0: 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e  r the <exprlist>
69e0: 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  ..      **.     
69f0: 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65   ** If the 'x' e
6a00: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63  xpression is a c
6a10: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20  olumn value, or 
6a20: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20  the SELECT....  
6a30: 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74      ** statement
6a40: 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d   returns a colum
6a50: 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68  n value, then th
6a60: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
6a70: 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75  at.      ** colu
6a80: 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75  mn is used to bu
6a90: 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65  ild the index ke
6aa0: 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20  ys. If both 'x' 
6ab0: 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a  and the.      **
6ac0: 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65   SELECT... state
6ad0: 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ment are columns
6ae0: 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61  , then numeric a
6af0: 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a  ffinity is used.
6b00: 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68        ** if eith
6b10: 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55  er column has NU
6b20: 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52  MERIC or INTEGER
6b30: 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65   affinity. If ne
6b40: 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27  ither.      ** '
6b50: 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43  x' nor the SELEC
6b60: 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61  T... statement a
6b70: 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e  re columns, then
6b80: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
6b90: 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73  y.      ** is us
6ba0: 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ed..      */.   
6bb0: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6bc0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b   = pParse->nTab+
6bd0: 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  +;.      addr = 
6be0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6bf0: 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c  (v, OP_OpenTemp,
6c00: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
6c10: 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74  0);.      memset
6c20: 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69  (&keyInfo, 0, si
6c30: 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a  zeof(keyInfo));.
6c40: 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46        keyInfo.nF
6c50: 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20  ield = 1;.      
6c60: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
6c70: 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c  (v, OP_SetNumCol
6c80: 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61  umns, pExpr->iTa
6c90: 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20  ble, 1);..      
6ca0: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
6cb0: 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  ct ){.        /*
6cc0: 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70   Case 1:     exp
6cd0: 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e  r IN (SELECT ...
6ce0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20  ).        **.   
6cf0: 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65       ** Generate
6d00: 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74   code to write t
6d10: 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68  he results of th
6d20: 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68  e select into th
6d30: 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20  e temporary.    
6d40: 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c      ** table all
6d50: 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65  ocated and opene
6d60: 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20  d above..       
6d70: 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20   */.        int 
6d80: 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69  iParm = pExpr->i
6d90: 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29  Table +  (((int)
6da0: 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a  affinity)<<16);.
6db0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
6dc0: 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20   *pEList;.      
6dd0: 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72    assert( (pExpr
6de0: 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46  ->iTable&0x0000F
6df0: 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61  FFF)==pExpr->iTa
6e00: 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73  ble );.        s
6e10: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
6e20: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
6e30: 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50  ect, SRT_Set, iP
6e40: 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  arm, 0, 0, 0, 0)
6e50: 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
6e60: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
6e70: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
6e80: 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
6e90: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
6ea0: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
6eb0: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
6ec0: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
6ed0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
6ee0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
6ef0: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
6f00: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
6f10: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
6f20: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
6f30: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
6f40: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
6f50: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
6f60: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  st).        **..
6f70: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
6f80: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
6f90: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
6fa0: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
6fb0: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
6fc0: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
6fd0: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
6fe0: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
6ff0: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
7000: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
7010: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
7020: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
7030: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
7040: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
7050: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
7060: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
7070: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
7080: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
7090: 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e          char con
70a0: 73 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20  st *affStr;.    
70b0: 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74      if( !affinit
70c0: 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  y ){.          a
70d0: 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45  ffinity = SQLITE
70e0: 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20  _AFF_NUMERIC;.  
70f0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7100: 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33  affStr = sqlite3
7110: 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61  AffinityString(a
7120: 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20  ffinity);.      
7130: 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b    keyInfo.aColl[
7140: 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  0] = pExpr->pLef
7150: 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20  t->pColl;..     
7160: 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75     /* Loop throu
7170: 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69  gh each expressi
7180: 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e  on in <exprlist>
7190: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72  . */.        for
71a0: 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70  (i=0; i<pExpr->p
71b0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b  List->nExpr; i++
71c0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
71d0: 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e  r *pE2 = pExpr->
71e0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
71f0: 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a  r;..          /*
7200: 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20   Check that the 
7210: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
7220: 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c 69 64  nstant and valid
7230: 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69  . */.          i
7240: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
7250: 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29  sConstant(pE2) )
7260: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71  {.            sq
7270: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7280: 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20  arse,.          
7290: 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20      "right-hand 
72a0: 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61  side of IN opera
72b0: 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73  tor must be cons
72c0: 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20  tant");.        
72d0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
72e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
72f0: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
7300: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
7310: 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20   pE2, 0, 0) ){. 
7320: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
7330: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
7340: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45  ..          /* E
7350: 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72  valuate the expr
7360: 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72  ession and inser
7370: 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65  t it into the te
7380: 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20  mp table */.    
7390: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
73a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
73b0: 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  2);.          sq
73c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
73d0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
73e0: 2c 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f  , 0, affStr, P3_
73f0: 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20  STATIC);.       
7400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7410: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
7420: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
7430: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7440: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74  ddOp(v, OP_PutSt
7450: 72 4b 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61  rKey, pExpr->iTa
7460: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  ble, 0);.       
7470: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
7480: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
7490: 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76  geP3(v, addr, (v
74a0: 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20  oid *)&keyInfo, 
74b0: 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20  P3_KEYINFO);..  
74c0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
74d0: 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45  ..    case TK_SE
74e0: 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  LECT: {.      /*
74f0: 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20   This has to be 
7500: 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e  a scalar SELECT.
7510: 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20    Generate code 
7520: 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20  to put the.     
7530: 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69   ** value of thi
7540: 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65  s select in a me
7550: 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65  mory cell and re
7560: 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a  cord the number.
7570: 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20        ** of the 
7580: 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69  memory cell in i
7590: 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f  Column..      */
75a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
75b0: 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e  olumn = pParse->
75c0: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66  nMem++;.      if
75d0: 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70  (sqlite3Select(p
75e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53  Parse, pExpr->pS
75f0: 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 70  elect, SRT_Mem,p
7600: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c  Expr->iColumn,0,
7610: 30 2c 30 2c 30 29 29 7b 0a 20 20 20 20 20 20 20  0,0,0)){.       
7620: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
7630: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
7640: 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f      }..    /* Fo
7650: 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74  r all else, just
7660: 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c   recursively wal
7670: 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20  k the tree */.  
7680: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
7690: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
76a0: 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c  eft.      && sql
76b0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
76c0: 64 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c  ds(pParse, pSrcL
76d0: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78  ist, pEList, pEx
76e0: 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20  pr->pLeft) ){.  
76f0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
7700: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
7710: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
7720: 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65  .      && sqlite
7730: 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28  3ExprResolveIds(
7740: 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74  pParse, pSrcList
7750: 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d  , pEList, pExpr-
7760: 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20  >pRight) ){.    
7770: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7780: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7790: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
77a0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
77b0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
77c0: 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  *pList = pExpr->
77d0: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66  pList;.        f
77e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  or(i=0; i<pList-
77f0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
7800: 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41          Expr *pA
7810: 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rg = pList->a[i]
7820: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20  .pExpr;.        
7830: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
7840: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
7850: 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45  se, pSrcList, pE
7860: 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20  List, pArg) ){. 
7870: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
7880: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d  n 1;.          }
7890: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
78a0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
78b0: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
78c0: 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64  * pExpr is a nod
78d0: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
78e0: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d   function of som
78f0: 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68  e kind.  It migh
7900: 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63  t.** be a syntac
7910: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b  tic function lik
7920: 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20  e "count(x)" or 
7930: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75  it might be a fu
7940: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69  nction.** that i
7950: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65  mplements an ope
7960: 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c  rator, like "a L
7970: 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  IKE b".  .**.** 
7980: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
7990: 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74  es *pzName point
79a0: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
79b0: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  the function and
79c0: 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c   .** *pnName hol
79d0: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
79e0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
79f0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
7a00: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
7a10: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
7a20: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
7a30: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65  st char **pzName
7a40: 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a  , int *pnName){.
7a50: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7a60: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7a70: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
7a80: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70       *pzName = p
7a90: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
7aa0: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70       *pnName = p
7ab0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
7ac0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ad0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
7ae0: 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  KE: {.      *pzN
7af0: 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20  ame = "like";.  
7b00: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
7b10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7b20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
7b30: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70  GLOB: {.      *p
7b40: 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a  zName = "glob";.
7b50: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7b60: 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;.      break;.
7b70: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
7b80: 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  t: {.      *pzNa
7b90: 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70  me = "can't happ
7ba0: 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  en";.      *pnNa
7bb0: 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62  me = 12;.      b
7bc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
7bd0: 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63  }../*.** Error c
7be0: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
7bf0: 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ns in an express
7c00: 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20  ion.  Make sure 
7c10: 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  all.** function 
7c20: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
7c30: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
7c40: 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20  ctions have the 
7c50: 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65  correct.** numbe
7c60: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
7c70: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
7c80: 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73  message in pPars
7c90: 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66  e->zErrMsg.** if
7ca0: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
7cb0: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
7cc0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
7cd0: 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67  ..**.** if pIsAg
7ce0: 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e  g is not null an
7cf0: 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f  d this expressio
7d00: 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74  n is an aggregat
7d10: 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c  e function.** (l
7d20: 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20  ike count(*) or 
7d30: 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e  max(value)) then
7d40: 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20   write a 1 into 
7d50: 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20  *pIsAgg..*/.int 
7d60: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
7d70: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
7d80: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
7d90: 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a   allowAgg, int *
7da0: 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e  pIsAgg){.  int n
7db0: 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  Err = 0;.  if( p
7dc0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
7dd0: 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45   0;.  switch( pE
7de0: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
7df0: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20  ase TK_GLOB:.   
7e00: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
7e10: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
7e20: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ION: {.      int
7e30: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
7e40: 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t ? pExpr->pList
7e50: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a  ->nExpr : 0;  /*
7e60: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
7e70: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
7e80: 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d  t no_such_func =
7e90: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75   0;       /* Tru
7ea0: 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e  e if no such fun
7eb0: 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a  ction exists */.
7ec0: 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f        int wrong_
7ed0: 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20  num_args = 0;   
7ee0: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f    /* True if wro
7ef0: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
7f00: 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20  uments */.      
7f10: 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20  int is_agg = 0; 
7f20: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
7f30: 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67  rue if is an agg
7f40: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
7f50: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  */.      int i;.
7f60: 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20        int nId;  
7f70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7f80: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
7f90: 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e  haracters in fun
7fa0: 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20  ction name */.  
7fb0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
7fc0: 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  zId;            
7fd0: 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20  /* The function 
7fe0: 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46  name. */.      F
7ff0: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
8000: 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50      int enc = pP
8010: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 0a  arse->db->enc;..
8020: 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f        getFunctio
8030: 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49  nName(pExpr, &zI
8040: 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20  d, &nId);.      
8050: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
8060: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
8070: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
8080: 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20   n, enc, 0);.   
8090: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
80a0: 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d  {.        pDef =
80b0: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
80c0: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
80d0: 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65   zId, nId, -1, e
80e0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  nc, 0);.        
80f0: 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20  if( pDef==0 ){. 
8100: 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68           no_such
8110: 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20  _func = 1;.     
8120: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
8130: 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72      wrong_num_ar
8140: 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20  gs = 1;.        
8150: 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  }.      }else{. 
8160: 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20         is_agg = 
8170: 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a  pDef->xFunc==0;.
8180: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8190: 28 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c  ( is_agg && !all
81a0: 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  owAgg ){.       
81b0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
81c0: 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65  (pParse, "misuse
81d0: 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75   of aggregate fu
81e0: 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20  nction %.*s()", 
81f0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
8200: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
8210: 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20     is_agg = 0;. 
8220: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e       }else if( n
8230: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20  o_such_func ){. 
8240: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
8250: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
8260: 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e  no such function
8270: 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49  : %.*s", nId, zI
8280: 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  d);.        nErr
8290: 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  ++;.      }else 
82a0: 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72  if( wrong_num_ar
82b0: 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  gs ){.        sq
82c0: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
82d0: 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62  arse,"wrong numb
82e0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
82f0: 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73  to function %.*s
8300: 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ()",.           
8310: 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20    nId, zId);.   
8320: 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20       nErr++;.   
8330: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8340: 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20  s_agg ){.       
8350: 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f   pExpr->op = TK_
8360: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20  AGG_FUNCTION;.  
8370: 20 20 20 20 20 20 69 66 28 20 70 49 73 41 67 67        if( pIsAgg
8380: 20 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a   ) *pIsAgg = 1;.
8390: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f        }.      fo
83a0: 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26  r(i=0; nErr==0 &
83b0: 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20  & i<n; i++){.   
83c0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
83d0: 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
83e0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  rse, pExpr->pLis
83f0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20  t->a[i].pExpr,. 
8400: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61 6c                al
8420: 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61 67  lowAgg && !is_ag
8430: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
8440: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58    }.      /* FIX
8450: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
8460: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
8470: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
8480: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
8490: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
84a0: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
84b0: 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66  */.    }.    def
84c0: 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66  ault: {.      if
84d0: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
84e0: 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d  {.        nErr =
84f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
8500: 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  k(pParse, pExpr-
8510: 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67  >pLeft, allowAgg
8520: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
8530: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72   }.      if( nEr
8540: 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70  r==0 && pExpr->p
8550: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
8560: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45   nErr = sqlite3E
8570: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
8580: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
8590: 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67  allowAgg, pIsAgg
85a0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
85b0: 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20   if( nErr==0 && 
85c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
85d0: 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20          int n = 
85e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
85f0: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74  xpr;.        int
8600: 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28   i;.        for(
8610: 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
8620: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
8630: 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d       Expr *pE2 =
8640: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
8650: 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [i].pExpr;.     
8660: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
8670: 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61  te3ExprCheck(pPa
8680: 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41  rse, pE2, allowA
8690: 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20  gg, pIsAgg);.   
86a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
86b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
86c0: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
86d0: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61  Err;.}../*.** Ca
86e0: 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  ll sqlite3ExprRe
86f0: 73 6f 6c 76 65 49 64 73 28 29 20 66 6f 6c 6c 6f  solveIds() follo
8700: 77 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  wed by sqlite3Ex
8710: 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a  prCheck()..**.**
8720: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
8730: 20 70 72 6f 76 69 64 65 64 20 61 73 20 61 20 63   provided as a c
8740: 6f 6e 76 65 6e 69 65 6e 63 65 20 73 69 6e 63 65  onvenience since
8750: 20 69 74 20 69 73 20 76 65 72 79 20 63 6f 6d 6d   it is very comm
8760: 6f 6e 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 52 65  on.** to call Re
8770: 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 43  solveIds() and C
8780: 68 65 63 6b 28 29 20 62 61 63 6b 20 74 6f 20 62  heck() back to b
8790: 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ack..*/.int sqli
87a0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 41 6e  te3ExprResolveAn
87b0: 64 43 68 65 63 6b 28 0a 20 20 50 61 72 73 65 20  dCheck(.  Parse 
87c0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
87d0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
87e0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
87f0: 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a 20 4c 69  *pSrcList, /* Li
8800: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65  st of tables use
8810: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c  d to resolve col
8820: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45  umn names */.  E
8830: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
8840: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
8850: 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f  ressions used to
8860: 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f   resolve "AS" */
8870: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  .  Expr *pExpr, 
8880: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
8890: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
88a0: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 69 6e 74  alyzed. */.  int
88b0: 20 61 6c 6c 6f 77 41 67 67 2c 20 20 20 20 20 20   allowAgg,      
88c0: 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c 6c 6f 77  /* True to allow
88d0: 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72 65   aggregate expre
88e0: 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20  ssions */.  int 
88f0: 2a 70 49 73 41 67 67 20 20 20 20 20 20 20 20 2f  *pIsAgg        /
8900: 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20 69 66  * Set to TRUE if
8910: 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65 20   aggregates are 
8920: 66 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66  found */.){.  if
8930: 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  ( pExpr==0 ) ret
8940: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c  urn 0;.  if( sql
8950: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
8960: 64 73 28 70 50 61 72 73 65 2c 70 53 72 63 4c 69  ds(pParse,pSrcLi
8970: 73 74 2c 70 45 4c 69 73 74 2c 70 45 78 70 72 29  st,pEList,pExpr)
8980: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31   ){.    return 1
8990: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73  ;.  }.  return s
89a0: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
89b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61  pParse, pExpr, a
89c0: 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29  llowAgg, pIsAgg)
89d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
89e0: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
89f0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
8a00: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
8a10: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
8a20: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
8a30: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
8a40: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
8a50: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
8a60: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
8a70: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
8a80: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
8a90: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
8aa0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
8ab0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
8ac0: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
8ad0: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
8ae0: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
8af0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
8b00: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
8b10: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
8b20: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
8b30: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
8b40: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  eal, 0, 0, z, n)
8b50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
8b60: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
8b70: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
8b80: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
8b90: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
8ba0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
8bb0: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
8bc0: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
8bd0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
8be0: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
8bf0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
8c00: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
8c10: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
8c20: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
8c30: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
8c40: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
8c50: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
8c60: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  ){.    case TK_P
8c70: 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  LUS:     op = OP
8c80: 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b  _Add;      break
8c90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  ;.    case TK_MI
8ca0: 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  NUS:    op = OP_
8cb0: 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b  Subtract; break;
8cc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
8cd0: 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d  R:     op = OP_M
8ce0: 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a  ultiply; break;.
8cf0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53      case TK_SLAS
8d00: 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69  H:    op = OP_Di
8d10: 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20  vide;   break;. 
8d20: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
8d30: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64       op = OP_And
8d40: 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ;      break;.  
8d50: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20    case TK_OR:   
8d60: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20      op = OP_Or; 
8d70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8d80: 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20   case TK_LT:    
8d90: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20     op = OP_Lt;  
8da0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8db0: 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20  case TK_LE:     
8dc0: 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20    op = OP_Le;   
8dd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8de0: 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20  ase TK_GT:      
8df0: 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20   op = OP_Gt;    
8e00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8e10: 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20  se TK_GE:       
8e20: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
8e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8e40: 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f  e TK_NE:       o
8e50: 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20  p = OP_Ne;      
8e60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8e70: 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70   TK_EQ:       op
8e80: 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20   = OP_Eq;       
8e90: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ea0: 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20  TK_ISNULL:   op 
8eb0: 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62  = OP_IsNull;   b
8ec0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8ed0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d  K_NOTNULL:  op =
8ee0: 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72   OP_NotNull;  br
8ef0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8f00: 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20  _NOT:      op = 
8f10: 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65  OP_Not;      bre
8f20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8f30: 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f  UMINUS:   op = O
8f40: 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61  P_Negative; brea
8f50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8f60: 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50  ITAND:   op = OP
8f70: 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b  _BitAnd;   break
8f80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8f90: 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  TOR:    op = OP_
8fa0: 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b  BitOr;    break;
8fb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8fc0: 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42  NOT:   op = OP_B
8fd0: 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a  itNot;   break;.
8fe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
8ff0: 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68  FT:   op = OP_Sh
9000: 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b  iftLeft;  break;
9010: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48  .    case TK_RSH
9020: 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53  IFT:   op = OP_S
9030: 68 69 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b  hiftRight; break
9040: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
9050: 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  M:      op = OP_
9060: 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61  Remainder;  brea
9070: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  k;.    case TK_F
9080: 4c 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20 4f 50  LOAT:    op = OP
9090: 5f 52 65 61 6c 3b 20 20 20 20 20 20 20 62 72 65  _Real;       bre
90a0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
90b0: 53 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d 20 4f  STRING:   op = O
90c0: 50 5f 53 74 72 69 6e 67 38 3b 20 20 20 20 62 72  P_String8;    br
90d0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
90e0: 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20  _BLOB:     op = 
90f0: 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20 20 20 62  OP_HexBlob;    b
9100: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9110: 4b 5f 43 4f 4e 43 41 54 3a 20 20 20 6f 70 20 3d  K_CONCAT:   op =
9120: 20 4f 50 5f 43 6f 6e 63 61 74 3b 20 20 20 20 20   OP_Concat;     
9130: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9140: 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72 65 61  lt: op = 0; brea
9150: 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  k;.  }.  switch(
9160: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9170: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9180: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  : {.      if( pP
9190: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b 0a  arse->useAgg ){.
91a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
91b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
91c0: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
91d0: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65  >iAgg);.      }e
91e0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
91f0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
9200: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9210: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
9220: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
9230: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
9240: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
9250: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9260: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9270: 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54  Recno, pExpr->iT
9280: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
9290: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
92a0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
92b0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
92c0: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
92d0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
92e0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
92f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9300: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9310: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
9320: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
9330: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
9340: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
9350: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
9360: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
9370: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9380: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
9390: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
93a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
93b0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
93c0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
93d0: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78  v, op, 0, 0, pEx
93e0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70  pr->token.z+1, p
93f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29  Expr->token.n-1)
9400: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
9410: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
9420: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
9430: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9440: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
9450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9460: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
9470: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
9480: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9490: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
94a0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
94b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
94c0: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
94d0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
94e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
94f0: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
9500: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
9510: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
9520: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
9530: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
9540: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9550: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9560: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
9570: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
9580: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
9590: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
95a0: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
95b0: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
95c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
95d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
95e0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
95f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9600: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9610: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
9620: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
9630: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
9640: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
9650: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9660: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9670: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
9680: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
9690: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
96a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
96b0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
96c0: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
96d0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
96e0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
96f0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
9700: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
9710: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
9720: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
9730: 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73  RSHIFT: .    cas
9740: 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20  e TK_CONCAT: {. 
9750: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9760: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9770: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9780: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9790: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
97a0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
97b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
97c0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
97d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
97e0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
97f0: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78  INUS: {.      Ex
9800: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
9810: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
9820: 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b  assert( pLeft );
9830: 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74  .      if( pLeft
9840: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c  ->op==TK_FLOAT |
9850: 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  | pLeft->op==TK_
9860: 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20  INTEGER ){.     
9870: 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70     Token *p = &p
9880: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
9890: 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73       char *z = s
98a0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
98b0: 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20  n + 2 );.       
98c0: 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e   sprintf(z, "-%.
98d0: 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29  *s", p->n, p->z)
98e0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c  ;.        if( pL
98f0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
9900: 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73  T ){.          s
9910: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
9920: 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20   OP_Real, 0, 0, 
9930: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
9940: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
9950: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
9960: 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a  (v, z, p->n+1);.
9970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9980: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b    sqliteFree(z);
9990: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
99a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a        }.      /*
99b0: 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e   Fall through in
99c0: 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20  to TK_NOT */.   
99d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42   }.    case TK_B
99e0: 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20  ITNOT:.    case 
99f0: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
9a00: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9a10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9a20: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
9a30: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9a40: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
9a50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9a60: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
9a70: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
9a80: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
9a90: 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20  int dest;.      
9aa0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9ab0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
9ac0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
9ad0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9ae0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9af0: 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20 3d  t);.      dest =
9b00: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
9b10: 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b 0a  entAddr(v) + 2;.
9b20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b30: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c  eAddOp(v, op, 1,
9b40: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
9b50: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9b60: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
9b70: 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62   0);.    }.    b
9b80: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9b90: 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
9ba0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9bb0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
9bc0: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
9bd0: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62 72  >iAgg);.      br
9be0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9bf0: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20  ase TK_GLOB:.   
9c00: 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20   case TK_LIKE:. 
9c10: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
9c20: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
9c30: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
9c40: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
9c50: 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20 70     int nExpr = p
9c60: 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45  List ? pList->nE
9c70: 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20 46  xpr : 0;.      F
9c80: 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20  uncDef *pDef;.  
9c90: 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20      int nId;.   
9ca0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
9cb0: 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70 32  Id;.      int p2
9cc0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74 20   = 0;.      int 
9cd0: 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63 20  i;.      u8 enc 
9ce0: 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e  = pParse->db->en
9cf0: 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65 71  c;.      CollSeq
9d00: 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20   *pColl = 0;.   
9d10: 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61     getFunctionNa
9d20: 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20  me(pExpr, &zId, 
9d30: 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  &nId);.      pDe
9d40: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
9d50: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
9d60: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 45  db, zId, nId, nE
9d70: 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  xpr, enc, 0);.  
9d80: 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66      assert( pDef
9d90: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78  !=0 );.      nEx
9da0: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
9db0: 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61  CodeExprList(pPa
9dc0: 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20  rse, pList);.   
9dd0: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
9de0: 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b  xpr && i<32; i++
9df0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  ){.        if( s
9e00: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9e10: 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  tant(pList->a[i]
9e20: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
9e30: 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c 69       p2 |= (1<<i
9e40: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
9e50: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
9e60: 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21 70  eedCollSeq && !p
9e70: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20  Coll ){.        
9e80: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
9e90: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
9ea0: 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d  rse, pList->a[i]
9eb0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
9ec0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
9ed0: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
9ee0: 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20 20  ollSeq ){.      
9ef0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20 70    if( !pColl ) p
9f00: 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e 64  Coll = pParse->d
9f10: 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20  b->pDfltColl; . 
9f20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9f30: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c  beOp3(v, OP_Coll
9f40: 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61 72  Seq, 0, 0, (char
9f50: 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c   *)pColl, P3_COL
9f60: 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20  LSEQ);.      }. 
9f70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9f80: 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74 69  Op3(v, OP_Functi
9f90: 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20 28  on, nExpr, p2, (
9fa0: 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f 46  char*)pDef, P3_F
9fb0: 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20 62  UNCDEF);.      b
9fc0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9fd0: 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20  case TK_SELECT: 
9fe0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9ff0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
a000: 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69  emLoad, pExpr->i
a010: 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20  Column, 0);.    
a020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a030: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
a040: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
a050: 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73  .      char cons
a060: 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20 20  t *affStr;..    
a070: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
a080: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
a090: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
a0a0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
a0b0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
a0c0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
a0d0: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
a0e0: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
a0f0: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
a100: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
a110: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
a120: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
a130: 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66  fStr = sqlite3Af
a140: 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63 6f 6d  finityString(com
a150: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
a160: 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20 20  pExpr));..      
a170: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a180: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
a190: 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  1, 0);..      /*
a1a0: 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72 3e   Code the <expr>
a1b0: 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
a1c0: 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65 6d   (...)". The tem
a1d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20 20  porary table.   
a1e0: 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54 61     ** pExpr->iTa
a1f0: 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ble contains the
a200: 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
a210: 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20 73  e up the (...) s
a220: 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  et..      */.   
a230: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a240: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a250: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a260: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
a270: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
a280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a290: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
a2a0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
a2b0: 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20 20  +4);            
a2c0: 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a 20  /* addr + 0 */. 
a2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a2e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
a2f0: 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   2, 0);.      sq
a300: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a310: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
a320: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a330: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a340: 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72 2b  P_Goto, 0, addr+
a350: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
a360: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
a370: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
a380: 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54   affStr, P3_STAT
a390: 49 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20 34  IC); /* addr + 4
a3a0: 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65   */.      sqlite
a3b0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a3c0: 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69  _Found, pExpr->i
a3d0: 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a  Table, addr+7);.
a3e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a3f0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64  eAddOp(v, OP_Add
a400: 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20  Imm, -1, 0);    
a410: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
a420: 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20   addr + 6 */..  
a430: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
a440: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
a450: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  WEEN: {.      Ex
a460: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
a470: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
a480: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
a490: 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70  item *pLItem = p
a4a0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a  Expr->pList->a;.
a4b0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
a4c0: 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78  ht = pLItem->pEx
a4d0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
a4e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a4f0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
a500: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a510: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
a520: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a530: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a540: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
a550: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
a560: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
a570: 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b  t, OP_Ge, 0, 0);
a580: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a590: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75  beAddOp(v, OP_Pu
a5a0: 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ll, 1, 0);.     
a5b0: 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20   pLItem++;.     
a5c0: 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d   pRight = pLItem
a5d0: 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ->pExpr;.      s
a5e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a5f0: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
a600: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
a610: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
a620: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
a630: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a640: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a650: 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a   OP_And, 0, 0);.
a660: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a670: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
a680: 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  PLUS:.    case T
a690: 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_AS: {.      sq
a6a0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a6b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a6c0: 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ft);.      break
a6d0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a6e0: 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20   TK_CASE: {.    
a6f0: 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c    int expr_end_l
a700: 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20  abel;.      int 
a710: 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20  jumpInst;.      
a720: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
a730: 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20  int nExpr;.     
a740: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78   int i;.      Ex
a750: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a  prList *pEList;.
a760: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
a770: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73  rList_item *aLis
a780: 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73  telem;..      as
a790: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
a7a0: 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  t);.      assert
a7b0: 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ((pExpr->pList->
a7c0: 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29  nExpr % 2) == 0)
a7d0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70  ;.      assert(p
a7e0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
a7f0: 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70  pr > 0);.      p
a800: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
a810: 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73  List;.      aLis
a820: 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e  telem = pEList->
a830: 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  a;.      nExpr =
a840: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a   pEList->nExpr;.
a850: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
a860: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
a870: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a880: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a890: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
a8a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a8b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a8c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
a8d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a8e0: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
a8f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a900: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a910: 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45   aListelem[i].pE
a920: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66  xpr);.        if
a930: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
a940: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
a950: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a960: 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20  OP_Dup, 1, 1);. 
a970: 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73           jumpIns
a980: 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  t = codeCompare(
a990: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a9a0: 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b  Left, aListelem[
a9b0: 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20  i].pExpr,.      
a9c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a9d0: 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65             OP_Ne
a9e0: 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20  , 0, 1);.       
a9f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
aa00: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
aa10: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65  , 0);.        }e
aa20: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a  lse{.          j
aa30: 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65  umpInst = sqlite
aa40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aa50: 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20  _IfNot, 1, 0);. 
aa60: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
aa70: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
aa80: 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c  (pParse, aListel
aa90: 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a  em[i+1].pExpr);.
aaa0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
aab0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
aac0: 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64  oto, 0, expr_end
aad0: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20  _label);.       
aae0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
aaf0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
ab00: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
ab10: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
ab20: 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72  , jumpInst, addr
ab30: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
ab40: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
ab50: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  t ){.        sql
ab60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ab70: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
ab80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ab90: 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20  ( pExpr->pRight 
aba0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
abb0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
abc0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
abd0: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
abe0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
abf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ac00: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
ac10: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
ac20: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
ac30: 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64  abel(v, expr_end
ac40: 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62  _label);.      b
ac50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
ac60: 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20 7b  case TK_RAISE: {
ac70: 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61 72  .      if( !pPar
ac80: 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29 7b  se->trigStack ){
ac90: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
aca0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
acb0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
acc0: 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28 29          "RAISE()
acd0: 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73 65   may only be use
ace0: 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67 67  d within a trigg
acf0: 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20 20  er-program");.  
ad00: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 45        pParse->nE
ad10: 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b 0a 20  rr++;..return;. 
ad20: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ad30: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
ad40: 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c  == OE_Rollback |
ad50: 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  |..  pExpr->iCol
ad60: 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20  umn == OE_Abort 
ad70: 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f  ||..  pExpr->iCo
ad80: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c 20  lumn == OE_Fail 
ad90: 29 7b 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62  ){..  sqlite3Vdb
ada0: 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c  eOp3(v, OP_Halt,
adb0: 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49   SQLITE_CONSTRAI
adc0: 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  NT, pExpr->iColu
add0: 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  mn,.            
ade0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
adf0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
ae00: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
ae10: 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 44 65  .  sqlite3VdbeDe
ae20: 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a  quoteP3(v, -1);.
ae30: 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a 09        } else {..
ae40: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ae50: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49  >iColumn == OE_I
ae60: 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c 69  gnore );..  sqli
ae70: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
ae80: 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73 65  _Goto, 0, pParse
ae90: 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67 6e  ->trigStack->ign
aea0: 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20 20  oreJump,.       
aeb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aec0: 20 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75 6d      "(IGNORE jum
aed0: 70 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  p)", 0);.      }
aee0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
aef0: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
af00: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
af10: 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
af20: 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
af30: 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
af40: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
af50: 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61  ist onto the sta
af60: 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e  ck..**.** Return
af70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
af80: 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f  lements pushed o
af90: 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a  nto the stack..*
afa0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
afb0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
afc0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
afd0: 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
afe0: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
aff0: 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f  List *pList    /
b000: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
b010: 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
b020: 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74  d */.){.  struct
b030: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
b040: 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20  pItem;.  int i, 
b050: 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20  n;.  Vdbe *v;.  
b060: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72  if( pList==0 ) r
b070: 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73  eturn 0;.  v = s
b080: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
b090: 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69  arse);.  n = pLi
b0a0: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72  st->nExpr;.  for
b0b0: 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c  (pItem=pList->a,
b0c0: 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20   i=0; i<n; i++, 
b0d0: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71  pItem++){.    sq
b0e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b0f0: 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78  arse, pItem->pEx
b100: 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  pr);.  }.  retur
b110: 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  n n;.}../*.** Ge
b120: 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20  nerate code for 
b130: 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73  a boolean expres
b140: 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61  sion such that a
b150: 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a   jump is made.**
b160: 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64   to the label "d
b170: 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72  est" if the expr
b180: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62  ession is true b
b190: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
b1a0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
b1b0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
b1c0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
b1d0: 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  se..**.** If the
b1e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c   expression eval
b1f0: 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e  uates to NULL (n
b200: 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20  either true nor 
b210: 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20  false), then.** 
b220: 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66  take the jump if
b230: 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20   the jumpIfNull 
b240: 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2f  flag is true..*/
b250: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
b260: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
b270: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
b280: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
b290: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
b2a0: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
b2b0: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
b2c0: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
b2d0: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
b2e0: 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63   return;.  switc
b2f0: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b300: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
b310: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74        op = OP_Lt
b320: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b330: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
b340: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b       op = OP_Le;
b350: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b360: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
b370: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20      op = OP_Gt; 
b380: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b390: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
b3a0: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20     op = OP_Ge;  
b3b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b3c0: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
b3d0: 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20    op = OP_Ne;   
b3e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b3f0: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
b400: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20   op = OP_Eq;    
b410: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b420: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20  se TK_ISNULL:   
b430: 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20  op = OP_IsNull; 
b440: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b450: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f  e TK_NOTNULL:  o
b460: 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20  p = OP_NotNull; 
b470: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
b480: 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ult:  break;.  }
b490: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
b4a0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b4b0: 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
b4c0: 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65   int d2 = sqlite
b4d0: 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76  3VdbeMakeLabel(v
b4e0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b4f0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
b500: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
b510: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
b520: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
b530: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
b540: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
b550: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
b560: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
b570: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
b580: 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
b590: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b5a0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
b5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b5c0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
b5d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
b5e0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
b5f0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b600: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
b610: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
b620: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
b630: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
b640: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b650: 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  TK_NOT: {.      
b660: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
b670: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
b680: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
b690: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
b6a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
b6b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
b6c0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
b6d0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
b6e0: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
b6f0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
b700: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
b710: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b720: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b730: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
b740: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b750: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b760: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
b770: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
b780: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b790: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
b7a0: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
b7b0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
b7c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
b7d0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
b7e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
b7f0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
b800: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b810: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b820: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
b830: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
b840: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
b850: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b860: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
b870: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
b880: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22  The expression "
b890: 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
b8a0: 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  z" is implemente
b8b0: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
b8c0: 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
b8d0: 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  < y) GOTO 3.    
b8e0: 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20    ** 2 IF (x <= 
b8f0: 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
b900: 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20       ** 3 ....  
b910: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74      */.      int
b920: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70   addr;.      Exp
b930: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
b940: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45  ->pLeft;.      E
b950: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45  xpr *pRight = pE
b960: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
b970: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
b980: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b990: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
b9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
b9c0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
b9d0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b9e0: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
b9f0: 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43      addr = codeC
ba00: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
ba10: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
ba20: 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e  _Lt, 0, !jumpIfN
ba30: 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69  ull);..      pRi
ba40: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
ba50: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
ba60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ba70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
ba80: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
ba90: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
baa0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
bab0: 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Le, dest, jum
bac0: 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
bad0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bae0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
baf0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
bb00: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
bb10: 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74  2(v, addr, sqlit
bb20: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
bb30: 72 28 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c  r(v));.      sql
bb40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bb50: 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a   OP_Pop, 1, 0);.
bb60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bb70: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
bb80: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
bb90: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
bba0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
bbb0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bbc0: 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e  , OP_If, jumpIfN
bbd0: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
bbe0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bbf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
bc00: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
bc10: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
bc20: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
bc30: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
bc40: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
bc50: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
bc60: 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75  sion is false bu
bc70: 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63  t execution.** c
bc80: 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68  ontinues straigh
bc90: 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78  t thru if the ex
bca0: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
bcb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
bcc0: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
bcd0: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
bce0: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
bcf0: 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d  lse) then.** jum
bd00: 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20  p if jumpIfNull 
bd10: 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20  is true or fall 
bd20: 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49  through if jumpI
bd30: 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a  fNull is false..
bd40: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
bd50: 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73 65  xprIfFalse(Parse
bd60: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
bd70: 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c  pExpr, int dest,
bd80: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
bd90: 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
bda0: 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69  arse->pVdbe;.  i
bdb0: 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28  nt op = 0;.  if(
bdc0: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
bdd0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77  0 ) return;.  sw
bde0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
bdf0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  ){.    case TK_L
be00: 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  T:       op = OP
be10: 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Ge;       break
be20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  ;.    case TK_LE
be30: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
be40: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
be50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
be60: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
be70: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
be80: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20      case TK_GE: 
be90: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74        op = OP_Lt
bea0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
beb0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20     case TK_NE:  
bec0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
bed0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bee0: 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20    case TK_EQ:   
bef0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20      op = OP_Ne; 
bf00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf10: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
bf20: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75     op = OP_NotNu
bf30: 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll;  break;.    
bf40: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
bf50: 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c    op = OP_IsNull
bf60: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64  ;   break;.    d
bf70: 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a  efault:  break;.
bf80: 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45    }.  switch( pE
bf90: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
bfa0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
bfb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
bfc0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
bfd0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
bfe0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
bff0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c000: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
c010: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
c020: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
c030: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c040: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c050: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e  K_OR: {.      in
c060: 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64  t d2 = sqlite3Vd
c070: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
c080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c090: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
c0a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
c0b0: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
c0c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c0d0: 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c  rIfFalse(pParse,
c0e0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
c0f0: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
c100: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c110: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
c120: 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62  (v, d2);.      b
c130: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c140: 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20  case TK_NOT: {. 
c150: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c160: 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70  IfTrue(pParse, p
c170: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
c180: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
c190: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c1a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
c1b0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
c1c0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
c1d0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
c1e0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
c1f0: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
c200: 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
c210: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
c220: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
c230: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c240: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c250: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
c260: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
c270: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c280: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
c290: 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
c2a0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
c2b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c2c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
c2d0: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
c2e0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
c2f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c300: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c310: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c320: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c330: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
c340: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c350: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c360: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
c370: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c380: 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
c390: 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
c3a0: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
c3b0: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c3c0: 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
c3d0: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
c3e0: 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
c3f0: 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
c400: 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
c410: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c420: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
c430: 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45  Expr *pLeft = pE
c440: 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20  xpr->pLeft;.    
c450: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
c460: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
c470: 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [0].pExpr;.     
c480: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c490: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
c4a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c4b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
c4c0: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
c4d0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c4e0: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
c4f0: 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71  .      addr = sq
c500: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
c510: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63  Addr(v);.      c
c520: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c530: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
c540: 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c  , OP_Ge, addr+3,
c550: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
c560: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c570: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
c580: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
c590: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c5a0: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64  v, OP_Goto, 0, d
c5b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67  est);.      pRig
c5c0: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
c5d0: 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20  t->a[1].pExpr;. 
c5e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c5f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
c600: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
c610: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
c620: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
c630: 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  P_Gt, dest, jump
c640: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
c650: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c660: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c670: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c680: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
c690: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c6a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
c6b0: 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  Not, jumpIfNull,
c6c0: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
c6d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
c6e0: 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65  ../*.** Do a dee
c6f0: 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20  p comparison of 
c700: 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74  two expression t
c710: 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52  rees.  Return TR
c720: 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a  UE (non-zero).**
c730: 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
c740: 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72  ntical and retur
c750: 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79 20  n FALSE if they 
c760: 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
c770: 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  y..*/.int sqlite
c780: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
c790: 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29  r *pA, Expr *pB)
c7a0: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
c7b0: 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pA==0 ){.    re
c7c0: 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65  turn pB==0;.  }e
c7d0: 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b  lse if( pB==0 ){
c7e0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
c7f0: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21   }.  if( pA->op!
c800: 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e  =pB->op ) return
c810: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
c820: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
c830: 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65  ->pLeft, pB->pLe
c840: 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ft) ) return 0;.
c850: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
c860: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52  prCompare(pA->pR
c870: 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74  ight, pB->pRight
c880: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
c890: 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b  if( pA->pList ){
c8a0: 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69  .    if( pB->pLi
c8b0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
c8c0: 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c  ;.    if( pA->pL
c8d0: 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e  ist->nExpr!=pB->
c8e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72  pList->nExpr ) r
c8f0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72  eturn 0;.    for
c900: 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73  (i=0; i<pA->pLis
c910: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
c920: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
c930: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
c940: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
c950: 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr, pB->pList->
c960: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
c970: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b         return 0;
c980: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
c990: 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70   }else if( pB->p
c9a0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75  List ){.    retu
c9b0: 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20  rn 0;.  }.  if( 
c9c0: 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70  pA->pSelect || p
c9d0: 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74  B->pSelect ) ret
c9e0: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
c9f0: 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61  >iTable!=pB->iTa
ca00: 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75  ble || pA->iColu
ca10: 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20  mn!=pB->iColumn 
ca20: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
ca30: 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b  ( pA->token.z ){
ca40: 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b  .    if( pB->tok
ca50: 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e  en.z==0 ) return
ca60: 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e   0;.    if( pB->
ca70: 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b  token.n!=pA->tok
ca80: 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  en.n ) return 0;
ca90: 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33  .    if( sqlite3
caa0: 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b  StrNICmp(pA->tok
cab0: 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e  en.z, pB->token.
cac0: 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21  z, pB->token.n)!
cad0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
cae0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d   }.  return 1;.}
caf0: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
cb00: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
cb10: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
cb20: 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e  array and return
cb30: 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73   its index..*/.s
cb40: 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e 64  tatic int append
cb50: 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a 70  AggInfo(Parse *p
cb60: 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28 70  Parse){.  if( (p
cb70: 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30 78  Parse->nAgg & 0x
cb80: 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74  7)==0 ){.    int
cb90: 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e   amt = pParse->n
cba0: 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67 67  Agg + 8;.    Agg
cbb0: 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71 6c  Expr *aAgg = sql
cbc0: 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73  iteRealloc(pPars
cbd0: 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a  e->aAgg, amt*siz
cbe0: 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67  eof(pParse->aAgg
cbf0: 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 61  [0]));.    if( a
cc00: 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  Agg==0 ){.      
cc10: 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d  return -1;.    }
cc20: 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67  .    pParse->aAg
cc30: 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20  g = aAgg;.  }.  
cc40: 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d 3e  memset(&pParse->
cc50: 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67  aAgg[pParse->nAg
cc60: 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70 50  g], 0, sizeof(pP
cc70: 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b  arse->aAgg[0]));
cc80: 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73 65  .  return pParse
cc90: 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a  ->nAgg++;.}../*.
cca0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
ccb0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
ccc0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
ccd0: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
cce0: 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
ccf0: 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
cd00: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
cd10: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
cd20: 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
cd30: 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
cd40: 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
cd50: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
cd60: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
cd70: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
cd80: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
cd90: 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
cda0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
cdb0: 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
cdc0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
cdd0: 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20 73  solveIds() and s
cde0: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
cdf0: 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72 6f  )..**.** If erro
ce00: 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65 61  rs are seen, lea
ce10: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
ce20: 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20 61  age in zErrMsg a
ce30: 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68 65  nd return.** the
ce40: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
ce50: 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  s..*/.int sqlite
ce60: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
ce70: 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70 50  egates(Parse *pP
ce80: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
ce90: 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41  r){.  int i;.  A
cea0: 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20 20  ggExpr *aAgg;.  
ceb0: 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a 20  int nErr = 0;.. 
cec0: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
ced0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
cee0: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
cef0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
cf00: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  UMN: {.      aAg
cf10: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
cf20: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
cf30: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
cf40: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
cf50: 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  f( aAgg[i].isAgg
cf60: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
cf70: 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d       if( aAgg[i]
cf80: 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d  .pExpr->iTable==
cf90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20 20  pExpr->iTable.  
cfa0: 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b 69         && aAgg[i
cfb0: 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ].pExpr->iColumn
cfc0: 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
cfd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72   ){.          br
cfe0: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
cff0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d000: 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67   i>=pParse->nAgg
d010: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d 20   ){.        i = 
d020: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
d030: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 69  arse);.        i
d040: 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20  f( i<0 ) return 
d050: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
d060: 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67 67  e->aAgg[i].isAgg
d070: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 50   = 0;.        pP
d080: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45  arse->aAgg[i].pE
d090: 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20  xpr = pExpr;.   
d0a0: 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72     }.      pExpr
d0b0: 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20  ->iAgg = i;.    
d0c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d0d0: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
d0e0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
d0f0: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
d100: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
d110: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
d120: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
d130: 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d 2e     if( !aAgg[i].
d140: 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65  isAgg ) continue
d150: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
d160: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
d170: 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c 20  (aAgg[i].pExpr, 
d180: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
d190: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
d1a0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
d1b0: 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65     if( i>=pParse
d1c0: 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20  ->nAgg ){.      
d1d0: 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73    u8 enc = pPars
d1e0: 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20  e->db->enc;.    
d1f0: 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41 67      i = appendAg
d200: 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a 20  gInfo(pParse);. 
d210: 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20 29         if( i<0 )
d220: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
d230: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
d240: 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20 20  i].isAgg = 1;.  
d250: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
d260: 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70 45  gg[i].pExpr = pE
d270: 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50 61  xpr;.        pPa
d280: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75  rse->aAgg[i].pFu
d290: 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  nc = sqlite3Find
d2a0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
d2b0: 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20  >db,.           
d2c0: 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a    pExpr->token.z
d2d0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
d2e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70  ,.             p
d2f0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45  Expr->pList ? pE
d300: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d310: 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b 0a  r : 0, enc, 0);.
d320: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45        }.      pE
d330: 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20  xpr->iAgg = i;. 
d340: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d350: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
d360: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
d370: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
d380: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
d390: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
d3a0: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
d3b0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
d3c0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
d3d0: 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72  nErr==0 && pExpr
d3e0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
d3f0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
d400: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d410: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d420: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
d430: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d440: 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78  ( nErr==0 && pEx
d450: 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pr->pList ){.   
d460: 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78       int n = pEx
d470: 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pr->pList->nExpr
d480: 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  ;.        int i;
d490: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
d4a0: 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e  ; nErr==0 && i<n
d4b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d4c0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33    nErr = sqlite3
d4d0: 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65  ExprAnalyzeAggre
d4e0: 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70 45  gates(pParse, pE
d4f0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  xpr->pList->a[i]
d500: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
d510: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
d520: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d530: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
d540: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65  .}../*.** Locate
d550: 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e   a user function
d560: 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20 61   given a name, a
d570: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
d580: 65 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67 0a  ents and a flag.
d590: 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68  ** indicating wh
d5a0: 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69  ether the functi
d5b0: 6f 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d 31  on prefers UTF-1
d5c0: 36 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20 52  6 over UTF-8.  R
d5d0: 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74  eturn a.** point
d5e0: 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65  er to the FuncDe
d5f0: 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74  f structure that
d600: 20 64 65 66 69 6e 65 73 20 74 68 61 74 20 66 75   defines that fu
d610: 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72  nction, or retur
d620: 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68 65  n.** NULL if the
d630: 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e   function does n
d640: 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20  ot exist..**.** 
d650: 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61  If the createFla
d660: 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72  g argument is tr
d670: 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28  ue, then a new (
d680: 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a  blank) FuncDef.*
d690: 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63  * structure is c
d6a0: 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64  reated and liked
d6b0: 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73   into the "db" s
d6c0: 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a  tructure if a.**
d6d0: 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e   no matching fun
d6e0: 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79  ction previously
d6f0: 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20   existed.  When 
d700: 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74 72  createFlag is tr
d710: 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41  ue.** and the nA
d720: 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  rg parameter is 
d730: 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20  -1, then only a 
d740: 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63  function that ac
d750: 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d  cepts.** any num
d760: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d770: 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65   will be returne
d780: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  d..**.** If crea
d790: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20  teFlag is false 
d7a0: 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20  and nArg is -1, 
d7b0: 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 76  then the first v
d7c0: 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e  alid.** function
d7d0: 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e   found is return
d7e0: 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20  ed.  A function 
d7f0: 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74 68  is valid if eith
d800: 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78  er xFunc.** or x
d810: 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f  Step is non-zero
d820: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74  ..**.** If creat
d830: 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 20  eFlag is false, 
d840: 74 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20  then a function 
d850: 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65  with the require
d860: 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e 75  d name and.** nu
d870: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d880: 73 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65  s may be returne
d890: 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 65 54  d even if the eT
d8a0: 65 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65 73  extRep flag does
d8b0: 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68   not.** match th
d8c0: 61 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a 2f  at requested..*/
d8d0: 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65  .FuncDef *sqlite
d8e0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20  3FindFunction(. 
d8f0: 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20 20   sqlite *db,    
d900: 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64      /* An open d
d910: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e  atabase */.  con
d920: 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20  st char *zName, 
d930: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66  /* Name of the f
d940: 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75  unction.  Not nu
d950: 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f  ll-terminated */
d960: 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20  .  int nName,   
d970: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d980: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
d990: 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69   the name */.  i
d9a0: 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20  nt nArg,        
d9b0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
d9c0: 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65  rguments.  -1 me
d9d0: 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a  ans any number *
d9e0: 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20  /.  u8 enc,     
d9f0: 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65 72         /* Prefer
da00: 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  red text encodin
da10: 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61 74  g */.  int creat
da20: 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72 65  eFlag     /* Cre
da30: 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69 66  ate new entry if
da40: 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20 6e   true and does n
da50: 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78 69  ot otherwise exi
da60: 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44  st */.){.  FuncD
da70: 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20 2f  ef *p;         /
da80: 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61  * Iterator varia
da90: 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66  ble */.  FuncDef
daa0: 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a 20   *pFirst;    /* 
dab0: 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 77  First function w
dac0: 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a 2f  ith this name */
dad0: 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65 73  .  FuncDef *pBes
dae0: 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20 6d  t = 0; /* Best m
daf0: 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66 61  atch found so fa
db00: 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 6d  r */.  int bestm
db10: 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20 20  atch = 0;  ...  
db20: 61 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51 4c  assert( enc==SQL
db30: 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 3d  ITE_UTF8 || enc=
db40: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20  =SQLITE_UTF16LE 
db50: 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  || enc==SQLITE_U
db60: 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20  TF16BE );.  if( 
db70: 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20 3d  nArg<-1 ) nArg =
db80: 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20 3d   -1;..  pFirst =
db90: 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74   (FuncDef*)sqlit
dba0: 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e  e3HashFind(&db->
dbb0: 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  aFunc, zName, nN
dbc0: 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 46  ame);.  for(p=pF
dbd0: 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e  irst; p; p=p->pN
dbe0: 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75 72  ext){.    /* Dur
dbf0: 69 6e 67 20 74 68 65 20 73 65 61 72 63 68 20 66  ing the search f
dc00: 6f 72 20 74 68 65 20 62 65 73 74 20 66 75 6e 63  or the best func
dc10: 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c  tion definition,
dc20: 20 62 65 73 74 6d 61 74 63 68 20 69 73 20 73 65   bestmatch is se
dc30: 74 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c 6c  t.    ** as foll
dc40: 6f 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20  ows to indicate 
dc50: 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74  the quality of t
dc60: 68 65 20 6d 61 74 63 68 20 77 69 74 68 20 74 68  he match with th
dc70: 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20 20  e definition.   
dc80: 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62   ** pointed to b
dc90: 79 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a 0a  y pBest:.    **.
dca0: 20 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74 20      ** 0: pBest 
dcb0: 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74 63  is NULL. No matc
dcc0: 68 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64  h has been found
dcd0: 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76 61  ..    ** 1: A va
dce0: 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73  riable arguments
dcf0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 70   function that p
dd00: 72 65 66 65 72 73 20 55 54 46 2d 38 20 77 68 65  refers UTF-8 whe
dd10: 6e 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20 2a  n a UTF-16.    *
dd20: 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69 73  *    encoding is
dd30: 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76   requested, or v
dd40: 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a  ice versa..    *
dd50: 2a 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65 20  * 2: A variable 
dd60: 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69  arguments functi
dd70: 6f 6e 20 74 68 61 74 20 75 73 65 73 20 55 54 46  on that uses UTF
dd80: 2d 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d 31  -16BE when UTF-1
dd90: 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20 20  6LE is.    **   
dda0: 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76   requested, or v
ddb0: 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a  ice versa..    *
ddc0: 2a 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65 20  * 3: A variable 
ddd0: 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69  arguments functi
dde0: 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d  on using the sam
ddf0: 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e  e text encoding.
de00: 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75 6e  .    ** 4: A fun
de10: 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65  ction with the e
de20: 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  xact number of a
de30: 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73 74  rguments request
de40: 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20  ed that.    **  
de50: 20 20 70 72 65 66 65 72 73 20 55 54 46 2d 38 20    prefers UTF-8 
de60: 77 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 6e  when a UTF-16 en
de70: 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73  coding is reques
de80: 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
de90: 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41 20  sa..    ** 5: A 
dea0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
deb0: 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f  e exact number o
dec0: 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75  f arguments requ
ded0: 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a  ested that.    *
dee0: 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54 46  *    prefers UTF
def0: 2d 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d 31  -16LE when UTF-1
df00: 36 42 45 20 69 73 20 72 65 71 75 65 73 74 65 64  6BE is requested
df10: 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e  , or vice versa.
df20: 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65 78  .    ** 6: An ex
df30: 61 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a  act match..    *
df40: 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67 65  *.    ** A large
df50: 72 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74 63  r value of 'matc
df60: 68 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65 73  hqual' indicates
df70: 20 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62 6c   a more desirabl
df80: 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f 0a  e match..    */.
df90: 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d      if( p->nArg=
dfa0: 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d 3d  =-1 || p->nArg==
dfb0: 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31  nArg || nArg==-1
dfc0: 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d 61   ){.      int ma
dfd0: 74 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20 20  tch = 1;        
dfe0: 20 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66 20    /* Quality of 
dff0: 74 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20  this match */.  
e000: 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d      if( p->nArg=
e010: 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d  =nArg || nArg==-
e020: 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74  1 ){.        mat
e030: 63 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d 0a  ch = 4;.      }.
e040: 20 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d 70        if( enc==p
e050: 2d 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20 20  ->iPrefEnc ){.  
e060: 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 32        match += 2
e070: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
e080: 65 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d 53  else if( (enc==S
e090: 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26 26  QLITE_UTF16LE &&
e0a0: 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51   p->iPrefEnc==SQ
e0b0: 4c 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c 7c  LITE_UTF16BE) ||
e0c0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
e0d0: 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  (enc==SQLITE_UTF
e0e0: 31 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65 66  16BE && p->iPref
e0f0: 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  Enc==SQLITE_UTF1
e100: 36 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20  6LE) ){.        
e110: 6d 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20 20  match += 1;.    
e120: 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d    }..      if( m
e130: 61 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20 29  atch>bestmatch )
e140: 7b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20  {.        pBest 
e150: 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65 73  = p;.        bes
e160: 74 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b 0a  tmatch = match;.
e170: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
e180: 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63  }..  /* If the c
e190: 72 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d 65  reateFlag parame
e1a0: 74 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e 64  ter is true, and
e1b0: 20 74 68 65 20 73 65 61 63 68 20 64 69 64 20 6e   the seach did n
e1c0: 6f 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20 2a  ot reveal an.  *
e1d0: 2a 20 65 78 61 63 74 20 6d 61 74 63 68 20 66 6f  * exact match fo
e1e0: 72 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d 62  r the name, numb
e1f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
e200: 61 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68  and encoding, th
e210: 65 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e 65  en add a.  ** ne
e220: 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 68  w entry to the h
e230: 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72 65  ash table and re
e240: 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20 20  turn it..  */.  
e250: 69 66 28 20 63 72 65 61 74 65 46 6c 61 67 20 26  if( createFlag &
e260: 26 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26 26  & bestmatch<6 &&
e270: 20 0a 20 20 20 20 20 20 28 70 42 65 73 74 20 3d   .      (pBest =
e280: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69   sqliteMalloc(si
e290: 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e 61  zeof(*pBest)+nNa
e2a0: 6d 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70 42  me+1)) ){.    pB
e2b0: 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67  est->nArg = nArg
e2c0: 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e 65  ;.    pBest->pNe
e2d0: 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20  xt = pFirst;.   
e2e0: 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d 20   pBest->zName = 
e2f0: 28 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31 5d  (char*)&pBest[1]
e300: 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50 72  ;.    pBest->iPr
e310: 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 20  efEnc = enc;.   
e320: 20 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e 7a   memcpy(pBest->z
e330: 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Name, zName, nNa
e340: 6d 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e  me);.    pBest->
e350: 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30  zName[nName] = 0
e360: 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61 73  ;.    sqlite3Has
e370: 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46 75  hInsert(&db->aFu
e380: 6e 63 2c 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65  nc, pBest->zName
e390: 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a 29  , nName, (void*)
e3a0: 70 42 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20 69  pBest);.  }..  i
e3b0: 66 28 20 70 42 65 73 74 20 26 26 20 28 70 42 65  f( pBest && (pBe
e3c0: 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42 65  st->xStep || pBe
e3d0: 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72 65  st->xFunc || cre
e3e0: 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20 20  ateFlag) ){.    
e3f0: 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20 20  return pBest;.  
e400: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.