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

Artifact d618305952f75567514824cf9bdd5de74db5e00a:


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 39 20 32 30 30 34 2f 30 39 2f 30 31 20  .159 2004/09/01 
0220: 30 33 3a 30 36 3a 33 35 20 64 72 68 20 45 78 70  03:06:35 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 4a 6f 69  ew;.}../*.** Joi
1b00: 6e 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e  n two expression
1b10: 73 20 75 73 69 6e 67 20 61 6e 20 41 4e 44 20 6f  s using an AND o
1b20: 70 65 72 61 74 6f 72 2e 20 20 49 66 20 65 69 74  perator.  If eit
1b30: 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 69  her expression i
1b40: 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  s.** NULL, then 
1b50: 6a 75 73 74 20 72 65 74 75 72 6e 20 74 68 65 20  just return the 
1b60: 6f 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  other expression
1b70: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
1b80: 65 33 45 78 70 72 41 6e 64 28 45 78 70 72 20 2a  e3ExprAnd(Expr *
1b90: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1ba0: 67 68 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66  ght){.  if( pLef
1bb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1bc0: 72 6e 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c  rn pRight;.  }el
1bd0: 73 65 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30  se if( pRight==0
1be0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
1bf0: 4c 65 66 74 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  Left;.  }else{. 
1c00: 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65     return sqlite
1c10: 33 45 78 70 72 28 54 4b 5f 41 4e 44 2c 20 70 4c  3Expr(TK_AND, pL
1c20: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 30 29 3b  eft, pRight, 0);
1c30: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  .  }.}../*.** Se
1c40: 74 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20  t the Expr.span 
1c50: 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76  field of the giv
1c60: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  en expression to
1c70: 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78   span all.** tex
1c80: 74 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77  t between the tw
1c90: 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a  o given tokens..
1ca0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
1cb0: 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45  xprSpan(Expr *pE
1cc0: 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66  xpr, Token *pLef
1cd0: 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74  t, Token *pRight
1ce0: 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69  ){.  assert( pRi
1cf0: 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65  ght!=0 );.  asse
1d00: 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a  rt( pLeft!=0 );.
1d10: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d    if( !sqlite3_m
1d20: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 26 26 20  alloc_failed && 
1d30: 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65  pRight->z && pLe
1d40: 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66 28  ft->z ){.    if(
1d50: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
1d60: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
1d70: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1d80: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
1d90: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
1da0: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
1db0: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67 68  ->n + Addr(pRigh
1dc0: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c 65  t->z) - Addr(pLe
1dd0: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
1de0: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
1df0: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
1e00: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
1e10: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1e20: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
1e30: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
1e40: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
1e50: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
1e60: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
1e70: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
1e80: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1e90: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
1ea0: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
1eb0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
1ec0: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
1ed0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1ee0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
1ef0: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
1f00: 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74  ); // Leak pList
1f10: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
1f20: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
1f30: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
1f40: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
1f50: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
1f60: 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  = pList;.  if( p
1f70: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  Token ){.    ass
1f80: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
1f90: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ==0 );.    pNew-
1fa0: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
1fb0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1fc0: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  New->token.z = 0
1fd0: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
1fe0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1ff0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
2000: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
2010: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
2020: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
2030: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2040: 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20  ExprDelete(Expr 
2050: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
2060: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2070: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
2080: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2090: 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66  p->span.z);.  if
20a0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29  ( p->token.dyn )
20b0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
20c0: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
20d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
20e0: 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  ete(p->pLeft);. 
20f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2100: 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  te(p->pRight);. 
2110: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2120: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29  Delete(p->pList)
2130: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2140: 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65  tDelete(p->pSele
2150: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
2160: 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  e(p);.}.../*.** 
2170: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
2180: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
2190: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
21a0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
21b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
21c0: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
21d0: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
21e0: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
21f0: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
2200: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
2210: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
2220: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
2230: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
2240: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
2250: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
2260: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
2270: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
2280: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
2290: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
22a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
22b0: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
22c0: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
22d0: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
22e0: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
22f0: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
2300: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
2310: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2320: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
2330: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
2340: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
2350: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
2360: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
2370: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a   duplicated..*/.
2380: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2390: 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20  rDup(Expr *p){. 
23a0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
23b0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
23c0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
23d0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
23e0: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
23f0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
2400: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
2410: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
2420: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
2430: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
2440: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
2450: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2460: 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20  p->token.z);.   
2470: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
2480: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
2490: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
24a0: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
24b0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
24c0: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
24d0: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
24e0: 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b  prDup(p->pLeft);
24f0: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
2500: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
2510: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  (p->pRight);.  p
2520: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
2530: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2540: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65  p->pList);.  pNe
2550: 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  w->pSelect = sql
2560: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
2570: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74  >pSelect);.  ret
2580: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64  urn pNew;.}.void
2590: 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70   sqlite3TokenCop
25a0: 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f  y(Token *pTo, To
25b0: 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69  ken *pFrom){.  i
25c0: 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71  f( pTo->dyn ) sq
25d0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
25e0: 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70  pTo->z);.  if( p
25f0: 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70  From->z ){.    p
2600: 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e  To->n = pFrom->n
2610: 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73  ;.    pTo->z = s
2620: 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46 72  qliteStrNDup(pFr
2630: 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29  om->z, pFrom->n)
2640: 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d  ;.    pTo->dyn =
2650: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2660: 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d   pTo->z = 0;.  }
2670: 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c  .}.ExprList *sql
2680: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
2690: 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20  ExprList *p){.  
26a0: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
26b0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
26c0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
26d0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d   int i;.  if( p=
26e0: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
26f0: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
2700: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e  lloc( sizeof(*pN
2710: 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  ew) );.  if( pNe
2720: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
2730: 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d  .  pNew->nExpr =
2740: 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20   pNew->nAlloc = 
2750: 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77  p->nExpr;.  pNew
2760: 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71  ->a = pItem = sq
2770: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
2780: 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61  Expr*sizeof(p->a
2790: 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49  [0]) );.  if( pI
27a0: 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71  tem==0 ){.    sq
27b0: 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a  liteFree(pNew);.
27c0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
27d0: 7d 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  } .  for(i=0; i<
27e0: 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  p->nExpr; i++, p
27f0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
2800: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
2810: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
2820: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
2830: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
2840: 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20  rDup(pOldExpr = 
2850: 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  p->a[i].pExpr);.
2860: 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72      if( pOldExpr
2870: 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70  ->span.z!=0 && p
2880: 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20  NewExpr ){.     
2890: 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20   /* Always make 
28a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70  a copy of the sp
28b0: 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c  an for top-level
28c0: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20   expressions in 
28d0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
28e0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54  ression list.  T
28f0: 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45  he logic in SELE
2900: 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68  CT processing th
2910: 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20  at determines.  
2920: 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73      ** the names
2930: 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74   of columns in t
2940: 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65  he result set ne
2950: 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61  eds this informa
2960: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71  tion */.      sq
2970: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26  lite3TokenCopy(&
2980: 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20  pNewExpr->span, 
2990: 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29  &pOldExpr->span)
29a0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65  ;.    }.    asse
29b0: 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20  rt( pNewExpr==0 
29c0: 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61  || pNewExpr->spa
29d0: 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20  n.z!=0 .        
29e0: 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d      || pOldExpr-
29f0: 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71  >span.z==0 || sq
2a00: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
2a10: 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d  led );.    pItem
2a20: 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65  ->zName = sqlite
2a30: 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a  StrDup(p->a[i].z
2a40: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d  Name);.    pItem
2a50: 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d  ->sortOrder = p-
2a60: 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b  >a[i].sortOrder;
2a70: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67  .    pItem->isAg
2a80: 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67  g = p->a[i].isAg
2a90: 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f  g;.    pItem->do
2aa0: 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65  ne = 0;.  }.  re
2ab0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63  turn pNew;.}.Src
2ac0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63  List *sqlite3Src
2ad0: 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74 20  ListDup(SrcList 
2ae0: 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a  *p){.  SrcList *
2af0: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
2b00: 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66   int nByte;.  if
2b10: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( p==0 ) return 
2b20: 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a  0;.  nByte = siz
2b30: 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53  eof(*p) + (p->nS
2b40: 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d  rc>0 ? sizeof(p-
2b50: 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72  >a[0]) * (p->nSr
2b60: 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65  c-1) : 0);.  pNe
2b70: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
2b80: 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20  Raw( nByte );.  
2b90: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
2ba0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
2bb0: 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c  nSrc = pNew->nAl
2bc0: 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20  loc = p->nSrc;. 
2bd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2be0: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  Src; i++){.    s
2bf0: 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74  truct SrcList_it
2c00: 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26  em *pNewItem = &
2c10: 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  pNew->a[i];.    
2c20: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2c30: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
2c40: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
2c50: 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73  ewItem->zDatabas
2c60: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
2c70: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61  (pOldItem->zData
2c80: 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  base);.    pNewI
2c90: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
2ca0: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
2cb0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
2cc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pNewItem->zAlias
2cd0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
2ce0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  pOldItem->zAlias
2cf0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2d00: 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64  >jointype = pOld
2d10: 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a  Item->jointype;.
2d20: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43      pNewItem->iC
2d30: 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d  ursor = pOldItem
2d40: 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70  ->iCursor;.    p
2d50: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
2d60: 30 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  0;.    pNewItem-
2d70: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2d80: 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64  e3SelectDup(pOld
2d90: 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a  Item->pSelect);.
2da0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f      pNewItem->pO
2db0: 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  n = sqlite3ExprD
2dc0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e  up(pOldItem->pOn
2dd0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2de0: 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65  >pUsing = sqlite
2df0: 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49  3IdListDup(pOldI
2e00: 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20  tem->pUsing);.  
2e10: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
2e20: 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74  .}.IdList *sqlit
2e30: 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69  e3IdListDup(IdLi
2e40: 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74  st *p){.  IdList
2e50: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
2e60: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2e70: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
2e80: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2e90: 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20  ( sizeof(*pNew) 
2ea0: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
2eb0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2ec0: 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d  New->nId = pNew-
2ed0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64  >nAlloc = p->nId
2ee0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
2ef0: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70  liteMallocRaw( p
2f00: 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e  ->nId*sizeof(p->
2f10: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
2f20: 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75  New->a==0 ) retu
2f30: 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b  rn 0;.  for(i=0;
2f40: 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b   i<p->nId; i++){
2f50: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
2f60: 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65  st_item *pNewIte
2f70: 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b  m = &pNew->a[i];
2f80: 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c 69  .    struct IdLi
2f90: 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65  st_item *pOldIte
2fa0: 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20  m = &p->a[i];.  
2fb0: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d    pNewItem->zNam
2fc0: 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  e = sqliteStrDup
2fd0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65  (pOldItem->zName
2fe0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
2ff0: 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  >idx = pOldItem-
3000: 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75  >idx;.  }.  retu
3010: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63  rn pNew;.}.Selec
3020: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
3030: 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Dup(Select *p){.
3040: 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a    Select *pNew;.
3050: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3060: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3070: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3080: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3090: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
30a0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
30b0: 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d  >isDistinct = p-
30c0: 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70  >isDistinct;.  p
30d0: 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71  New->pEList = sq
30e0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
30f0: 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70  (p->pEList);.  p
3100: 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69  New->pSrc = sqli
3110: 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d  te3SrcListDup(p-
3120: 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e  >pSrc);.  pNew->
3130: 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33  pWhere = sqlite3
3140: 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72  ExprDup(p->pWher
3150: 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f  e);.  pNew->pGro
3160: 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  upBy = sqlite3Ex
3170: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72  prListDup(p->pGr
3180: 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  oupBy);.  pNew->
3190: 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65  pHaving = sqlite
31a0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76  3ExprDup(p->pHav
31b0: 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  ing);.  pNew->pO
31c0: 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33  rderBy = sqlite3
31d0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
31e0: 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77  OrderBy);.  pNew
31f0: 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20  ->op = p->op;.  
3200: 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73  pNew->pPrior = s
3210: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
3220: 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e  p->pPrior);.  pN
3230: 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e  ew->nLimit = p->
3240: 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e  nLimit;.  pNew->
3250: 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66  nOffset = p->nOf
3260: 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53  fset;.  pNew->zS
3270: 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e 65  elect = 0;.  pNe
3280: 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a  w->iLimit = -1;.
3290: 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20    pNew->iOffset 
32a0: 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 70 70  = -1;.  pNew->pp
32b0: 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20 20  OpenTemp = 0;.  
32c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
32d0: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
32e0: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
32f0: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
3300: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
3310: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
3320: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
3330: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
3340: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f  ression list..*/
3350: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
3360: 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64  e3ExprListAppend
3370: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
3380: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  , Expr *pExpr, T
3390: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20  oken *pName){.  
33a0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
33b0: 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69      pList = sqli
33c0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
33d0: 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20  (ExprList) );.  
33e0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
33f0: 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
3400: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
3410: 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d  pr); // Leak mem
3420: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ory if malloc fa
3430: 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74  ils */.      ret
3440: 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20  urn 0;.    }.   
3450: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
3460: 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d  nAlloc==0 );.  }
3470: 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41  .  if( pList->nA
3480: 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78  lloc<=pList->nEx
3490: 70 72 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d  pr ){.    pList-
34a0: 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d  >nAlloc = pList-
34b0: 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20  >nAlloc*2 + 4;. 
34c0: 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71     pList->a = sq
34d0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73  liteRealloc(pLis
34e0: 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c  t->a, pList->nAl
34f0: 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74  loc*sizeof(pList
3500: 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66  ->a[0]));.    if
3510: 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b  ( pList->a==0 ){
3520: 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65  .      /* sqlite
3530: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
3540: 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f  r); // Leak memo
3550: 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69  ry if malloc fai
3560: 6c 73 20 2a 2f 0a 20 20 20 20 20 20 70 4c 69 73  ls */.      pLis
3570: 74 2d 3e 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  t->nExpr = pList
3580: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20  ->nAlloc = 0;.  
3590: 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74      return pList
35a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73  ;.    }.  }.  as
35b0: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
35c0: 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  0 );.  if( pExpr
35d0: 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20   || pName ){.   
35e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
35f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
3600: 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e  pList->a[pList->
3610: 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65  nExpr++];.    me
3620: 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73  mset(pItem, 0, s
3630: 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a  izeof(*pItem));.
3640: 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72      pItem->pExpr
3650: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70 49   = pExpr;.    pI
3660: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
3670: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
3680: 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  n(pName);.  }.  
3690: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a  return pList;.}.
36a0: 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e  ./*.** Delete an
36b0: 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73 69   entire expressi
36c0: 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64  on list..*/.void
36d0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
36e0: 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20  Delete(ExprList 
36f0: 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69  *pList){.  int i
3700: 3b 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c  ;.  struct ExprL
3710: 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b  ist_item *pItem;
3720: 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20  .  if( pList==0 
3730: 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65  ) return;.  asse
3740: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
3750: 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72  || (pList->nExpr
3760: 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41  ==0 && pList->nA
3770: 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73  lloc==0) );.  as
3780: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78  sert( pList->nEx
3790: 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  pr<=pList->nAllo
37a0: 63 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  c );.  for(pItem
37b0: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
37c0: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
37d0: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
37e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
37f0: 6c 65 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70  lete(pItem->pExp
3800: 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72  r);.    sqliteFr
3810: 65 65 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  ee(pItem->zName)
3820: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72  ;.  }.  sqliteFr
3830: 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20  ee(pList->a);.  
3840: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
3850: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b  );.}../*.** Walk
3860: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74   an expression t
3870: 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69  ree.  Return 1 i
3880: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
3890: 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20   is constant.** 
38a0: 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f  and 0 if it invo
38b0: 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a  lves variables..
38c0: 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75  **.** For the pu
38d0: 72 70 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66  rposes of this f
38e0: 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c  unction, a doubl
38f0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
3900: 28 65 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69  (ex: "abc").** i
3910: 73 20 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76  s considered a v
3920: 61 72 69 61 62 6c 65 20 62 75 74 20 61 20 73 69  ariable but a si
3930: 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  ngle-quoted stri
3940: 6e 67 20 28 65 78 3a 20 27 61 62 63 27 29 20 69  ng (ex: 'abc') i
3950: 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e  s.** a constant.
3960: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
3970: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78  xprIsConstant(Ex
3980: 70 72 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68  pr *p){.  switch
3990: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
39a0: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
39b0: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
39c0: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a     case TK_DOT:.
39d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
39e0: 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75  TION:.      retu
39f0: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
3a00: 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  K_NULL:.    case
3a10: 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20   TK_STRING:.    
3a20: 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20  case TK_BLOB:.  
3a30: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
3a40: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  R:.    case TK_F
3a50: 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54  LOAT:.    case T
3a60: 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20  K_VARIABLE:.    
3a70: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3a80: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
3a90: 20 69 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26   if( p->pLeft &&
3aa0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
3ab0: 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74  onstant(p->pLeft
3ac0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
3ad0: 20 20 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68      if( p->pRigh
3ae0: 74 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70  t && !sqlite3Exp
3af0: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70  rIsConstant(p->p
3b00: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
3b10: 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e  0;.      if( p->
3b20: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
3b30: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20   int i;.        
3b40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c  for(i=0; i<p->pL
3b50: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
3b60: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  {.          if( 
3b70: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
3b80: 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d  nstant(p->pList-
3b90: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72  >a[i].pExpr) ) r
3ba0: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20  eturn 0;.       
3bb0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
3bc0: 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74   return p->pLeft
3bd0: 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74  !=0 || p->pRight
3be0: 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74  !=0 || (p->pList
3bf0: 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45   && p->pList->nE
3c00: 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20  xpr>0);.    }.  
3c10: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
3c20: 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69  ./*.** If the gi
3c30: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63  ven expression c
3c40: 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20  odes a constant 
3c50: 69 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20  integer that is 
3c60: 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20  small enough.** 
3c70: 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62  to fit in a 32-b
3c80: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
3c90: 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65  rn 1 and put the
3ca0: 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e   value of the in
3cb0: 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61  teger.** in *pVa
3cc0: 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70  lue.  If the exp
3cd0: 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61  ression is not a
3ce0: 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20  n integer or if 
3cf0: 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a  it is too big.**
3d00: 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67   to fit in a sig
3d10: 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67  ned 32-bit integ
3d20: 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64  er, return 0 and
3d30: 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75   leave *pValue u
3d40: 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74  nchanged..*/.int
3d50: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
3d60: 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69  teger(Expr *p, i
3d70: 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73  nt *pValue){.  s
3d80: 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a  witch( p->op ){.
3d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45      case TK_INTE
3da0: 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  GER: {.      if(
3db0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
3dc0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61  (p->token.z, pVa
3dd0: 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20  lue) ){.        
3de0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3df0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3e00: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
3e10: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
3e20: 20 63 6f 6e 73 74 20 75 38 20 2a 7a 20 3d 20 28   const u8 *z = (
3e30: 75 38 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  u8*)p->token.z;.
3e40: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d        int n = p-
3e50: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
3e60: 69 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d  if( n>0 && z[0]=
3e70: 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d  ='-' ){ z++; n--
3e80: 3b 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ; }.      while(
3e90: 20 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73   n>0 && *z && is
3ea0: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
3eb0: 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69  ; n--; }.      i
3ec0: 66 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74  f( n==0 && sqlit
3ed0: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f  e3GetInt32(p->to
3ee0: 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29  ken.z, pValue) )
3ef0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3f00: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
3f10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3f20: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
3f30: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
3f40: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
3f50: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
3f60: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
3f70: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
3f80: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
3f90: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3fa0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
3fb0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
3fc0: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
3fd0: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
3fe0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3ff0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
4000: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
4010: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
4020: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
4030: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
4040: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
4050: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
4060: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
4070: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
4080: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
4090: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
40a0: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
40b0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
40c0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
40d0: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
40e0: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
40f0: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
4100: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
4110: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
4120: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4130: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
4140: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
4150: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59   of the form X.Y
4160: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73  .Z or Y.Z or jus
4170: 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20  t Z, look up.** 
4180: 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65  that name in the
4190: 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74   set of source t
41a0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73  ables in pSrcLis
41b0: 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70  t and make the p
41c0: 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73  Expr .** express
41d0: 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62  ion node refer b
41e0: 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72  ack to that sour
41f0: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
4200: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
4210: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
4220: 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   pExpr:.**.**   
4230: 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20   pExpr->iDb     
4240: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e        Set the in
4250: 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  dex in db->aDb[]
4260: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
4270: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20   holding.**     
4280: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4290: 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a      the table..*
42a0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  *    pExpr->iTab
42b0: 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f  le        Set to
42c0: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
42d0: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
42e0: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20   obtained.**    
42f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4300: 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69       from pSrcLi
4310: 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  st..**    pExpr-
4320: 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53  >iColumn       S
4330: 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
4340: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
4350: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
4360: 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
4370: 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43       Set to TK_C
4380: 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78  OLUMN..**    pEx
4390: 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20  pr->pLeft       
43a0: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
43b0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
43c0: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20  is deleted.**   
43d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20   pExpr->pRight  
43e0: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
43f0: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
4400: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a   to is deleted..
4410: 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b  **.** The pDbTok
4420: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
4430: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
4440: 74 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20  the "X").  This 
4450: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20  value may be.** 
4460: 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61  NULL meaning tha
4470: 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65  t name is of the
4480: 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20   form Y.Z or Z. 
4490: 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64   Any available d
44a0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62  atabase.** can b
44b0: 65 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61  e used.  The pTa
44c0: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  bleToken is the 
44d0: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
44e0: 65 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68  e (the "Y").  Th
44f0: 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20  is.** value can 
4500: 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f  be NULL if pDbTo
4510: 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ken is also NULL
4520: 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65  .  If pTableToke
4530: 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20  n is NULL it.** 
4540: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
4550: 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  orm of the name 
4560: 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f  is Z and that co
4570: 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74  lumns from any t
4580: 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75  able.** can be u
4590: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
45a0: 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65  e name cannot be
45b0: 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69   resolved unambi
45c0: 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61  guously, leave a
45d0: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
45e0: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
45f0: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
4600: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f  .  Return zero o
4610: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
4620: 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e  atic int lookupN
4630: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4640: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
4650: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
4660: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  t */.  Token *pD
4670: 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e  bToken,     /* N
4680: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
4690: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
46a0: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
46b0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
46c0: 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20  Token,  /* Name 
46d0: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
46e0: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
46f0: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
4700: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a  pColumnToken, /*
4710: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
4720: 75 6d 6e 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  umn. */.  SrcLis
4730: 74 20 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 2f  t *pSrcList,   /
4740: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
4750: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
4760: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
4770: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
4780: 69 73 74 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20  ist,    /* List 
4790: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  of expressions u
47a0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22  sed to resolve "
47b0: 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  AS" */.  Expr *p
47c0: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
47d0: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
47e0: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
47f0: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
4800: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  n */.){.  char *
4810: 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  zDb = 0;       /
4820: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
4830: 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22  tabase.  The "X"
4840: 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63   in X.Y.Z */.  c
4850: 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
4860: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4870: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22  he table.  The "
4880: 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59  Y" in X.Y.Z or Y
4890: 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  .Z */.  char *zC
48a0: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
48b0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
48c0: 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a  mn.  The "Z" */.
48d0: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
48e0: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
48f0: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
4900: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
4910: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
4920: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
4930: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
4940: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  tTab = 0;      /
4950: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
4960: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
4970: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
4980: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
4990: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
49a0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
49b0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
49c0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
49d0: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
49e0: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
49f0: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
4a00: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4a10: 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  n(pDbToken);.  z
4a20: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
4a30: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
4a40: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
4a50: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
4a60: 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f  mToken(pColumnTo
4a70: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
4a80: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
4a90: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
4aa0: 31 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f  1;  /* Leak memo
4ab0: 72 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62  ry (zDb and zTab
4ac0: 29 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  ) if malloc fail
4ad0: 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
4ae0: 74 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45  t( zTab==0 || pE
4af0: 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45  List==0 );..  pE
4b00: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
4b10: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4b20: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
4b30: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4b40: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
4b50: 74 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d  tem = &pSrcList-
4b60: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
4b70: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
4b80: 70 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  pTab;.    Column
4b90: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28   *pCol;..    if(
4ba0: 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pTab==0 ) conti
4bb0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
4bc0: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
4bd0: 0a 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b  .    if( zTab ){
4be0: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
4bf0: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
4c00: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
4c10: 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  me = pItem->zAli
4c20: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
4c30: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
4c40: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
4c50: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
4c60: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
4c70: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
4c80: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
4c90: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61  .        if( zTa
4ca0: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  bName==0 || sqli
4cb0: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
4cc0: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
4cd0: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4ce0: 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20    if( zDb!=0 && 
4cf0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
4d00: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
4d10: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
4d20: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
4d30: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4d40: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4d50: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
4d60: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70  ab++) ){.      p
4d70: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4d80: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
4d90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
4da0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
4db0: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20   }.    for(j=0, 
4dc0: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
4dd0: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
4de0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
4df0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4e00: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
4e10: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
4e20: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
4e30: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4e40: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
4e50: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45  rsor;.        pE
4e60: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
4e70: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a  >iDb;.        /*
4e80: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
4e90: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
4ea0: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
4eb0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
4ec0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4ed0: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
4ee0: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
4ef0: 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  j;.        pExpr
4f00: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
4f10: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
4f20: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ity;.        pEx
4f30: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
4f40: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
4f50: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4f60: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4f70: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  }..  /* If we ha
4f80: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
4f90: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
4fa0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
4fb0: 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a  ** it is a new.*
4fc0: 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65   or old.* trigge
4fd0: 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  r argument refer
4fe0: 65 6e 63 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ence.  */.  if( 
4ff0: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
5000: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
5010: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
5020: 21 3d 30 20 29 7b 0a 20 20 20 20 54 72 69 67 67  !=0 ){.    Trigg
5030: 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65  erStack *pTrigge
5040: 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d  rStack = pParse-
5050: 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20  >trigStack;.    
5060: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
5070: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
5080: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
5090: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
50a0: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
50b0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
50c0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
50d0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
50e0: 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 61  >newIdx;.      a
50f0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
5100: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
5110: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
5120: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
5130: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
5140: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
5150: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
5160: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
5170: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
5180: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
5190: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
51a0: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
51b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
51c0: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
51d0: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
51e0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
51f0: 54 61 62 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Tab;.    }..    
5200: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
5210: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
5220: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
5230: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
5240: 20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69   .      pExpr->i
5250: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
5260: 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a        cntTab++;.
5270: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
5280: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   < pTab->nCol; j
5290: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
52a0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
52b0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
52c0: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
52d0: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  {.          cnt+
52e0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  +;.          pEx
52f0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
5300: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
5310: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
5320: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
5330: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
5340: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
5350: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
5360: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
5370: 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].pColl;.       
5380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
5390: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
53a0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
53b0: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
53c0: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
53d0: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
53e0: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
53f0: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
5400: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
5410: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20  Col) ){.    cnt 
5420: 3d 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  = 1;.    pExpr->
5430: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
5440: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
5450: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
5460: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f  NTEGER;.  }..  /
5470: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e  *.  ** If the in
5480: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
5490: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
54a0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
54b0: 20 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67   name Z.  ** mig
54c0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
54d0: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
54e0: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
54f0: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
5500: 6e 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65  n.  ** we are re
5510: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
5520: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5530: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
5540: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a  ng command:.  **
5550: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
5560: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
5570: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
5580: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
5590: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
55a0: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
55b0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
55c0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
55d0: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
55e0: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
55f0: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
5600: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
5610: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
5620: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
5630: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
5640: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
5650: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
5660: 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73  dy been.  ** res
5670: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
5680: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
5690: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
56a0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
56b0: 30 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29  0 && pEList!=0 )
56c0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
56d0: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
56e0: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
56f0: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
5700: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
5710: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
5720: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5730: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
5740: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5750: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
5760: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
5770: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
5780: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
5790: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
57a0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
57b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
57c0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
57d0: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
57e0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
57f0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
5800: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5810: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
5820: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
5830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5840: 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20  }.    } .  }..  
5850: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
5860: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
5870: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
5880: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
5890: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
58a0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
58b0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
58c0: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
58d0: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
58e0: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
58f0: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
5900: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
5910: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
5920: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
5930: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
5940: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
5950: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
5960: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
5970: 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69   pExpr..  */.  i
5980: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
5990: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
59a0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
59b0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
59c0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
59d0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
59e0: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
59f0: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
5a00: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
5a10: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
5a20: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
5a30: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
5a40: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
5a50: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
5a60: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
5a70: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
5a80: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
5a90: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
5aa0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
5ab0: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
5ac0: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
5ad0: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
5ae0: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
5af0: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
5b00: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
5b10: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
5b20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
5b30: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
5b40: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
5b50: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
5b60: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
5b70: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
5b80: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
5b90: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
5ba0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
5bb0: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
5bc0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
5bd0: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
5be0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
5bf0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
5c00: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
5c10: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
5c20: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71  Free(zCol);.  sq
5c30: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5c40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5c50: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
5c60: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
5c70: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
5c80: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
5c90: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
5ca0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
5cb0: 55 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  UMN;.  sqlite3Au
5cc0: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
5cd0: 45 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b  Expr, pSrcList);
5ce0: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31  .  return cnt!=1
5cf0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5d00: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
5d10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5d20: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
5d30: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
5d40: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
5d50: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
5d60: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
5d70: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
5d80: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
5d90: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
5da0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
5db0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
5dc0: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
5dd0: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
5de0: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
5df0: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
5e00: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
5e10: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
5e20: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5e30: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
5e40: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
5e50: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
5e60: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
5e70: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
5e80: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
5e90: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
5ea0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
5eb0: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
5ec0: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
5ed0: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
5ee0: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
5ef0: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
5f00: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
5f10: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
5f20: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
5f30: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
5f40: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
5f50: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
5f60: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
5f70: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
5f80: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
5f90: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
5fa0: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
5fb0: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
5fc0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63  .**.** We also c
5fd0: 68 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63  heck for instanc
5fe0: 65 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  es of the IN ope
5ff0: 72 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73  rator.  IN comes
6000: 20 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73   in two.** forms
6010: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
6020: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
6030: 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20  ist).** and.**  
6040: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
6050: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
6060: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f  .** The first fo
6070: 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rm is handled by
6080: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
6090: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  holding the list
60a0: 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76  .** of allowed v
60b0: 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f  alues.  The seco
60c0: 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74  nd form causes t
60d0: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e  he SELECT to gen
60e0: 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70  erate .** a temp
60f0: 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a  orary table..**.
6100: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6110: 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73  also looks for s
6120: 63 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68  calar SELECTs th
6130: 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61  at are part of a
6140: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
6150: 20 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79   If it finds any
6160: 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63  , it generates c
6170: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
6180: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
6190: 65 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20  elect.** into a 
61a0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
61b0: 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d  ** Unknown colum
61c0: 6e 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f  ns or tables pro
61d0: 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20  voke an error.  
61e0: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
61f0: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  urns.** the numb
6200: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
6210: 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20  n and leaves an 
6220: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
6230: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
6240: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6250: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a  ExprResolveIds(.
6260: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6270: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
6280: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6290: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
62a0: 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  t, /* List of ta
62b0: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73  bles used to res
62c0: 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  olve column name
62d0: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
62e0: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
62f0: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
6300: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
6310: 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20   "AS" */.  Expr 
6320: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a  *pExpr        /*
6330: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
6340: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
6350: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
6360: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6370: 7c 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  | pSrcList==0 ) 
6380: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
6390: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
63a0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
63b0: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
63c0: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e  t->a[i].iCursor>
63d0: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  =0 && pSrcList->
63e0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61  a[i].iCursor<pPa
63f0: 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d  rse->nTab );.  }
6400: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
6410: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
6420: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
6430: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
6440: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
6450: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
6460: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
6470: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
6480: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
6490: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
64a0: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
64b0: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
64c0: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
64d0: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
64e0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
64f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
6500: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
6510: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
6520: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
6530: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
6540: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
6550: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
6560: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
6570: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
6580: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
6590: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
65a0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
65b0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
65c0: 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65    if( lookupName
65d0: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
65e0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53  pExpr->token, pS
65f0: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
6600: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6610: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6620: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6630: 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f   .    }.  .    /
6640: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
6650: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
6660: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
6670: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
6680: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
6690: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
66a0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
66b0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
66c0: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
66d0: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
66e0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
66f0: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
6700: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52  Right;..      pR
6710: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6720: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
6730: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
6740: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
6750: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
6760: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
6770: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
6780: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
6790: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
67a0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
67b0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
67c0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
67d0: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
67e0: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
67f0: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
6800: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
6810: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
6820: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
6830: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
6840: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
6850: 20 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70        if( lookup
6860: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62  Name(pParse, pDb
6870: 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d  , pTable, pColum
6880: 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20  n, pSrcList, 0, 
6890: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
68a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
68b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
68c0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
68d0: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
68e0: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
68f0: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
6900: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6910: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79  arse);.      Key
6920: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
6930: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
6940: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6950: 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  of OP_OpenTemp i
6960: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
6970: 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20       if( v==0 ) 
6980: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6990: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
69a0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
69b0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
69c0: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
69d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
69e0: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
69f0: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
6a00: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
6a10: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
6a20: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
6a30: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
6a40: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
6a50: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
6a60: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
6a70: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
6a80: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
6a90: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d   same way. A tem
6aa0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20  porary table is 
6ab0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
6ac0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
6ad0: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
6ae0: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
6af0: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
6b00: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
6b10: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
6b20: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
6b30: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
6b40: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6b50: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
6b60: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
6b70: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
6b80: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
6b90: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
6ba0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
6bb0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
6bc0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
6bd0: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
6be0: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
6bf0: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
6c00: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
6c10: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
6c20: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
6c30: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
6c40: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
6c50: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
6c60: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
6c70: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
6c80: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
6c90: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
6ca0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
6cb0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
6cc0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
6cd0: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
6ce0: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
6cf0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6d00: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
6d10: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
6d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6d30: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
6d40: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6d50: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
6d60: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
6d70: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
6d80: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
6d90: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
6da0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6db0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
6dc0: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
6dd0: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
6de0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6df0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
6e00: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
6e10: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
6e20: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
6e30: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
6e40: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
6e50: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
6e60: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
6e70: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
6e80: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
6e90: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
6ea0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
6eb0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
6ec0: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
6ed0: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
6ee0: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
6ef0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
6f00: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
6f10: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
6f20: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
6f30: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
6f40: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
6f50: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
6f60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
6f70: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
6f80: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
6f90: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
6fa0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
6fb0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
6fc0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
6fd0: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
6fe0: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
6ff0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
7000: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
7010: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7020: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
7030: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
7040: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
7050: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7060: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
7070: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
7080: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
7090: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
70a0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
70b0: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
70c0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
70d0: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
70e0: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
70f0: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
7100: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
7110: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
7120: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
7130: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
7140: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
7150: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
7160: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
7170: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
7180: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
7190: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
71a0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
71b0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
71c0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
71d0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 63 6f  .        char co
71e0: 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20  nst *affStr;.   
71f0: 20 20 20 20 20 69 66 28 20 21 61 66 66 69 6e 69       if( !affini
7200: 74 79 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ty ){.          
7210: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
7220: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
7230: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7240: 20 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65   affStr = sqlite
7250: 33 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28  3AffinityString(
7260: 61 66 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20  affinity);.     
7270: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
7280: 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65  [0] = pExpr->pLe
7290: 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20  ft->pColl;..    
72a0: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f      /* Loop thro
72b0: 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73 73  ugh each express
72c0: 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74  ion in <exprlist
72d0: 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f  >. */.        fo
72e0: 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e  r(i=0; i<pExpr->
72f0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7300: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
7310: 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d  pr *pE2 = pExpr-
7320: 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  >pList->a[i].pEx
7330: 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f  pr;..          /
7340: 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68 65  * Check that the
7350: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
7360: 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c 69  onstant and vali
7370: 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  d. */.          
7380: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
7390: 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20  IsConstant(pE2) 
73a0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
73b0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
73c0: 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20  Parse,.         
73d0: 20 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64       "right-hand
73e0: 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72   side of IN oper
73f0: 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e  ator must be con
7400: 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20 20  stant");.       
7410: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7420: 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
7430: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
7440: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
7450: 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a  , pE2, 0, 0) ){.
7460: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
7470: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
7480: 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  }..          /* 
7490: 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78 70  Evaluate the exp
74a0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65  ression and inse
74b0: 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74  rt it into the t
74c0: 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20  emp table */.   
74d0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
74e0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
74f0: 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  E2);.          s
7500: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
7510: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20   OP_MakeRecord, 
7520: 31 2c 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33  1, 0, affStr, P3
7530: 5f 53 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20  _STATIC);.      
7540: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
7550: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
7560: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
7570: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
7580: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53  AddOp(v, OP_PutS
7590: 74 72 4b 65 79 2c 20 70 45 78 70 72 2d 3e 69 54  trKey, pExpr->iT
75a0: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
75b0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
75c0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
75d0: 6e 67 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28  ngeP3(v, addr, (
75e0: 76 6f 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c  void *)&keyInfo,
75f0: 20 50 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20   P3_KEYINFO);.. 
7600: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7610: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  }..    case TK_S
7620: 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f  ELECT: {.      /
7630: 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20 62 65  * This has to be
7640: 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54   a scalar SELECT
7650: 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  .  Generate code
7660: 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20   to put the.    
7670: 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68    ** value of th
7680: 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d  is select in a m
7690: 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72  emory cell and r
76a0: 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72  ecord the number
76b0: 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65  .      ** of the
76c0: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20   memory cell in 
76d0: 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a  iColumn..      *
76e0: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
76f0: 43 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d  Column = pParse-
7700: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69  >nMem++;.      i
7710: 66 28 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28  f(sqlite3Select(
7720: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
7730: 53 65 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c  Select, SRT_Mem,
7740: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30  pExpr->iColumn,0
7750: 2c 30 2c 30 2c 30 29 29 7b 0a 20 20 20 20 20 20  ,0,0,0)){.      
7760: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7770: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
7780: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46  .    }..    /* F
7790: 6f 72 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73  or all else, jus
77a0: 74 20 72 65 63 75 72 73 69 76 65 6c 79 20 77 61  t recursively wa
77b0: 6c 6b 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20  lk the tree */. 
77c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
77d0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
77e0: 4c 65 66 74 0a 20 20 20 20 20 20 26 26 20 73 71  Left.      && sq
77f0: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
7800: 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72 63  Ids(pParse, pSrc
7810: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
7820: 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20  xpr->pLeft) ){. 
7830: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7840: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
7850: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
7860: 20 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74   .      && sqlit
7870: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
7880: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
7890: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
78a0: 2d 3e 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20  ->pRight) ){.   
78b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
78c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
78d0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
78e0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
78f0: 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74          ExprList
7900: 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d   *pList = pExpr-
7910: 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  >pList;.        
7920: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74  for(i=0; i<pList
7930: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
7940: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7950: 41 72 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69  Arg = pList->a[i
7960: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
7970: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
7980: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61  prResolveIds(pPa
7990: 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70  rse, pSrcList, p
79a0: 45 4c 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a  EList, pArg) ){.
79b0: 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75              retu
79c0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20  rn 1;.          
79d0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
79e0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
79f0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
7a00: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f  ** pExpr is a no
7a10: 64 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  de that defines 
7a20: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f  a function of so
7a30: 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67  me kind.  It mig
7a40: 68 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61  ht.** be a synta
7a50: 63 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69  ctic function li
7a60: 6b 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72  ke "count(x)" or
7a70: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66   it might be a f
7a80: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  unction.** that 
7a90: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70  implements an op
7aa0: 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20  erator, like "a 
7ab0: 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a  LIKE b".  .**.**
7ac0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
7ad0: 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e  kes *pzName poin
7ae0: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  t to the name of
7af0: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e   the function an
7b00: 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f  d .** *pnName ho
7b10: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
7b20: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7b30: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
7b40: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7b50: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
7b60: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f  (Expr *pExpr, co
7b70: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d  nst char **pzNam
7b80: 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b  e, int *pnName){
7b90: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7ba0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7bb0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
7bc0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
7bd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
7be0: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7bf0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
7c00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c10: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
7c20: 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  IKE: {.      *pz
7c30: 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20  Name = "like";. 
7c40: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
7c50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7c60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7c70: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a  _GLOB: {.      *
7c80: 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b  pzName = "glob";
7c90: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
7ca0: 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   4;.      break;
7cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
7cc0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  lt: {.      *pzN
7cd0: 61 6d 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70  ame = "can't hap
7ce0: 70 65 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  pen";.      *pnN
7cf0: 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20  ame = 12;.      
7d00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
7d10: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20  .}../*.** Error 
7d20: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
7d30: 6f 6e 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73  ons in an expres
7d40: 73 69 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65  sion.  Make sure
7d50: 20 61 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e   all.** function
7d60: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
7d70: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
7d80: 6e 63 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65  nctions have the
7d90: 20 63 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62   correct.** numb
7da0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
7db0: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
7dc0: 20 6d 65 73 73 61 67 65 20 69 6e 20 70 50 61 72   message in pPar
7dd0: 73 65 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69  se->zErrMsg.** i
7de0: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
7df0: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
7e00: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
7e10: 73 2e 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41  s..**.** if pIsA
7e20: 67 67 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61  gg is not null a
7e30: 6e 64 20 74 68 69 73 20 65 78 70 72 65 73 73 69  nd this expressi
7e40: 6f 6e 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  on is an aggrega
7e50: 74 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28  te function.** (
7e60: 6c 69 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72  like count(*) or
7e70: 20 6d 61 78 28 76 61 6c 75 65 29 29 20 74 68 65   max(value)) the
7e80: 6e 20 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f  n write a 1 into
7e90: 20 2a 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74   *pIsAgg..*/.int
7ea0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
7eb0: 6b 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  k(Parse *pParse,
7ec0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
7ed0: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20  t allowAgg, int 
7ee0: 2a 70 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20  *pIsAgg){.  int 
7ef0: 6e 45 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20  nErr = 0;.  if( 
7f00: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
7f10: 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70  n 0;.  switch( p
7f20: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
7f30: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
7f40: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
7f50: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
7f60: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e  TION: {.      in
7f70: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
7f80: 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73  st ? pExpr->pLis
7f90: 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f  t->nExpr : 0;  /
7fa0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * Number of argu
7fb0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
7fc0: 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20  nt no_such_func 
7fd0: 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72  = 0;       /* Tr
7fe0: 75 65 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75  ue if no such fu
7ff0: 6e 63 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f  nction exists */
8000: 0a 20 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67  .      int wrong
8010: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20  _num_args = 0;  
8020: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72     /* True if wr
8030: 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  ong number of ar
8040: 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20  guments */.     
8050: 20 69 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b   int is_agg = 0;
8060: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
8070: 54 72 75 65 20 69 66 20 69 73 20 61 6e 20 61 67  True if is an ag
8080: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
8090: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
80a0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20  .      int nId; 
80b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
80c0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
80d0: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 66 75  characters in fu
80e0: 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20  nction name */. 
80f0: 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
8100: 2a 7a 49 64 3b 20 20 20 20 20 20 20 20 20 20 20  *zId;           
8110: 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e   /* The function
8120: 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20   name. */.      
8130: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
8140: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70       int enc = p
8150: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
8160: 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69  .      getFuncti
8170: 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a  onName(pExpr, &z
8180: 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20  Id, &nId);.     
8190: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
81a0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
81b0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
81c0: 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20  , n, enc, 0);.  
81d0: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
81e0: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66 20  ){.        pDef 
81f0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
8200: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
8210: 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20  , zId, nId, -1, 
8220: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  enc, 0);.       
8230: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
8240: 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63            no_suc
8250: 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20  h_func = 1;.    
8260: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8270: 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61       wrong_num_a
8280: 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  rgs = 1;.       
8290: 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a   }.      }else{.
82a0: 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d          is_agg =
82b0: 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b   pDef->xFunc==0;
82c0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
82d0: 66 28 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c  f( is_agg && !al
82e0: 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20  lowAgg ){.      
82f0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
8300: 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73  g(pParse, "misus
8310: 65 20 6f 66 20 61 67 67 72 65 67 61 74 65 20 66  e of aggregate f
8320: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
8330: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
8340: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
8350: 20 20 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a      is_agg = 0;.
8360: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
8370: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a  no_such_func ){.
8380: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
8390: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
83a0: 22 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f  "no such functio
83b0: 6e 3a 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a  n: %.*s", nId, z
83c0: 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72  Id);.        nEr
83d0: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
83e0: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
83f0: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8400: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8410: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
8420: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8430: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
8440: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
8450: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
8460: 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20        nErr++;.  
8470: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8480: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
8490: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
84a0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
84b0: 20 20 20 20 20 20 20 69 66 28 20 70 49 73 41 67         if( pIsAg
84c0: 67 20 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b  g ) *pIsAgg = 1;
84d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66  .      }.      f
84e0: 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20  or(i=0; nErr==0 
84f0: 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20  && i<n; i++){.  
8500: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
8510: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
8520: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
8530: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a  st->a[i].pExpr,.
8540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61                 a
8560: 6c 6c 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61  llowAgg && !is_a
8570: 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20  gg, pIsAgg);.   
8580: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49     }.      /* FI
8590: 58 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70  X ME:  Compute p
85a0: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62  Expr->affinity b
85b0: 61 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65  ased on the expe
85c0: 63 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20  cted return.    
85d0: 20 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65    ** type of the
85e0: 20 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20   function .     
85f0: 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 65   */.    }.    de
8600: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
8610: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
8620: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
8630: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  = sqlite3ExprChe
8640: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
8650: 2d 3e 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67  ->pLeft, allowAg
8660: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
8670: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45    }.      if( nE
8680: 72 72 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  rr==0 && pExpr->
8690: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20  pRight ){.      
86a0: 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33    nErr = sqlite3
86b0: 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65  ExprCheck(pParse
86c0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
86d0: 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67   allowAgg, pIsAg
86e0: 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  g);.      }.    
86f0: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
8700: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
8710: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
8720: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
8730: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
8740: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
8750: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
8760: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
8770: 20 20 20 20 20 20 45 78 70 72 20 2a 70 45 32 20        Expr *pE2 
8780: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
8790: 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[i].pExpr;.    
87a0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
87b0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
87c0: 61 72 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77  arse, pE2, allow
87d0: 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20  Agg, pIsAgg);.  
87e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
87f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8800: 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20   }.  }.  return 
8810: 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  nErr;.}../*.** C
8820: 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72 52  all sqlite3ExprR
8830: 65 73 6f 6c 76 65 49 64 73 28 29 20 66 6f 6c 6c  esolveIds() foll
8840: 6f 77 65 64 20 62 79 20 73 71 6c 69 74 65 33 45  owed by sqlite3E
8850: 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a  xprCheck()..**.*
8860: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
8870: 73 20 70 72 6f 76 69 64 65 64 20 61 73 20 61 20  s provided as a 
8880: 63 6f 6e 76 65 6e 69 65 6e 63 65 20 73 69 6e 63  convenience sinc
8890: 65 20 69 74 20 69 73 20 76 65 72 79 20 63 6f 6d  e it is very com
88a0: 6d 6f 6e 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 52  mon.** to call R
88b0: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
88c0: 43 68 65 63 6b 28 29 20 62 61 63 6b 20 74 6f 20  Check() back to 
88d0: 62 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  back..*/.int sql
88e0: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 41  ite3ExprResolveA
88f0: 6e 64 43 68 65 63 6b 28 0a 20 20 50 61 72 73 65  ndCheck(.  Parse
8900: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a   *pParse,     /*
8910: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
8920: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8930: 20 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a 20 4c   *pSrcList, /* L
8940: 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73  ist of tables us
8950: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f  ed to resolve co
8960: 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20  lumn names */.  
8970: 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74  ExprList *pEList
8980: 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78  ,  /* List of ex
8990: 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74  pressions used t
89a0: 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a  o resolve "AS" *
89b0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
89c0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
89d0: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
89e0: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 69 6e  nalyzed. */.  in
89f0: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 20 20 20 20  t allowAgg,     
8a00: 20 2f 2a 20 54 72 75 65 20 74 6f 20 61 6c 6c 6f   /* True to allo
8a10: 77 20 61 67 67 72 65 67 61 74 65 20 65 78 70 72  w aggregate expr
8a20: 65 73 73 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74  essions */.  int
8a30: 20 2a 70 49 73 41 67 67 20 20 20 20 20 20 20 20   *pIsAgg        
8a40: 2f 2a 20 53 65 74 20 74 6f 20 54 52 55 45 20 69  /* Set to TRUE i
8a50: 66 20 61 67 67 72 65 67 61 74 65 73 20 61 72 65  f aggregates are
8a60: 20 66 6f 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69   found */.){.  i
8a70: 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65  f( pExpr==0 ) re
8a80: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 73 71  turn 0;.  if( sq
8a90: 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65  lite3ExprResolve
8aa0: 49 64 73 28 70 50 61 72 73 65 2c 70 53 72 63 4c  Ids(pParse,pSrcL
8ab0: 69 73 74 2c 70 45 4c 69 73 74 2c 70 45 78 70 72  ist,pEList,pExpr
8ac0: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
8ad0: 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  1;.  }.  return 
8ae0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
8af0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20  (pParse, pExpr, 
8b00: 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67  allowAgg, pIsAgg
8b10: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
8b20: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
8b30: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
8b40: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
8b50: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
8b60: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74  t z[0..n-1] on t
8b70: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61  he stack..*/.sta
8b80: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
8b90: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f  eger(Vdbe *v, co
8ba0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
8bb0: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
8bc0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
8bd0: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
8be0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8bf0: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
8c00: 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , i, 0);.  }else
8c10: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
8c20: 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20  In64Bits(z) ){. 
8c30: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
8c40: 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  3(v, OP_Integer,
8c50: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
8c60: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
8c70: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
8c80: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e  Real, 0, 0, z, n
8c90: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
8ca0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
8cb0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
8cc0: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
8cd0: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
8ce0: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
8cf0: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20  e the result on 
8d00: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
8d10: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8d20: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
8d30: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
8d40: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
8d50: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8d60: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
8d70: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
8d80: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
8d90: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
8da0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
8db0: 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f  PLUS:     op = O
8dc0: 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61  P_Add;      brea
8dd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
8de0: 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50  INUS:    op = OP
8df0: 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b  _Subtract; break
8e00: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
8e10: 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  AR:     op = OP_
8e20: 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b  Multiply; break;
8e30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
8e40: 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44  SH:    op = OP_D
8e50: 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a  ivide;   break;.
8e60: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
8e70: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e        op = OP_An
8e80: 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  d;      break;. 
8e90: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
8ea0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b       op = OP_Or;
8eb0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8ec0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
8ed0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
8ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8ef0: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
8f00: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
8f10: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f20: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
8f30: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
8f40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8f50: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
8f60: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
8f70: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8f80: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20  se TK_NE:       
8f90: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
8fa0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8fb0: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f  e TK_EQ:       o
8fc0: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
8fd0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8fe0: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70   TK_ISNULL:   op
8ff0: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
9000: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9010: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20  TK_NOTNULL:  op 
9020: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
9030: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9040: 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d  K_NOT:      op =
9050: 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72   OP_Not;      br
9060: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
9070: 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20  _UMINUS:   op = 
9080: 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65  OP_Negative; bre
9090: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
90a0: 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f  BITAND:   op = O
90b0: 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61  P_BitAnd;   brea
90c0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
90d0: 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50  ITOR:    op = OP
90e0: 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b  _BitOr;    break
90f0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
9100: 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TNOT:   op = OP_
9110: 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b  BitNot;   break;
9120: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
9130: 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53  IFT:   op = OP_S
9140: 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b  hiftLeft;  break
9150: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
9160: 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  HIFT:   op = OP_
9170: 53 68 69 66 74 52 69 67 68 74 3b 20 62 72 65 61  ShiftRight; brea
9180: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
9190: 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  EM:      op = OP
91a0: 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65  _Remainder;  bre
91b0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
91c0: 46 4c 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20 4f  FLOAT:    op = O
91d0: 50 5f 52 65 61 6c 3b 20 20 20 20 20 20 20 62 72  P_Real;       br
91e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
91f0: 5f 53 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d 20  _STRING:   op = 
9200: 4f 50 5f 53 74 72 69 6e 67 38 3b 20 20 20 20 62  OP_String8;    b
9210: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
9220: 4b 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d  K_BLOB:     op =
9230: 20 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20 20 20   OP_HexBlob;    
9240: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9250: 54 4b 5f 43 4f 4e 43 41 54 3a 20 20 20 6f 70 20  TK_CONCAT:   op 
9260: 3d 20 4f 50 5f 43 6f 6e 63 61 74 3b 20 20 20 20  = OP_Concat;    
9270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
9280: 75 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72 65  ult: op = 0; bre
9290: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
92a0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
92b0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
92c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
92d0: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b  Parse->useAgg ){
92e0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
92f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9300: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
9310: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
9320: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
9330: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
9340: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9350: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
9360: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
9370: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
9380: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
9390: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
93a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
93b0: 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69  _Recno, pExpr->i
93c0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
93d0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
93e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
93f0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
9400: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
9410: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
9420: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
9430: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9440: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9450: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
9460: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
9470: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9480: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
9490: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
94a0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
94b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
94c0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
94d0: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
94e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
94f0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
9500: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
9510: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45  (v, op, 0, 0, pE
9520: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20  xpr->token.z+1, 
9530: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31  pExpr->token.n-1
9540: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9550: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
9560: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
9570: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
9580: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
9590: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
95a0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
95b0: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
95c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
95d0: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
95e0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
95f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9600: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
9610: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
9620: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9630: 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20 20 20  token.n>1 ){.   
9640: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9650: 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31 2c 20  ChangeP3(v, -1, 
9660: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
9670: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
9680: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
9690: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
96a0: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
96b0: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
96c0: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
96d0: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
96e0: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
96f0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
9700: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9710: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9720: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9730: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9740: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9750: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
9760: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
9770: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9780: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
9790: 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  op, 0, 0);.     
97a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
97b0: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
97c0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
97d0: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
97e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
97f0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
9800: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
9810: 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
9820: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
9830: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
9840: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
9850: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
9860: 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IFT:.    case TK
9870: 5f 52 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61  _RSHIFT: .    ca
9880: 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a  se TK_CONCAT: {.
9890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
98a0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
98b0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
98c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
98d0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
98e0: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
98f0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9900: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
9910: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9920: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
9930: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
9940: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
9950: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9960: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
9970: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
9980: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
9990: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
99a0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
99b0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
99c0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
99d0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
99e0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
99f0: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
9a00: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
9a10: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
9a20: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9a30: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
9a40: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
9a50: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
9a60: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
9a70: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
9a80: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9a90: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
9aa0: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
9ab0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9ac0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
9ad0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9ae0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
9af0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
9b00: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
9b10: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9b20: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
9b30: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
9b40: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9b50: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9b60: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
9b70: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9b80: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
9b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9ba0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
9bb0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
9bc0: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
9bd0: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
9be0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9bf0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9c00: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
9c10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9c20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9c30: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
9c40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
9c50: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
9c60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9c70: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
9c80: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
9c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9ca0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
9cb0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
9cc0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9cd0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9ce0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9cf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d00: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
9d10: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
9d20: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9d30: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
9d40: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
9d50: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
9d60: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
9d70: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9d80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
9d90: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
9da0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
9db0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
9dc0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
9dd0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
9de0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9df0: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  zId;.      int p
9e00: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  2 = 0;.      int
9e10: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
9e20: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
9e30: 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  nc;.      CollSe
9e40: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
9e50: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
9e60: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
9e70: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
9e80: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
9e90: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
9ea0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
9eb0: 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
9ec0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
9ed0: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
9ee0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9ef0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
9f00: 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
9f10: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9f20: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
9f30: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9f40: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9f50: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
9f60: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9f70: 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c        p2 |= (1<<
9f80: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
9f90: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
9fa0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21  needCollSeq && !
9fb0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
9fc0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9fd0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9fe0: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
9ff0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
a000: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
a010: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
a020: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
a030: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
a040: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
a050: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
a060: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
a070: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
a080: 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
a090: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
a0a0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
a0b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a0c0: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
a0d0: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20  ion, nExpr, p2, 
a0e0: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
a0f0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
a100: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a110: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
a120: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
a130: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a140: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
a150: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
a160: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a170: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
a180: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
a190: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  ;.      char con
a1a0: 73 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20  st *affStr;..   
a1b0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
a1c0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
a1d0: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
a1e0: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
a1f0: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
a200: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a210: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
a220: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
a230: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
a240: 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66  r.      ** P3 of
a250: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
a260: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a270: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
a280: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63 6f  ffinityString(co
a290: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
a2a0: 28 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  (pExpr));..     
a2b0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a2c0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a2d0: 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   1, 0);..      /
a2e0: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
a2f0: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
a300: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
a310: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
a320: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
a330: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
a340: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
a350: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
a360: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
a370: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a380: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
a390: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a3a0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a3b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a3c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a3d0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a3e0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
a3f0: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
a400: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
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 50 6f 70  eAddOp(v, OP_Pop
a430: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
a440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a450: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a460: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a470: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a480: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
a490: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
a4a0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a4b0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
a4c0: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41  , affStr, P3_STA
a4d0: 54 49 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20  TIC); /* addr + 
a4e0: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
a4f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a500: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
a510: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
a520: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a530: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
a540: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
a550: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a560: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
a570: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a580: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
a590: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
a5a0: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
a5b0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
a5c0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a5d0: 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
a5e0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b  pExpr->pList->a;
a5f0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
a600: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
a610: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
a620: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a630: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
a640: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a650: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
a660: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a670: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a680: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
a690: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
a6a0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
a6b0: 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29  ht, OP_Ge, 0, 0)
a6c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a6d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
a6e0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
a6f0: 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
a700: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
a710: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
a720: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a730: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
a740: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
a750: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
a760: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
a770: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a780: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a790: 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b  , OP_And, 0, 0);
a7a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a7b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a7c0: 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  UPLUS:.    case 
a7d0: 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
a7e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a7f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a800: 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
a810: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a820: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
a830: 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f     int expr_end_
a840: 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  label;.      int
a850: 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20   jumpInst;.     
a860: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
a870: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
a880: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
a890: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
a8a0: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
a8b0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
a8c0: 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61  stelem;..      a
a8d0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
a8e0: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
a8f0: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
a900: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
a910: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a920: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
a930: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
a940: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
a950: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
a960: 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
a970: 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
a980: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
a990: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
a9a0: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
a9b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a9c0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
a9d0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
a9e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a9f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
aa00: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
aa10: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
aa20: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
aa30: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aa40: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
aa50: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
aa60: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
aa70: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
aa80: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
aa90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aaa0: 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a   OP_Dup, 1, 1);.
aab0: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
aac0: 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
aad0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
aae0: 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
aaf0: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
ab00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
ab20: 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
ab30: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab40: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
ab50: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
ab60: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
ab70: 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74  jumpInst = sqlit
ab80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
ab90: 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a  P_IfNot, 1, 0);.
aba0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
abb0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
abc0: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
abd0: 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b  lem[i+1].pExpr);
abe0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
abf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ac00: 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e  Goto, 0, expr_en
ac10: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
ac20: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
ac30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
ac40: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
ac50: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
ac60: 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64  v, jumpInst, add
ac70: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
ac80: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
ac90: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
aca0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
acb0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
acc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
acd0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
ace0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
acf0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
ad00: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
ad10: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
ad20: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
ad30: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ad40: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
ad50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
ad60: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
ad70: 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
ad80: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
ad90: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ada0: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
adb0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
adc0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
add0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ade0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
adf0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
ae00: 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
ae10: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
ae20: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
ae30: 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
ae40: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
ae50: 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b 0a  Err++;..return;.
ae60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
ae70: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
ae80: 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20   == OE_Rollback 
ae90: 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f  ||..  pExpr->iCo
aea0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
aeb0: 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43   ||..  pExpr->iC
aec0: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c  olumn == OE_Fail
aed0: 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 33 56 64   ){..  sqlite3Vd
aee0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
aef0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
af00: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
af10: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
af20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
af40: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
af50: 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ..  sqlite3VdbeD
af60: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
af70: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
af80: 09 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
af90: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
afa0: 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c  Ignore );..  sql
afb0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
afc0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
afd0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
afe0: 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20  noreJump,.      
aff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b000: 20 20 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75       "(IGNORE ju
b010: 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  mp)", 0);.      
b020: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
b030: 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
b040: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
b050: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
b060: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
b070: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
b080: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
b090: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
b0a0: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ack..**.** Retur
b0b0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
b0c0: 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20  elements pushed 
b0d0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
b0e0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
b0f0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
b100: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
b110: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
b120: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
b130: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
b140: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
b150: 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
b160: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ed */.){.  struc
b170: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
b180: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
b190: 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   n;.  Vdbe *v;. 
b1a0: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
b1b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20  return 0;.  v = 
b1c0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
b1d0: 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c  Parse);.  n = pL
b1e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
b1f0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
b200: 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
b210: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
b220: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b230: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
b240: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
b250: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
b260: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
b270: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
b280: 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
b290: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
b2a0: 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
b2b0: 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
b2c0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
b2d0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
b2e0: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
b2f0: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
b300: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
b310: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
b320: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
b330: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
b340: 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
b350: 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
b360: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
b370: 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
b380: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
b390: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
b3a0: 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
b3b0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
b3c0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
b3d0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
b3e0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
b3f0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
b400: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
b410: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
b420: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
b430: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
b440: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
b450: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
b460: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
b470: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
b480: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65        op = OP_Le
b490: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b4a0: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
b4b0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b       op = OP_Gt;
b4c0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b4d0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
b4e0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20      op = OP_Ge; 
b4f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b500: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
b510: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20     op = OP_Ne;  
b520: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b530: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
b540: 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20    op = OP_Eq;   
b550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b560: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
b570: 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b   op = OP_IsNull;
b580: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b590: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20  se TK_NOTNULL:  
b5a0: 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b  op = OP_NotNull;
b5b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
b5c0: 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20  ault:  break;.  
b5d0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
b5e0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b5f0: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
b600: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
b610: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b620: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b630: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
b640: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b650: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
b660: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
b670: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
b680: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
b690: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
b6a0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
b6b0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b6c0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
b6d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b6e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
b6f0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b700: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
b710: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
b720: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
b730: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b740: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
b750: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
b760: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
b770: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
b780: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b790: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
b7a0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
b7b0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
b7c0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
b7d0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b7e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b7f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
b800: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
b810: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
b820: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
b830: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
b840: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
b850: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b860: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b870: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b880: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b890: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b8a0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
b8b0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
b8c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b8d0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
b8e0: 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
b8f0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
b900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b910: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
b920: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
b930: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
b940: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b950: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b960: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
b970: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b980: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
b990: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b9a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
b9b0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
b9c0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b9d0: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
b9e0: 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   z" is implement
b9f0: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
ba00: 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
ba10: 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20   < y) GOTO 3.   
ba20: 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d     ** 2 IF (x <=
ba30: 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a   z) GOTO <dest>.
ba40: 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20        ** 3 .... 
ba50: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ba60: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
ba70: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
ba80: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
ba90: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
baa0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
bab0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
bac0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bad0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
bae0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
baf0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
bb00: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
bb10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
bb20: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
bb30: 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65       addr = code
bb40: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
bb50: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
bb60: 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66  P_Lt, 0, !jumpIf
bb70: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52  Null);..      pR
bb80: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
bb90: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
bba0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bbb0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
bbc0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
bbd0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
bbe0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
bbf0: 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75   OP_Le, dest, ju
bc00: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
bc10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bc20: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
bc30: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
bc40: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
bc50: 50 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69  P2(v, addr, sqli
bc60: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
bc70: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 73 71  dr(v));.      sq
bc80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
bc90: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
bca0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bcb0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
bcc0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
bcd0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bce0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
bcf0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
bd00: 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66  v, OP_If, jumpIf
bd10: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
bd20: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
bd30: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
bd40: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
bd50: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
bd60: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
bd70: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
bd80: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
bd90: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
bda0: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
bdb0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
bdc0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
bdd0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
bde0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
bdf0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
be00: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
be10: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
be20: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
be30: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
be40: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
be50: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
be60: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
be70: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
be80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
be90: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
bea0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
beb0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
bec0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
bed0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
bee0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
bef0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
bf00: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
bf10: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
bf20: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bf30: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bf40: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
bf50: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
bf60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
bf70: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
bf80: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
bf90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
bfa0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
bfb0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
bfc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
bfd0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
bfe0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
bff0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
c000: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
c010: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
c020: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
c030: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
c040: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
c050: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
c060: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
c070: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
c080: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
c090: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
c0a0: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
c0b0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
c0c0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
c0d0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
c0e0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
c0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c100: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
c110: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
c120: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
c130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c140: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
c150: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
c160: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
c170: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
c180: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c190: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
c1a0: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
c1b0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
c1c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c1d0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
c1e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
c1f0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
c200: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c210: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
c220: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
c230: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
c240: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
c250: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
c260: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
c270: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c280: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
c290: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c2a0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
c2b0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
c2c0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
c2d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c2e0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c2f0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
c300: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
c310: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
c320: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
c330: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
c340: 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
c350: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
c360: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
c370: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c380: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c390: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
c3a0: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
c3b0: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
c3c0: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
c3d0: 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
c3e0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
c3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c400: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
c410: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
c420: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
c430: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c440: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c450: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c470: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
c480: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c490: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c4a0: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
c4b0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c4c0: 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45  ion is "x BETWEE
c4d0: 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69  N y AND z". It i
c4e0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
c4f0: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
c500: 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79   ** 1 IF (x >= y
c510: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
c520: 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a  * 2 GOTO <dest>.
c530: 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78        ** 3 IF (x
c540: 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74   > z) GOTO <dest
c550: 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  >.      */.     
c560: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c570: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
c580: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
c590: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
c5a0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
c5b0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
c5c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c5d0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
c5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c5f0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
c600: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
c610: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c620: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
c630: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
c640: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c650: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
c660: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c670: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
c680: 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33  t, OP_Ge, addr+3
c690: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
c6a0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c6b0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c6c0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
c6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c6e0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
c6f0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
c700: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
c710: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c720: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c730: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
c740: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
c750: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
c760: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
c770: 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Gt, dest, jum
c780: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
c790: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c7a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c7b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c7c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
c7d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c7e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c7f0: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
c800: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
c810: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
c830: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
c840: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
c850: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
c860: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
c870: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
c880: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
c890: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
c8a0: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
c8b0: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
c8c0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
c8d0: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
c8e0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c8f0: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
c900: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
c910: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
c920: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c930: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
c940: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
c950: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
c960: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
c970: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
c980: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
c990: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
c9a0: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
c9b0: 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
c9c0: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
c9d0: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
c9e0: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
c9f0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
ca00: 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
ca10: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
ca20: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
ca30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
ca40: 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
ca50: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
ca60: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
ca70: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
ca80: 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
ca90: 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
caa0: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
cab0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
cac0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cad0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
cae0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
caf0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
cb00: 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
cb10: 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
cb20: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
cb30: 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
cb40: 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
cb50: 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
cb60: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
cb70: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
cb80: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
cb90: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
cba0: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
cbb0: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
cbc0: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
cbd0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
cbe0: 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  3StrNICmp(pA->to
cbf0: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
cc00: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pB->token.n)
cc10: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
cc20: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
cc30: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
cc40: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
cc50: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
cc60: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
cc70: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n its index..*/.
cc80: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
cc90: 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a  dAggInfo(Parse *
cca0: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28  pParse){.  if( (
ccb0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30  pParse->nAgg & 0
ccc0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  x7)==0 ){.    in
ccd0: 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e  t amt = pParse->
cce0: 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67  nAgg + 8;.    Ag
ccf0: 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71  gExpr *aAgg = sq
cd00: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72  liteRealloc(pPar
cd10: 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69  se->aAgg, amt*si
cd20: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
cd30: 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  g[0]));.    if( 
cd40: 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aAgg==0 ){.     
cd50: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
cd60: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  }.    pParse->aA
cd70: 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20  gg = aAgg;.  }. 
cd80: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
cd90: 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41  >aAgg[pParse->nA
cda0: 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  gg], 0, sizeof(p
cdb0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
cdc0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
cdd0: 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a  e->nAgg++;.}../*
cde0: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
cdf0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
ce00: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
ce10: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ce20: 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
ce30: 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
ce40: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
ce50: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
ce60: 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
ce70: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
ce80: 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
ce90: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
cea0: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
ceb0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cec0: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
ced0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
cee0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
cef0: 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
cf00: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52   by sqlite3ExprR
cf10: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
cf20: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
cf30: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
cf40: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
cf50: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
cf60: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
cf70: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
cf80: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
cf90: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
cfa0: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
cfb0: 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70  regates(Parse *p
cfc0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
cfd0: 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
cfe0: 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20  AggExpr *aAgg;. 
cff0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
d000: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
d010: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
d020: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
d030: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
d040: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  LUMN: {.      aA
d050: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
d060: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
d070: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
d080: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d090: 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67  if( aAgg[i].isAg
d0a0: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
d0b0: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
d0c0: 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ].pExpr->iTable=
d0d0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20  =pExpr->iTable. 
d0e0: 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b          && aAgg[
d0f0: 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
d100: 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
d110: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
d120: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
d130: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d140: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
d150: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
d160: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
d170: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d180: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
d190: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
d1a0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
d1b0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
d1c0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
d1d0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
d1e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
d1f0: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
d200: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d210: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
d220: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
d230: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
d240: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
d250: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
d260: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
d270: 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d      if( !aAgg[i]
d280: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
d290: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
d2a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
d2b0: 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
d2c0: 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
d2d0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d2e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d2f0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
d300: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
d310: 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
d320: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
d330: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
d340: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
d350: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
d360: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
d370: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
d380: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
d390: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
d3a0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
d3b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
d3c0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
d3d0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
d3e0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
d3f0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
d400: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
d410: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
d420: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d430: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
d440: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d450: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
d460: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d470: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
d480: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d490: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
d4a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
d4b0: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d4c0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
d4d0: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d4e0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d4f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d500: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d510: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
d520: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d530: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
d540: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
d550: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
d560: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d570: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d580: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
d590: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
d5a0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
d5b0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d5c0: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
d5d0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d5e0: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
d5f0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
d600: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
d610: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
d620: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
d630: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
d640: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d650: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d660: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d670: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
d680: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
d690: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
d6a0: 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20  n given a name, 
d6b0: 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  a number of argu
d6c0: 6d 65 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67  ments and a flag
d6d0: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77  .** indicating w
d6e0: 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
d6f0: 69 6f 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d  ion prefers UTF-
d700: 31 36 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20  16 over UTF-8.  
d710: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
d720: 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
d730: 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
d740: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 20 66  t defines that f
d750: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
d760: 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68  rn.** NULL if th
d770: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
d780: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
d790: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
d7a0: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
d7b0: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
d7c0: 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a  (blank) FuncDef.
d7d0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
d7e0: 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65  created and like
d7f0: 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20  d into the "db" 
d800: 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a  structure if a.*
d810: 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75  * no matching fu
d820: 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  nction previousl
d830: 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e  y existed.  When
d840: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74   createFlag is t
d850: 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  rue.** and the n
d860: 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Arg parameter is
d870: 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61   -1, then only a
d880: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61   function that a
d890: 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75  ccepts.** any nu
d8a0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d8b0: 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  s will be return
d8c0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65  ed..**.** If cre
d8d0: 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65  ateFlag is false
d8e0: 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c   and nArg is -1,
d8f0: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
d900: 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f  valid.** functio
d910: 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72  n found is retur
d920: 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e  ned.  A function
d930: 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74   is valid if eit
d940: 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20  her xFunc.** or 
d950: 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  xStep is non-zer
d960: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  o..**.** If crea
d970: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c  teFlag is false,
d980: 20 74 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e   then a function
d990: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
d9a0: 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e  ed name and.** n
d9b0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d9c0: 74 73 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  ts may be return
d9d0: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 65  ed even if the e
d9e0: 54 65 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65  TextRep flag doe
d9f0: 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74  s not.** match t
da00: 68 61 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a  hat requested..*
da10: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
da20: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a  e3FindFunction(.
da30: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
da40: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
da50: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
da60: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
da70: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
da80: 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e  function.  Not n
da90: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a  ull-terminated *
daa0: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20  /.  int nName,  
dab0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dac0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
dad0: 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  n the name */.  
dae0: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
daf0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
db00: 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d  arguments.  -1 m
db10: 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20  eans any number 
db20: 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20  */.  u8 enc,    
db30: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65          /* Prefe
db40: 72 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69  rred text encodi
db50: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  ng */.  int crea
db60: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
db70: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
db80: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
db90: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
dba0: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
dbb0: 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Def *p;         
dbc0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
dbd0: 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  able */.  FuncDe
dbe0: 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a  f *pFirst;    /*
dbf0: 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   First function 
dc00: 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a  with this name *
dc10: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65  /.  FuncDef *pBe
dc20: 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20  st = 0; /* Best 
dc30: 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66  match found so f
dc40: 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  ar */.  int best
dc50: 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20  match = 0;  ... 
dc60: 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51   assert( enc==SQ
dc70: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
dc80: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
dc90: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
dca0: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
dcb0: 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20   nArg<-1 ) nArg 
dcc0: 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20  = -1;..  pFirst 
dcd0: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
dce0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
dcf0: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
dd00: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  Name);.  for(p=p
dd10: 46 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  First; p; p=p->p
dd20: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75  Next){.    /* Du
dd30: 72 69 6e 67 20 74 68 65 20 73 65 61 72 63 68 20  ring the search 
dd40: 66 6f 72 20 74 68 65 20 62 65 73 74 20 66 75 6e  for the best fun
dd50: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
dd60: 2c 20 62 65 73 74 6d 61 74 63 68 20 69 73 20 73  , bestmatch is s
dd70: 65 74 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c  et.    ** as fol
dd80: 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lows to indicate
dd90: 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
dda0: 74 68 65 20 6d 61 74 63 68 20 77 69 74 68 20 74  the match with t
ddb0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20  he definition.  
ddc0: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
ddd0: 62 79 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a  by pBest:.    **
dde0: 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74  .    ** 0: pBest
ddf0: 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74   is NULL. No mat
de00: 63 68 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e  ch has been foun
de10: 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76  d..    ** 1: A v
de20: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
de30: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
de40: 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77 68  prefers UTF-8 wh
de50: 65 6e 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20  en a UTF-16.    
de60: 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69  **    encoding i
de70: 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
de80: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
de90: 2a 2a 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 2: A variable
dea0: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
deb0: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 55 54  ion that uses UT
dec0: 46 2d 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d  F-16BE when UTF-
ded0: 31 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20  16LE is.    **  
dee0: 20 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20    requested, or 
def0: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
df00: 2a 2a 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 3: A variable
df10: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
df20: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61  ion using the sa
df30: 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  me text encoding
df40: 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75  ..    ** 4: A fu
df50: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
df60: 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  exact number of 
df70: 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73  arguments reques
df80: 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ted that.    ** 
df90: 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d 38     prefers UTF-8
dfa0: 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   when a UTF-16 e
dfb0: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65  ncoding is reque
dfc0: 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65  sted, or vice ve
dfd0: 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41  rsa..    ** 5: A
dfe0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
dff0: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20  he exact number 
e000: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71  of arguments req
e010: 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20  uested that.    
e020: 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54  **    prefers UT
e030: 46 2d 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d  F-16LE when UTF-
e040: 31 36 42 45 20 69 73 20 72 65 71 75 65 73 74 65  16BE is requeste
e050: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
e060: 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65  ..    ** 6: An e
e070: 78 61 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20  xact match..    
e080: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67  **.    ** A larg
e090: 65 72 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74  er value of 'mat
e0a0: 63 68 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65  chqual' indicate
e0b0: 73 20 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62  s a more desirab
e0c0: 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f  le match..    */
e0d0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  .    if( p->nArg
e0e0: 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d  ==-1 || p->nArg=
e0f0: 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d  =nArg || nArg==-
e100: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d  1 ){.      int m
e110: 61 74 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20  atch = 1;       
e120: 20 20 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66     /* Quality of
e130: 20 74 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20   this match */. 
e140: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67       if( p->nArg
e150: 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d  ==nArg || nArg==
e160: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  -1 ){.        ma
e170: 74 63 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d  tch = 4;.      }
e180: 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d  .      if( enc==
e190: 70 2d 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20  p->iPrefEnc ){. 
e1a0: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20         match += 
e1b0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
e1c0: 20 65 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d   else if( (enc==
e1d0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26  SQLITE_UTF16LE &
e1e0: 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53  & p->iPrefEnc==S
e1f0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c  QLITE_UTF16BE) |
e200: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e210: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
e220: 46 31 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65  F16BE && p->iPre
e230: 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
e240: 31 36 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  16LE) ){.       
e250: 20 6d 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20   match += 1;.   
e260: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e270: 6d 61 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20  match>bestmatch 
e280: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  ){.        pBest
e290: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65   = p;.        be
e2a0: 73 74 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b  stmatch = match;
e2b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e2c0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
e2d0: 63 72 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d  createFlag param
e2e0: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e  eter is true, an
e2f0: 64 20 74 68 65 20 73 65 61 63 68 20 64 69 64 20  d the seach did 
e300: 6e 6f 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20  not reveal an.  
e310: 2a 2a 20 65 78 61 63 74 20 6d 61 74 63 68 20 66  ** exact match f
e320: 6f 72 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d  or the name, num
e330: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
e340: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74   and encoding, t
e350: 68 65 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e  hen add a.  ** n
e360: 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  ew entry to the 
e370: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72  hash table and r
e380: 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20  eturn it..  */. 
e390: 20 69 66 28 20 63 72 65 61 74 65 46 6c 61 67 20   if( createFlag 
e3a0: 26 26 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26  && bestmatch<6 &
e3b0: 26 20 0a 20 20 20 20 20 20 28 70 42 65 73 74 20  & .      (pBest 
e3c0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
e3d0: 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e  izeof(*pBest)+nN
e3e0: 61 6d 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70  ame+1)) ){.    p
e3f0: 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72  Best->nArg = nAr
e400: 67 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e  g;.    pBest->pN
e410: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
e420: 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d    pBest->zName =
e430: 20 28 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31   (char*)&pBest[1
e440: 5d 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50  ];.    pBest->iP
e450: 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20  refEnc = enc;.  
e460: 20 20 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e    memcpy(pBest->
e470: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
e480: 61 6d 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d  ame);.    pBest-
e490: 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20  >zName[nName] = 
e4a0: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  0;.    sqlite3Ha
e4b0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46  shInsert(&db->aF
e4c0: 75 6e 63 2c 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  unc, pBest->zNam
e4d0: 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a  e, nName, (void*
e4e0: 29 70 42 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  )pBest);.  }..  
e4f0: 69 66 28 20 70 42 65 73 74 20 26 26 20 28 70 42  if( pBest && (pB
e500: 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42  est->xStep || pB
e510: 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72  est->xFunc || cr
e520: 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20  eateFlag) ){.   
e530: 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20   return pBest;. 
e540: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e550: 0a                                               .