/ Hex Artifact Content
Login

Artifact 0b8c89324d979895e6b0f31a6d7bf60edfee13ac:


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 33 20 32 30 30 34 2f 30 37 2f 32 36 20  .153 2004/07/26 
0220: 30 30 3a 33 31 3a 30 39 20 64 72 68 20 45 78 70  00:31:09 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 63 68 61 72 20 63 6f 6e 73 74 20 2a 73 71 6c  .char const *sql
0270: 69 74 65 33 41 66 66 69 6e 69 74 79 53 74 72 69  ite3AffinityStri
0280: 6e 67 28 63 68 61 72 20 61 66 66 69 6e 69 74 79  ng(char affinity
0290: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  ){.  switch( aff
02a0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 63 61 73  inity ){.    cas
02b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  e SQLITE_AFF_INT
02c0: 45 47 45 52 3a 20 72 65 74 75 72 6e 20 22 69 22  EGER: return "i"
02d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
02e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 72  E_AFF_NUMERIC: r
02f0: 65 74 75 72 6e 20 22 6e 22 3b 0a 20 20 20 20 63  eturn "n";.    c
0300: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
0310: 45 58 54 3a 20 20 20 20 72 65 74 75 72 6e 20 22  EXT:    return "
0320: 74 22 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  t";.    case SQL
0330: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20  ITE_AFF_NONE:   
0340: 20 72 65 74 75 72 6e 20 22 6f 22 3b 0a 20 20 20   return "o";.   
0350: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
0360: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 20  assert(0);.  }. 
0370: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a 2f   return 0;.}.../
0380: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
0390: 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20 74 68  'affinity' of th
03a0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78  e expression pEx
03b0: 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a  pr if any..**.**
03c0: 20 49 66 20 70 45 78 70 72 20 69 73 20 61 20 63   If pExpr is a c
03d0: 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72 65 6e  olumn, a referen
03e0: 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e 20 76  ce to a column v
03f0: 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69 61 73  ia an 'AS' alias
0400: 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d 73 65  ,.** or a sub-se
0410: 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f 6c 75  lect with a colu
0420: 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75 72 6e  mn as the return
0430: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
0440: 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20 6f 66   .** affinity of
0450: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69 73 20   that column is 
0460: 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65 72 77  returned. Otherw
0470: 69 73 65 2c 20 30 78 30 30 20 69 73 20 72 65 74  ise, 0x00 is ret
0480: 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69 63 61  urned,.** indica
0490: 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69 74 79  ting no affinity
04a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
04b0: 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20  ion..**.** i.e. 
04c0: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
04d0: 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20 69 6e   expresssions in
04e0: 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 73   the following s
04f0: 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a  tatements all.**
0500: 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e 69 74   have an affinit
0510: 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54 45 20  y:.**.** CREATE 
0520: 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a 2a 20  TABLE t1(a);.** 
0530: 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31  SELECT * FROM t1
0540: 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53 45 4c   WHERE a;.** SEL
0550: 45 43 54 20 61 20 41 53 20 62 20 46 52 4f 4d 20  ECT a AS b FROM 
0560: 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a 20 53  t1 WHERE b;.** S
0570: 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74 31 20  ELECT * FROM t1 
0580: 57 48 45 52 45 20 28 73 65 6c 65 63 74 20 61 20  WHERE (select a 
0590: 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63 68 61  from t1);.*/.cha
05a0: 72 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  r sqlite3ExprAff
05b0: 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78 70  inity(Expr *pExp
05c0: 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  r){.  if( pExpr-
05d0: 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a 20 20  >op==TK_AS ){.  
05e0: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
05f0: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0600: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 7d 0a  pr->pLeft);.  }.
0610: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
0620: 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a 20 20  =TK_SELECT ){.  
0630: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
0640: 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78  ExprAffinity(pEx
0650: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
0660: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
0670: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
0680: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 3b 0a  Expr->affinity;.
0690: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
06a0: 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f 6c 6c  the default coll
06b0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 66  ation sequence f
06c0: 6f 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  or the expressio
06d0: 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a 20 74  n pExpr. If.** t
06e0: 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66 61 75  here is no defau
06f0: 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74 79 70  lt collation typ
0700: 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a  e, return 0..*/.
0710: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
0720: 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61 72 73  ExprCollSeq(Pars
0730: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
0740: 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c 6c 53  *pExpr){.  CollS
0750: 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20  eq *pColl = 0;. 
0760: 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a 20 20   if( pExpr ){.  
0770: 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70 72 2d    pColl = pExpr-
0780: 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66 28 20  >pColl;.    if( 
0790: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53  pExpr->op==TK_AS
07a0: 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20   && !pColl ){.  
07b0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
07c0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
07d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
07e0: 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20  ft);.    }.  }. 
07f0: 20 69 66 28 20 73 71 6c 69 74 65 33 43 68 65 63   if( sqlite3Chec
0800: 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  kCollSeq(pParse,
0810: 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20 20 20   pColl) ){ .    
0820: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20  pColl = 0;.  }. 
0830: 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d   return pColl;.}
0840: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
0850: 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61 6e   the left operan
0860: 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73 6f  d of a compariso
0870: 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66 66  n operator.  aff
0880: 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70 65  2 is the.** type
0890: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 65   affinity of the
08a0: 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64 2e 20   right operand. 
08b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72 65   This routine re
08c0: 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70  turns the.** typ
08d0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
08e0: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66  should be used f
08f0: 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f  or the compariso
0900: 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63  n operator..*/.c
0910: 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  har sqlite3Compa
0920: 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72 20  reAffinity(Expr 
0930: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66 66  *pExpr, char aff
0940: 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31 20  2){.  char aff1 
0950: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0960: 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20  inity(pExpr);.  
0970: 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66 32  if( aff1 && aff2
0980: 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20   ){.    /* Both 
0990: 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f 6d  sides of the com
09a0: 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75  parison are colu
09b0: 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73 20  mns. If one has 
09c0: 6e 75 6d 65 72 69 63 20 6f 72 0a 20 20 20 20 2a  numeric or.    *
09d0: 2a 20 69 6e 74 65 67 65 72 20 61 66 66 69 6e 69  * integer affini
09e0: 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20 4f 74  ty, use that. Ot
09f0: 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f 20 61  herwise use no a
0a00: 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a  ffinity..    */.
0a10: 20 20 20 20 69 66 28 20 61 66 66 31 3d 3d 53 51      if( aff1==SQ
0a20: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0a30: 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c 49 54 45   || aff2==SQLITE
0a40: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29 7b 0a  _AFF_INTEGER ){.
0a50: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
0a60: 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b  ITE_AFF_INTEGER;
0a70: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 61  .    }else if( a
0a80: 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff1==SQLITE_AFF_
0a90: 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66 32 3d  NUMERIC || aff2=
0aa0: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
0ab0: 52 49 43 20 29 7b 0a 20 20 20 20 20 20 72 65 74  RIC ){.      ret
0ac0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0ad0: 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73  UMERIC;.    }els
0ae0: 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  e{.      return 
0af0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
0b00: 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69  .    }.  }else i
0b10: 66 28 20 21 61 66 66 31 20 26 26 20 21 61 66 66  f( !aff1 && !aff
0b20: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74  2 ){.    /* Neit
0b30: 68 65 72 20 73 69 64 65 20 6f 66 20 74 68 65 20  her side of the 
0b40: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20 61 20  comparison is a 
0b50: 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61 72 65  column.  Compare
0b60: 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65 73 75   the.    ** resu
0b70: 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a 20 20  lts directly..  
0b80: 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 72 65 74 75    */.    /* retu
0b90: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  rn SQLITE_AFF_NU
0ba0: 4d 45 52 49 43 3b 20 20 2f 2f 20 54 69 63 6b 65  MERIC;  // Ticke
0bb0: 74 20 23 38 30 35 20 2a 2f 0a 20 20 20 20 72 65  t #805 */.    re
0bc0: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0bd0: 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  NONE;.  }else{. 
0be0: 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65 20 69     /* One side i
0bf0: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 20  s a column, the 
0c00: 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20 55 73  other is not. Us
0c10: 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20 61 66  e the columns af
0c20: 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20 20 72  finity. */.    r
0c30: 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20 61 66  eturn (aff1 + af
0c40: 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  f2);.  }.}../*.*
0c50: 2a 20 70 45 78 70 72 20 69 73 20 61 20 63 6f 6d  * pExpr is a com
0c60: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
0c70: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 74 79  .  Return the ty
0c80: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
0c90: 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20 61 70   should.** be ap
0ca0: 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20 6f 70  plied to both op
0cb0: 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74 6f 20  erands prior to 
0cc0: 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70 61 72  doing the compar
0cd0: 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ison..*/.static 
0ce0: 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f 6e 41  char comparisonA
0cf0: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
0d00: 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61 66 66  xpr){.  char aff
0d10: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
0d20: 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20  r->op==TK_EQ || 
0d30: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
0d40: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0d50: 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20 20 20  K_LT ||.        
0d60: 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f    pExpr->op==TK_
0d70: 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GT || pExpr->op=
0d80: 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70 72 2d  =TK_GE || pExpr-
0d90: 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20  >op==TK_LE ||.  
0da0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
0db0: 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20 61 73  p==TK_NE );.  as
0dc0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
0dd0: 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20 73 71  ft );.  aff = sq
0de0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0df0: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
0e00: 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52  .  if( pExpr->pR
0e10: 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66 66 20  ight ){.    aff 
0e20: 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65  = sqlite3Compare
0e30: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0e40: 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a 20 20  pRight, aff);.  
0e50: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70 45 78  }.  else if( pEx
0e60: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
0e70: 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33     aff = sqlite3
0e80: 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28  CompareAffinity(
0e90: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e  pExpr->pSelect->
0ea0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
0eb0: 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  pr, aff);.  }.  
0ec0: 65 6c 73 65 20 69 66 28 20 21 61 66 66 20 29 7b  else if( !aff ){
0ed0: 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c 49 54  .    aff = SQLIT
0ee0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
0ef0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66 66 3b   }.  return aff;
0f00: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0f10: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
0f20: 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67 2e 20  expression, eg. 
0f30: 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e  '=', '<', IN(...
0f40: 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f 61 66  ) etc..** idx_af
0f50: 66 69 6e 69 74 79 20 69 73 20 74 68 65 20 61 66  finity is the af
0f60: 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69 6e 64  finity of an ind
0f70: 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52 65 74  exed column. Ret
0f80: 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66 20 74  urn true.** if t
0f90: 68 65 20 69 6e 64 65 78 20 77 69 74 68 20 61 66  he index with af
0fa0: 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66 69 6e  finity idx_affin
0fb0: 69 74 79 20 6d 61 79 20 62 65 20 75 73 65 64 20  ity may be used 
0fc0: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20  to implement.** 
0fd0: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0fe0: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20  n pExpr..*/.int 
0ff0: 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66 66 69  sqlite3IndexAffi
1000: 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70 45 78  nityOk(Expr *pEx
1010: 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61 66 66  pr, char idx_aff
1020: 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72 20 61  inity){.  char a
1030: 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f 6e 41  ff = comparisonA
1040: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
1050: 20 20 72 65 74 75 72 6e 20 0a 20 20 20 20 28 61    return .    (a
1060: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
1070: 4f 4e 45 29 20 7c 7c 0a 20 20 20 20 28 61 66 66  ONE) ||.    (aff
1080: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
1090: 45 52 49 43 20 26 26 20 69 64 78 5f 61 66 66 69  ERIC && idx_affi
10a0: 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46 46  nity==SQLITE_AFF
10b0: 5f 49 4e 54 45 47 45 52 29 20 7c 7c 0a 20 20 20  _INTEGER) ||.   
10c0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
10d0: 46 5f 49 4e 54 45 47 45 52 20 26 26 20 69 64 78  F_INTEGER && idx
10e0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
10f0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29 20 7c  E_AFF_NUMERIC) |
1100: 7c 0a 20 20 20 20 28 61 66 66 3d 3d 69 64 78 5f  |.    (aff==idx_
1110: 61 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a  affinity);.}../*
1120: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50  .** Return the P
1130: 31 20 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f  1 value that sho
1140: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
1150: 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69  a binary compari
1160: 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f  son.** opcode (O
1170: 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e  P_Eq, OP_Ge etc.
1180: 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72  ) used to compar
1190: 65 20 70 45 78 70 72 31 20 61 6e 64 20 70 45 78  e pExpr1 and pEx
11a0: 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d 70 49  pr2..** If jumpI
11b0: 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c 20 74  fNull is true, t
11c0: 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f 77 20  hen set the low 
11d0: 62 79 74 65 20 6f 66 20 74 68 65 20 72 65 74 75  byte of the retu
11e0: 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c 75 65  rned.** P1 value
11f0: 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f 70 63   to tell the opc
1200: 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66 20 65  ode to jump if e
1210: 69 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e  ither expression
1220: 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20 74 6f  .** evaluates to
1230: 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63   NULL..*/.static
1240: 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d 70 61   int binaryCompa
1250: 72 65 50 31 28 45 78 70 72 20 2a 70 45 78 70 72  reP1(Expr *pExpr
1260: 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72 32 2c  1, Expr *pExpr2,
1270: 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29   int jumpIfNull)
1280: 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d 20 73  {.  char aff = s
1290: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
12a0: 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20 72 65  ty(pExpr2);.  re
12b0: 74 75 72 6e 20 28 28 28 69 6e 74 29 73 71 6c 69  turn (((int)sqli
12c0: 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69  te3CompareAffini
12d0: 74 79 28 70 45 78 70 72 31 2c 20 61 66 66 29 29  ty(pExpr1, aff))
12e0: 3c 3c 38 29 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c  <<8)+(jumpIfNull
12f0: 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ?1:0);.}../*.** 
1300: 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  Return a pointer
1310: 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f   to the collatio
1320: 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61 74 20  n sequence that 
1330: 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 62  should be used b
1340: 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20 63 6f  y.** a binary co
1350: 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f  mparison operato
1360: 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c 65 66  r comparing pLef
1370: 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a 2a 2a  t and pRight..**
1380: 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66 74 20  .** If the left 
1390: 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 20  hand expression 
13a0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 20  has a collating 
13b0: 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c 20 74  sequence type, t
13c0: 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75 73 65  hen it is.** use
13d0: 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74 68 65  d. Otherwise the
13e0: 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65   collation seque
13f0: 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69 67 68  nce for the righ
1400: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1410: 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20 6f 72  n.** is used, or
1420: 20 74 68 65 20 64 65 66 61 75 6c 74 20 28 42 49   the default (BI
1430: 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68 65 72  NARY) if neither
1440: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1450: 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74  a collating.** t
1460: 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 43  ype..*/.static C
1470: 6f 6c 6c 53 65 71 2a 20 62 69 6e 61 72 79 43 6f  ollSeq* binaryCo
1480: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 50 61 72  mpareCollSeq(Par
1490: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
14a0: 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70   *pLeft, Expr *p
14b0: 52 69 67 68 74 29 7b 0a 20 20 43 6f 6c 6c 53 65  Right){.  CollSe
14c0: 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74  q *pColl = sqlit
14d0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
14e0: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
14f0: 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20  if( !pColl ){.  
1500: 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65    pColl = sqlite
1510: 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61  3ExprCollSeq(pPa
1520: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
1530: 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c  }.  return pColl
1540: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
1550: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63  ate code for a c
1560: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
1570: 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  or..*/.static in
1580: 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20  t codeCompare(. 
1590: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
15a0: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
15b0: 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  g (and code gene
15c0: 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20  rating) context 
15d0: 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74  */.  Expr *pLeft
15e0: 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65  ,      /* The le
15f0: 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ft operand */.  
1600: 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20  Expr *pRight,   
1610: 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f    /* The right o
1620: 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20  perand */.  int 
1630: 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a  opcode,       /*
1640: 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20   The comparison 
1650: 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20  opcode */.  int 
1660: 64 65 73 74 2c 20 20 20 20 20 20 20 20 20 2f 2a  dest,         /*
1670: 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 74 72   Jump here if tr
1680: 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20 6a 75  ue.  */.  int ju
1690: 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a 20 49  mpIfNull    /* I
16a0: 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69 66 20  f true, jump if 
16b0: 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64 20 69  either operand i
16c0: 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 69  s NULL */.){.  i
16d0: 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f  nt p1 = binaryCo
16e0: 6d 70 61 72 65 50 31 28 70 4c 65 66 74 2c 20 70  mpareP1(pLeft, p
16f0: 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c  Right, jumpIfNul
1700: 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  l);.  CollSeq *p
1710: 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  3 = binaryCompar
1720: 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  eCollSeq(pParse,
1730: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b   pLeft, pRight);
1740: 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65  .  return sqlite
1750: 33 56 64 62 65 4f 70 33 28 70 50 61 72 73 65 2d  3VdbeOp3(pParse-
1760: 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65 2c 20  >pVdbe, opcode, 
1770: 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 20  p1, dest, (void 
1780: 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  *)p3, P3_COLLSEQ
1790: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73  );.}../*.** Cons
17a0: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
17b0: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64 20  ession node and 
17c0: 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65 72  return a pointer
17d0: 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79 0a   to it.  Memory.
17e0: 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64 65  ** for this node
17f0: 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72 6f   is obtained fro
1800: 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 29  m sqliteMalloc()
1810: 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20 66  .  The calling f
1820: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72 65  unction.** is re
1830: 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d 61  sponsible for ma
1840: 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e 6f  king sure the no
1850: 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67 65  de eventually ge
1860: 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78 70  ts freed..*/.Exp
1870: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28 69  r *sqlite3Expr(i
1880: 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c 65  nt op, Expr *pLe
1890: 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68 74  ft, Expr *pRight
18a0: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
18b0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
18c0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
18d0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
18e0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
18f0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57  w==0 ){.    /* W
1900: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
1910: 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72 79  , we leak memory
1920: 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64 20   from pLeft and 
1930: 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72 65  pRight */.    re
1940: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e  turn 0;.  }.  pN
1950: 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20 70  ew->op = op;.  p
1960: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c 65  New->pLeft = pLe
1970: 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67  ft;.  pNew->pRig
1980: 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20 69  ht = pRight;.  i
1990: 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  f( pToken ){.   
19a0: 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d   assert( pToken-
19b0: 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70  >dyn==0 );.    p
19c0: 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54  New->token = *pT
19d0: 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  oken;.    pNew->
19e0: 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  span = *pToken;.
19f0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73    }else{.    ass
1a00: 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  ert( pNew->token
1a10: 2e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 61  .dyn==0 );.    a
1a20: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
1a30: 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 20 20 61  en.z==0 );.    a
1a40: 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b  ssert( pNew->tok
1a50: 65 6e 2e 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 69  en.n==0 );.    i
1a60: 66 28 20 70 4c 65 66 74 20 26 26 20 70 52 69 67  f( pLeft && pRig
1a70: 68 74 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ht ){.      sqli
1a80: 74 65 33 45 78 70 72 53 70 61 6e 28 70 4e 65 77  te3ExprSpan(pNew
1a90: 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61 6e 2c 20  , &pLeft->span, 
1aa0: 26 70 52 69 67 68 74 2d 3e 73 70 61 6e 29 3b 0a  &pRight->span);.
1ab0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
1ac0: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
1ad0: 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 7d  ew->token;.    }
1ae0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
1af0: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74  ew;.}../*.** Set
1b00: 20 74 68 65 20 45 78 70 72 2e 73 70 61 6e 20 66   the Expr.span f
1b10: 69 65 6c 64 20 6f 66 20 74 68 65 20 67 69 76 65  ield of the give
1b20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  n expression to 
1b30: 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74 65 78 74  span all.** text
1b40: 20 62 65 74 77 65 65 6e 20 74 68 65 20 74 77 6f   between the two
1b50: 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73 2e 0a 2a   given tokens..*
1b60: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1b70: 70 72 53 70 61 6e 28 45 78 70 72 20 2a 70 45 78  prSpan(Expr *pEx
1b80: 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c 65 66 74  pr, Token *pLeft
1b90: 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67 68 74 29  , Token *pRight)
1ba0: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 52 69 67  {.  assert( pRig
1bb0: 68 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72  ht!=0 );.  asser
1bc0: 74 28 20 70 4c 65 66 74 21 3d 30 20 29 3b 0a 20  t( pLeft!=0 );. 
1bd0: 20 2f 2a 20 4e 6f 74 65 3a 20 70 45 78 70 72 20   /* Note: pExpr 
1be0: 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 64 75  might be NULL du
1bf0: 65 20 74 6f 20 61 20 70 72 69 6f 72 20 6d 61 6c  e to a prior mal
1c00: 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a 2f 0a 20  loc failure */. 
1c10: 20 69 66 28 20 70 45 78 70 72 20 26 26 20 70 52   if( pExpr && pR
1c20: 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c 65 66 74  ight->z && pLeft
1c30: 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70  ->z ){.    if( p
1c40: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20  Left->dyn==0 && 
1c50: 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29  pRight->dyn==0 )
1c60: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  {.      pExpr->s
1c70: 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a  pan.z = pLeft->z
1c80: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73  ;.      pExpr->s
1c90: 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e  pan.n = pRight->
1ca0: 6e 20 2b 20 41 64 64 72 28 70 52 69 67 68 74 2d  n + Addr(pRight-
1cb0: 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c 65 66 74  >z) - Addr(pLeft
1cc0: 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  ->z);.    }else{
1cd0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
1ce0: 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  an.z = 0;.    }.
1cf0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e    }.}../*.** Con
1d00: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
1d10: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72  ression node for
1d20: 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68   a function with
1d30: 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67   multiple.** arg
1d40: 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20  uments..*/.Expr 
1d50: 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63  *sqlite3ExprFunc
1d60: 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70  tion(ExprList *p
1d70: 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f  List, Token *pTo
1d80: 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  ken){.  Expr *pN
1d90: 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  ew;.  pNew = sql
1da0: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
1db0: 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28  f(Expr) );.  if(
1dc0: 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20   pNew==0 ){.    
1dd0: 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  /* sqlite3ExprLi
1de0: 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b  stDelete(pList);
1df0: 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74 20 77   // Leak pList w
1e00: 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73  hen malloc fails
1e10: 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30   */.    return 0
1e20: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70  ;.  }.  pNew->op
1e30: 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a   = TK_FUNCTION;.
1e40: 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20    pNew->pList = 
1e50: 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54 6f  pList;.  if( pTo
1e60: 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72  ken ){.    asser
1e70: 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d  t( pToken->dyn==
1e80: 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  0 );.    pNew->t
1e90: 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a  oken = *pToken;.
1ea0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65    }else{.    pNe
1eb0: 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a  w->token.z = 0;.
1ec0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
1ed0: 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a   = pNew->token;.
1ee0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1ef0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73 69 76  ../*.** Recursiv
1f00: 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20 65 78  ely delete an ex
1f10: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 0a 2a  pression tree..*
1f20: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
1f30: 70 72 44 65 6c 65 74 65 28 45 78 70 72 20 2a 70  prDelete(Expr *p
1f40: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
1f50: 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20 70 2d  return;.  if( p-
1f60: 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71 6c 69  >span.dyn ) sqli
1f70: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d  teFree((char*)p-
1f80: 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66 28 20  >span.z);.  if( 
1f90: 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29 20 73  p->token.dyn ) s
1fa0: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
1fb0: 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  )p->token.z);.  
1fc0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
1fd0: 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 73  e(p->pLeft);.  s
1fe0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
1ff0: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 73  (p->pRight);.  s
2000: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2010: 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29 3b 0a  lete(p->pList);.
2020: 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44    sqlite3SelectD
2030: 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65 63 74  elete(p->pSelect
2040: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
2050: 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68  p);.}.../*.** Th
2060: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72 6f 75  e following grou
2070: 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20 6d 61  p of routines ma
2080: 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73 20 6f  ke deep copies o
2090: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c 0a 2a  f expressions,.*
20a0: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
20b0: 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20 61 6e  ts, ID lists, an
20c0: 64 20 73 65 6c 65 63 74 20 73 74 61 74 65 6d 65  d select stateme
20d0: 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69 65 73  nts.  The copies
20e0: 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c 65 74   can.** be delet
20f0: 65 64 20 28 62 79 20 62 65 69 6e 67 20 70 61 73  ed (by being pas
2100: 73 65 64 20 74 6f 20 74 68 65 69 72 20 72 65 73  sed to their res
2110: 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c 65 74  pective ...Delet
2120: 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a 2a 2a  e() routines).**
2130: 20 77 69 74 68 6f 75 74 20 65 66 66 65 63 74 69   without effecti
2140: 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 73  ng the originals
2150: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78 70 72  ..**.** The expr
2160: 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49 44 2c  ession list, ID,
2170: 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69 73 74   and source list
2180: 73 20 72 65 74 75 72 6e 20 62 79 20 73 71 6c 69  s return by sqli
2190: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 29  te3ExprListDup()
21a0: 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64 4c 69  ,.** sqlite3IdLi
21b0: 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73 71 6c  stDup(), and sql
21c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 29  ite3SrcListDup()
21d0: 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75 72 74   can not be furt
21e0: 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a 2a 2a  her expanded .**
21f0: 20 62 79 20 73 75 62 73 65 71 75 65 6e 74 20 63   by subsequent c
2200: 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65 2a 4c  alls to sqlite*L
2210: 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f 75 74  istAppend() rout
2220: 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e 79 20  ines..**.** Any 
2230: 74 61 62 6c 65 73 20 74 68 61 74 20 74 68 65 20  tables that the 
2240: 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20 70 6f  SrcList might po
2250: 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74 20 64  int to are not d
2260: 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a 45 78  uplicated..*/.Ex
2270: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 44  pr *sqlite3ExprD
2280: 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 45  up(Expr *p){.  E
2290: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28  xpr *pNew;.  if(
22a0: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
22b0: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
22c0: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65  eMallocRaw( size
22d0: 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20  of(*p) );.  if( 
22e0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
22f0: 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70 4e 65   0;.  memcpy(pNe
2300: 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a 70 4e  w, p, sizeof(*pN
2310: 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74  ew));.  if( p->t
2320: 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20 20 20  oken.z!=0 ){.   
2330: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d   pNew->token.z =
2340: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 2d   sqliteStrDup(p-
2350: 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 20 20 70  >token.z);.    p
2360: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d  New->token.dyn =
2370: 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20   1;.  }else{.   
2380: 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74   assert( pNew->t
2390: 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d  oken.z==0 );.  }
23a0: 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20  .  pNew->span.z 
23b0: 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65  = 0;.  pNew->pLe
23c0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
23d0: 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  Dup(p->pLeft);. 
23e0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
23f0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
2400: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65  ->pRight);.  pNe
2410: 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74  w->pList = sqlit
2420: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
2430: 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d  >pList);.  pNew-
2440: 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74  >pSelect = sqlit
2450: 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70  e3SelectDup(p->p
2460: 53 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72  Select);.  retur
2470: 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73  n pNew;.}.void s
2480: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
2490: 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65  Token *pTo, Toke
24a0: 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28  n *pFrom){.  if(
24b0: 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69   pTo->dyn ) sqli
24c0: 74 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54  teFree((char*)pT
24d0: 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72  o->z);.  if( pFr
24e0: 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f  om->z ){.    pTo
24f0: 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a  ->n = pFrom->n;.
2500: 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71 6c      pTo->z = sql
2510: 69 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f 6d  iteStrNDup(pFrom
2520: 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a  ->z, pFrom->n);.
2530: 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31      pTo->dyn = 1
2540: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
2550: 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d  To->z = 0;.  }.}
2560: 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74  .ExprList *sqlit
2570: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 45 78  e3ExprListDup(Ex
2580: 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78  prList *p){.  Ex
2590: 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  prList *pNew;.  
25a0: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
25b0: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
25c0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30  nt i;.  if( p==0
25d0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
25e0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
25f0: 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  oc( sizeof(*pNew
2600: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
2610: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2620: 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20 3d 20 70   pNew->nExpr = p
2630: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
2640: 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65 77 2d 3e  >nExpr;.  pNew->
2650: 61 20 3d 20 70 49 74 65 6d 20 3d 20 73 71 6c 69  a = pItem = sqli
2660: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 45 78  teMalloc( p->nEx
2670: 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  pr*sizeof(p->a[0
2680: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65  ]) );.  if( pIte
2690: 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  m==0 ){.    sqli
26a0: 74 65 46 72 65 65 28 70 4e 65 77 29 3b 0a 20 20  teFree(pNew);.  
26b0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 20    return 0;.  } 
26c0: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
26d0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
26e0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70 72 20  em++){.    Expr 
26f0: 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f 6c 64  *pNewExpr, *pOld
2700: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
2710: 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45 78 70  >pExpr = pNewExp
2720: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  r = sqlite3ExprD
2730: 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20 70 2d  up(pOldExpr = p-
2740: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[i].pExpr);.  
2750: 20 20 69 66 28 20 70 4f 6c 64 45 78 70 72 2d 3e    if( pOldExpr->
2760: 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20 70 4e 65  span.z!=0 && pNe
2770: 77 45 78 70 72 20 29 7b 0a 20 20 20 20 20 20 2f  wExpr ){.      /
2780: 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65 20 61 20  * Always make a 
2790: 63 6f 70 79 20 6f 66 20 74 68 65 20 73 70 61 6e  copy of the span
27a0: 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65 6c 20 65   for top-level e
27b0: 78 70 72 65 73 73 69 6f 6e 73 20 69 6e 20 74 68  xpressions in th
27c0: 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72 65  e.      ** expre
27d0: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 54 68 65  ssion list.  The
27e0: 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c 45 43 54   logic in SELECT
27f0: 20 70 72 6f 63 65 73 73 69 6e 67 20 74 68 61 74   processing that
2800: 20 64 65 74 65 72 6d 69 6e 65 73 0a 20 20 20 20   determines.    
2810: 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65 73 20 6f    ** the names o
2820: 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65  f columns in the
2830: 20 72 65 73 75 6c 74 20 73 65 74 20 6e 65 65 64   result set need
2840: 73 20 74 68 69 73 20 69 6e 66 6f 72 6d 61 74 69  s this informati
2850: 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69  on */.      sqli
2860: 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 26 70 4e  te3TokenCopy(&pN
2870: 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c 20 26 70  ewExpr->span, &p
2880: 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 29 3b 0a  OldExpr->span);.
2890: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
28a0: 28 20 70 4e 65 77 45 78 70 72 3d 3d 30 20 7c 7c  ( pNewExpr==0 ||
28b0: 20 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2e   pNewExpr->span.
28c0: 7a 21 3d 30 20 0a 20 20 20 20 20 20 20 20 20 20  z!=0 .          
28d0: 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72 2d 3e 73    || pOldExpr->s
28e0: 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73 71 6c 69  pan.z==0 || sqli
28f0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
2900: 64 20 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  d );.    pItem->
2910: 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74  zName = sqliteSt
2920: 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e 7a 4e 61  rDup(p->a[i].zNa
2930: 6d 65 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  me);.    pItem->
2940: 73 6f 72 74 4f 72 64 65 72 20 3d 20 70 2d 3e 61  sortOrder = p->a
2950: 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72 3b 0a 20  [i].sortOrder;. 
2960: 20 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20     pItem->isAgg 
2970: 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41 67 67 3b  = p->a[i].isAgg;
2980: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e 65  .    pItem->done
2990: 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75   = 0;.  }.  retu
29a0: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72 63 4c 69  rn pNew;.}.SrcLi
29b0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
29c0: 73 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70  stDup(SrcList *p
29d0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
29e0: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
29f0: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
2a00: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
2a10: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
2a20: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
2a30: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
2a40: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
2a50: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
2a60: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2a70: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  w( nByte );.  if
2a80: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
2a90: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
2aa0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
2ab0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
2ac0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
2ad0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
2ae0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
2af0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
2b00: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
2b10: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
2b20: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
2b30: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
2b40: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
2b50: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
2b60: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
2b70: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
2b80: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
2b90: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
2ba0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
2bb0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
2bc0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
2bd0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
2be0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
2bf0: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
2c00: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
2c10: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
2c20: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
2c30: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
2c40: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 30 3b  wItem->pTab = 0;
2c50: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
2c60: 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33  Select = sqlite3
2c70: 53 65 6c 65 63 74 44 75 70 28 70 4f 6c 64 49 74  SelectDup(pOldIt
2c80: 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  em->pSelect);.  
2c90: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 4f 6e 20    pNewItem->pOn 
2ca0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
2cb0: 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f 6e 29 3b  (pOldItem->pOn);
2cc0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
2cd0: 55 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49  Using = sqlite3I
2ce0: 64 4c 69 73 74 44 75 70 28 70 4f 6c 64 49 74 65  dListDup(pOldIte
2cf0: 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20 20 7d 0a  m->pUsing);.  }.
2d00: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
2d10: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
2d20: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
2d30: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
2d40: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
2d50: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
2d60: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
2d70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2d80: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
2d90: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2da0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
2db0: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
2dc0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
2dd0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
2de0: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
2df0: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
2e00: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
2e10: 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  w->a==0 ) return
2e20: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
2e30: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
2e40: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
2e50: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
2e60: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
2e70: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
2e80: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
2e90: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
2ea0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
2eb0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
2ec0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
2ed0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
2ee0: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
2ef0: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
2f00: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
2f10: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
2f20: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
2f30: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
2f40: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2f50: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
2f60: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
2f70: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
2f80: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
2f90: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
2fa0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
2fb0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
2fc0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
2fd0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
2fe0: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
2ff0: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
3000: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
3010: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
3020: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3030: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
3040: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
3050: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
3060: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
3070: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
3080: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
3090: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
30a0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
30b0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
30c0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
30d0: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
30e0: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
30f0: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
3100: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
3110: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
3120: 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d 3e 6e 4c  ->nLimit = p->nL
3130: 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4f  imit;.  pNew->nO
3140: 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f 66 66 73  ffset = p->nOffs
3150: 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a 53 65 6c  et;.  pNew->zSel
3160: 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  ect = 0;.  pNew-
3170: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
3180: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
3190: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f 70  -1;.  pNew->ppOp
31a0: 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20 20 72 65  enTemp = 0;.  re
31b0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f  turn pNew;.}.../
31c0: 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65  *.** Add a new e
31d0: 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e  lement to the en
31e0: 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69  d of an expressi
31f0: 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69  on list.  If pLi
3200: 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c  st is.** initial
3210: 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72  ly NULL, then cr
3220: 65 61 74 65 20 61 20 6e 65 77 20 65 78 70 72 65  eate a new expre
3230: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45  ssion list..*/.E
3240: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
3250: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45  ExprListAppend(E
3260: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20  xprList *pList, 
3270: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
3280: 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66  en *pName){.  if
3290: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
32a0: 20 20 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65    pList = sqlite
32b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
32c0: 78 70 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20  xprList) );.    
32d0: 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a  if( pList==0 ){.
32e0: 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33        /* sqlite3
32f0: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
3300: 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72  ); // Leak memor
3310: 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  y if malloc fail
3320: 73 20 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72  s */.      retur
3330: 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61  n 0;.    }.    a
3340: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41  ssert( pList->nA
3350: 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20  lloc==0 );.  }. 
3360: 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c   if( pList->nAll
3370: 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72  oc<=pList->nExpr
3380: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e   ){.    pList->n
3390: 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e  Alloc = pList->n
33a0: 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20  Alloc*2 + 4;.   
33b0: 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69   pList->a = sqli
33c0: 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d  teRealloc(pList-
33d0: 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  >a, pList->nAllo
33e0: 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e  c*sizeof(pList->
33f0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  a[0]));.    if( 
3400: 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20  pList->a==0 ){. 
3410: 20 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45       /* sqlite3E
3420: 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29  xprDelete(pExpr)
3430: 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79  ; // Leak memory
3440: 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73   if malloc fails
3450: 20 2a 2f 0a 20 20 20 20 20 20 70 4c 69 73 74 2d   */.      pList-
3460: 3e 6e 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e  >nExpr = pList->
3470: 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20  nAlloc = 0;.    
3480: 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a    return pList;.
3490: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65      }.  }.  asse
34a0: 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20  rt( pList->a!=0 
34b0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c  );.  if( pExpr |
34c0: 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73  | pName ){.    s
34d0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
34e0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c  tem *pItem = &pL
34f0: 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45  ist->a[pList->nE
3500: 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73  xpr++];.    mems
3510: 65 74 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a  et(pItem, 0, siz
3520: 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20  eof(*pItem));.  
3530: 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d    pItem->pExpr =
3540: 20 70 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65   pExpr;.    pIte
3550: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3560: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
3570: 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65  pName);.  }.  re
3580: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f  turn pList;.}../
3590: 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65  *.** Delete an e
35a0: 6e 74 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e  ntire expression
35b0: 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73   list..*/.void s
35c0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
35d0: 6c 65 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70  lete(ExprList *p
35e0: 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  List){.  int i;.
35f0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
3600: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
3610: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
3620: 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74  return;.  assert
3630: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c  ( pList->a!=0 ||
3640: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   (pList->nExpr==
3650: 30 20 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  0 && pList->nAll
3660: 6f 63 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65  oc==0) );.  asse
3670: 72 74 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  rt( pList->nExpr
3680: 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20  <=pList->nAlloc 
3690: 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  );.  for(pItem=p
36a0: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
36b0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
36c0: 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20  +, pItem++){.   
36d0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
36e0: 74 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29  te(pItem->pExpr)
36f0: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3700: 28 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  (pItem->zName);.
3710: 20 20 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65    }.  sqliteFree
3720: 28 70 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71  (pList->a);.  sq
3730: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b  liteFree(pList);
3740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61  .}../*.** Walk a
3750: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  n expression tre
3760: 65 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20  e.  Return 1 if 
3770: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
3780: 73 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e  s constant.** an
3790: 64 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76  d 0 if it involv
37a0: 65 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a  es variables..**
37b0: 0a 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70  .** For the purp
37c0: 6f 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e  oses of this fun
37d0: 63 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d  ction, a double-
37e0: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
37f0: 78 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20  x: "abc").** is 
3800: 63 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72  considered a var
3810: 69 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67  iable but a sing
3820: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
3830: 20 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a   (ex: 'abc') is.
3840: 2a 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a  ** a constant..*
3850: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
3860: 72 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72  rIsConstant(Expr
3870: 20 2a 70 29 7b 0a 20 20 73 77 69 74 63 68 28 20   *p){.  switch( 
3880: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
3890: 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73  e TK_ID:.    cas
38a0: 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20  e TK_COLUMN:.   
38b0: 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20   case TK_DOT:.  
38c0: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
38d0: 4f 4e 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  ON:.      return
38e0: 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   0;.    case TK_
38f0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
3900: 4b 5f 53 54 52 49 4e 47 3a 0a 20 20 20 20 63 61  K_STRING:.    ca
3910: 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20  se TK_BLOB:.    
3920: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
3930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
3940: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
3950: 56 41 52 49 41 42 4c 45 3a 0a 20 20 20 20 20 20  VARIABLE:.      
3960: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 64 65  return 1;.    de
3970: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
3980: 66 28 20 70 2d 3e 70 4c 65 66 74 20 26 26 20 21  f( p->pLeft && !
3990: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
39a0: 73 74 61 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20  stant(p->pLeft) 
39b0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
39c0: 20 20 69 66 28 20 70 2d 3e 70 52 69 67 68 74 20    if( p->pRight 
39d0: 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  && !sqlite3ExprI
39e0: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69  sConstant(p->pRi
39f0: 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  ght) ) return 0;
3a00: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
3a10: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
3a20: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f  nt i;.        fo
3a30: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73  r(i=0; i<p->pLis
3a40: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3a50: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 73            if( !s
3a60: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
3a70: 74 61 6e 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61  tant(p->pList->a
3a80: 5b 69 5d 2e 70 45 78 70 72 29 20 29 20 72 65 74  [i].pExpr) ) ret
3a90: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d  urn 0;.        }
3aa0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 72  .      }.      r
3ab0: 65 74 75 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d  eturn p->pLeft!=
3ac0: 30 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d  0 || p->pRight!=
3ad0: 30 20 7c 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26  0 || (p->pList &
3ae0: 26 20 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  & p->pList->nExp
3af0: 72 3e 30 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  r>0);.    }.  }.
3b00: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
3b10: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 67 69 76 65  *.** If the give
3b20: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 64  n expression cod
3b30: 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e  es a constant in
3b40: 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73 6d  teger that is sm
3b50: 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f  all enough.** to
3b60: 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69 74   fit in a 32-bit
3b70: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
3b80: 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20 76   1 and put the v
3b90: 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74 65  alue of the inte
3ba0: 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75  ger.** in *pValu
3bb0: 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65  e.  If the expre
3bc0: 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20  ssion is not an 
3bd0: 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69 74  integer or if it
3be0: 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74   is too big.** t
3bf0: 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e 65  o fit in a signe
3c00: 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  d 32-bit integer
3c10: 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20 6c  , return 0 and l
3c20: 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e 63  eave *pValue unc
3c30: 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73  hanged..*/.int s
3c40: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
3c50: 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e 74  ger(Expr *p, int
3c60: 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77 69   *pValue){.  swi
3c70: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
3c80: 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45    case TK_INTEGE
3c90: 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 73  R: {.      if( s
3ca0: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70  qlite3GetInt32(p
3cb0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75  ->token.z, pValu
3cc0: 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65  e) ){.        re
3cd0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3ce0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3cf0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53   }.    case TK_S
3d00: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63  TRING: {.      c
3d10: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 20 3d 20 70  onst char *z = p
3d20: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
3d30: 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65   int n = p->toke
3d40: 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 6e  n.n;.      if( n
3d50: 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20  >0 && z[0]=='-' 
3d60: 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20  ){ z++; n--; }. 
3d70: 20 20 20 20 20 77 68 69 6c 65 28 20 6e 3e 30 20       while( n>0 
3d80: 26 26 20 2a 7a 20 26 26 20 69 73 64 69 67 69 74  && *z && isdigit
3d90: 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d  (*z) ){ z++; n--
3da0: 3b 20 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 3d  ; }.      if( n=
3db0: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 47 65 74  =0 && sqlite3Get
3dc0: 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  Int32(p->token.z
3dd0: 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20  , pValue) ){.   
3de0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
3df0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
3e00: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
3e10: 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20  se TK_UPLUS: {. 
3e20: 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69       return sqli
3e30: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
3e40: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
3e50: 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  e);.    }.    ca
3e60: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
3e70: 20 20 20 20 20 20 69 6e 74 20 76 3b 0a 20 20 20        int v;.   
3e80: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
3e90: 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70  prIsInteger(p->p
3ea0: 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a 20 20 20  Left, &v) ){.   
3eb0: 20 20 20 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d       *pValue = -
3ec0: 76 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  v;.        retur
3ed0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3ee0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3ef0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72 65      default: bre
3f00: 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  ak;.  }.  return
3f10: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74   0;.}../*.** Ret
3f20: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 65 20  urn TRUE if the 
3f30: 67 69 76 65 6e 20 73 74 72 69 6e 67 20 69 73 20  given string is 
3f40: 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20  a row-id column 
3f50: 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  name..*/.int sql
3f60: 69 74 65 33 49 73 52 6f 77 69 64 28 63 6f 6e 73  ite3IsRowid(cons
3f70: 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66  t char *z){.  if
3f80: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
3f90: 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d  (z, "_ROWID_")==
3fa0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
3fb0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
3fc0: 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d  mp(z, "ROWID")==
3fd0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
3fe0: 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49 43  if( sqlite3StrIC
3ff0: 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20  mp(z, "OID")==0 
4000: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 72 65  ) return 1;.  re
4010: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
4020: 20 47 69 76 65 6e 20 74 68 65 20 6e 61 6d 65 20   Given the name 
4030: 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  of a column of t
4040: 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72  he form X.Y.Z or
4050: 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20   Y.Z or just Z, 
4060: 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20  look up.** that 
4070: 6e 61 6d 65 20 69 6e 20 74 68 65 20 73 65 74 20  name in the set 
4080: 6f 66 20 73 6f 75 72 63 65 20 74 61 62 6c 65 73  of source tables
4090: 20 69 6e 20 70 53 72 63 4c 69 73 74 20 61 6e 64   in pSrcList and
40a0: 20 6d 61 6b 65 20 74 68 65 20 70 45 78 70 72 20   make the pExpr 
40b0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  .** expression n
40c0: 6f 64 65 20 72 65 66 65 72 20 62 61 63 6b 20 74  ode refer back t
40d0: 6f 20 74 68 61 74 20 73 6f 75 72 63 65 20 63 6f  o that source co
40e0: 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f  lumn.  The follo
40f0: 77 69 6e 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20  wing changes.** 
4100: 61 72 65 20 6d 61 64 65 20 74 6f 20 70 45 78 70  are made to pExp
4110: 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70  r:.**.**    pExp
4120: 72 2d 3e 69 44 62 20 20 20 20 20 20 20 20 20 20  r->iDb          
4130: 20 53 65 74 20 74 68 65 20 69 6e 64 65 78 20 69   Set the index i
4140: 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74  n db->aDb[] of t
4150: 68 65 20 64 61 74 61 62 61 73 65 20 68 6f 6c 64  he database hold
4160: 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  ing.**          
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 74                 t
4180: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
4190: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 20 20  pExpr->iTable   
41a0: 20 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20       Set to the 
41b0: 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f  cursor number fo
41c0: 72 20 74 68 65 20 74 61 62 6c 65 20 6f 62 74 61  r the table obta
41d0: 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20 20 20 20  ined.**         
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 66 72 6f 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a  from pSrcList..*
4200: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c  *    pExpr->iCol
4210: 75 6d 6e 20 20 20 20 20 20 20 53 65 74 20 74 6f  umn       Set to
4220: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62   the column numb
4230: 65 72 20 77 69 74 68 69 6e 20 74 68 65 20 74 61  er within the ta
4240: 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  ble..**    pExpr
4250: 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20 20 20  ->op            
4260: 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  Set to TK_COLUMN
4270: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70  ..**    pExpr->p
4280: 4c 65 66 74 20 20 20 20 20 20 20 20 20 41 6e 79  Left         Any
4290: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73   expression this
42a0: 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65   points to is de
42b0: 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70 45 78 70  leted.**    pExp
42c0: 72 2d 3e 70 52 69 67 68 74 20 20 20 20 20 20 20  r->pRight       
42d0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
42e0: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
42f0: 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a  s deleted..**.**
4300: 20 54 68 65 20 70 44 62 54 6f 6b 65 6e 20 69 73   The pDbToken is
4310: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
4320: 20 64 61 74 61 62 61 73 65 20 28 74 68 65 20 22   database (the "
4330: 58 22 29 2e 20 20 54 68 69 73 20 76 61 6c 75 65  X").  This value
4340: 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20   may be.** NULL 
4350: 6d 65 61 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d  meaning that nam
4360: 65 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  e is of the form
4370: 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20   Y.Z or Z.  Any 
4380: 61 76 61 69 6c 61 62 6c 65 20 64 61 74 61 62 61  available databa
4390: 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  se.** can be use
43a0: 64 2e 20 20 54 68 65 20 70 54 61 62 6c 65 54 6f  d.  The pTableTo
43b0: 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ken is the name 
43c0: 6f 66 20 74 68 65 20 74 61 62 6c 65 20 28 74 68  of the table (th
43d0: 65 20 22 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a  e "Y").  This.**
43e0: 20 76 61 6c 75 65 20 63 61 6e 20 62 65 20 4e 55   value can be NU
43f0: 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65 6e 20 69  LL if pDbToken i
4400: 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66  s also NULL.  If
4410: 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20   pTableToken is 
4420: 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73  NULL it.** means
4430: 20 74 68 61 74 20 74 68 65 20 66 6f 72 6d 20 6f   that the form o
4440: 66 20 74 68 65 20 6e 61 6d 65 20 69 73 20 5a 20  f the name is Z 
4450: 61 6e 64 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73  and that columns
4460: 20 66 72 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a   from any table.
4470: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 0a  ** can be used..
4480: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d  **.** If the nam
4490: 65 20 63 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f  e cannot be reso
44a0: 6c 76 65 64 20 75 6e 61 6d 62 69 67 75 6f 75 73  lved unambiguous
44b0: 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20 65 72 72  ly, leave an err
44c0: 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e  or message.** in
44d0: 20 70 50 61 72 73 65 20 61 6e 64 20 72 65 74 75   pParse and retu
44e0: 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65  rn non-zero.  Re
44f0: 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63  turn zero on suc
4500: 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  cess..*/.static 
4510: 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a  int lookupName(.
4520: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
4530: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
4540: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
4550: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65    Token *pDbToke
4560: 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  n,     /* Name o
4570: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 63  f the database c
4580: 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c  ontaining table,
4590: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
45a0: 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e  ken *pTableToken
45b0: 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61  ,  /* Name of ta
45c0: 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63  ble containing c
45d0: 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a  olumn, or NULL *
45e0: 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75  /.  Token *pColu
45f0: 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65  mnToken, /* Name
4600: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20   of the column. 
4610: 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53  */.  SrcList *pS
4620: 72 63 4c 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73  rcList,   /* Lis
4630: 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64  t of tables used
4640: 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75   to resolve colu
4650: 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78  mn names */.  Ex
4660: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20  prList *pEList, 
4670: 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78     /* List of ex
4680: 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74  pressions used t
4690: 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a  o resolve "AS" *
46a0: 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20  /.  Expr *pExpr 
46b0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65           /* Make
46c0: 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64 65 20   this EXPR node 
46d0: 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73 65 6c  point to the sel
46e0: 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a  ected column */.
46f0: 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62 20 3d  ){.  char *zDb =
4700: 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d   0;       /* Nam
4710: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4720: 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e 20 58  e.  The "X" in X
4730: 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a  .Y.Z */.  char *
4740: 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  zTab = 0;      /
4750: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 74 61  * Name of the ta
4760: 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20 69 6e  ble.  The "Y" in
4770: 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f   X.Y.Z or Y.Z */
4780: 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20  .  char *zCol = 
4790: 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20  0;      /* Name 
47a0: 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20  of the column.  
47b0: 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74  The "Z" */.  int
47c0: 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20 20 20   i, j;          
47d0: 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65    /* Loop counte
47e0: 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20  rs */.  int cnt 
47f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f 2a 20  = 0;         /* 
4800: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
4810: 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ng column names 
4820: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61 62 20  */.  int cntTab 
4830: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d  = 0;      /* Num
4840: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
4850: 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20  table names */. 
4860: 20 73 71 6c 69 74 65 20 2a 64 62 20 3d 20 70 50   sqlite *db = pP
4870: 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68  arse->db;  /* Th
4880: 65 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20  e database */.. 
4890: 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e   assert( pColumn
48a0: 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e  Token && pColumn
48b0: 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54  Token->z ); /* T
48c0: 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61  he Z in X.Y.Z ca
48d0: 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  nnot be NULL */.
48e0: 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e    zDb = sqlite3N
48f0: 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62  ameFromToken(pDb
4900: 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d  Token);.  zTab =
4910: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
4920: 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65  Token(pTableToke
4930: 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c  n);.  zCol = sql
4940: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4950: 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b  n(pColumnToken);
4960: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d  .  if( sqlite3_m
4970: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a  alloc_failed ){.
4980: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f      return 1;  /
4990: 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a  * Leak memory (z
49a0: 44 62 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20  Db and zTab) if 
49b0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
49c0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 54    }.  assert( zT
49d0: 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d  ab==0 || pEList=
49e0: 3d 30 20 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e  =0 );..  pExpr->
49f0: 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66  iTable = -1;.  f
4a00: 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69  or(i=0; i<pSrcLi
4a10: 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a  st->nSrc; i++){.
4a20: 20 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69      struct SrcLi
4a30: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d  st_item *pItem =
4a40: 20 26 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d   &pSrcList->a[i]
4a50: 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61  ;.    Table *pTa
4a60: 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b  b = pItem->pTab;
4a70: 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f  .    Column *pCo
4a80: 6c 3b 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62  l;..    if( pTab
4a90: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
4aa0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62      assert( pTab
4ab0: 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20  ->nCol>0 );.    
4ac0: 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20  if( zTab ){.    
4ad0: 20 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c    if( pItem->zAl
4ae0: 69 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ias ){.        c
4af0: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
4b00: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
4b10: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
4b20: 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61  e3StrICmp(zTabNa
4b30: 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63  me, zTab)!=0 ) c
4b40: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
4b50: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68  else{.        ch
4b60: 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70  ar *zTabName = p
4b70: 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20  Tab->zName;.    
4b80: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
4b90: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
4ba0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
4bb0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
4bc0: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  nue;.        if(
4bd0: 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74   zDb!=0 && sqlit
4be0: 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44  e3StrICmp(db->aD
4bf0: 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61  b[pTab->iDb].zNa
4c00: 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20  me, zDb)!=0 ){. 
4c10: 20 20 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75           continu
4c20: 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  e;.        }.   
4c30: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69     }.    }.    i
4c40: 66 28 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29  f( 0==(cntTab++)
4c50: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
4c60: 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d  >iTable = pItem-
4c70: 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20  >iCursor;.      
4c80: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
4c90: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20  b->iDb;.    }.  
4ca0: 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d    for(j=0, pCol=
4cb0: 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54  pTab->aCol; j<pT
4cc0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
4cd0: 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66  Col++){.      if
4ce0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
4cf0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
4d00: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
4d10: 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20    cnt++;.       
4d20: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
4d30: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
4d40: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4d50: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
4d60: 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73  .        /* Subs
4d70: 74 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64  titute the rowid
4d80: 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72   (column -1) for
4d90: 20 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49   the INTEGER PRI
4da0: 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20  MARY KEY */.    
4db0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
4dc0: 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50  mn = j==pTab->iP
4dd0: 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20  Key ? -1 : j;.  
4de0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
4df0: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
4e00: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
4e10: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
4e20: 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  Coll = pTab->aCo
4e30: 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20  l[j].pColl;.    
4e40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
4e50: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
4e60: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
4e70: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
4e80: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
4e90: 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a 20 69 74  n maybe .  ** it
4ea0: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
4eb0: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
4ec0: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
4ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 3d 3d    */.  if( zDb==
4ee0: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
4ef0: 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65  cnt==0 && pParse
4f00: 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29  ->trigStack!=0 )
4f10: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 61  {.    TriggerSta
4f20: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
4f30: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
4f40: 53 74 61 63 6b 3b 0a 20 20 20 20 54 61 62 6c 65  Stack;.    Table
4f50: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
4f60: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
4f70: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
4f80: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
4f90: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
4fa0: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  = 0 ){.      pEx
4fb0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
4fc0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49  iggerStack->newI
4fd0: 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dx;.      assert
4fe0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
4ff0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 70  >pTab );.      p
5000: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
5010: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d  ack->pTab;.    }
5020: 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65  else if( pTrigge
5030: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21  rStack->oldIdx !
5040: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
5050: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
5060: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
5070: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
5080: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
5090: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 61  >oldIdx;.      a
50a0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
50b0: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
50c0: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
50d0: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
50e0: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
50f0: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 69 6e  Tab ){ .      in
5100: 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d  t j;.      Colum
5110: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
5120: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  aCol;.      .   
5130: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
5140: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
5150: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
5160: 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54   for(j=0; j < pT
5170: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
5180: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
5190: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
51a0: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
51b0: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
51c0: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
51d0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
51e0: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
51f0: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
5200: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
5210: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
5220: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
5230: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
5240: 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70  pExpr->pColl = p
5250: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f  Tab->aCol[j].pCo
5260: 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 62 72  ll;.          br
5270: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  eak;.        }. 
5280: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
5290: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 65 72 68  ..  /*.  ** Perh
52a0: 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69 73 20  aps the name is 
52b0: 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20 74  a reference to t
52c0: 68 65 20 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20  he ROWID.  */.  
52d0: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e  if( cnt==0 && cn
52e0: 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c 69 74  tTab==1 && sqlit
52f0: 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20  e3IsRowid(zCol) 
5300: 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a  ){.    cnt = 1;.
5310: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
5320: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 70 45 78  mn = -1;.    pEx
5330: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53  pr->affinity = S
5340: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
5350: 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a  R;.  }..  /*.  *
5360: 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74 20 69  * If the input i
5370: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 5a 20  s of the form Z 
5380: 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e  (not Y.Z or X.Y.
5390: 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61 6d 65  Z) then the name
53a0: 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74 20 72 65   Z.  ** might re
53b0: 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75 6c 74  fer to an result
53c0: 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54 68 69  -set alias.  Thi
53d0: 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72 20 65  s happens, for e
53e0: 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20 20 2a  xample, when.  *
53f0: 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c 76 69  * we are resolvi
5400: 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68 65 20  ng names in the 
5410: 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f 66 20  WHERE clause of 
5420: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f  the following co
5430: 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a  mmand:.  **.  **
5440: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
5450: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
5460: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 2a 2a  WHERE x<10;.  **
5470: 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c  .  ** In cases l
5480: 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63  ike this, replac
5490: 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20 63  e pExpr with a c
54a0: 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72 65  opy of the expre
54b0: 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20  ssion that.  ** 
54c0: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
54d0: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
54e0: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
54f0: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
5500: 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2a 20 4e  ediately..  ** N
5510: 6f 74 65 20 74 68 61 74 20 74 68 65 20 65 78 70  ote that the exp
5520: 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65 20 72  ression in the r
5530: 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75 6c 64  esult set should
5540: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
5550: 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64  en.  ** resolved
5560: 20 62 79 20 74 68 65 20 74 69 6d 65 20 74 68 65   by the time the
5570: 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 69 73   WHERE clause is
5580: 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a   resolved..  */.
5590: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
55a0: 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20 20 20  pEList!=0 ){.   
55b0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69   for(j=0; j<pELi
55c0: 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b  st->nExpr; j++){
55d0: 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a 41 73  .      char *zAs
55e0: 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e   = pEList->a[j].
55f0: 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69 66 28  zName;.      if(
5600: 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74   zAs!=0 && sqlit
5610: 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a  e3StrICmp(zAs, z
5620: 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Col)==0 ){.     
5630: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
5640: 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45  ->pLeft==0 && pE
5650: 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29  xpr->pRight==0 )
5660: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
5670: 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20  >op = TK_AS;.   
5680: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5690: 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20  umn = j;.       
56a0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
56b0: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
56c0: 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70  EList->a[j].pExp
56d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
56e0: 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20  teFree(zCol);.  
56f0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 7a 54        assert( zT
5700: 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20  ab==0 && zDb==0 
5710: 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  );.        retur
5720: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
5730: 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   } .  }..  /*.  
5740: 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20 61 72  ** If X and Y ar
5750: 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72  e NULL (in other
5760: 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79 20 74   words if only t
5770: 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a  he column name Z
5780: 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65   is.  ** supplie
5790: 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c 75 65  d) and the value
57a0: 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65   of Z is enclose
57b0: 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74  d in double-quot
57c0: 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20  es, then.  ** Z 
57d0: 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69 74 65  is a string lite
57e0: 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73 6e 27  ral if it doesn'
57f0: 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f 6c 75  t match any colu
5800: 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68  mn names.  In th
5810: 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20 77 65  at.  ** case, we
5820: 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72 6e 20   need to return 
5830: 72 69 67 68 74 20 61 77 61 79 20 61 6e 64 20 6e  right away and n
5840: 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e  ot make any chan
5850: 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70  ges to.  ** pExp
5860: 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e  r..  */.  if( cn
5870: 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t==0 && zTab==0 
5880: 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  && pColumnToken-
5890: 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20  >z[0]=='"' ){.  
58a0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
58b0: 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  l);.    return 0
58c0: 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  ;.  }..  /*.  **
58d0: 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68   cnt==0 means th
58e0: 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61 74 63  ere was not matc
58f0: 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20  h.  cnt>1 means 
5900: 74 68 65 72 65 20 77 65 72 65 20 74 77 6f 20 6f  there were two o
5910: 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63  r.  ** more matc
5920: 68 65 73 2e 20 20 45 69 74 68 65 72 20 77 61 79  hes.  Either way
5930: 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65 72 72  , we have an err
5940: 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63  or..  */.  if( c
5950: 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63 68 61  nt!=1 ){.    cha
5960: 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68  r *z = 0;.    ch
5970: 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45  ar *zErr;.    zE
5980: 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e  rr = cnt==0 ? "n
5990: 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25  o such column: %
59a0: 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75 73 20  s" : "ambiguous 
59b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22  column name: %s"
59c0: 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20 29 7b  ;.    if( zDb ){
59d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
59e0: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c  tString(&z, zDb,
59f0: 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c   ".", zTab, ".",
5a00: 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d   zCol, 0);.    }
5a10: 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20 29 7b  else if( zTab ){
5a20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65  .      sqlite3Se
5a30: 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62  tString(&z, zTab
5a40: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
5a50: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
5a60: 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44    z = sqliteStrD
5a70: 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a  up(zCol);.    }.
5a80: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
5a90: 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45 72 72  Msg(pParse, zErr
5aa0: 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  , z);.    sqlite
5ab0: 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20  Free(z);.  }..  
5ac0: 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20  /* Clean up and 
5ad0: 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71  return.  */.  sq
5ae0: 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a 20  liteFree(zDb);. 
5af0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62   sqliteFree(zTab
5b00: 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28  );.  sqliteFree(
5b10: 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33  zCol);.  sqlite3
5b20: 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70 72  ExprDelete(pExpr
5b30: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70  ->pLeft);.  pExp
5b40: 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20  r->pLeft = 0;.  
5b50: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
5b60: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  e(pExpr->pRight)
5b70: 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ;.  pExpr->pRigh
5b80: 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e  t = 0;.  pExpr->
5b90: 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a  op = TK_COLUMN;.
5ba0: 20 20 73 71 6c 69 74 65 33 41 75 74 68 52 65 61    sqlite3AuthRea
5bb0: 64 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  d(pParse, pExpr,
5bc0: 20 70 53 72 63 4c 69 73 74 29 3b 0a 20 20 72 65   pSrcList);.  re
5bd0: 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a  turn cnt!=1;.}..
5be0: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
5bf0: 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72  ne walks an expr
5c00: 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20  ession tree and 
5c10: 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e  resolves referen
5c20: 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20  ces to.** table 
5c30: 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20  columns.  Nodes 
5c40: 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49  of the form ID.I
5c50: 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20  D or ID resolve 
5c60: 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78  into an.** index
5c70: 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e   to the table in
5c80: 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20   the table list 
5c90: 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66  and a column off
5ca0: 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78  set.  The .** Ex
5cb0: 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75  pr.opcode for su
5cc0: 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e  ch nodes is chan
5cd0: 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e  ged to TK_COLUMN
5ce0: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54 61 62  .  The Expr.iTab
5cf0: 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63  le.** value is c
5d00: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
5d10: 64 65 78 20 6f 66 20 74 68 65 20 72 65 66 65 72  dex of the refer
5d20: 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70  enced table in p
5d30: 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20  TabList.** plus 
5d40: 74 68 65 20 22 62 61 73 65 22 20 76 61 6c 75 65  the "base" value
5d50: 2e 20 20 54 68 65 20 62 61 73 65 20 76 61 6c 75  .  The base valu
5d60: 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c  e will ultimatel
5d70: 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20  y become the.** 
5d80: 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62  VDBE cursor numb
5d90: 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20  er for a cursor 
5da0: 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67  that is pointing
5db0: 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65   into the refere
5dc0: 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20  nced.** table.  
5dd0: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
5de0: 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65   value is change
5df0: 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f  d to the index o
5e00: 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a  f the column .**
5e10: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
5e20: 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45  ed table.  The E
5e30: 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75  xpr.iColumn valu
5e40: 65 20 66 6f 72 20 74 68 65 20 73 70 65 63 69 61  e for the specia
5e50: 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d  l.** ROWID colum
5e60: 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e  n is -1.  Any IN
5e70: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
5e80: 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65  Y column is trie
5e90: 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73  d as an.** alias
5ea0: 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a   for ROWID..**.*
5eb0: 2a 20 57 65 20 61 6c 73 6f 20 63 68 65 63 6b 20  * We also check 
5ec0: 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20 6f 66  for instances of
5ed0: 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72   the IN operator
5ee0: 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69 6e 20 74  .  IN comes in t
5ef0: 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a  wo.** forms:.**.
5f00: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78 70  **           exp
5f10: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
5f20: 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20  ** and.**       
5f30: 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c      expr IN (SEL
5f40: 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54  ECT ...).**.** T
5f50: 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69 73  he first form is
5f60: 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65 61   handled by crea
5f70: 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64 69  ting a set holdi
5f80: 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f  ng the list.** o
5f90: 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73  f allowed values
5fa0: 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66 6f  .  The second fo
5fb0: 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53 45  rm causes the SE
5fc0: 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74 65  LECT to generate
5fd0: 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72 79   .** a temporary
5fe0: 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68   table..**.** Th
5ff0: 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20  is routine also 
6000: 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c 61 72  looks for scalar
6010: 20 53 45 4c 45 43 54 73 20 74 68 61 74 20 61 72   SELECTs that ar
6020: 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65 78 70  e part of an exp
6030: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69  ression..** If i
6040: 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69 74 20  t finds any, it 
6050: 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74  generates code t
6060: 6f 20 77 72 69 74 65 20 74 68 65 20 76 61 6c 75  o write the valu
6070: 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65 63 74  e of that select
6080: 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72  .** into a memor
6090: 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e  y cell..**.** Un
60a0: 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72  known columns or
60b0: 20 74 61 62 6c 65 73 20 70 72 6f 76 6f 6b 65 20   tables provoke 
60c0: 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65 20 66  an error.  The f
60d0: 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a  unction returns.
60e0: 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ** the number of
60f0: 20 65 72 72 6f 72 73 20 73 65 65 6e 20 61 6e 64   errors seen and
6100: 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72 6f 72   leaves an error
6110: 20 6d 65 73 73 61 67 65 20 6f 6e 20 70 50 61 72   message on pPar
6120: 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a  se->zErrMsg..*/.
6130: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 52  int sqlite3ExprR
6140: 65 73 6f 6c 76 65 49 64 73 28 0a 20 20 50 61 72  esolveIds(.  Par
6150: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
6160: 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20 63 6f  /* The parser co
6170: 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69  ntext */.  SrcLi
6180: 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a  st *pSrcList, /*
6190: 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20   List of tables 
61a0: 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20  used to resolve 
61b0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
61c0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
61d0: 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20  st,  /* List of 
61e0: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65 64  expressions used
61f0: 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53 22   to resolve "AS"
6200: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
6210: 72 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  r        /* The 
6220: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
6230: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
6240: 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28  .  int i;..  if(
6250: 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70 53 72   pExpr==0 || pSr
6260: 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  cList==0 ) retur
6270: 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20  n 0;.  for(i=0; 
6280: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
6290: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65  ; i++){.    asse
62a0: 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b  rt( pSrcList->a[
62b0: 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26  i].iCursor>=0 &&
62c0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
62d0: 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e  iCursor<pParse->
62e0: 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20 20 73 77  nTab );.  }.  sw
62f0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
6300: 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65  ){.    /* Double
6310: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 73 20  -quoted strings 
6320: 28 65 78 3a 20 22 61 62 63 22 29 20 61 72 65 20  (ex: "abc") are 
6330: 75 73 65 64 20 61 73 20 69 64 65 6e 74 69 66 69  used as identifi
6340: 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f  ers if.    ** po
6350: 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72 77 69  ssible.  Otherwi
6360: 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e 20 61  se they remain a
6370: 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69 6e 67  s strings.  Sing
6380: 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a  le-quoted.    **
6390: 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20 27 61   strings (ex: 'a
63a0: 62 63 27 29 20 61 72 65 20 61 6c 77 61 79 73 20  bc') are always 
63b0: 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e  string literals.
63c0: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
63d0: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
63e0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 74      if( pExpr->t
63f0: 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20  oken.z[0]=='\'' 
6400: 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f  ) break;.      /
6410: 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f  * Fall thru into
6420: 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73 65 20   the TK_ID case 
6430: 69 66 20 74 68 69 73 20 69 73 20 61 20 64 6f 75  if this is a dou
6440: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
6450: 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f  g */.    }.    /
6460: 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66  * A lone identif
6470: 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d 65 20  ier is the name 
6480: 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e 0a 20 20  of a columnd..  
6490: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
64a0: 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  _ID: {.      if(
64b0: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72   lookupName(pPar
64c0: 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72  se, 0, 0, &pExpr
64d0: 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63 4c 69 73  ->token, pSrcLis
64e0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
64f0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
6500: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6510: 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20 20 20       break; .   
6520: 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74   }.  .    /* A t
6530: 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f  able name and co
6540: 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49  lumn name:     I
6550: 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61  D.ID.    ** Or a
6560: 20 64 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65   database, table
6570: 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44   and column:  ID
6580: 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20  .ID.ID.    */.  
6590: 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b    case TK_DOT: {
65a0: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43  .      Token *pC
65b0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b  olumn;.      Tok
65c0: 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20  en *pTable;.    
65d0: 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20    Token *pDb;.  
65e0: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
65f0: 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68 74 20  ;..      pRight 
6600: 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3b  = pExpr->pRight;
6610: 0a 20 20 20 20 20 20 69 66 28 20 70 52 69 67 68  .      if( pRigh
6620: 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a  t->op==TK_ID ){.
6630: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 30 3b          pDb = 0;
6640: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
6650: 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d  = &pExpr->pLeft-
6660: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20  >token;.        
6670: 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68  pColumn = &pRigh
6680: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
6690: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 61  }else{.        a
66a0: 73 73 65 72 74 28 20 70 52 69 67 68 74 2d 3e 6f  ssert( pRight->o
66b0: 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20  p==TK_DOT );.   
66c0: 20 20 20 20 20 70 44 62 20 3d 20 26 70 45 78 70       pDb = &pExp
66d0: 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  r->pLeft->token;
66e0: 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c 65 20  .        pTable 
66f0: 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65 66 74  = &pRight->pLeft
6700: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20  ->token;.       
6710: 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67   pColumn = &pRig
6720: 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65  ht->pRight->toke
6730: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
6740: 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28   if( lookupName(
6750: 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70 54 61  pParse, pDb, pTa
6760: 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 53  ble, pColumn, pS
6770: 72 63 4c 69 73 74 2c 20 30 2c 20 70 45 78 70 72  rcList, 0, pExpr
6780: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
6790: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
67a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
67b0: 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  }..    case TK_I
67c0: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
67d0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
67e0: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
67f0: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
6800: 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66 6f 20  ;.      KeyInfo 
6810: 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69  keyInfo;.      i
6820: 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20 20 20  nt addr;        
6830: 2f 2a 20 41 64 64 72 65 73 73 20 6f 66 20 4f 50  /* Address of OP
6840: 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73 74 72 75  _OpenTemp instru
6850: 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20  ction */..      
6860: 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72  if( v==0 ) retur
6870: 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28 20 73  n 1;.      if( s
6880: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
6890: 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53 72  eIds(pParse, pSr
68a0: 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70  cList, pEList, p
68b0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a  Expr->pLeft) ){.
68c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
68d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
68e0: 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69 74  affinity = sqlit
68f0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
6900: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20  Expr->pLeft);.. 
6910: 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72 20       /* Whether 
6920: 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49 4e  this is an 'x IN
6930: 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20  (SELECT...)' or 
6940: 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c 69  an 'x IN(<exprli
6950: 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20 65  st>)'.      ** e
6960: 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73 20  xpression it is 
6970: 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d 65  handled the same
6980: 20 77 61 79 2e 20 41 20 74 65 6d 70 6f 72 61 72   way. A temporar
6990: 79 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20 20  y table is .    
69a0: 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74 68    ** filled with
69b0: 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e   single-field in
69c0: 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73 65  dex keys represe
69d0: 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c 74  nting the result
69e0: 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20  s.      ** from 
69f0: 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74 68  the SELECT or th
6a00: 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20  e <exprlist>..  
6a10: 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
6a20: 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72 65  If the 'x' expre
6a30: 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  ssion is a colum
6a40: 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65 20  n value, or the 
6a50: 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20  SELECT....      
6a60: 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65 74  ** statement ret
6a70: 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61  urns a column va
6a80: 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61 66  lue, then the af
6a90: 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a 20  finity of that. 
6aa0: 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69       ** column i
6ab0: 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64 20  s used to build 
6ac0: 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  the index keys. 
6ad0: 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64 20  If both 'x' and 
6ae0: 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c  the.      ** SEL
6af0: 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74  ECT... statement
6b00: 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68   are columns, th
6b10: 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  en numeric affin
6b20: 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20 20  ity is used.    
6b30: 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20 63    ** if either c
6b40: 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49  olumn has NUMERI
6b50: 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66 66  C or INTEGER aff
6b60: 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68 65  inity. If neithe
6b70: 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20 6e  r.      ** 'x' n
6b80: 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e  or the SELECT...
6b90: 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63   statement are c
6ba0: 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d  olumns, then num
6bb0: 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20 20  eric affinity.  
6bc0: 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a      ** is used..
6bd0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70        */.      p
6be0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
6bf0: 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20  Parse->nTab++;. 
6c00: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
6c10: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6c20: 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78  OP_OpenTemp, pEx
6c30: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
6c40: 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b 65        memset(&ke
6c50: 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66  yInfo, 0, sizeof
6c60: 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20  (keyInfo));.    
6c70: 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64    keyInfo.nField
6c80: 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c 69   = 1;.      sqli
6c90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
6ca0: 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73  OP_SetNumColumns
6cb0: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6cc0: 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28 20   1);..      if( 
6cd0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
6ce0: 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73  {.        /* Cas
6cf0: 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49 4e  e 1:     expr IN
6d00: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20   (SELECT ...).  
6d10: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
6d20: 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64   ** Generate cod
6d30: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 72  e to write the r
6d40: 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73 65  esults of the se
6d50: 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74 65  lect into the te
6d60: 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20 20  mporary.        
6d70: 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74  ** table allocat
6d80: 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61 62  ed and opened ab
6d90: 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ove..        */.
6da0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61 72          int iPar
6db0: 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  m = pExpr->iTabl
6dc0: 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66 69  e +  (((int)affi
6dd0: 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20  nity)<<16);.    
6de0: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
6df0: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61 73  List;.        as
6e00: 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69 54  sert( (pExpr->iT
6e10: 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46 29  able&0x0000FFFF)
6e20: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  ==pExpr->iTable 
6e30: 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
6e40: 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65 2c  e3Select(pParse,
6e50: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c   pExpr->pSelect,
6e60: 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d 2c   SRT_Set, iParm,
6e70: 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b 0a 20 20   0, 0, 0, 0);.  
6e80: 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70        pEList = p
6e90: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
6ea0: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 69  EList;.        i
6eb0: 66 28 20 70 45 4c 69 73 74 20 26 26 20 70 45 4c  f( pEList && pEL
6ec0: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 7b 20  ist->nExpr>0 ){ 
6ed0: 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79 49 6e  .          keyIn
6ee0: 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 62 69  fo.aColl[0] = bi
6ef0: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
6f00: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
6f10: 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20 20 20  ->pLeft,.       
6f20: 20 20 20 20 20 20 20 70 45 4c 69 73 74 2d 3e 61         pEList->a
6f30: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
6f40: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
6f50: 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69  e if( pExpr->pLi
6f60: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  st ){.        /*
6f70: 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78 70   Case 2:     exp
6f80: 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29 0a  r IN (exprlist).
6f90: 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20 46          **..** F
6fa0: 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73 69  or each expressi
6fb0: 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e 64  on, build an ind
6fc0: 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20  ex key from the 
6fd0: 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a 20  evaluation and. 
6fe0: 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65 20         ** store 
6ff0: 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f 72  it in the tempor
7000: 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c 65  ary table. If <e
7010: 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d 6e  xpr> is a column
7020: 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20 20  , then use.     
7030: 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75 6d     ** that colum
7040: 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65 6e  ns affinity when
7050: 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78 20   building index 
7060: 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e 20  keys. If <expr> 
7070: 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20 2a  is not.        *
7080: 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65 20  * a column, use 
7090: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
70a0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
70b0: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
70c0: 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20 2a      char const *
70d0: 61 66 66 53 74 72 3b 0a 20 20 20 20 20 20 20 20  affStr;.        
70e0: 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b  if( !affinity ){
70f0: 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69 6e  .          affin
7100: 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46  ity = SQLITE_AFF
7110: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 20 20  _NUMERIC;.      
7120: 20 20 7d 0a 20 20 20 20 20 20 20 20 61 66 66 53    }.        affS
7130: 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66 69  tr = sqlite3Affi
7140: 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66 69 6e  nityString(affin
7150: 69 74 79 29 3b 0a 20 20 20 20 20 20 20 20 6b 65  ity);.        ke
7160: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
7170: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 70   pExpr->pLeft->p
7180: 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20 20 2f  Coll;..        /
7190: 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20 65  * Loop through e
71a0: 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ach expression i
71b0: 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f  n <exprlist>. */
71c0: 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
71d0: 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73 74  ; i<pExpr->pList
71e0: 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20  ->nExpr; i++){. 
71f0: 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a 70           Expr *p
7200: 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  E2 = pExpr->pLis
7210: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 0a  t->a[i].pExpr;..
7220: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68 65            /* Che
7230: 63 6b 20 74 68 61 74 20 74 68 65 20 65 78 70 72  ck that the expr
7240: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
7250: 6e 74 20 61 6e 64 20 76 61 6c 69 64 2e 20 2a 2f  nt and valid. */
7260: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21  .          if( !
7270: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
7280: 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20 20  stant(pE2) ){.  
7290: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
72a0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
72b0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
72c0: 22 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65  "right-hand side
72d0: 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72 20   of IN operator 
72e0: 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e 74  must be constant
72f0: 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ");.            
7300: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7310: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
7320: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
7330: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32  heck(pParse, pE2
7340: 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20 20  , 0, 0) ){.     
7350: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7360: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20 20  .          }..  
7370: 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c 75          /* Evalu
7380: 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73 69  ate the expressi
7390: 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69 74  on and insert it
73a0: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20 74   into the temp t
73b0: 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20 20  able */.        
73c0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
73d0: 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b 0a  e(pParse, pE2);.
73e0: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
73f0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 4d  3VdbeOp3(v, OP_M
7400: 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30 2c  akeRecord, 1, 0,
7410: 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54   affStr, P3_STAT
7420: 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  IC);.          s
7430: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
7440: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
7450: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 0);.          
7460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
7470: 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79  (v, OP_PutStrKey
7480: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
7490: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
74a0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c       }.      sql
74b0: 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 33  ite3VdbeChangeP3
74c0: 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64 20  (v, addr, (void 
74d0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
74e0: 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20 20 20  EYINFO);..      
74f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
7500: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
7510: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
7520: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
7530: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
7540: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
7550: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
7560: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
7570: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
7580: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
7590: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
75a0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
75b0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
75c0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
75d0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
75e0: 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  n = pParse->nMem
75f0: 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73 71 6c  ++;.      if(sql
7600: 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73  ite3Select(pPars
7610: 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  e, pExpr->pSelec
7620: 74 2c 20 53 52 54 5f 4d 65 6d 2c 70 45 78 70 72  t, SRT_Mem,pExpr
7630: 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c 30 2c  ->iColumn,0,0,0,
7640: 30 29 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  0)){.        ret
7650: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7660: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7670: 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20 61 6c  }..    /* For al
7680: 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72 65 63  l else, just rec
7690: 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20 74 68  ursively walk th
76a0: 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20 64 65  e tree */.    de
76b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
76c0: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 0a  f( pExpr->pLeft.
76d0: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
76e0: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
76f0: 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c  Parse, pSrcList,
7700: 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e   pEList, pExpr->
7710: 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20 20 20  pLeft) ){.      
7720: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7730: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
7740: 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20 20 20  xpr->pRight .   
7750: 20 20 20 26 26 20 73 71 6c 69 74 65 33 45 78 70     && sqlite3Exp
7760: 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72  rResolveIds(pPar
7770: 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45  se, pSrcList, pE
7780: 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  List, pExpr->pRi
7790: 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ght) ){.        
77a0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
77b0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  }.      if( pExp
77c0: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
77d0: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
77e0: 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69     ExprList *pLi
77f0: 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  st = pExpr->pLis
7800: 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  t;.        for(i
7810: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
7820: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
7830: 20 20 20 20 45 78 70 72 20 2a 70 41 72 67 20 3d      Expr *pArg =
7840: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
7850: 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  pr;.          if
7860: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
7870: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
7880: 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74  pSrcList, pEList
7890: 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20 20 20  , pArg) ){.     
78a0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
78b0: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
78c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
78d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
78e0: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  n 0;.}../*.** pE
78f0: 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20 74 68  xpr is a node th
7900: 61 74 20 64 65 66 69 6e 65 73 20 61 20 66 75 6e  at defines a fun
7910: 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69  ction of some ki
7920: 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a  nd.  It might.**
7930: 20 62 65 20 61 20 73 79 6e 74 61 63 74 69 63 20   be a syntactic 
7940: 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63  function like "c
7950: 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74 20 6d  ount(x)" or it m
7960: 69 67 68 74 20 62 65 20 61 20 66 75 6e 63 74 69  ight be a functi
7970: 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65  on.** that imple
7980: 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61 74 6f  ments an operato
7990: 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20  r, like "a LIKE 
79a0: 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73  b".  .**.** This
79b0: 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a   routine makes *
79c0: 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20  pzName point to 
79d0: 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20  the name of the 
79e0: 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a  function and .**
79f0: 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68   *pnName hold th
7a00: 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  e number of char
7a10: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 66 75  acters in the fu
7a20: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a  nction name..*/.
7a30: 73 74 61 74 69 63 20 76 6f 69 64 20 67 65 74 46  static void getF
7a40: 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72  unctionName(Expr
7a50: 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63   *pExpr, const c
7a60: 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e  har **pzName, in
7a70: 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77  t *pnName){.  sw
7a80: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
7a90: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  ){.    case TK_F
7aa0: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
7ab0: 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pzName = pExpr
7ac0: 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20  ->token.z;.     
7ad0: 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72   *pnName = pExpr
7ae0: 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20  ->token.n;.     
7af0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7b00: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20    case TK_LIKE: 
7b10: 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20  {.      *pzName 
7b20: 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20  = "like";.      
7b30: 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20  *pnName = 4;.   
7b40: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7b50: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42      case TK_GLOB
7b60: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
7b70: 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20  e = "glob";.    
7b80: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
7b90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7ba0: 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  }.    default: {
7bb0: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
7bc0: 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e 22 3b   "can't happen";
7bd0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
7be0: 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   12;.      break
7bf0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
7c00: 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65 63 6b  *.** Error check
7c10: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 69   the functions i
7c20: 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e  n an expression.
7c30: 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c 0a    Make sure all.
7c40: 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  ** function name
7c50: 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64  s are recognized
7c60: 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f   and all functio
7c70: 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f 72 72  ns have the corr
7c80: 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  ect.** number of
7c90: 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61   arguments.  Lea
7ca0: 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73  ve an error mess
7cb0: 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d 3e 7a  age in pParse->z
7cc0: 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61 6e 79  ErrMsg.** if any
7cd0: 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20  thing is amiss. 
7ce0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
7cf0: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a  er of errors..**
7d00: 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20 69 73  .** if pIsAgg is
7d10: 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20 74 68   not null and th
7d20: 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  is expression is
7d30: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
7d40: 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b 65 20  nction.** (like 
7d50: 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61 78 28  count(*) or max(
7d60: 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77 72 69  value)) then wri
7d70: 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70 49 73  te a 1 into *pIs
7d80: 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  Agg..*/.int sqli
7d90: 74 65 33 45 78 70 72 43 68 65 63 6b 28 50 61 72  te3ExprCheck(Par
7da0: 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
7db0: 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61 6c 6c   *pExpr, int all
7dc0: 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49 73 41  owAgg, int *pIsA
7dd0: 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72 20  gg){.  int nErr 
7de0: 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72  = 0;.  if( pExpr
7df0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
7e00: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7e10: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7e20: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
7e30: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
7e40: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
7e50: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d   {.      int n =
7e60: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20   pExpr->pList ? 
7e70: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
7e80: 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e 75 6d  xpr : 0;  /* Num
7e90: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
7ea0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 6f   */.      int no
7eb0: 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30 3b 20  _such_func = 0; 
7ec0: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66        /* True if
7ed0: 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f   no such functio
7ee0: 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20 20 20  n exists */.    
7ef0: 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75 6d 5f    int wrong_num_
7f00: 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20 2f 2a  args = 0;     /*
7f10: 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67 20 6e   True if wrong n
7f20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
7f30: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
7f40: 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20 20 20  is_agg = 0;     
7f50: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
7f60: 69 66 20 69 73 20 61 6e 20 61 67 67 72 65 67 61  if is an aggrega
7f70: 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  te function */. 
7f80: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
7f90: 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20 20 20    int nId;      
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
7fb0: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
7fc0: 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74 69 6f  cters in functio
7fd0: 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20 20 20  n name */.      
7fe0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
7ff0: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54              /* T
8000: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
8010: 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  . */.      FuncD
8020: 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
8030: 69 6e 74 20 65 6e 63 20 3d 20 70 50 61 72 73 65  int enc = pParse
8040: 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 0a 20 20 20 20  ->db->enc;..    
8050: 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d    getFunctionNam
8060: 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20 26  e(pExpr, &zId, &
8070: 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  nId);.      pDef
8080: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
8090: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
80a0: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c 20  b, zId, nId, n, 
80b0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 69  enc, 0);.      i
80c0: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
80d0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
80e0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
80f0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
8100: 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63 2c 20  , nId, -1, enc, 
8110: 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  0);.        if( 
8120: 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20  pDef==0 ){.     
8130: 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66 75 6e       no_such_fun
8140: 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  c = 1;.        }
8150: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
8160: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
8170: 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   1;.        }.  
8180: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
8190: 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44 65 66     is_agg = pDef
81a0: 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20 20 20  ->xFunc==0;.    
81b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
81c0: 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77 41 67  _agg && !allowAg
81d0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
81e0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
81f0: 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f 66 20  rse, "misuse of 
8200: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
8210: 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c  on %.*s()", nId,
8220: 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20 20 6e   zId);.        n
8230: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8240: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
8250: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
8260: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
8270: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
8280: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
8290: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
82a0: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
82b0: 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b 0a          nErr++;.
82c0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
82d0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29  wrong_num_args )
82e0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
82f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8300: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
8310: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
8320: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
8330: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
8340: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
8350: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d   nErr++;.      }
8360: 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67  .      if( is_ag
8370: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  g ){.        pEx
8380: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47 47 5f  pr->op = TK_AGG_
8390: 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20 20 20  FUNCTION;.      
83a0: 20 20 69 66 28 20 70 49 73 41 67 67 20 29 20 2a    if( pIsAgg ) *
83b0: 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20  pIsAgg = 1;.    
83c0: 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d    }.      for(i=
83d0: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
83e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
83f0: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45   nErr = sqlite3E
8400: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
8410: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
8420: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
8430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8440: 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f 77 41            allowA
8450: 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c 20 70  gg && !is_agg, p
8460: 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a  IsAgg);.      }.
8470: 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a        /* FIX ME:
8480: 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d    Compute pExpr-
8490: 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65 64 20  >affinity based 
84a0: 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65 64 20  on the expected 
84b0: 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20  return.      ** 
84c0: 74 79 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63  type of the func
84d0: 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20  tion .      */. 
84e0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
84f0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
8500: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
8510: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
8520: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
8530: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
8540: 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20 70 49  ft, allowAgg, pI
8550: 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 0a 20  sAgg);.      }. 
8560: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
8570: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
8580: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
8590: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
85a0: 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78  heck(pParse, pEx
85b0: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c 6c 6f  pr->pRight, allo
85c0: 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a 20  wAgg, pIsAgg);. 
85d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
85e0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
85f0: 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  r->pList ){.    
8600: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
8610: 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  r->pList->nExpr;
8620: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
8630: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
8640: 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b   nErr==0 && i<n;
8650: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
8660: 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78   Expr *pE2 = pEx
8670: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  pr->pList->a[i].
8680: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
8690: 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45   nErr = sqlite3E
86a0: 78 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c  xprCheck(pParse,
86b0: 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67 2c 20   pE2, allowAgg, 
86c0: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 20  pIsAgg);.       
86d0: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
86e0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
86f0: 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72 3b  }.  return nErr;
8700: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8710: 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f  te an instructio
8720: 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20  n that will put 
8730: 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63  the integer desc
8740: 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20  ribe by.** text 
8750: 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65  z[0..n-1] on the
8760: 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69   stack..*/.stati
8770: 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67  c void codeInteg
8780: 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73  er(Vdbe *v, cons
8790: 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e  t char *z, int n
87a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
87b0: 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33  ( sqlite3GetInt3
87c0: 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20  2(z, &i) ){.    
87d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
87e0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
87f0: 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69  i, 0);.  }else i
8800: 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e  f( sqlite3FitsIn
8810: 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20  64Bits(z) ){.   
8820: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
8830: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
8840: 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65  , 0, z, n);.  }e
8850: 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  lse{.    sqlite3
8860: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65  VdbeOp3(v, OP_Re
8870: 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b  al, 0, 0, z, n);
8880: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65  .  }.}../*.** Ge
8890: 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f  nerate code into
88a0: 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62   the current Vdb
88b0: 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68  e to evaluate th
88c0: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
88d0: 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20  ssion and leave 
88e0: 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68  the result on th
88f0: 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a  e top of stack..
8900: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
8910: 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
8920: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
8930: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
8940: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
8950: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20    int op;.  if( 
8960: 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30  v==0 || pExpr==0
8970: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69   ) return;.  swi
8980: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
8990: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  {.    case TK_PL
89a0: 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  US:     op = OP_
89b0: 41 64 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b  Add;      break;
89c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
89d0: 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 53  US:    op = OP_S
89e0: 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b 3b 0a  ubtract; break;.
89f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
8a00: 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4d 75  :     op = OP_Mu
8a10: 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b 0a 20  ltiply; break;. 
8a20: 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
8a30: 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44 69 76  :    op = OP_Div
8a40: 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20  ide;   break;.  
8a50: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 20    case TK_AND:  
8a60: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b      op = OP_And;
8a70: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8a80: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20 20 20   case TK_OR:    
8a90: 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b 20 20     op = OP_Or;  
8aa0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8ab0: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
8ac0: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
8ad0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8ae0: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
8af0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
8b00: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8b10: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
8b20: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
8b30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8b40: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
8b50: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
8b60: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8b70: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
8b80: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
8b90: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8ba0: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
8bb0: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
8bc0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8bd0: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
8be0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
8bf0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8c00: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
8c10: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
8c20: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8c30: 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  NOT:      op = O
8c40: 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72 65 61  P_Not;      brea
8c50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55  k;.    case TK_U
8c60: 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20 4f 50  MINUS:   op = OP
8c70: 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65 61 6b  _Negative; break
8c80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8c90: 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TAND:   op = OP_
8ca0: 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61 6b 3b  BitAnd;   break;
8cb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
8cc0: 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 42  OR:    op = OP_B
8cd0: 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b 3b 0a  itOr;    break;.
8ce0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
8cf0: 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69  OT:   op = OP_Bi
8d00: 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b 0a 20  tNot;   break;. 
8d10: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
8d20: 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69  T:   op = OP_Shi
8d30: 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b 3b 0a  ftLeft;  break;.
8d40: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49      case TK_RSHI
8d50: 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 68  FT:   op = OP_Sh
8d60: 69 66 74 52 69 67 68 74 3b 20 62 72 65 61 6b 3b  iftRight; break;
8d70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d  .    case TK_REM
8d80: 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52  :      op = OP_R
8d90: 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65 61 6b  emainder;  break
8da0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c  ;.    case TK_FL
8db0: 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  OAT:    op = OP_
8dc0: 52 65 61 6c 3b 20 20 20 20 20 20 20 62 72 65 61  Real;       brea
8dd0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
8de0: 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d 20 4f 50  TRING:   op = OP
8df0: 5f 53 74 72 69 6e 67 38 3b 20 20 20 20 20 62 72  _String8;     br
8e00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8e10: 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70 20 3d 20  _BLOB:     op = 
8e20: 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20 20 20 62  OP_HexBlob;    b
8e30: 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c  reak;.    defaul
8e40: 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72 65 61 6b  t: op = 0; break
8e50: 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20  ;.  }.  switch( 
8e60: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
8e70: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
8e80: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50 61   {.      if( pPa
8e90: 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b 0a 20  rse->useAgg ){. 
8ea0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8eb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67  beAddOp(v, OP_Ag
8ec0: 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e  gGet, 0, pExpr->
8ed0: 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65 6c  iAgg);.      }el
8ee0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43  se if( pExpr->iC
8ef0: 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20 20  olumn>=0 ){.    
8f00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
8f10: 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  ddOp(v, OP_Colum
8f20: 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  n, pExpr->iTable
8f30: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
8f40: 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
8f50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8f60: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52  dbeAddOp(v, OP_R
8f70: 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61  ecno, pExpr->iTa
8f80: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  ble, 0);.      }
8f90: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8fa0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8fb0: 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20  INTEGER: {.     
8fc0: 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c 20   codeInteger(v, 
8fd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
8fe0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
8ff0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
9000: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9010: 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65 20  FLOAT:.    case 
9020: 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20  TK_STRING: {.   
9030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
9040: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
9050: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
9060: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
9070: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9080: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
9090: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
90a0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
90b0: 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
90c0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
90d0: 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70  , op, 0, 0, pExp
90e0: 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45  r->token.z+1, pE
90f0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b  xpr->token.n-1);
9100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9110: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
9120: 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  1);.      break;
9130: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9140: 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  TK_NULL: {.     
9150: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9160: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
9170: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72   0, 0);.      br
9180: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
9190: 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
91a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
91b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
91c0: 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72 2d  Variable, pExpr-
91d0: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
91e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
91f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
9200: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
9210: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
9220: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
9230: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
9240: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
9250: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9260: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
9270: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9280: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9290: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
92a0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
92b0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
92c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
92d0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
92e0: 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  ht, op, 0, 0);. 
92f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9300: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  }.    case TK_AN
9310: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f  D:.    case TK_O
9320: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50  R:.    case TK_P
9330: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
9340: 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20  _STAR:.    case 
9350: 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61  TK_MINUS:.    ca
9360: 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63  se TK_REM:.    c
9370: 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20  ase TK_BITAND:. 
9380: 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52     case TK_BITOR
9390: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  :.    case TK_SL
93a0: 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ASH:.    case TK
93b0: 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
93c0: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20  e TK_RSHIFT: {. 
93d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
93e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
93f0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9400: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9410: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9420: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9430: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9440: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
9450: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9460: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
9470: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  NCAT: {.      sq
9480: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9490: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
94a0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
94b0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
94c0: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
94d0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
94e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
94f0: 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b 0a  Concat8, 2, 0);.
9500: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9510: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
9520: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
9530: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
9540: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9550: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
9560: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
9570: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
9580: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
9590: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
95a0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
95b0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
95c0: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
95d0: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
95e0: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
95f0: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
9600: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
9610: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9620: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
9630: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
9640: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
9650: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
9660: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
9670: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
9680: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
9690: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
96a0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
96b0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
96c0: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
96d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
96e0: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
96f0: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
9700: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9710: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
9720: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
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 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
9760: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
9770: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
9780: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9790: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
97a0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
97b0: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
97c0: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
97d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
97e0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
97f0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
9800: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9810: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9820: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
9830: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
9840: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
9850: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9860: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
9870: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
9880: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9890: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
98a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
98b0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
98c0: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
98d0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
98e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
98f0: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
9900: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
9910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9920: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
9930: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
9940: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
9950: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
9960: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9970: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
9980: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
9990: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
99a0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
99b0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
99c0: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
99d0: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
99e0: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  zId;.      int p
99f0: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  2 = 0;.      int
9a00: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
9a10: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
9a20: 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  nc;.      CollSe
9a30: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
9a40: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
9a50: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
9a60: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
9a70: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
9a80: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
9a90: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
9aa0: 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
9ab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
9ac0: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
9ad0: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9ae0: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
9af0: 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
9b00: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9b10: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
9b20: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9b30: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9b40: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
9b50: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9b60: 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c        p2 |= (1<<
9b70: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
9b80: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
9b90: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21  needCollSeq && !
9ba0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
9bb0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9bc0: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9bd0: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
9be0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9bf0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9c00: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
9c10: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
9c20: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9c30: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
9c40: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
9c50: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9c60: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
9c70: 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
9c80: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
9c90: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
9ca0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9cb0: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
9cc0: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20  ion, nExpr, p2, 
9cd0: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
9ce0: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
9cf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9d00: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
9d10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9d20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d30: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
9d40: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
9d50: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d60: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9d70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
9d80: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  ;.      char con
9d90: 73 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20  st *affStr;..   
9da0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
9db0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
9dc0: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
9dd0: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
9de0: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
9df0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9e00: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
9e10: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
9e20: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
9e30: 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66  r.      ** P3 of
9e40: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
9e50: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
9e60: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
9e70: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63 6f  ffinityString(co
9e80: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
9e90: 28 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  (pExpr));..     
9ea0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9eb0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9ec0: 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   1, 0);..      /
9ed0: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
9ee0: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
9ef0: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
9f00: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
9f10: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
9f20: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
9f30: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
9f40: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
9f50: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
9f60: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9f70: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9f80: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9f90: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
9fa0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9fb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9fc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9fd0: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
9fe0: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
9ff0: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
a000: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a010: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
a020: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
a030: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a040: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a050: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a060: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a070: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
a080: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
a090: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a0a0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
a0b0: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41  , affStr, P3_STA
a0c0: 54 49 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20  TIC); /* addr + 
a0d0: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
a0e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a0f0: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
a100: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
a110: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a120: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
a130: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a150: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
a160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a170: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
a180: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45  TWEEN: {.      E
a190: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
a1a0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
a1b0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
a1c0: 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20  _item *pLItem = 
a1d0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b  pExpr->pList->a;
a1e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
a1f0: 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45  ght = pLItem->pE
a200: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
a210: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
a220: 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  e, pLeft);.     
a230: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a240: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20  p(v, OP_Dup, 0, 
a250: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
a260: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a270: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
a280: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
a290: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
a2a0: 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29  ht, OP_Ge, 0, 0)
a2b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a2c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
a2d0: 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  ull, 1, 0);.    
a2e0: 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20    pLItem++;.    
a2f0: 20 20 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65    pRight = pLIte
a300: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
a310: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a320: 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b  pParse, pRight);
a330: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
a340: 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
a350: 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
a360: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
a370: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a380: 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b  , OP_And, 0, 0);
a390: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a3a0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a3b0: 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  UPLUS:.    case 
a3c0: 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73  TK_AS: {.      s
a3d0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a3e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a3f0: 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  eft);.      brea
a400: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
a410: 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20  e TK_CASE: {.   
a420: 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f     int expr_end_
a430: 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74  label;.      int
a440: 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20   jumpInst;.     
a450: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
a460: 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20   int nExpr;.    
a470: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45    int i;.      E
a480: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b  xprList *pEList;
a490: 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78  .      struct Ex
a4a0: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69  prList_item *aLi
a4b0: 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61  stelem;..      a
a4c0: 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69  ssert(pExpr->pLi
a4d0: 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  st);.      asser
a4e0: 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t((pExpr->pList-
a4f0: 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30  >nExpr % 2) == 0
a500: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
a510: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45  pExpr->pList->nE
a520: 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20  xpr > 0);.      
a530: 70 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e  pEList = pExpr->
a540: 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69  pList;.      aLi
a550: 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d  stelem = pEList-
a560: 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20  >a;.      nExpr 
a570: 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b  = pEList->nExpr;
a580: 0a 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f  .      expr_end_
a590: 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  label = sqlite3V
a5a0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
a5b0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
a5c0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
a5d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a5e0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a5f0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a600: 7d 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  }.      for(i=0;
a610: 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29   i<nExpr; i=i+2)
a620: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a630: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
a640: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70  , aListelem[i].p
a650: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69  Expr);.        i
a660: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
a670: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a680: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a690: 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a   OP_Dup, 1, 1);.
a6a0: 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e            jumpIn
a6b0: 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65  st = codeCompare
a6c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a6d0: 70 4c 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d  pLeft, aListelem
a6e0: 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20  [i].pExpr,.     
a6f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a700: 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e              OP_N
a710: 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20  e, 0, 1);.      
a720: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a730: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
a740: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  1, 0);.        }
a750: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20  else{.          
a760: 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74  jumpInst = sqlit
a770: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a780: 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a  P_IfNot, 1, 0);.
a790: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
a7a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a7b0: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
a7c0: 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b  lem[i+1].pExpr);
a7d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a7e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a7f0: 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e  Goto, 0, expr_en
a800: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
a810: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
a820: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
a830: 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  v);.        sqli
a840: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
a850: 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64  v, jumpInst, add
a860: 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  r);.      }.    
a870: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
a880: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  ft ){.        sq
a890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a8a0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
a8b0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
a8c0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
a8d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
a8e0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
a8f0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
a900: 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  t);.      }else{
a910: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a920: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a930: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
a940: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a950: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
a960: 4c 61 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e  Label(v, expr_en
a970: 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20  d_label);.      
a980: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
a990: 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a 20   case TK_RAISE: 
a9a0: 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50 61  {.      if( !pPa
a9b0: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20 29  rse->trigStack )
a9c0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
a9d0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
a9e0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a9f0: 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45 28           "RAISE(
aa00: 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75 73  ) may only be us
aa10: 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69 67  ed within a trig
aa20: 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a 20  ger-program");. 
aa30: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
aa40: 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72 6e 3b 0a  Err++;..return;.
aa50: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
aa60: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
aa70: 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20   == OE_Rollback 
aa80: 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43 6f  ||..  pExpr->iCo
aa90: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62 6f 72 74  lumn == OE_Abort
aaa0: 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e 69 43   ||..  pExpr->iC
aab0: 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69 6c  olumn == OE_Fail
aac0: 20 29 7b 0a 09 20 20 73 71 6c 69 74 65 33 56 64   ){..  sqlite3Vd
aad0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
aae0: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
aaf0: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
ab00: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  pExpr->token.z, 
ab30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b  pExpr->token.n);
ab40: 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 44  ..  sqlite3VdbeD
ab50: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
ab60: 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b 0a  .      } else {.
ab70: 09 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
ab80: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
ab90: 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20 73 71 6c  Ignore );..  sql
aba0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
abb0: 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61 72 73  P_Goto, 0, pPars
abc0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e 69 67  e->trigStack->ig
abd0: 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20 20 20 20  noreJump,.      
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 22 28 49 47 4e 4f 52 45 20 6a 75       "(IGNORE ju
ac00: 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20 20 20 20  mp)", 0);.      
ac10: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  }.    }.    brea
ac20: 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  k;.  }.}../*.** 
ac30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
ac40: 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61  at pushes the va
ac50: 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65  lue of every ele
ac60: 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65  ment of the give
ac70: 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  n.** expression 
ac80: 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73 74  list onto the st
ac90: 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72  ack..**.** Retur
aca0: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
acb0: 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64 20  elements pushed 
acc0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
acd0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ace0: 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a  prCodeExprList(.
acf0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
ad00: 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20       /* Parsing 
ad10: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70  context */.  Exp
ad20: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20 20  rList *pList    
ad30: 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  /* The expressio
ad40: 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64  n list to be cod
ad50: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  ed */.){.  struc
ad60: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
ad70: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
ad80: 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20   n;.  Vdbe *v;. 
ad90: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20   if( pList==0 ) 
ada0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20  return 0;.  v = 
adb0: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
adc0: 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c  Parse);.  n = pL
add0: 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f  ist->nExpr;.  fo
ade0: 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61  r(pItem=pList->a
adf0: 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c  , i=0; i<n; i++,
ae00: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
ae10: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ae20: 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45  Parse, pItem->pE
ae30: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
ae40: 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  rn n;.}../*.** G
ae50: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
ae60: 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65   a boolean expre
ae70: 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20  ssion such that 
ae80: 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a  a jump is made.*
ae90: 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22  * to the label "
aea0: 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78 70  dest" if the exp
aeb0: 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 20  ression is true 
aec0: 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a  but execution.**
aed0: 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69   continues strai
aee0: 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20  ght thru if the 
aef0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61  expression is fa
af00: 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  lse..**.** If th
af10: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61  e expression eva
af20: 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28  luates to NULL (
af30: 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72  neither true nor
af40: 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a   false), then.**
af50: 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20 69   take the jump i
af60: 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c  f the jumpIfNull
af70: 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a 2a   flag is true..*
af80: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
af90: 70 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a  prIfTrue(Parse *
afa0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
afb0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
afc0: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
afd0: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
afe0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
aff0: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
b000: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
b010: 29 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74  ) return;.  swit
b020: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
b030: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
b040: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
b050: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
b060: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20      case TK_LE: 
b070: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65        op = OP_Le
b080: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b090: 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20     case TK_GT:  
b0a0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b       op = OP_Gt;
b0b0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b0c0: 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20    case TK_GE:   
b0d0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20      op = OP_Ge; 
b0e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b0f0: 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20   case TK_NE:    
b100: 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20     op = OP_Ne;  
b110: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b120: 63 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20  case TK_EQ:     
b130: 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20    op = OP_Eq;   
b140: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b150: 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20  ase TK_ISNULL:  
b160: 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b   op = OP_IsNull;
b170: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b180: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20  se TK_NOTNULL:  
b190: 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b  op = OP_NotNull;
b1a0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
b1b0: 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20  ault:  break;.  
b1c0: 7d 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  }.  switch( pExp
b1d0: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
b1e0: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
b1f0: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
b200: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
b210: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
b220: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
b230: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b240: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
b250: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
b260: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
b270: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
b280: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
b290: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
b2a0: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
b2b0: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
b2c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b2d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
b2e0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b2f0: 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65  xprIfTrue(pParse
b300: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
b310: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
b320: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b330: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
b340: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
b350: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
b360: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
b370: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b380: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
b390: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
b3a0: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
b3b0: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
b3c0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b3d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b3e0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
b3f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
b400: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
b410: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
b420: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
b430: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
b440: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
b450: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b460: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b470: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b480: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b490: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
b4a0: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
b4b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b4c0: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
b4d0: 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75  ht, op, dest, ju
b4e0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
b4f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
b500: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
b510: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  :.    case TK_NO
b520: 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73  TNULL: {.      s
b530: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b540: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b550: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
b560: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b570: 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20  op, 1, dest);.  
b580: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54  .    case TK_BET
b5a0: 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a  WEEN: {.      /*
b5b0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
b5c0: 22 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44  "x BETWEEN y AND
b5d0: 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74   z" is implement
b5e0: 65 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a  ed as:.      **.
b5f0: 20 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78        ** 1 IF (x
b600: 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20   < y) GOTO 3.   
b610: 20 20 20 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d     ** 2 IF (x <=
b620: 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a   z) GOTO <dest>.
b630: 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20        ** 3 .... 
b640: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
b650: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
b660: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
b670: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
b680: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
b690: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
b6a0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
b6b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b6c0: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b6e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
b6f0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
b700: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b710: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
b720: 20 20 20 20 20 61 64 64 72 20 3d 20 63 6f 64 65       addr = code
b730: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
b740: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
b750: 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66  P_Lt, 0, !jumpIf
b760: 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52  Null);..      pR
b770: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
b780: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b  ist->a[1].pExpr;
b790: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b7a0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b7b0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f  Right);.      co
b7c0: 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
b7d0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
b7e0: 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75   OP_Le, dest, ju
b7f0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
b800: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b810: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
b820: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b830: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
b840: 50 32 28 76 2c 20 61 64 64 72 2c 20 73 71 6c 69  P2(v, addr, sqli
b850: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
b860: 64 72 28 76 29 29 3b 0a 20 20 20 20 20 20 73 71  dr(v));.      sq
b870: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b880: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
b890: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b8a0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
b8b0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b8c0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b8d0: 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73   pExpr);.      s
b8e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b8f0: 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66  v, OP_If, jumpIf
b900: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
b910: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b920: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
b930: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
b940: 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73   boolean express
b950: 69 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20  ion such that a 
b960: 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20  jump is made.** 
b970: 74 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65  to the label "de
b980: 73 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65  st" if the expre
b990: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 20 62  ssion is false b
b9a0: 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20  ut execution.** 
b9b0: 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67  continues straig
b9c0: 68 74 20 74 68 72 75 20 69 66 20 74 68 65 20 65  ht thru if the e
b9d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75  xpression is tru
b9e0: 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  e..**.** If the 
b9f0: 65 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75  expression evalu
ba00: 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65  ates to NULL (ne
ba10: 69 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66  ither true nor f
ba20: 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75  alse) then.** ju
ba30: 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c  mp if jumpIfNull
ba40: 20 69 73 20 74 72 75 65 20 6f 72 20 66 61 6c 6c   is true or fall
ba50: 20 74 68 72 6f 75 67 68 20 69 66 20 6a 75 6d 70   through if jump
ba60: 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e  IfNull is false.
ba70: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
ba80: 45 78 70 72 49 66 46 61 6c 73 65 28 50 61 72 73  ExprIfFalse(Pars
ba90: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
baa0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
bab0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
bac0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
bad0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
bae0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
baf0: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
bb00: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
bb10: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
bb20: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
bb30: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
bb40: 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ge;       brea
bb50: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
bb60: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
bb70: 5f 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Gt;       break
bb80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
bb90: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
bba0: 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Le;       break;
bbb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
bbc0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c         op = OP_L
bbd0: 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;       break;.
bbe0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
bbf0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71        op = OP_Eq
bc00: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
bc10: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
bc20: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b       op = OP_Ne;
bc30: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
bc40: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
bc50: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e  :   op = OP_NotN
bc60: 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20  ull;  break;.   
bc70: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
bc80: 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75 6c  :  op = OP_IsNul
bc90: 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  l;   break;.    
bca0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
bcb0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
bcc0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
bcd0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
bce0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
bcf0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
bd00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
bd10: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
bd20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bd30: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
bd40: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
bd50: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
bd60: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
bd70: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bd80: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69  TK_OR: {.      i
bd90: 6e 74 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56  nt d2 = sqlite3V
bda0: 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
bdb0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
bdc0: 70 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c  prIfTrue(pParse,
bdd0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64   pExpr->pLeft, d
bde0: 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  2, !jumpIfNull);
bdf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
be00: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
be10: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
be20: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
be30: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
be40: 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
be50: 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20  l(v, d2);.      
be60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
be70: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a   case TK_NOT: {.
be80: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
be90: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
bea0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65  pExpr->pLeft, de
beb0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
bec0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bed0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bee0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
bef0: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
bf00: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
bf10: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
bf20: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
bf30: 45 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  EQ: {.      sqli
bf40: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
bf50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bf60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bf70: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bf80: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
bf90: 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
bfa0: 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
bfb0: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
bfc0: 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74  pRight, op, dest
bfd0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
bfe0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
bff0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
c000: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
c010: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
c020: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
c030: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
c040: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
c050: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c060: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
c070: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
c080: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c090: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
c0a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
c0b0: 69 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45  ion is "x BETWEE
c0c0: 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69  N y AND z". It i
c0d0: 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73  s implemented as
c0e0: 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
c0f0: 20 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79   ** 1 IF (x >= y
c100: 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a  ) GOTO 3.      *
c110: 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a  * 2 GOTO <dest>.
c120: 20 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78        ** 3 IF (x
c130: 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74   > z) GOTO <dest
c140: 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  >.      */.     
c150: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c160: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
c170: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
c180: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
c190: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
c1a0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
c1b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c1c0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
c1d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c1e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
c1f0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
c200: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c210: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
c220: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
c230: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
c240: 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20  tAddr(v);.      
c250: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c260: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
c270: 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33  t, OP_Ge, addr+3
c280: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
c290: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c2a0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c2b0: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
c2c0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c2d0: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
c2e0: 64 65 73 74 29 3b 0a 20 20 20 20 20 20 70 52 69  dest);.      pRi
c2f0: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
c300: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a  st->a[1].pExpr;.
c310: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c320: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
c330: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
c340: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
c350: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
c360: 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d  OP_Gt, dest, jum
c370: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
c380: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c390: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c3a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c3b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
c3c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c3d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c3e0: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
c3f0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
c400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c410: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
c420: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
c430: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
c440: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
c450: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
c460: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
c470: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
c480: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
c490: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
c4a0: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
c4b0: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
c4c0: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
c4d0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c4e0: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
c4f0: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
c500: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
c510: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c520: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
c530: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
c540: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
c550: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
c560: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
c570: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
c580: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
c590: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
c5a0: 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
c5b0: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
c5c0: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
c5d0: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
c5e0: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
c5f0: 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
c600: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
c610: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
c620: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
c630: 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
c640: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c650: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
c660: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
c670: 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
c680: 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
c690: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
c6a0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c6b0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c6c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
c6d0: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
c6e0: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
c6f0: 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
c700: 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
c710: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
c720: 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
c730: 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
c740: 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
c750: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
c760: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
c770: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
c780: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
c790: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
c7a0: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
c7b0: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
c7c0: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
c7d0: 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  3StrNICmp(pA->to
c7e0: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
c7f0: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pB->token.n)
c800: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
c810: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
c820: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
c830: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
c840: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
c850: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
c860: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n its index..*/.
c870: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
c880: 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a  dAggInfo(Parse *
c890: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28  pParse){.  if( (
c8a0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30  pParse->nAgg & 0
c8b0: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  x7)==0 ){.    in
c8c0: 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e  t amt = pParse->
c8d0: 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67  nAgg + 8;.    Ag
c8e0: 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71  gExpr *aAgg = sq
c8f0: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72  liteRealloc(pPar
c900: 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69  se->aAgg, amt*si
c910: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
c920: 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  g[0]));.    if( 
c930: 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aAgg==0 ){.     
c940: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
c950: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  }.    pParse->aA
c960: 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20  gg = aAgg;.  }. 
c970: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
c980: 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41  >aAgg[pParse->nA
c990: 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  gg], 0, sizeof(p
c9a0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
c9b0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
c9c0: 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a  e->nAgg++;.}../*
c9d0: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
c9e0: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
c9f0: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
ca00: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ca10: 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
ca20: 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
ca30: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
ca40: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
ca50: 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
ca60: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
ca70: 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
ca80: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
ca90: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
caa0: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cab0: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
cac0: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
cad0: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
cae0: 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
caf0: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52   by sqlite3ExprR
cb00: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
cb10: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
cb20: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
cb30: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
cb40: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
cb50: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
cb60: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
cb70: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
cb80: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
cb90: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
cba0: 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70  regates(Parse *p
cbb0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
cbc0: 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
cbd0: 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20  AggExpr *aAgg;. 
cbe0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
cbf0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
cc00: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
cc10: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
cc20: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
cc30: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  LUMN: {.      aA
cc40: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
cc50: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
cc60: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
cc70: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cc80: 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67  if( aAgg[i].isAg
cc90: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
cca0: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
ccb0: 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ].pExpr->iTable=
ccc0: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20  =pExpr->iTable. 
ccd0: 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b          && aAgg[
cce0: 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
ccf0: 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
cd00: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
cd10: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
cd20: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
cd30: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
cd40: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
cd50: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
cd60: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
cd70: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
cd80: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
cd90: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
cda0: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
cdb0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
cdc0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
cdd0: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
cde0: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
cdf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ce00: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
ce10: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
ce20: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
ce30: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
ce40: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
ce50: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
ce60: 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d      if( !aAgg[i]
ce70: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
ce80: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
ce90: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
cea0: 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
ceb0: 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
cec0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ced0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
cee0: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
cef0: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
cf00: 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
cf10: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
cf20: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
cf30: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
cf40: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
cf50: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
cf60: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
cf70: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
cf80: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
cf90: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
cfa0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
cfb0: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
cfc0: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
cfd0: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
cfe0: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
cff0: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
d000: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
d010: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d020: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
d030: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d040: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
d050: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d060: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
d070: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d080: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
d090: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
d0a0: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d0b0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
d0c0: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d0d0: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d0e0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d0f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d100: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
d110: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d120: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
d130: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
d140: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
d150: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d160: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d170: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
d180: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
d190: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
d1a0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d1b0: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
d1c0: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d1d0: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
d1e0: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
d1f0: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
d200: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
d210: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
d220: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
d230: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d240: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d250: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d260: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
d270: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
d280: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
d290: 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20  n given a name, 
d2a0: 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  a number of argu
d2b0: 6d 65 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67  ments and a flag
d2c0: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77  .** indicating w
d2d0: 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
d2e0: 69 6f 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d  ion prefers UTF-
d2f0: 31 36 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20  16 over UTF-8.  
d300: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
d310: 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
d320: 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
d330: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 20 66  t defines that f
d340: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
d350: 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68  rn.** NULL if th
d360: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
d370: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
d380: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
d390: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
d3a0: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
d3b0: 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a  (blank) FuncDef.
d3c0: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
d3d0: 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65  created and like
d3e0: 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20  d into the "db" 
d3f0: 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a  structure if a.*
d400: 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75  * no matching fu
d410: 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  nction previousl
d420: 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e  y existed.  When
d430: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74   createFlag is t
d440: 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  rue.** and the n
d450: 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Arg parameter is
d460: 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61   -1, then only a
d470: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61   function that a
d480: 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75  ccepts.** any nu
d490: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d4a0: 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  s will be return
d4b0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65  ed..**.** If cre
d4c0: 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65  ateFlag is false
d4d0: 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c   and nArg is -1,
d4e0: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
d4f0: 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f  valid.** functio
d500: 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72  n found is retur
d510: 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e  ned.  A function
d520: 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74   is valid if eit
d530: 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20  her xFunc.** or 
d540: 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  xStep is non-zer
d550: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  o..**.** If crea
d560: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c  teFlag is false,
d570: 20 74 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e   then a function
d580: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
d590: 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e  ed name and.** n
d5a0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d5b0: 74 73 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  ts may be return
d5c0: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 65  ed even if the e
d5d0: 54 65 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65  TextRep flag doe
d5e0: 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74  s not.** match t
d5f0: 68 61 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a  hat requested..*
d600: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
d610: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a  e3FindFunction(.
d620: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
d630: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
d640: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
d650: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
d660: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
d670: 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e  function.  Not n
d680: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a  ull-terminated *
d690: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20  /.  int nName,  
d6a0: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d6b0: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
d6c0: 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  n the name */.  
d6d0: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
d6e0: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d6f0: 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d  arguments.  -1 m
d700: 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20  eans any number 
d710: 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20  */.  u8 enc,    
d720: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65          /* Prefe
d730: 72 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69  rred text encodi
d740: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  ng */.  int crea
d750: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
d760: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
d770: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
d780: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
d790: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
d7a0: 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Def *p;         
d7b0: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
d7c0: 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  able */.  FuncDe
d7d0: 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a  f *pFirst;    /*
d7e0: 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   First function 
d7f0: 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a  with this name *
d800: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65  /.  FuncDef *pBe
d810: 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20  st = 0; /* Best 
d820: 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66  match found so f
d830: 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  ar */.  int best
d840: 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20  match = 0;  ... 
d850: 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51   assert( enc==SQ
d860: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
d870: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
d880: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
d890: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
d8a0: 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20   nArg<-1 ) nArg 
d8b0: 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20  = -1;..  pFirst 
d8c0: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
d8d0: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
d8e0: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
d8f0: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  Name);.  for(p=p
d900: 46 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  First; p; p=p->p
d910: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75  Next){.    /* Du
d920: 72 69 6e 67 20 74 68 65 20 73 65 61 72 63 68 20  ring the search 
d930: 66 6f 72 20 74 68 65 20 62 65 73 74 20 66 75 6e  for the best fun
d940: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
d950: 2c 20 62 65 73 74 6d 61 74 63 68 20 69 73 20 73  , bestmatch is s
d960: 65 74 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c  et.    ** as fol
d970: 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lows to indicate
d980: 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
d990: 74 68 65 20 6d 61 74 63 68 20 77 69 74 68 20 74  the match with t
d9a0: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20  he definition.  
d9b0: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
d9c0: 62 79 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a  by pBest:.    **
d9d0: 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74  .    ** 0: pBest
d9e0: 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74   is NULL. No mat
d9f0: 63 68 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e  ch has been foun
da00: 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76  d..    ** 1: A v
da10: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
da20: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
da30: 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77 68  prefers UTF-8 wh
da40: 65 6e 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20  en a UTF-16.    
da50: 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69  **    encoding i
da60: 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
da70: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
da80: 2a 2a 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 2: A variable
da90: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
daa0: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 55 54  ion that uses UT
dab0: 46 2d 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d  F-16BE when UTF-
dac0: 31 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20  16LE is.    **  
dad0: 20 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20    requested, or 
dae0: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
daf0: 2a 2a 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 3: A variable
db00: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
db10: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61  ion using the sa
db20: 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  me text encoding
db30: 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75  ..    ** 4: A fu
db40: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
db50: 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  exact number of 
db60: 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73  arguments reques
db70: 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ted that.    ** 
db80: 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d 38     prefers UTF-8
db90: 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   when a UTF-16 e
dba0: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65  ncoding is reque
dbb0: 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65  sted, or vice ve
dbc0: 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41  rsa..    ** 5: A
dbd0: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
dbe0: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20  he exact number 
dbf0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71  of arguments req
dc00: 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20  uested that.    
dc10: 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54  **    prefers UT
dc20: 46 2d 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d  F-16LE when UTF-
dc30: 31 36 42 45 20 69 73 20 72 65 71 75 65 73 74 65  16BE is requeste
dc40: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
dc50: 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65  ..    ** 6: An e
dc60: 78 61 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20  xact match..    
dc70: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67  **.    ** A larg
dc80: 65 72 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74  er value of 'mat
dc90: 63 68 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65  chqual' indicate
dca0: 73 20 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62  s a more desirab
dcb0: 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f  le match..    */
dcc0: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  .    if( p->nArg
dcd0: 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d  ==-1 || p->nArg=
dce0: 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d  =nArg || nArg==-
dcf0: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d  1 ){.      int m
dd00: 61 74 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20  atch = 1;       
dd10: 20 20 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66     /* Quality of
dd20: 20 74 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20   this match */. 
dd30: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67       if( p->nArg
dd40: 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d  ==nArg || nArg==
dd50: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  -1 ){.        ma
dd60: 74 63 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d  tch = 4;.      }
dd70: 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d  .      if( enc==
dd80: 70 2d 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20  p->iPrefEnc ){. 
dd90: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20         match += 
dda0: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
ddb0: 20 65 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d   else if( (enc==
ddc0: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26  SQLITE_UTF16LE &
ddd0: 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53  & p->iPrefEnc==S
dde0: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c  QLITE_UTF16BE) |
ddf0: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
de00: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
de10: 46 31 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65  F16BE && p->iPre
de20: 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
de30: 31 36 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  16LE) ){.       
de40: 20 6d 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20   match += 1;.   
de50: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
de60: 6d 61 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20  match>bestmatch 
de70: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  ){.        pBest
de80: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65   = p;.        be
de90: 73 74 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b  stmatch = match;
dea0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
deb0: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
dec0: 63 72 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d  createFlag param
ded0: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e  eter is true, an
dee0: 64 20 74 68 65 20 73 65 61 63 68 20 64 69 64 20  d the seach did 
def0: 6e 6f 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20  not reveal an.  
df00: 2a 2a 20 65 78 61 63 74 20 6d 61 74 63 68 20 66  ** exact match f
df10: 6f 72 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d  or the name, num
df20: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
df30: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74   and encoding, t
df40: 68 65 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e  hen add a.  ** n
df50: 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  ew entry to the 
df60: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72  hash table and r
df70: 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20  eturn it..  */. 
df80: 20 69 66 28 20 63 72 65 61 74 65 46 6c 61 67 20   if( createFlag 
df90: 26 26 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26  && bestmatch<6 &
dfa0: 26 20 0a 20 20 20 20 20 20 28 70 42 65 73 74 20  & .      (pBest 
dfb0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
dfc0: 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e  izeof(*pBest)+nN
dfd0: 61 6d 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70  ame+1)) ){.    p
dfe0: 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72  Best->nArg = nAr
dff0: 67 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e  g;.    pBest->pN
e000: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
e010: 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d    pBest->zName =
e020: 20 28 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31   (char*)&pBest[1
e030: 5d 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50  ];.    pBest->iP
e040: 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20  refEnc = enc;.  
e050: 20 20 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e    memcpy(pBest->
e060: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
e070: 61 6d 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d  ame);.    pBest-
e080: 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20  >zName[nName] = 
e090: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  0;.    sqlite3Ha
e0a0: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46  shInsert(&db->aF
e0b0: 75 6e 63 2c 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  unc, pBest->zNam
e0c0: 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a  e, nName, (void*
e0d0: 29 70 42 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  )pBest);.  }..  
e0e0: 69 66 28 20 70 42 65 73 74 20 26 26 20 28 70 42  if( pBest && (pB
e0f0: 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42  est->xStep || pB
e100: 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72  est->xFunc || cr
e110: 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20  eateFlag) ){.   
e120: 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20   return pBest;. 
e130: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e140: 0a                                               .