/ Hex Artifact Content
Login

Artifact 3694386726ca140dddb839837ba24b58563d10af:


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 37 20 32 30 30 34 2f 30 38 2f 32 31 20  .157 2004/08/21 
0220: 31 37 3a 35 34 3a 34 35 20 64 72 68 20 45 78 70  17:54:45 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 20 62  P_String8;     b
90d0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
90e0: 4b 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d  K_BLOB:     op =
90f0: 20 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20 20 20   OP_HexBlob;    
9100: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
9110: 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72 65 61  lt: op = 0; brea
9120: 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28  k;.  }.  switch(
9130: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
9140: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9150: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  : {.      if( pP
9160: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b 0a  arse->useAgg ){.
9170: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9180: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
9190: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
91a0: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65  >iAgg);.      }e
91b0: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
91c0: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
91d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
91e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
91f0: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
9200: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
9210: 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  n);.      }else{
9220: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
9230: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9240: 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54  Recno, pExpr->iT
9250: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
9260: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
9270: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9280: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
9290: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
92a0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
92b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
92c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
92d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
92e0: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
92f0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
9300: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
9310: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
9320: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
9330: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
9340: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9350: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
9360: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
9370: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9380: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
9390: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
93a0: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78  v, op, 0, 0, pEx
93b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70  pr->token.z+1, p
93c0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29  Expr->token.n-1)
93d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
93e0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
93f0: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
9400: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9410: 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20   TK_NULL: {.    
9420: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9430: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
9440: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
9450: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9460: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
9470: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
9480: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9490: 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
94a0: 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20  ->iTable, 0);.  
94b0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
94c0: 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20 20  oken.n>1 ){.    
94d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
94e0: 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20 70  hangeP3(v, -1, p
94f0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
9500: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
9510: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
9520: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9530: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
9540: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
9550: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
9560: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
9570: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
9580: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
9590: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
95a0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
95b0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
95c0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
95d0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
95e0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
95f0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
9600: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
9610: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
9620: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9630: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9640: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
9650: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
9660: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
9670: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
9680: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
9690: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
96a0: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
96b0: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
96c0: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
96d0: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a   case TK_SLASH:.
96e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49      case TK_LSHI
96f0: 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  FT:.    case TK_
9700: 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20 20 20  RSHIFT: {.      
9710: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9720: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9730: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
9740: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9750: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
9760: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
9770: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
9780: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
9790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
97a0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
97b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
97c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
97d0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
97e0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
97f0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9800: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9810: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9820: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 63 61  ddOp(v, OP_Conca
9830: 74 38 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20  t8, 2, 0);.     
9840: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9850: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
9860: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
9870: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
9880: 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65  Left;.      asse
9890: 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20  rt( pLeft );.   
98a0: 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70     if( pLeft->op
98b0: 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c  ==TK_FLOAT || pL
98c0: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45  eft->op==TK_INTE
98d0: 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20 54  GER ){.        T
98e0: 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66 74  oken *p = &pLeft
98f0: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
9900: 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69 74   char *z = sqlit
9910: 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b 20  eMalloc( p->n + 
9920: 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70 72  2 );.        spr
9930: 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22 2c  intf(z, "-%.*s",
9940: 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20   p->n, p->z);.  
9950: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
9960: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b  >op==TK_FLOAT ){
9970: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
9980: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
9990: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 70  Real, 0, 0, z, p
99a0: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
99b0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
99c0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
99d0: 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20  z, p->n+1);.    
99e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71      }.        sq
99f0: 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 20  liteFree(z);.   
9a00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9a10: 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c    }.      /* Fal
9a20: 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20 54  l through into T
9a30: 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a 20  K_NOT */.    }. 
9a40: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f     case TK_BITNO
9a50: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  T:.    case TK_N
9a60: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
9a70: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9a80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
9a90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9aa0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
9ab0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
9ac0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9ad0: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
9ae0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
9af0: 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
9b00: 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c 69  dest;.      sqli
9b10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9b20: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
9b30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9b40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9b50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9b60: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
9b70: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
9b80: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
9b90: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9ba0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
9bb0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9bc0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9bd0: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
9be0: 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61 6b  .    }.    break
9bf0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ;.    case TK_AG
9c00: 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  G_FUNCTION: {.  
9c10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9c20: 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65  ddOp(v, OP_AggGe
9c30: 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41 67  t, 0, pExpr->iAg
9c40: 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  g);.      break;
9c50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9c60: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
9c70: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
9c80: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
9c90: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
9ca0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
9cb0: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  ->pList;.      i
9cc0: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  nt nExpr = pList
9cd0: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
9ce0: 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  : 0;.      FuncD
9cf0: 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
9d00: 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63  int nId;.      c
9d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
9d20: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 30        int p2 = 0
9d30: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
9d40: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
9d50: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
9d60: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
9d70: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  oll = 0;.      g
9d80: 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70  etFunctionName(p
9d90: 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64  Expr, &zId, &nId
9da0: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
9db0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
9dc0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
9dd0: 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
9de0: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
9df0: 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
9e00: 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
9e10: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9e20: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
9e30: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66   pList);.      f
9e40: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
9e50: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
9e60: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
9e70: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
9e80: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
9e90: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
9ea0: 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20   p2 |= (1<<i);. 
9eb0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
9ec0: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
9ed0: 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
9ee0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
9ef0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
9f00: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
9f10: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
9f20: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
9f30: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
9f40: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
9f50: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
9f60: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
9f70: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
9f80: 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
9f90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
9fa0: 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
9fb0: 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
9fc0: 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
9fd0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
9fe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
9ff0: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
a000: 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72  nExpr, p2, (char
a010: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
a020: 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  EF);.      break
a030: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a040: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
a050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a060: 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f  ddOp(v, OP_MemLo
a070: 61 64 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  ad, pExpr->iColu
a080: 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  mn, 0);.      br
a090: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a0a0: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
a0b0: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a0c0: 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a 61     char const *a
a0d0: 66 66 53 74 72 3b 0a 0a 20 20 20 20 20 20 2f 2a  ffStr;..      /*
a0e0: 20 46 69 67 75 72 65 20 6f 75 74 20 74 68 65 20   Figure out the 
a0f0: 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73 65 20  affinity to use 
a100: 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65 79 20  to create a key 
a110: 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c 74 73  from the results
a120: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
a130: 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66   expression. aff
a140: 69 6e 69 74 79 53 74 72 20 73 74 6f 72 65 73 20  inityStr stores 
a150: 61 20 73 74 61 74 69 63 20 73 74 72 69 6e 67 20  a static string 
a160: 73 75 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 20  suitable for.   
a170: 20 20 20 2a 2a 20 50 33 20 6f 66 20 4f 50 5f 4d     ** P3 of OP_M
a180: 61 6b 65 52 65 63 6f 72 64 2e 0a 20 20 20 20 20  akeRecord..     
a190: 20 2a 2f 0a 20 20 20 20 20 20 61 66 66 53 74 72   */.      affStr
a1a0: 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69   = sqlite3Affini
a1b0: 74 79 53 74 72 69 6e 67 28 63 6f 6d 70 61 72 69  tyString(compari
a1c0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
a1d0: 72 29 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  r));..      sqli
a1e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a1f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
a200: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
a210: 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  e the <expr> fro
a220: 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
a230: 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  .)". The tempora
a240: 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
a250: 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
a260: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
a270: 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
a280: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a   the (...) set..
a290: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
a2a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a2b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a2c0: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
a2d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
a2e0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
a2f0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a300: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
a310: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b  ll, -1, addr+4);
a320: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
a330: 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20  ddr + 0 */.     
a340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a350: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20  p(v, OP_Pop, 2, 
a360: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a370: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a380: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
a390: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a3a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
a3b0: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
a3c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a3d0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
a3e0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 61 66 66  ecord, 1, 0, aff
a3f0: 53 74 72 2c 20 50 33 5f 53 54 41 54 49 43 29 3b  Str, P3_STATIC);
a400: 20 2f 2a 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a   /* addr + 4 */.
a410: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a420: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75  eAddOp(v, OP_Fou
a430: 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  nd, pExpr->iTabl
a440: 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20 20 20 20  e, addr+7);.    
a450: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a460: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
a470: 20 2d 31 2c 20 30 29 3b 20 20 20 20 20 20 20 20   -1, 0);        
a480: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64 64            /* add
a490: 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20  r + 6 */..      
a4a0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a4b0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
a4c0: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
a4d0: 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70  pLeft = pExpr->p
a4e0: 4c 65 66 74 3b 0a 20 20 20 20 20 20 73 74 72 75  Left;.      stru
a4f0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
a500: 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45 78 70 72   *pLItem = pExpr
a510: 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20  ->pList->a;.    
a520: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d    Expr *pRight =
a530: 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a   pLItem->pExpr;.
a540: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a550: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
a560: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
a570: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a580: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
a590: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a5a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
a5b0: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
a5c0: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
a5d0: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
a5e0: 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Ge, 0, 0);.   
a5f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
a600: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20  dOp(v, OP_Pull, 
a610: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 70 4c 49  1, 0);.      pLI
a620: 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69  tem++;.      pRi
a630: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
a640: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
a650: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a660: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
a670: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
a680: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
a690: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30  ght, OP_Le, 0, 0
a6a0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a6b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a6c0: 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  And, 0, 0);.    
a6d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a6e0: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
a6f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  :.    case TK_AS
a700: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
a710: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a720: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
a730: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a740: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a750: 43 41 53 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e  CASE: {.      in
a760: 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c  t expr_end_label
a770: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a 75 6d 70  ;.      int jump
a780: 49 6e 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20  Inst;.      int 
a790: 61 64 64 72 3b 0a 20 20 20 20 20 20 69 6e 74 20  addr;.      int 
a7a0: 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 69 6e 74  nExpr;.      int
a7b0: 20 69 3b 0a 20 20 20 20 20 20 45 78 70 72 4c 69   i;.      ExprLi
a7c0: 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20  st *pEList;.    
a7d0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a7e0: 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65  t_item *aListele
a7f0: 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73 65 72 74  m;..      assert
a800: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a  (pExpr->pList);.
a810: 20 20 20 20 20 20 61 73 73 65 72 74 28 28 70 45        assert((pE
a820: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
a830: 72 20 25 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20  r % 2) == 0);.  
a840: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
a850: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e  ->pList->nExpr >
a860: 20 30 29 3b 0a 20 20 20 20 20 20 70 45 4c 69 73   0);.      pELis
a870: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
a880: 3b 0a 20 20 20 20 20 20 61 4c 69 73 74 65 6c 65  ;.      aListele
a890: 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20  m = pEList->a;. 
a8a0: 20 20 20 20 20 6e 45 78 70 72 20 3d 20 70 45 4c       nExpr = pEL
a8b0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20  ist->nExpr;.    
a8c0: 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c    expr_end_label
a8d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
a8e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
a8f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
a900: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
a910: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a920: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
a930: 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ft);.      }.   
a940: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45     for(i=0; i<nE
a950: 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  xpr; i=i+2){.   
a960: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a970: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
a980: 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29  stelem[i].pExpr)
a990: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45  ;.        if( pE
a9a0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
a9b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a9c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
a9d0: 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20 20 20 20  up, 1, 1);.     
a9e0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
a9f0: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
aa00: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
aa10: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
aa20: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
aa30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa40: 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c         OP_Ne, 0,
aa50: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73   1);.          s
aa60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
aa70: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
aa80: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
aa90: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
aaa0: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
aab0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e  eAddOp(v, OP_IfN
aac0: 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  ot, 1, 0);.     
aad0: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c     }.        sql
aae0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
aaf0: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
ab00: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
ab10: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab20: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
ab30: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
ab40: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  el);.        add
ab50: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
ab60: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ab70: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ab80: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
ab90: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
aba0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
abb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
abc0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
abd0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
abe0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
abf0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ac00: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
ac10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ac20: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ac30: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ac40: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac60: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ac70: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
ac80: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
ac90: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
aca0: 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
acb0: 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
acc0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
acd0: 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
ace0: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
acf0: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
ad00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ad10: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
ad20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad30: 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
ad40: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
ad50: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
ad60: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
ad70: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
ad80: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  ;..return;.     
ad90: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
ada0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
adb0: 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20  E_Rollback ||.. 
adc0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
add0: 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09  == OE_Abort ||..
ade0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
adf0: 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09   == OE_Fail ){..
ae00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ae10: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
ae20: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
ae30: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
ae40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae50: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ae60: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
ae70: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73  ->token.n);..  s
ae80: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
ae90: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
aea0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73    } else {..  as
aeb0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
aec0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72  lumn == OE_Ignor
aed0: 65 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56  e );..  sqlite3V
aee0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 6f 74  dbeOp3(v, OP_Got
aef0: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
af00: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
af10: 75 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ump,.           
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70 29 22 2c  "(IGNORE jump)",
af40: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
af50: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
af60: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
af70: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
af80: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
af90: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
afa0: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
afb0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
afc0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
afd0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
afe0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
aff0: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
b000: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
b010: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
b020: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
b030: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b040: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b050: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
b060: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
b070: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
b080: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
b090: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
b0a0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b0b0: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
b0c0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20   Vdbe *v;.  if( 
b0d0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
b0e0: 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  n 0;.  v = sqlit
b0f0: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b100: 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
b110: 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
b120: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
b130: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
b140: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
b150: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b160: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
b170: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
b180: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b190: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
b1a0: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
b1b0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
b1c0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
b1d0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
b1e0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
b1f0: 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
b200: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
b210: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
b220: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
b230: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
b240: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
b250: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
b260: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
b270: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
b280: 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
b290: 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
b2a0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
b2b0: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69   is true..*/.voi
b2c0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
b2d0: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
b2e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
b2f0: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
b300: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
b310: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b320: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
b330: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
b340: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
b350: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70  urn;.  switch( p
b360: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b370: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
b380: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
b390: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b3a0: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
b3b0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
b3c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b3d0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
b3e0: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
b3f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b400: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
b410: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
b420: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b430: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
b440: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
b450: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b460: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
b470: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
b480: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b490: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
b4a0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
b4b0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b4c0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
b4d0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
b4e0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
b500: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b510: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b520: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
b530: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
b540: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b550: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b560: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
b570: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
b580: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
b590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b5a0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
b5b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
b5c0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
b5d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b5e0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b5f0: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
b600: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b610: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
b620: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b630: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
b640: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
b650: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
b660: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
b670: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
b680: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
b690: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b6a0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6b0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
b6c0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
b6d0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
b6e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b6f0: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
b700: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
b710: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b720: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
b730: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
b740: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
b750: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
b760: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
b770: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
b780: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b790: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b7a0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b7b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b7c0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b7d0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
b7e0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
b7f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
b800: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
b810: 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  p, dest, jumpIfN
b820: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61  ull);.      brea
b830: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b840: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
b850: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
b860: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b870: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b880: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
b890: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b8a0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
b8b0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
b8c0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b8d0: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
b8e0: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20   {.      /* The 
b8f0: 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20 42 45  expression "x BE
b900: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 20 69  TWEEN y AND z" i
b910: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
b920: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
b930: 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20 79 29   ** 1 IF (x < y)
b940: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
b950: 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29 20 47   2 IF (x <= z) G
b960: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
b970: 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20   ** 3 ....      
b980: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
b990: 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
b9a0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
b9b0: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
b9c0: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
b9d0: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
b9e0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
b9f0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ba00: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
ba10: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba20: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
ba30: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ba40: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ba50: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
ba60: 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61  addr = codeCompa
ba70: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
ba80: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c  , pRight, OP_Lt,
ba90: 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29   0, !jumpIfNull)
baa0: 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  ;..      pRight 
bab0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
bac0: 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[1].pExpr;.    
bad0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
bae0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
baf0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
bb00: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
bb10: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
bb20: 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  e, dest, jumpIfN
bb30: 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c  ull);..      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 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
bb60: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
bb70: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
bb80: 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64   addr, sqlite3Vd
bb90: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
bba0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bbb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
bbc0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
bbd0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bbe0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
bbf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
bc00: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
bc10: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
bc20: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bc30: 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _If, jumpIfNull,
bc40: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72   dest);.      br
bc50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
bc60: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
bc70: 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c   code for a bool
bc80: 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73  ean expression s
bc90: 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20  uch that a jump 
bca0: 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68  is made.** to th
bcb0: 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69  e label "dest" i
bcc0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
bcd0: 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65 78   is false but ex
bce0: 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69  ecution.** conti
bcf0: 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74 68  nues straight th
bd00: 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65 73  ru if the expres
bd10: 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a  sion is true..**
bd20: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
bd30: 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20  ssion evaluates 
bd40: 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72  to NULL (neither
bd50: 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29   true nor false)
bd60: 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66   then.** jump if
bd70: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74   jumpIfNull is t
bd80: 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f  rue or fall thro
bd90: 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c  ugh if jumpIfNul
bda0: 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76  l is false..*/.v
bdb0: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49  oid sqlite3ExprI
bdc0: 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70 50  fFalse(Parse *pP
bdd0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
bde0: 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74  r, int dest, int
bdf0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
be00: 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65  Vdbe *v = pParse
be10: 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f  ->pVdbe;.  int o
be20: 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d  p = 0;.  if( v==
be30: 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20  0 || pExpr==0 ) 
be40: 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68  return;.  switch
be50: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
be60: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
be70: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b       op = OP_Ge;
be80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
be90: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
bea0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20      op = OP_Gt; 
beb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bec0: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
bed0: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
bee0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bef0: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
bf00: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
bf10: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
bf20: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
bf30: 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20   op = OP_Eq;    
bf40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
bf50: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
bf60: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
bf70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
bf80: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
bf90: 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20  p = OP_NotNull; 
bfa0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
bfb0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
bfc0: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
bfd0: 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75  break;.    defau
bfe0: 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  lt:  break;.  }.
bff0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
c000: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
c010: 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20  TK_AND: {.      
c020: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
c030: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
c040: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
c050: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
c060: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
c070: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
c080: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
c090: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
c0a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c0b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
c0c0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32  : {.      int d2
c0d0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61   = sqlite3VdbeMa
c0e0: 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20  keLabel(v);.    
c0f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
c100: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
c110: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
c120: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
c130: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
c140: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
c150: 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74  pr->pRight, dest
c160: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
c170: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c180: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
c190: 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  d2);.      break
c1a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c1b0: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
c1c0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
c1d0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
c1e0: 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a  ->pLeft, dest, j
c1f0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
c200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c210: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20     case TK_LT:. 
c220: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20     case TK_LE:. 
c230: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20     case TK_GT:. 
c240: 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20     case TK_GE:. 
c250: 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20     case TK_NE:. 
c260: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b     case TK_EQ: {
c270: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c280: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c290: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
c2a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c2b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c2c0: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
c2d0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
c2e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c2f0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
c300: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
c310: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
c320: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c330: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
c340: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
c350: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
c360: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c370: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c380: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
c390: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
c3a0: 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20  p, 1, dest);.   
c3b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c3c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
c3d0: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  EEN: {.      /* 
c3e0: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  The expression i
c3f0: 73 20 22 78 20 42 45 54 57 45 45 4e 20 79 20 41  s "x BETWEEN y A
c400: 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69 6d 70  ND z". It is imp
c410: 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20  lemented as:.   
c420: 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31     **.      ** 1
c430: 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47 4f 54   IF (x >= y) GOT
c440: 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20 47  O 3.      ** 2 G
c450: 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20  OTO <dest>.     
c460: 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20 7a 29   ** 3 IF (x > z)
c470: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
c480: 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20     */.      int 
c490: 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72  addr;.      Expr
c4a0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
c4b0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78  >pLeft;.      Ex
c4c0: 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78  pr *pRight = pEx
c4d0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e  pr->pList->a[0].
c4e0: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c  pExpr;.      sql
c4f0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c500: 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20  rse, pLeft);.   
c510: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c520: 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30  dOp(v, OP_Dup, 0
c530: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c540: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c550: 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20  se, pRight);.   
c560: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
c570: 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72  3VdbeCurrentAddr
c580: 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  (v);.      codeC
c590: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
c5a0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
c5b0: 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75  _Ge, addr+3, !ju
c5c0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
c5d0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c5e0: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
c5f0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
c600: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c610: 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29  P_Goto, 0, dest)
c620: 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d  ;.      pRight =
c630: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
c640: 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20  [1].pExpr;.     
c650: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c660: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
c670: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
c680: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
c690: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 74  t, pRight, OP_Gt
c6a0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
c6b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
c6c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
c6d0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
c6e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c6f0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
c700: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c710: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
c720: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
c730: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
c740: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
c750: 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
c760: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
c770: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
c780: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
c790: 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
c7a0: 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
c7b0: 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
c7c0: 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
c7d0: 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
c7e0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c7f0: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
c800: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
c810: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
c820: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c830: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
c840: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
c850: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c860: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
c870: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
c880: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
c890: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
c8a0: 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
c8b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
c8c0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
c8d0: 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
c8e0: 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
c8f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
c900: 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pA->pList ){.   
c910: 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d   if( pB->pList==
c920: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c930: 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d    if( pA->pList-
c940: 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73  >nExpr!=pB->pLis
c950: 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  t->nExpr ) retur
c960: 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  n 0;.    for(i=0
c970: 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  ; i<pA->pList->n
c980: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c990: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
c9a0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
c9b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
c9c0: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
c9d0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
c9e0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c9f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
ca00: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
ca10: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
ca20: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
ca30: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
ca40: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
ca50: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  0;.  if( pA->iTa
ca60: 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
ca70: 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
ca80: 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
ca90: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
caa0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
cab0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
cac0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
cad0: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
cae0: 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
caf0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
cb00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
cb10: 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  ICmp(pA->token.z
cb20: 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pB->token.z, p
cb30: 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29  B->token.n)!=0 )
cb40: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
cb50: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
cb60: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
cb70: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61  ement to the pPa
cb80: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
cb90: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  y and return its
cba0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
cbb0: 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49  c int appendAggI
cbc0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
cbd0: 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73  e){.  if( (pPars
cbe0: 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d  e->nAgg & 0x7)==
cbf0: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74  0 ){.    int amt
cc00: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20   = pParse->nAgg 
cc10: 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72  + 8;.    AggExpr
cc20: 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52   *aAgg = sqliteR
cc30: 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61  ealloc(pParse->a
cc40: 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28  Agg, amt*sizeof(
cc50: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
cc60: 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d  );.    if( aAgg=
cc70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
cc80: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
cc90: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20   pParse->aAgg = 
cca0: 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  aAgg;.  }.  mems
ccb0: 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67  et(&pParse->aAgg
ccc0: 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20  [pParse->nAgg], 
ccd0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65  0, sizeof(pParse
cce0: 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72  ->aAgg[0]));.  r
ccf0: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41  eturn pParse->nA
cd00: 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  gg++;.}../*.** A
cd10: 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
cd20: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
cd30: 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
cd40: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
cd50: 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
cd60: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
cd70: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
cd80: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
cd90: 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
cda0: 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
cdb0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
cdc0: 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
cdd0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
cde0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
cdf0: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
ce00: 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
ce10: 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
ce20: 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
ce30: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
ce40: 65 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74  eIds() and sqlit
ce50: 65 33 45 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a  e3ExprCheck()..*
ce60: 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61  *.** If errors a
ce70: 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61  re seen, leave a
ce80: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
ce90: 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72  in zErrMsg and r
cea0: 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
ceb0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
cec0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
ced0: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
cee0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
cef0: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
cf00: 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78    int i;.  AggEx
cf10: 70 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20  pr *aAgg;.  int 
cf20: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  nErr = 0;..  if(
cf30: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
cf40: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
cf50: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
cf60: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
cf70: 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20   {.      aAgg = 
cf80: 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
cf90: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
cfa0: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
cfb0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
cfc0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
cfd0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
cfe0: 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45 78   if( aAgg[i].pEx
cff0: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pr->iTable==pExp
d000: 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
d010: 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45     && aAgg[i].pE
d020: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  xpr->iColumn==pE
d030: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
d040: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
d050: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
d060: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
d070: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
d080: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
d090: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
d0a0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
d0b0: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
d0c0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
d0d0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30  Agg[i].isAgg = 0
d0e0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
d0f0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
d100: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
d110: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
d120: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72  gg = i;.      br
d130: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
d140: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
d150: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  ION: {.      aAg
d160: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
d170: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
d180: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
d190: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
d1a0: 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67  f( !aAgg[i].isAg
d1b0: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
d1c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
d1d0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  3ExprCompare(aAg
d1e0: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
d1f0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
d200: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
d210: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d220: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
d230: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  gg ){.        u8
d240: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
d250: 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  b->enc;.        
d260: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
d270: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
d280: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
d290: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
d2a0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
d2b0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
d2c0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
d2d0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
d2e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
d2f0: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
d300: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
d310: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
d320: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45  .             pE
d330: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
d340: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
d350: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
d360: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
d370: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
d380: 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
d390: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
d3a0: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
d3b0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
d3c0: 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
d3d0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
d3e0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  eft ){.        n
d3f0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Err = sqlite3Exp
d400: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
d410: 65 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  es(pParse, pExpr
d420: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
d430: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
d440: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
d450: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
d460: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
d470: 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
d480: 74 65 73 28 70 50 61 72 73 65 2c 20 70 45 78 70  tes(pParse, pExp
d490: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
d4a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
d4b0: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
d4c0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
d4d0: 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e   int n = pExpr->
d4e0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20  pList->nExpr;.  
d4f0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
d500: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45       for(i=0; nE
d510: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
d520: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 45  +){.          nE
d530: 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  rr = sqlite3Expr
d540: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
d550: 73 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  s(pParse, pExpr-
d560: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
d570: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
d580: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
d590: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  ak;.    }.  }.  
d5a0: 72 65 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a  return nErr;.}..
d5b0: 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75  /*.** Locate a u
d5c0: 73 65 72 20 66 75 6e 63 74 69 6f 6e 20 67 69 76  ser function giv
d5d0: 65 6e 20 61 20 6e 61 6d 65 2c 20 61 20 6e 75 6d  en a name, a num
d5e0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d5f0: 20 61 6e 64 20 61 20 66 6c 61 67 0a 2a 2a 20 69   and a flag.** i
d600: 6e 64 69 63 61 74 69 6e 67 20 77 68 65 74 68 65  ndicating whethe
d610: 72 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 70  r the function p
d620: 72 65 66 65 72 73 20 55 54 46 2d 31 36 20 6f 76  refers UTF-16 ov
d630: 65 72 20 55 54 46 2d 38 2e 20 20 52 65 74 75 72  er UTF-8.  Retur
d640: 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74  n a.** pointer t
d650: 6f 20 74 68 65 20 46 75 6e 63 44 65 66 20 73 74  o the FuncDef st
d660: 72 75 63 74 75 72 65 20 74 68 61 74 20 64 65 66  ructure that def
d670: 69 6e 65 73 20 74 68 61 74 20 66 75 6e 63 74 69  ines that functi
d680: 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e 0a 2a 2a  on, or return.**
d690: 20 4e 55 4c 4c 20 69 66 20 74 68 65 20 66 75 6e   NULL if the fun
d6a0: 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65  ction does not e
d6b0: 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  xist..**.** If t
d6c0: 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 61 72  he createFlag ar
d6d0: 67 75 6d 65 6e 74 20 69 73 20 74 72 75 65 2c 20  gument is true, 
d6e0: 74 68 65 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e  then a new (blan
d6f0: 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74  k) FuncDef.** st
d700: 72 75 63 74 75 72 65 20 69 73 20 63 72 65 61 74  ructure is creat
d710: 65 64 20 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74  ed and liked int
d720: 6f 20 74 68 65 20 22 64 62 22 20 73 74 72 75 63  o the "db" struc
d730: 74 75 72 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20  ture if a.** no 
d740: 6d 61 74 63 68 69 6e 67 20 66 75 6e 63 74 69 6f  matching functio
d750: 6e 20 70 72 65 76 69 6f 75 73 6c 79 20 65 78 69  n previously exi
d760: 73 74 65 64 2e 20 20 57 68 65 6e 20 63 72 65 61  sted.  When crea
d770: 74 65 46 6c 61 67 20 69 73 20 74 72 75 65 0a 2a  teFlag is true.*
d780: 2a 20 61 6e 64 20 74 68 65 20 6e 41 72 67 20 70  * and the nArg p
d790: 61 72 61 6d 65 74 65 72 20 69 73 20 2d 31 2c 20  arameter is -1, 
d7a0: 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63  then only a func
d7b0: 74 69 6f 6e 20 74 68 61 74 20 61 63 63 65 70 74  tion that accept
d7c0: 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20  s.** any number 
d7d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 77 69 6c  of arguments wil
d7e0: 6c 20 62 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a  l be returned..*
d7f0: 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c  *.** If createFl
d800: 61 67 20 69 73 20 66 61 6c 73 65 20 61 6e 64 20  ag is false and 
d810: 6e 41 72 67 20 69 73 20 2d 31 2c 20 74 68 65 6e  nArg is -1, then
d820: 20 74 68 65 20 66 69 72 73 74 20 76 61 6c 69 64   the first valid
d830: 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75  .** function fou
d840: 6e 64 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20  nd is returned. 
d850: 20 41 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 76   A function is v
d860: 61 6c 69 64 20 69 66 20 65 69 74 68 65 72 20 78  alid if either x
d870: 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70  Func.** or xStep
d880: 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a   is non-zero..**
d890: 0a 2a 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61  .** If createFla
d8a0: 67 20 69 73 20 66 61 6c 73 65 2c 20 74 68 65 6e  g is false, then
d8b0: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
d8c0: 20 74 68 65 20 72 65 71 75 69 72 65 64 20 6e 61   the required na
d8d0: 6d 65 20 61 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72  me and.** number
d8e0: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 61   of arguments ma
d8f0: 79 20 62 65 20 72 65 74 75 72 6e 65 64 20 65 76  y be returned ev
d900: 65 6e 20 69 66 20 74 68 65 20 65 54 65 78 74 52  en if the eTextR
d910: 65 70 20 66 6c 61 67 20 64 6f 65 73 20 6e 6f 74  ep flag does not
d920: 0a 2a 2a 20 6d 61 74 63 68 20 74 68 61 74 20 72  .** match that r
d930: 65 71 75 65 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e  equested..*/.Fun
d940: 63 44 65 66 20 2a 73 71 6c 69 74 65 33 46 69 6e  cDef *sqlite3Fin
d950: 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c  dFunction(.  sql
d960: 69 74 65 20 2a 64 62 2c 20 20 20 20 20 20 20 20  ite *db,        
d970: 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61 74 61 62  /* An open datab
d980: 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63  ase */.  const c
d990: 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e  har *zName, /* N
d9a0: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
d9b0: 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74  ion.  Not null-t
d9c0: 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69  erminated */.  i
d9d0: 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20  nt nName,       
d9e0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63    /* Number of c
d9f0: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
da00: 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e   name */.  int n
da10: 41 72 67 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  Arg,          /*
da20: 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   Number of argum
da30: 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20  ents.  -1 means 
da40: 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20  any number */.  
da50: 75 38 20 65 6e 63 2c 20 20 20 20 20 20 20 20 20  u8 enc,         
da60: 20 20 20 2f 2a 20 50 72 65 66 65 72 72 65 64 20     /* Preferred 
da70: 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f  text encoding */
da80: 0a 20 20 69 6e 74 20 63 72 65 61 74 65 46 6c 61  .  int createFla
da90: 67 20 20 20 20 20 2f 2a 20 43 72 65 61 74 65 20  g     /* Create 
daa0: 6e 65 77 20 65 6e 74 72 79 20 69 66 20 74 72 75  new entry if tru
dab0: 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f  e and does not o
dac0: 74 68 65 72 77 69 73 65 20 65 78 69 73 74 20 2a  therwise exist *
dad0: 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a  /.){.  FuncDef *
dae0: 70 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 49 74  p;         /* It
daf0: 65 72 61 74 6f 72 20 76 61 72 69 61 62 6c 65 20  erator variable 
db00: 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 46  */.  FuncDef *pF
db10: 69 72 73 74 3b 20 20 20 20 2f 2a 20 46 69 72 73  irst;    /* Firs
db20: 74 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  t function with 
db30: 74 68 69 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 46  this name */.  F
db40: 75 6e 63 44 65 66 20 2a 70 42 65 73 74 20 3d 20  uncDef *pBest = 
db50: 30 3b 20 2f 2a 20 42 65 73 74 20 6d 61 74 63 68  0; /* Best match
db60: 20 66 6f 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f   found so far */
db70: 0a 20 20 69 6e 74 20 62 65 73 74 6d 61 74 63 68  .  int bestmatch
db80: 20 3d 20 30 3b 20 20 0a 0a 0a 20 20 61 73 73 65   = 0;  ...  asse
db90: 72 74 28 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f  rt( enc==SQLITE_
dba0: 55 54 46 38 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c  UTF8 || enc==SQL
dbb0: 49 54 45 5f 55 54 46 31 36 4c 45 20 7c 7c 20 65  ITE_UTF16LE || e
dbc0: 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
dbd0: 42 45 20 29 3b 0a 20 20 69 66 28 20 6e 41 72 67  BE );.  if( nArg
dbe0: 3c 2d 31 20 29 20 6e 41 72 67 20 3d 20 2d 31 3b  <-1 ) nArg = -1;
dbf0: 0a 0a 20 20 70 46 69 72 73 74 20 3d 20 28 46 75  ..  pFirst = (Fu
dc00: 6e 63 44 65 66 2a 29 73 71 6c 69 74 65 33 48 61  ncDef*)sqlite3Ha
dc10: 73 68 46 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e  shFind(&db->aFun
dc20: 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29  c, zName, nName)
dc30: 3b 0a 20 20 66 6f 72 28 70 3d 70 46 69 72 73 74  ;.  for(p=pFirst
dc40: 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29  ; p; p=p->pNext)
dc50: 7b 0a 20 20 20 20 2f 2a 20 44 75 72 69 6e 67 20  {.    /* During 
dc60: 74 68 65 20 73 65 61 72 63 68 20 66 6f 72 20 74  the search for t
dc70: 68 65 20 62 65 73 74 20 66 75 6e 63 74 69 6f 6e  he best function
dc80: 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20 62 65 73   definition, bes
dc90: 74 6d 61 74 63 68 20 69 73 20 73 65 74 0a 20 20  tmatch is set.  
dca0: 20 20 2a 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 20    ** as follows 
dcb0: 74 6f 20 69 6e 64 69 63 61 74 65 20 74 68 65 20  to indicate the 
dcc0: 71 75 61 6c 69 74 79 20 6f 66 20 74 68 65 20 6d  quality of the m
dcd0: 61 74 63 68 20 77 69 74 68 20 74 68 65 20 64 65  atch with the de
dce0: 66 69 6e 69 74 69 6f 6e 0a 20 20 20 20 2a 2a 20  finition.    ** 
dcf0: 70 6f 69 6e 74 65 64 20 74 6f 20 62 79 20 70 42  pointed to by pB
dd00: 65 73 74 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20  est:.    **.    
dd10: 2a 2a 20 30 3a 20 70 42 65 73 74 20 69 73 20 4e  ** 0: pBest is N
dd20: 55 4c 4c 2e 20 4e 6f 20 6d 61 74 63 68 20 68 61  ULL. No match ha
dd30: 73 20 62 65 65 6e 20 66 6f 75 6e 64 2e 0a 20 20  s been found..  
dd40: 20 20 2a 2a 20 31 3a 20 41 20 76 61 72 69 61 62    ** 1: A variab
dd50: 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e  le arguments fun
dd60: 63 74 69 6f 6e 20 74 68 61 74 20 70 72 65 66 65  ction that prefe
dd70: 72 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20  rs UTF-8 when a 
dd80: 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a 20 20 20  UTF-16.    **   
dd90: 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71   encoding is req
dda0: 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
ddb0: 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 32 3a  versa..    ** 2:
ddc0: 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75   A variable argu
ddd0: 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 74  ments function t
dde0: 68 61 74 20 75 73 65 73 20 55 54 46 2d 31 36 42  hat uses UTF-16B
ddf0: 45 20 77 68 65 6e 20 55 54 46 2d 31 36 4c 45 20  E when UTF-16LE 
de00: 69 73 0a 20 20 20 20 2a 2a 20 20 20 20 72 65 71  is.    **    req
de10: 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20  uested, or vice 
de20: 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 33 3a  versa..    ** 3:
de30: 20 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75   A variable argu
de40: 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 75  ments function u
de50: 73 69 6e 67 20 74 68 65 20 73 61 6d 65 20 74 65  sing the same te
de60: 78 74 20 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 20  xt encoding..   
de70: 20 2a 2a 20 34 3a 20 41 20 66 75 6e 63 74 69 6f   ** 4: A functio
de80: 6e 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74  n with the exact
de90: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
dea0: 65 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74  ents requested t
deb0: 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72  hat.    **    pr
dec0: 65 66 65 72 73 20 55 54 46 2d 38 20 77 68 65 6e  efers UTF-8 when
ded0: 20 61 20 55 54 46 2d 31 36 20 65 6e 63 6f 64 69   a UTF-16 encodi
dee0: 6e 67 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  ng is requested,
def0: 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
df00: 20 20 20 20 2a 2a 20 35 3a 20 41 20 66 75 6e 63      ** 5: A func
df10: 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65 78  tion with the ex
df20: 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  act number of ar
df30: 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73 74 65  guments requeste
df40: 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20  d that.    **   
df50: 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36 4c   prefers UTF-16L
df60: 45 20 77 68 65 6e 20 55 54 46 2d 31 36 42 45 20  E when UTF-16BE 
df70: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72  is requested, or
df80: 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20   vice versa..   
df90: 20 2a 2a 20 36 3a 20 41 6e 20 65 78 61 63 74 20   ** 6: An exact 
dfa0: 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20  match..    **.  
dfb0: 20 20 2a 2a 20 41 20 6c 61 72 67 65 72 20 76 61    ** A larger va
dfc0: 6c 75 65 20 6f 66 20 27 6d 61 74 63 68 71 75 61  lue of 'matchqua
dfd0: 6c 27 20 69 6e 64 69 63 61 74 65 73 20 61 20 6d  l' indicates a m
dfe0: 6f 72 65 20 64 65 73 69 72 61 62 6c 65 20 6d 61  ore desirable ma
dff0: 74 63 68 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  tch..    */.    
e000: 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20  if( p->nArg==-1 
e010: 7c 7c 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67  || p->nArg==nArg
e020: 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a   || nArg==-1 ){.
e030: 20 20 20 20 20 20 69 6e 74 20 6d 61 74 63 68 20        int match 
e040: 3d 20 31 3b 20 20 20 20 20 20 20 20 20 20 2f 2a  = 1;          /*
e050: 20 51 75 61 6c 69 74 79 20 6f 66 20 74 68 69 73   Quality of this
e060: 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20 20 20 20   match */.      
e070: 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72  if( p->nArg==nAr
e080: 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b  g || nArg==-1 ){
e090: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 3d  .        match =
e0a0: 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   4;.      }.    
e0b0: 20 20 69 66 28 20 65 6e 63 3d 3d 70 2d 3e 69 50    if( enc==p->iP
e0c0: 72 65 66 45 6e 63 20 29 7b 0a 20 20 20 20 20 20  refEnc ){.      
e0d0: 20 20 6d 61 74 63 68 20 2b 3d 20 32 3b 0a 20 20    match += 2;.  
e0e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
e0f0: 20 69 66 28 20 28 65 6e 63 3d 3d 53 51 4c 49 54   if( (enc==SQLIT
e100: 45 5f 55 54 46 31 36 4c 45 20 26 26 20 70 2d 3e  E_UTF16LE && p->
e110: 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45  iPrefEnc==SQLITE
e120: 5f 55 54 46 31 36 42 45 29 20 7c 7c 0a 20 20 20  _UTF16BE) ||.   
e130: 20 20 20 20 20 20 20 20 20 20 20 20 28 65 6e 63              (enc
e140: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
e150: 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d   && p->iPrefEnc=
e160: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 29  =SQLITE_UTF16LE)
e170: 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
e180: 68 20 2b 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  h += 1;.      }.
e190: 0a 20 20 20 20 20 20 69 66 28 20 6d 61 74 63 68  .      if( match
e1a0: 3e 62 65 73 74 6d 61 74 63 68 20 29 7b 0a 20 20  >bestmatch ){.  
e1b0: 20 20 20 20 20 20 70 42 65 73 74 20 3d 20 70 3b        pBest = p;
e1c0: 0a 20 20 20 20 20 20 20 20 62 65 73 74 6d 61 74  .        bestmat
e1d0: 63 68 20 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20  ch = match;.    
e1e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
e1f0: 20 2f 2a 20 49 66 20 74 68 65 20 63 72 65 61 74   /* If the creat
e200: 65 46 6c 61 67 20 70 61 72 61 6d 65 74 65 72 20  eFlag parameter 
e210: 69 73 20 74 72 75 65 2c 20 61 6e 64 20 74 68 65  is true, and the
e220: 20 73 65 61 63 68 20 64 69 64 20 6e 6f 74 20 72   seach did not r
e230: 65 76 65 61 6c 20 61 6e 0a 20 20 2a 2a 20 65 78  eveal an.  ** ex
e240: 61 63 74 20 6d 61 74 63 68 20 66 6f 72 20 74 68  act match for th
e250: 65 20 6e 61 6d 65 2c 20 6e 75 6d 62 65 72 20 6f  e name, number o
e260: 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64 20  f arguments and 
e270: 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65 6e 20 61  encoding, then a
e280: 64 64 20 61 0a 20 20 2a 2a 20 6e 65 77 20 65 6e  dd a.  ** new en
e290: 74 72 79 20 74 6f 20 74 68 65 20 68 61 73 68 20  try to the hash 
e2a0: 74 61 62 6c 65 20 61 6e 64 20 72 65 74 75 72 6e  table and return
e2b0: 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20   it..  */.  if( 
e2c0: 63 72 65 61 74 65 46 6c 61 67 20 26 26 20 62 65  createFlag && be
e2d0: 73 74 6d 61 74 63 68 3c 36 20 26 26 20 0a 20 20  stmatch<6 && .  
e2e0: 20 20 20 20 28 70 42 65 73 74 20 3d 20 73 71 6c      (pBest = sql
e2f0: 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66  iteMalloc(sizeof
e300: 28 2a 70 42 65 73 74 29 2b 6e 4e 61 6d 65 2b 31  (*pBest)+nName+1
e310: 29 29 20 29 7b 0a 20 20 20 20 70 42 65 73 74 2d  )) ){.    pBest-
e320: 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20  >nArg = nArg;.  
e330: 20 20 70 42 65 73 74 2d 3e 70 4e 65 78 74 20 3d    pBest->pNext =
e340: 20 70 46 69 72 73 74 3b 0a 20 20 20 20 70 42 65   pFirst;.    pBe
e350: 73 74 2d 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61  st->zName = (cha
e360: 72 2a 29 26 70 42 65 73 74 5b 31 5d 3b 0a 20 20  r*)&pBest[1];.  
e370: 20 20 70 42 65 73 74 2d 3e 69 50 72 65 66 45 6e    pBest->iPrefEn
e380: 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20 6d 65 6d  c = enc;.    mem
e390: 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e 61 6d 65  cpy(pBest->zName
e3a0: 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b  , zName, nName);
e3b0: 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  .    pBest->zNam
e3c0: 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20  e[nName] = 0;.  
e3d0: 20 20 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73    sqlite3HashIns
e3e0: 65 72 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ert(&db->aFunc, 
e3f0: 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e  pBest->zName, nN
e400: 61 6d 65 2c 20 28 76 6f 69 64 2a 29 70 42 65 73  ame, (void*)pBes
e410: 74 29 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70  t);.  }..  if( p
e420: 42 65 73 74 20 26 26 20 28 70 42 65 73 74 2d 3e  Best && (pBest->
e430: 78 53 74 65 70 20 7c 7c 20 70 42 65 73 74 2d 3e  xStep || pBest->
e440: 78 46 75 6e 63 20 7c 7c 20 63 72 65 61 74 65 46  xFunc || createF
e450: 6c 61 67 29 20 29 7b 0a 20 20 20 20 72 65 74 75  lag) ){.    retu
e460: 72 6e 20 70 42 65 73 74 3b 0a 20 20 7d 0a 20 20  rn pBest;.  }.  
e470: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a              return 0;.}.