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

Artifact f4a883c00ff3fea1aa2bae4694c3b3984dcf6757:


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 34 20 32 30 30 34 2f 30 38 2f 30 38 20  .154 2004/08/08 
0220: 32 30 3a 32 32 3a 31 37 20 64 72 68 20 45 78 70  20:22:17 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 75 38 20 2a 7a 20 3d 20 28 75 38  onst u8 *z = (u8
3d20: 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  *)p->token.z;.  
3d30: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d 3e 74      int n = p->t
3d40: 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 69 66  oken.n;.      if
3d50: 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d 3d 27  ( n>0 && z[0]=='
3d60: 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20  -' ){ z++; n--; 
3d70: 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28 20 6e  }.      while( n
3d80: 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73 64 69  >0 && *z && isdi
3d90: 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b 3b 20  git(*z) ){ z++; 
3da0: 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69 66 28  n--; }.      if(
3db0: 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74 65 33   n==0 && sqlite3
3dc0: 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65  GetInt32(p->toke
3dd0: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
3de0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3df0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3e00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3e10: 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20   case TK_UPLUS: 
3e20: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
3e30: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
3e40: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56  ger(p->pLeft, pV
3e50: 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20 20  alue);.    }.   
3e60: 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
3e70: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b 0a   {.      int v;.
3e80: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
3e90: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
3ea0: 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b 0a  ->pLeft, &v) ){.
3eb0: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
3ec0: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 65  = -v;.        re
3ed0: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a  turn 1;.      }.
3ee0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
3ef0: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
3f00: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74  break;.  }.  ret
3f10: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
3f20: 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20 74  Return TRUE if t
3f30: 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67 20  he given string 
3f40: 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c 75  is a row-id colu
3f50: 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74 20  mn name..*/.int 
3f60: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 63  sqlite3IsRowid(c
3f70: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a 20  onst char *z){. 
3f80: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
3f90: 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f 22  Cmp(z, "_ROWID_"
3fa0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
3fb0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
3fc0: 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44 22  rICmp(z, "ROWID"
3fd0: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
3fe0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
3ff0: 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29 3d  rICmp(z, "OID")=
4000: 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  =0 ) return 1;. 
4010: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
4020: 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e 61  .** Given the na
4030: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20 6f  me of a column o
4040: 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e 5a  f the form X.Y.Z
4050: 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74 20   or Y.Z or just 
4060: 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74 68  Z, look up.** th
4070: 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20 73  at name in the s
4080: 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61 62  et of source tab
4090: 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74 20  les in pSrcList 
40a0: 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45 78  and make the pEx
40b0: 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  pr .** expressio
40c0: 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61 63  n node refer bac
40d0: 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63 65  k to that source
40e0: 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66 6f   column.  The fo
40f0: 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73 0a  llowing changes.
4100: 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20 70  ** are made to p
4110: 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 70  Expr:.**.**    p
4120: 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20 20  Expr->iDb       
4130: 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64 65      Set the inde
4140: 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20 6f  x in db->aDb[] o
4150: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 68  f the database h
4160: 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20 20  olding.**       
4170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
4180: 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20    the table..** 
4190: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
41a0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74          Set to t
41b0: 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  he cursor number
41c0: 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20 6f   for the table o
41d0: 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20 20  btained.**      
41e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
41f0: 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73 74     from pSrcList
4200: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
4210: 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65 74  Column       Set
4220: 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e   to the column n
4230: 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68 65  umber within the
4240: 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45   table..**    pE
4250: 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20  xpr->op         
4260: 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f 4c     Set to TK_COL
4270: 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72  UMN..**    pExpr
4280: 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20 20  ->pLeft         
4290: 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74  Any expression t
42a0: 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73  his points to is
42b0: 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20 70   deleted.**    p
42c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20 20  Expr->pRight    
42d0: 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73 69      Any expressi
42e0: 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74  on this points t
42f0: 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a 2a  o is deleted..**
4300: 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65 6e  .** The pDbToken
4310: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
4320: 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74 68  the database (th
4330: 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76 61  e "X").  This va
4340: 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e 55  lue may be.** NU
4350: 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74 20  LL meaning that 
4360: 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20 66  name is of the f
4370: 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20 41  orm Y.Z or Z.  A
4380: 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61 74  ny available dat
4390: 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65 20  abase.** can be 
43a0: 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62 6c  used.  The pTabl
43b0: 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61  eToken is the na
43c0: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  me of the table 
43d0: 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69 73  (the "Y").  This
43e0: 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62 65  .** value can be
43f0: 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b 65   NULL if pDbToke
4400: 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e 20  n is also NULL. 
4410: 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20   If pTableToken 
4420: 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d 65  is NULL it.** me
4430: 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f 72  ans that the for
4440: 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69 73  m of the name is
4450: 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c 75   Z and that colu
4460: 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61 62  mns from any tab
4470: 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73 65  le.** can be use
4480: 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  d..**.** If the 
4490: 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20 72  name cannot be r
44a0: 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67 75  esolved unambigu
44b0: 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e 20  ously, leave an 
44c0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a 2a  error message.**
44d0: 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20 72   in pParse and r
44e0: 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e 20  eturn non-zero. 
44f0: 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e 20   Return zero on 
4500: 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61 74  success..*/.stat
4510: 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61 6d  ic int lookupNam
4520: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
4530: 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  se,      /* The 
4540: 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20  parsing context 
4550: 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62 54  */.  Token *pDbT
4560: 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61 6d  oken,     /* Nam
4570: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
4580: 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61 62  e containing tab
4590: 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  le, or NULL */. 
45a0: 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54 6f   Token *pTableTo
45b0: 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f 66  ken,  /* Name of
45c0: 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69 6e   table containin
45d0: 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55 4c  g column, or NUL
45e0: 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 43  L */.  Token *pC
45f0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20 4e  olumnToken, /* N
4600: 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  ame of the colum
4610: 6e 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  n. */.  SrcList 
4620: 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 2f 2a 20  *pSrcList,   /* 
4630: 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75  List of tables u
4640: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63  sed to resolve c
4650: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
4660: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
4670: 74 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66  t,    /* List of
4680: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 65   expressions use
4690: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41 53  d to resolve "AS
46a0: 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78  " */.  Expr *pEx
46b0: 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d  pr          /* M
46c0: 61 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f  ake this EXPR no
46d0: 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  de point to the 
46e0: 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20  selected column 
46f0: 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44  */.){.  char *zD
4700: 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20  b = 0;       /* 
4710: 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61  Name of the data
4720: 62 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69  base.  The "X" i
4730: 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61  n X.Y.Z */.  cha
4740: 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20  r *zTab = 0;    
4750: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
4760: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22   table.  The "Y"
4770: 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a   in X.Y.Z or Y.Z
4780: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c   */.  char *zCol
4790: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
47a0: 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e  me of the column
47b0: 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20  .  The "Z" */.  
47c0: 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20  int i, j;       
47d0: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75       /* Loop cou
47e0: 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63  nters */.  int c
47f0: 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  nt = 0;         
4800: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74  /* Number of mat
4810: 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ching column nam
4820: 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54  es */.  int cntT
4830: 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ab = 0;      /* 
4840: 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69  Number of matchi
4850: 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a  ng table names *
4860: 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 20 3d  /.  sqlite *db =
4870: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
4880: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
4890: 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c  ..  assert( pCol
48a0: 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c  umnToken && pCol
48b0: 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f  umnToken->z ); /
48c0: 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a  * The Z in X.Y.Z
48d0: 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20   cannot be NULL 
48e0: 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74  */.  zDb = sqlit
48f0: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
4900: 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61  pDbToken);.  zTa
4910: 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46  b = sqlite3NameF
4920: 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54  romToken(pTableT
4930: 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20  oken);.  zCol = 
4940: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
4950: 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65  oken(pColumnToke
4960: 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  n);.  if( sqlite
4970: 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20  3_malloc_failed 
4980: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b  ){.    return 1;
4990: 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72 79    /* Leak memory
49a0: 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62 29 20   (zDb and zTab) 
49b0: 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
49c0: 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28  */.  }.  assert(
49d0: 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69   zTab==0 || pELi
49e0: 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45 78 70  st==0 );..  pExp
49f0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31 3b 0a  r->iTable = -1;.
4a00: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 53 72    for(i=0; i<pSr
4a10: 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69 2b 2b  cList->nSrc; i++
4a20: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
4a30: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
4a40: 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d 3e 61  m = &pSrcList->a
4a50: 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a  [i];.    Table *
4a60: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
4a70: 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ab;.    Column *
4a80: 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28 20 70  pCol;..    if( p
4a90: 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75  Tab==0 ) continu
4aa0: 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  e;.    assert( p
4ab0: 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20  Tab->nCol>0 );. 
4ac0: 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20     if( zTab ){. 
4ad0: 20 20 20 20 20 69 66 28 20 70 49 74 65 6d 2d 3e       if( pItem->
4ae0: 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20 20 20  zAlias ){.      
4af0: 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65    char *zTabName
4b00: 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73   = pItem->zAlias
4b10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  ;.        if( sq
4b20: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
4b30: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
4b40: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4b50: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
4b60: 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20   char *zTabName 
4b70: 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b 0a 20  = pTab->zName;. 
4b80: 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62 4e         if( zTabN
4b90: 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65  ame==0 || sqlite
4ba0: 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d  3StrICmp(zTabNam
4bb0: 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f  e, zTab)!=0 ) co
4bc0: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4bd0: 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71  if( zDb!=0 && sq
4be0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d  lite3StrICmp(db-
4bf0: 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e  >aDb[pTab->iDb].
4c00: 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29  zName, zDb)!=0 )
4c10: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 74  {.          cont
4c20: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 7d 0a  inue;.        }.
4c30: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4c40: 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54 61 62    if( 0==(cntTab
4c50: 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70 45 78  ++) ){.      pEx
4c60: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
4c70: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
4c80: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
4c90: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 7d  pTab->iDb;.    }
4ca0: 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43  .    for(j=0, pC
4cb0: 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a  ol=pTab->aCol; j
4cc0: 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b  <pTab->nCol; j++
4cd0: 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20  , pCol++){.     
4ce0: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4cf0: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
4d00: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
4d10: 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20       cnt++;.    
4d20: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
4d30: 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73  e = pItem->iCurs
4d40: 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70  or;.        pExp
4d50: 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  r->iDb = pTab->i
4d60: 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53  Db;.        /* S
4d70: 75 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f  ubstitute the ro
4d80: 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20  wid (column -1) 
4d90: 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20  for the INTEGER 
4da0: 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20  PRIMARY KEY */. 
4db0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
4dc0: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
4dd0: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
4de0: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4df0: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
4e00: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
4e10: 79 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  y;.        pExpr
4e20: 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e  ->pColl = pTab->
4e30: 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20  aCol[j].pColl;. 
4e40: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
4e50: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a      }.    }.  }.
4e60: 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65  .  /* If we have
4e70: 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73   not already res
4e80: 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20  olved the name, 
4e90: 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a  then maybe .  **
4ea0: 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f   it is a new.* o
4eb0: 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20  r old.* trigger 
4ec0: 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e  argument referen
4ed0: 63 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44  ce.  */.  if( zD
4ee0: 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d 30 20  b==0 && zTab!=0 
4ef0: 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70 50 61  && cnt==0 && pPa
4f00: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d  rse->trigStack!=
4f10: 30 20 29 7b 0a 20 20 20 20 54 72 69 67 67 65 72  0 ){.    Trigger
4f20: 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65 72 53  Stack *pTriggerS
4f30: 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74  tack = pParse->t
4f40: 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20 54 61  rigStack;.    Ta
4f50: 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20  ble *pTab = 0;. 
4f60: 20 20 20 69 66 28 20 70 54 72 69 67 67 65 72 53     if( pTriggerS
4f70: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20  tack->newIdx != 
4f80: 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  -1 && sqlite3Str
4f90: 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62  ICmp("new", zTab
4fa0: 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20  ) == 0 ){.      
4fb0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
4fc0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
4fd0: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 61 73 73  ewIdx;.      ass
4fe0: 65 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61  ert( pTriggerSta
4ff0: 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20  ck->pTab );.    
5000: 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65    pTab = pTrigge
5010: 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20  rStack->pTab;.  
5020: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69    }else if( pTri
5030: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
5040: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
5050: 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c  e3StrICmp("old",
5060: 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20   zTab) == 0 ){. 
5070: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
5080: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
5090: 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20  ck->oldIdx;.    
50a0: 20 20 61 73 73 65 72 74 28 20 70 54 72 69 67 67    assert( pTrigg
50b0: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b  erStack->pTab );
50c0: 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54  .      pTab = pT
50d0: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61  riggerStack->pTa
50e0: 62 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 69 66  b;.    }..    if
50f0: 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20  ( pTab ){ .     
5100: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f   int j;.      Co
5110: 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61  lumn *pCol = pTa
5120: 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a  b->aCol;.      .
5130: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62        pExpr->iDb
5140: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
5150: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
5160: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c      for(j=0; j <
5170: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b   pTab->nCol; j++
5180: 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20  , pCol++) {.    
5190: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
51a0: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
51b0: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
51c0: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
51d0: 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72  .          pExpr
51e0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70  ->iColumn = j==p
51f0: 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20  Tab->iPKey ? -1 
5200: 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 70  : j;.          p
5210: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
5220: 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61   pTab->aCol[j].a
5230: 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20  ffinity;.       
5240: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
5250: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
5260: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
5270: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
5280: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
5290: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50    }..  /*.  ** P
52a0: 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20  erhaps the name 
52b0: 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  is a reference t
52c0: 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20 2a 2f  o the ROWID.  */
52d0: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26  .  if( cnt==0 &&
52e0: 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71   cntTab==1 && sq
52f0: 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f  lite3IsRowid(zCo
5300: 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20  l) ){.    cnt = 
5310: 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  1;.    pExpr->iC
5320: 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20  olumn = -1;.    
5330: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
5340: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  = SQLITE_AFF_INT
5350: 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a  EGER;.  }..  /*.
5360: 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75    ** If the inpu
5370: 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  t is of the form
5380: 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58   Z (not Y.Z or X
5390: 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e  .Y.Z) then the n
53a0: 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74  ame Z.  ** might
53b0: 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73   refer to an res
53c0: 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20  ult-set alias.  
53d0: 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f  This happens, fo
53e0: 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a  r example, when.
53f0: 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f    ** we are reso
5400: 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74  lving names in t
5410: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
5420: 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  of the following
5430: 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20   command:.  **. 
5440: 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61   **     SELECT a
5450: 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62  +b AS x FROM tab
5460: 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20  le WHERE x<10;. 
5470: 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65   **.  ** In case
5480: 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70  s like this, rep
5490: 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20  lace pExpr with 
54a0: 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78  a copy of the ex
54b0: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20  pression that.  
54c0: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
54d0: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
54e0: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
54f0: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
5500: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a  immediately..  *
5510: 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20  * Note that the 
5520: 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68  expression in th
5530: 65 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f  e result set sho
5540: 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79  uld have already
5550: 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c   been.  ** resol
5560: 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20  ved by the time 
5570: 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65  the WHERE clause
5580: 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20   is resolved..  
5590: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
55a0: 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a  && pEList!=0 ){.
55b0: 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70      for(j=0; j<p
55c0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b  EList->nExpr; j+
55d0: 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a  +){.      char *
55e0: 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b  zAs = pEList->a[
55f0: 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  j].zName;.      
5600: 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71  if( zAs!=0 && sq
5610: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73  lite3StrICmp(zAs
5620: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
5630: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45        assert( pE
5640: 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26  xpr->pLeft==0 &&
5650: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d   pExpr->pRight==
5660: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78  0 );.        pEx
5670: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
5680: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
5690: 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20  Column = j;.    
56a0: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74      pExpr->pLeft
56b0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
56c0: 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70  p(pEList->a[j].p
56d0: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73  Expr);.        s
56e0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
56f0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
5700: 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d   zTab==0 && zDb=
5710: 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65  =0 );.        re
5720: 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a  turn 0;.      }.
5730: 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a      } .  }..  /*
5740: 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59  .  ** If X and Y
5750: 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74   are NULL (in ot
5760: 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c  her words if onl
5770: 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d  y the column nam
5780: 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70  e Z is.  ** supp
5790: 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61  lied) and the va
57a0: 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c  lue of Z is encl
57b0: 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71  osed in double-q
57c0: 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a  uotes, then.  **
57d0: 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c   Z is a string l
57e0: 69 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65  iteral if it doe
57f0: 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63  sn't match any c
5800: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e  olumn names.  In
5810: 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c   that.  ** case,
5820: 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75   we need to retu
5830: 72 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e  rn right away an
5840: 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63  d not make any c
5850: 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70  hanges to.  ** p
5860: 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  Expr..  */.  if(
5870: 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d   cnt==0 && zTab=
5880: 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  =0 && pColumnTok
5890: 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b  en->z[0]=='"' ){
58a0: 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28  .    sqliteFree(
58b0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72  zCol);.    retur
58c0: 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  n 0;.  }..  /*. 
58d0: 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73   ** cnt==0 means
58e0: 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d   there was not m
58f0: 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61  atch.  cnt>1 mea
5900: 6e 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77  ns there were tw
5910: 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d  o or.  ** more m
5920: 61 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20  atches.  Either 
5930: 77 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20  way, we have an 
5940: 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66  error..  */.  if
5950: 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20  ( cnt!=1 ){.    
5960: 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20  char *z = 0;.   
5970: 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20   char *zErr;.   
5980: 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f   zErr = cnt==0 ?
5990: 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e   "no such column
59a0: 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f  : %s" : "ambiguo
59b0: 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  us column name: 
59c0: 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62  %s";.    if( zDb
59d0: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
59e0: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
59f0: 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22  Db, ".", zTab, "
5a00: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
5a10: 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62    }else if( zTab
5a20: 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   ){.      sqlite
5a30: 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a  3SetString(&z, z
5a40: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
5a50: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  0);.    }else{. 
5a60: 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53       z = sqliteS
5a70: 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20  trDup(zCol);.   
5a80: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72   }.    sqlite3Er
5a90: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a  rorMsg(pParse, z
5aa0: 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c  Err, z);.    sql
5ab0: 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a  iteFree(z);.  }.
5ac0: 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61  .  /* Clean up a
5ad0: 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20  nd return.  */. 
5ae0: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29   sqliteFree(zDb)
5af0: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a  ;.  sqliteFree(z
5b00: 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  Tab);.  sqliteFr
5b10: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69  ee(zCol);.  sqli
5b20: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
5b30: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70  xpr->pLeft);.  p
5b40: 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b  Expr->pLeft = 0;
5b50: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
5b60: 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67  lete(pExpr->pRig
5b70: 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52  ht);.  pExpr->pR
5b80: 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70  ight = 0;.  pExp
5b90: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d  r->op = TK_COLUM
5ba0: 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68  N;.  sqlite3Auth
5bb0: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
5bc0: 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a 20  pr, pSrcList);. 
5bd0: 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a   return cnt!=1;.
5be0: 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f  }../*.** This ro
5bf0: 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65  utine walks an e
5c00: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61  xpression tree a
5c10: 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65  nd resolves refe
5c20: 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62  rences to.** tab
5c30: 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64  le columns.  Nod
5c40: 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49  es of the form I
5c50: 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c  D.ID or ID resol
5c60: 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e  ve into an.** in
5c70: 64 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65  dex to the table
5c80: 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69   in the table li
5c90: 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20  st and a column 
5ca0: 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a  offset.  The .**
5cb0: 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72   Expr.opcode for
5cc0: 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63   such nodes is c
5cd0: 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c  hanged to TK_COL
5ce0: 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69  UMN.  The Expr.i
5cf0: 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69  Table.** value i
5d00: 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65  s changed to the
5d10: 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65   index of the re
5d20: 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69  ferenced table i
5d30: 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c  n pTabList.** pl
5d40: 75 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61  us the "base" va
5d50: 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76  lue.  The base v
5d60: 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61  alue will ultima
5d70: 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a  tely become the.
5d80: 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e  ** VDBE cursor n
5d90: 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73  umber for a curs
5da0: 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74  or that is point
5db0: 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66  ing into the ref
5dc0: 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65  erenced.** table
5dd0: 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c  .  The Expr.iCol
5de0: 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61  umn value is cha
5df0: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
5e00: 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  x of the column 
5e10: 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72  .** of the refer
5e20: 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68  enced table.  Th
5e30: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
5e40: 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65  alue for the spe
5e50: 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f  cial.** ROWID co
5e60: 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79  lumn is -1.  Any
5e70: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
5e80: 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74   KEY column is t
5e90: 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c  ried as an.** al
5ea0: 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a  ias for ROWID..*
5eb0: 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68 65  *.** We also che
5ec0: 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73  ck for instances
5ed0: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
5ee0: 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69  tor.  IN comes i
5ef0: 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a  n two.** forms:.
5f00: 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  **.**           
5f10: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
5f20: 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20  t).** and.**    
5f30: 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28         expr IN (
5f40: 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a  SELECT ...).**.*
5f50: 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d  * The first form
5f60: 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63   is handled by c
5f70: 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f  reating a set ho
5f80: 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a  lding the list.*
5f90: 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c  * of allowed val
5fa0: 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64  ues.  The second
5fb0: 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65   form causes the
5fc0: 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72   SELECT to gener
5fd0: 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72  ate .** a tempor
5fe0: 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ary table..**.**
5ff0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c   This routine al
6000: 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61  so looks for sca
6010: 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61 74  lar SELECTs that
6020: 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20   are part of an 
6030: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49  expression..** I
6040: 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c 20  f it finds any, 
6050: 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64  it generates cod
6060: 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 76  e to write the v
6070: 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65 6c  alue of that sel
6080: 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65  ect.** into a me
6090: 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a  mory cell..**.**
60a0: 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73   Unknown columns
60b0: 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76 6f   or tables provo
60c0: 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68  ke an error.  Th
60d0: 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72  e function retur
60e0: 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  ns.** the number
60f0: 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20   of errors seen 
6100: 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65 72  and leaves an er
6110: 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 70  ror message on p
6120: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a  Parse->zErrMsg..
6130: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
6140: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20  prResolveIds(.  
6150: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
6160: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72     /* The parser
6170: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72   context */.  Sr
6180: 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 2c  cList *pSrcList,
6190: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
61a0: 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  es used to resol
61b0: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
61c0: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
61d0: 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20  EList,  /* List 
61e0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  of expressions u
61f0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22  sed to resolve "
6200: 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  AS" */.  Expr *p
6210: 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54  Expr        /* T
6220: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f  he expression to
6230: 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f   be analyzed. */
6240: 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20  .){.  int i;..  
6250: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20  if( pExpr==0 || 
6260: 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65  pSrcList==0 ) re
6270: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
6280: 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  0; i<pSrcList->n
6290: 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61  Src; i++){.    a
62a0: 73 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d  ssert( pSrcList-
62b0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30  >a[i].iCursor>=0
62c0: 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b   && pSrcList->a[
62d0: 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73  i].iCursor<pPars
62e0: 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20  e->nTab );.  }. 
62f0: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
6300: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75  op ){.    /* Dou
6310: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
6320: 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61  gs (ex: "abc") a
6330: 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74  re used as ident
6340: 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a  ifiers if.    **
6350: 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65   possible.  Othe
6360: 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69  rwise they remai
6370: 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53  n as strings.  S
6380: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20  ingle-quoted.   
6390: 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a   ** strings (ex:
63a0: 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61   'abc') are alwa
63b0: 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61  ys string litera
63c0: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
63d0: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
63e0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
63f0: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c  ->token.z[0]=='\
6400: 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  '' ) break;.    
6410: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
6420: 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61  nto the TK_ID ca
6430: 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  se if this is a 
6440: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
6450: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ring */.    }.  
6460: 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e    /* A lone iden
6470: 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61  tifier is the na
6480: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e  me of a columnd.
6490: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65  .    */.    case
64a0: 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20   TK_ID: {.      
64b0: 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70  if( lookupName(p
64c0: 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45  Parse, 0, 0, &pE
64d0: 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63  xpr->token, pSrc
64e0: 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45  List, pEList, pE
64f0: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
6500: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
6510: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a  }.      break; .
6520: 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20      }.  .    /* 
6530: 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64  A table name and
6540: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20   column name:   
6550: 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f    ID.ID.    ** O
6560: 72 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61  r a database, ta
6570: 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20  ble and column: 
6580: 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f   ID.ID.ID.    */
6590: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54  .    case TK_DOT
65a0: 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  : {.      Token 
65b0: 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20  *pColumn;.      
65c0: 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20  Token *pTable;. 
65d0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b       Token *pDb;
65e0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
65f0: 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69 67  ght;..      pRig
6600: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67  ht = pExpr->pRig
6610: 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52  ht;.      if( pR
6620: 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20  ight->op==TK_ID 
6630: 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d  ){.        pDb =
6640: 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62   0;.        pTab
6650: 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65  le = &pExpr->pLe
6660: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
6670: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
6680: 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  ight->token;.   
6690: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
66a0: 20 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74    assert( pRight
66b0: 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a  ->op==TK_DOT );.
66c0: 20 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70          pDb = &p
66d0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
66e0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62  en;.        pTab
66f0: 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c  le = &pRight->pL
6700: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
6710: 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70      pColumn = &p
6720: 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74  Right->pRight->t
6730: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20  oken;.      }.  
6740: 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61      if( lookupNa
6750: 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20  me(pParse, pDb, 
6760: 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c  pTable, pColumn,
6770: 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70 45   pSrcList, 0, pE
6780: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
6790: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
67a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
67b0: 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54     }..    case T
67c0: 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68  K_IN: {.      ch
67d0: 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  ar affinity;.   
67e0: 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c     Vdbe *v = sql
67f0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
6800: 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e  se);.      KeyIn
6810: 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20 20 20  fo keyInfo;.    
6820: 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20    int addr;     
6830: 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20 6f 66     /* Address of
6840: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69 6e 73   OP_OpenTemp ins
6850: 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 20  truction */..   
6860: 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65     if( v==0 ) re
6870: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66  turn 1;.      if
6880: 28 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  ( sqlite3ExprRes
6890: 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20  olveIds(pParse, 
68a0: 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74  pSrcList, pEList
68b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20  , pExpr->pLeft) 
68c0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
68d0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
68e0: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71     affinity = sq
68f0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
6900: 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  y(pExpr->pLeft);
6910: 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68  ..      /* Wheth
6920: 65 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78  er this is an 'x
6930: 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20   IN(SELECT...)' 
6940: 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70  or an 'x IN(<exp
6950: 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a  rlist>)'.      *
6960: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20  * expression it 
6970: 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73  is handled the s
6980: 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70 6f  ame way. A tempo
6990: 72 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a 20  rary table is . 
69a0: 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77       ** filled w
69b0: 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64  ith single-field
69c0: 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72   index keys repr
69d0: 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73  esenting the res
69e0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72  ults.      ** fr
69f0: 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72  om the SELECT or
6a00: 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e   the <exprlist>.
6a10: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
6a20: 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78  ** If the 'x' ex
6a30: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f  pression is a co
6a40: 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74  lumn value, or t
6a50: 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20  he SELECT....   
6a60: 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20     ** statement 
6a70: 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e  returns a column
6a80: 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65   value, then the
6a90: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
6aa0: 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d  t.      ** colum
6ab0: 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69  n is used to bui
6ac0: 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79  ld the index key
6ad0: 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61  s. If both 'x' a
6ae0: 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  nd the.      ** 
6af0: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
6b00: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
6b10: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
6b20: 66 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20  finity is used. 
6b30: 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65       ** if eithe
6b40: 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d  r column has NUM
6b50: 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20  ERIC or INTEGER 
6b60: 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69  affinity. If nei
6b70: 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78  ther.      ** 'x
6b80: 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54  ' nor the SELECT
6b90: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
6ba0: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
6bb0: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
6bc0: 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65  .      ** is use
6bd0: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
6be0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
6bf0: 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b  = pParse->nTab++
6c00: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
6c10: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6c20: 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20  v, OP_OpenTemp, 
6c30: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
6c40: 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28  );.      memset(
6c50: 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a  &keyInfo, 0, siz
6c60: 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20  eof(keyInfo));. 
6c70: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69       keyInfo.nFi
6c80: 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73  eld = 1;.      s
6c90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
6ca0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
6cb0: 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  mns, pExpr->iTab
6cc0: 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  le, 1);..      i
6cd0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
6ce0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
6cf0: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
6d00: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
6d10: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
6d20: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
6d30: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
6d40: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
6d50: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
6d60: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
6d70: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
6d80: 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
6d90: 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
6da0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
6db0: 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  Parm = pExpr->iT
6dc0: 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61  able +  (((int)a
6dd0: 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20  ffinity)<<16);. 
6de0: 20 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20         ExprList 
6df0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20  *pEList;.       
6e00: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
6e10: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
6e20: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
6e30: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  le );.        sq
6e40: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
6e50: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
6e60: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
6e70: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rm, 0, 0, 0, 0);
6e80: 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74 20  .        pEList 
6e90: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
6ea0: 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20  ->pEList;.      
6eb0: 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26 20    if( pEList && 
6ec0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20  pEList->nExpr>0 
6ed0: 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65  ){ .          ke
6ee0: 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d  yInfo.aColl[0] =
6ef0: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f   binaryCompareCo
6f00: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
6f10: 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20  xpr->pLeft,.    
6f20: 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73 74            pEList
6f30: 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[0].pExpr);. 
6f40: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6f50: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
6f60: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20  pList ){.       
6f70: 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20   /* Case 2:     
6f80: 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73  expr IN (exprlis
6f90: 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a  t).        **..*
6fa0: 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65  * For each expre
6fb0: 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20  ssion, build an 
6fc0: 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74  index key from t
6fd0: 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e  he evaluation an
6fe0: 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f  d.        ** sto
6ff0: 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d  re it in the tem
7000: 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66  porary table. If
7010: 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c   <expr> is a col
7020: 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20  umn, then use.  
7030: 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f        ** that co
7040: 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77  lumns affinity w
7050: 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64  hen building ind
7060: 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70  ex keys. If <exp
7070: 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20  r> is not.      
7080: 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75    ** a column, u
7090: 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e  se numeric affin
70a0: 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a  ity..        */.
70b0: 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20          int i;. 
70c0: 20 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73         char cons
70d0: 74 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20 20  t *affStr;.     
70e0: 20 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79     if( !affinity
70f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66   ){.          af
7100: 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f  finity = SQLITE_
7110: 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20  AFF_NUMERIC;.   
7120: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61       }.        a
7130: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
7140: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66  ffinityString(af
7150: 66 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 20  finity);.       
7160: 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30   keyInfo.aColl[0
7170: 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  ] = pExpr->pLeft
7180: 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20  ->pColl;..      
7190: 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67    /* Loop throug
71a0: 68 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f  h each expressio
71b0: 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e  n in <exprlist>.
71c0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28   */.        for(
71d0: 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c  i=0; i<pExpr->pL
71e0: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  ist->nExpr; i++)
71f0: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
7200: 20 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70   *pE2 = pExpr->p
7210: 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  List->a[i].pExpr
7220: 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20  ;..          /* 
7230: 43 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65  Check that the e
7240: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
7250: 73 74 61 6e 74 20 61 6e 64 20 76 61 6c 69 64 2e  stant and valid.
7260: 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66   */.          if
7270: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73  ( !sqlite3ExprIs
7280: 43 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b  Constant(pE2) ){
7290: 0a 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c  .            sql
72a0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
72b0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
72c0: 20 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73     "right-hand s
72d0: 69 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74  ide of IN operat
72e0: 6f 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74  or must be const
72f0: 61 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20  ant");.         
7300: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
7310: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
7320: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
7330: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
7340: 70 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20  pE2, 0, 0) ){.  
7350: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7360: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
7370: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76  .          /* Ev
7380: 61 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65  aluate the expre
7390: 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74  ssion and insert
73a0: 20 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d   it into the tem
73b0: 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20  p table */.     
73c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
73d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32  Code(pParse, pE2
73e0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
73f0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
7400: 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c  P_MakeRecord, 1,
7410: 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53   0, affStr, P3_S
7420: 54 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20  TATIC);.        
7430: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7440: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
7450: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
7460: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
7470: 64 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72  dOp(v, OP_PutStr
7480: 4b 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  Key, pExpr->iTab
7490: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  le, 0);.        
74a0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  }.      }.      
74b0: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
74c0: 65 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f  eP3(v, addr, (vo
74d0: 69 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50  id *)&keyInfo, P
74e0: 33 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20  3_KEYINFO);..   
74f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
7510: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  ECT: {.      /* 
7520: 54 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61  This has to be a
7530: 20 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20   scalar SELECT. 
7540: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
7550: 6f 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20  o put the.      
7560: 2a 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73  ** value of this
7570: 20 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d   select in a mem
7580: 6f 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63  ory cell and rec
7590: 6f 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20  ord the number. 
75a0: 20 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d       ** of the m
75b0: 65 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43  emory cell in iC
75c0: 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a  olumn..      */.
75d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
75e0: 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  lumn = pParse->n
75f0: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28  Mem++;.      if(
7600: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
7610: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
7620: 6c 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 70 45  lect, SRT_Mem,pE
7630: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30  xpr->iColumn,0,0
7640: 2c 30 2c 30 29 29 7b 0a 20 20 20 20 20 20 20 20  ,0,0)){.        
7650: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
7660: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
7670: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72     }..    /* For
7680: 20 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20   all else, just 
7690: 72 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b  recursively walk
76a0: 20 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20   the tree */.   
76b0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
76c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
76d0: 66 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69  ft.      && sqli
76e0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
76f0: 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69  s(pParse, pSrcLi
7700: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
7710: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
7720: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
7730: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
7740: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a   pExpr->pRight .
7750: 20 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33        && sqlite3
7760: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70  ExprResolveIds(p
7770: 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c  Parse, pSrcList,
7780: 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e   pEList, pExpr->
7790: 70 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20  pRight) ){.     
77a0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
77b0: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70     }.      if( p
77c0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
77d0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
77e0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
77f0: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  pList = pExpr->p
7800: 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f  List;.        fo
7810: 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e  r(i=0; i<pList->
7820: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
7830: 20 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72         Expr *pAr
7840: 67 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  g = pList->a[i].
7850: 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20  pExpr;.         
7860: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
7870: 52 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73  ResolveIds(pPars
7880: 65 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c  e, pSrcList, pEL
7890: 69 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20  ist, pArg) ){.  
78a0: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
78b0: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
78c0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
78d0: 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  }.    }.  }.  re
78e0: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
78f0: 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64 65   pExpr is a node
7900: 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 20   that defines a 
7910: 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65  function of some
7920: 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68 74   kind.  It might
7930: 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63 74  .** be a syntact
7940: 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65  ic function like
7950: 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20 69   "count(x)" or i
7960: 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75 6e  t might be a fun
7970: 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d  ction.** that im
7980: 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72  plements an oper
7990: 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49  ator, like "a LI
79a0: 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54  KE b".  .**.** T
79b0: 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65  his routine make
79c0: 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20  s *pzName point 
79d0: 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74  to the name of t
79e0: 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20  he function and 
79f0: 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64  .** *pnName hold
7a00: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63   the number of c
7a10: 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65  haracters in the
7a20: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a   function name..
7a30: 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67  */.static void g
7a40: 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45  etFunctionName(E
7a50: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73  xpr *pExpr, cons
7a60: 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c  t char **pzName,
7a70: 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20   int *pnName){. 
7a80: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
7a90: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
7aa0: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
7ab0: 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45      *pzName = pE
7ac0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20  xpr->token.z;.  
7ad0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45      *pnName = pE
7ae0: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20  xpr->token.n;.  
7af0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
7b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
7b10: 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  E: {.      *pzNa
7b20: 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20  me = "like";.   
7b30: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a     *pnName = 4;.
7b40: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b50: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47   }.    case TK_G
7b60: 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  LOB: {.      *pz
7b70: 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20  Name = "glob";. 
7b80: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
7b90: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7ba0: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
7bb0: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
7bc0: 65 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70 65  e = "can't happe
7bd0: 6e 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d  n";.      *pnNam
7be0: 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62 72  e = 12;.      br
7bf0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  eak;.    }.  }.}
7c00: 0a 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68  ../*.** Error ch
7c10: 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  eck the function
7c20: 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69  s in an expressi
7c30: 6f 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61  on.  Make sure a
7c40: 6c 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  ll.** function n
7c50: 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69  ames are recogni
7c60: 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63  zed and all func
7c70: 74 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20 63  tions have the c
7c80: 6f 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72  orrect.** number
7c90: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20   of arguments.  
7ca0: 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d  Leave an error m
7cb0: 65 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65  essage in pParse
7cc0: 2d 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20  ->zErrMsg.** if 
7cd0: 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73  anything is amis
7ce0: 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  s.  Return the n
7cf0: 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
7d00: 0a 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67 67  .**.** if pIsAgg
7d10: 20 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64   is not null and
7d20: 20 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e   this expression
7d30: 20 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65   is an aggregate
7d40: 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69   function.** (li
7d50: 6b 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d  ke count(*) or m
7d60: 61 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e 20  ax(value)) then 
7d70: 77 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20 2a  write a 1 into *
7d80: 70 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73  pIsAgg..*/.int s
7d90: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
7da0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
7db0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
7dc0: 61 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70  allowAgg, int *p
7dd0: 49 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45  IsAgg){.  int nE
7de0: 72 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45  rr = 0;.  if( pE
7df0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
7e00: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
7e10: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
7e20: 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20  se TK_GLOB:.    
7e30: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20  case TK_LIKE:.  
7e40: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
7e50: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ON: {.      int 
7e60: 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  n = pExpr->pList
7e70: 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
7e80: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20  >nExpr : 0;  /* 
7e90: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
7ea0: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
7eb0: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
7ec0: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
7ed0: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
7ee0: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
7ef0: 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e       int wrong_n
7f00: 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20  um_args = 0;    
7f10: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e   /* True if wron
7f20: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
7f30: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
7f40: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20  nt is_agg = 0;  
7f50: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
7f60: 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72  ue if is an aggr
7f70: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
7f80: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
7f90: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
7fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7fb0: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
7fc0: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
7fd0: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
7fe0: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
7ff0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
8000: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
8010: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
8020: 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20  ncDef *pDef;.   
8030: 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50 61     int enc = pPa
8040: 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 0a 20  rse->db->enc;.. 
8050: 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e       getFunction
8060: 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64  Name(pExpr, &zId
8070: 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70  , &nId);.      p
8080: 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  Def = sqlite3Fin
8090: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
80a0: 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20  ->db, zId, nId, 
80b0: 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  n, enc, 0);.    
80c0: 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b    if( pDef==0 ){
80d0: 0a 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20  .        pDef = 
80e0: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
80f0: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
8100: 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e  zId, nId, -1, en
8110: 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69  c, 0);.        i
8120: 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20  f( pDef==0 ){.  
8130: 20 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f          no_such_
8140: 66 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20  func = 1;.      
8150: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
8160: 20 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67     wrong_num_arg
8170: 73 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d  s = 1;.        }
8180: 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
8190: 20 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70        is_agg = p
81a0: 44 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20  Def->xFunc==0;. 
81b0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
81c0: 20 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f   is_agg && !allo
81d0: 77 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  wAgg ){.        
81e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
81f0: 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
8200: 6f 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  of aggregate fun
8210: 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e  ction %.*s()", n
8220: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
8230: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8240: 20 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20    is_agg = 0;.  
8250: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f      }else if( no
8260: 5f 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20  _such_func ){.  
8270: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72        sqlite3Err
8280: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e  orMsg(pParse, "n
8290: 6f 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a  o such function:
82a0: 20 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64   %.*s", nId, zId
82b0: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
82c0: 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69  +;.      }else i
82d0: 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67  f( wrong_num_arg
82e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  s ){.        sql
82f0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
8300: 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65  rse,"wrong numbe
8310: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74  r of arguments t
8320: 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28  o function %.*s(
8330: 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  )",.            
8340: 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20   nId, zId);.    
8350: 20 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20      nErr++;.    
8360: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73    }.      if( is
8370: 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  _agg ){.        
8380: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41  pExpr->op = TK_A
8390: 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20  GG_FUNCTION;.   
83a0: 20 20 20 20 20 69 66 28 20 70 49 73 41 67 67 20       if( pIsAgg 
83b0: 29 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20  ) *pIsAgg = 1;. 
83c0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
83d0: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
83e0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
83f0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
8400: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
8410: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  se, pExpr->pList
8420: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  ->a[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 20 20 20 61 6c 6c               all
8450: 6f 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67  owAgg && !is_agg
8460: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
8470: 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20   }.      /* FIX 
8480: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
8490: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
84a0: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
84b0: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
84c0: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
84d0: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
84e0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  /.    }.    defa
84f0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
8500: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
8510: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
8520: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
8530: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
8540: 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c  pLeft, allowAgg,
8550: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
8560: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
8570: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
8580: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
8590: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
85a0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
85b0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
85c0: 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29  llowAgg, pIsAgg)
85d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
85e0: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
85f0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
8600: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
8610: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
8620: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
8630: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
8640: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
8650: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
8660: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
8670: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
8680: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
8690: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
86a0: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
86b0: 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67  se, pE2, allowAg
86c0: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
86d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
86e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
86f0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
8700: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  rr;.}../*.** Gen
8710: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
8720: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
8730: 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
8740: 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
8750: 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20  xt z[0..n-1] on 
8760: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74  the stack..*/.st
8770: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
8780: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
8790: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
87a0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
87b0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
87c0: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
87d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
87e0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
87f0: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  r, i, 0);.  }els
8800: 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74  e if( sqlite3Fit
8810: 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a  sIn64Bits(z) ){.
8820: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8830: 70 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p3(v, OP_Integer
8840: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
8850: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8860: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
8870: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
8880: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
8890: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
88a0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
88b0: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
88c0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
88d0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
88e0: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
88f0: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
8900: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
8910: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
8920: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8930: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
8940: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8950: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
8960: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
8970: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8980: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
8990: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
89a0: 5f 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20  _PLUS:     op = 
89b0: 4f 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65  OP_Add;      bre
89c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
89d0: 4d 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f  MINUS:    op = O
89e0: 50 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65 61  P_Subtract; brea
89f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
8a00: 54 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  TAR:     op = OP
8a10: 5f 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b  _Multiply; break
8a20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
8a30: 41 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  ASH:    op = OP_
8a40: 44 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b  Divide;   break;
8a50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8a60: 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41  :      op = OP_A
8a70: 6e 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  nd;      break;.
8a80: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
8a90: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72        op = OP_Or
8aa0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8ab0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
8ac0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
8ad0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8ae0: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
8af0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
8b00: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8b10: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
8b20: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
8b30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8b40: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
8b50: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
8b60: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8b70: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
8b80: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
8b90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8ba0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
8bb0: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
8bc0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8bd0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
8be0: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
8bf0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8c00: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
8c10: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
8c20: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8c30: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20  TK_NOT:      op 
8c40: 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62  = OP_Not;      b
8c50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8c60: 4b 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d  K_UMINUS:   op =
8c70: 20 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72   OP_Negative; br
8c80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8c90: 5f 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20  _BITAND:   op = 
8ca0: 4f 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65  OP_BitAnd;   bre
8cb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8cc0: 42 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f  BITOR:    op = O
8cd0: 50 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61  P_BitOr;    brea
8ce0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8cf0: 49 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50  ITNOT:   op = OP
8d00: 5f 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b  _BitNot;   break
8d10: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
8d20: 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  HIFT:   op = OP_
8d30: 53 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61  ShiftLeft;  brea
8d40: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8d50: 53 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50  SHIFT:   op = OP
8d60: 5f 53 68 69 66 74 52 69 67 68 74 3b 20 62 72 65  _ShiftRight; bre
8d70: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8d80: 52 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  REM:      op = O
8d90: 50 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72  P_Remainder;  br
8da0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8db0: 5f 46 4c 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20  _FLOAT:    op = 
8dc0: 4f 50 5f 52 65 61 6c 3b 20 20 20 20 20 20 20 62  OP_Real;       b
8dd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8de0: 4b 5f 53 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d  K_STRING:   op =
8df0: 20 4f 50 5f 53 74 72 69 6e 67 38 3b 20 20 20 20   OP_String8;    
8e00: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8e10: 20 54 4b 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70   TK_BLOB:     op
8e20: 20 3d 20 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20   = OP_HexBlob;  
8e30: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
8e40: 61 75 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72  ault: op = 0; br
8e50: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
8e60: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8e70: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
8e80: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
8e90: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29  pParse->useAgg )
8ea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8eb0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8ec0: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
8ed0: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
8ee0: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
8ef0: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
8f00: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
8f10: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
8f20: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
8f30: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
8f40: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
8f50: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
8f60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8f70: 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e  P_Recno, pExpr->
8f80: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
8f90: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
8fa0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
8fb0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
8fc0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
8fd0: 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  v, pExpr->token.
8fe0: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
8ff0: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
9000: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9010: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
9020: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
9030: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9040: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
9050: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
9060: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
9070: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9080: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
9090: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
90a0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
90b0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
90c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
90d0: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
90e0: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c  Expr->token.z+1,
90f0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d   pExpr->token.n-
9100: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9110: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  3VdbeDequoteP3(v
9120: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
9130: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9140: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
9150: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9160: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
9170: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
9180: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9190: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
91a0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
91b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
91c0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
91d0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
91e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
91f0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9200: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
9210: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
9220: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
9230: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
9240: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
9250: 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
9260: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
9270: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
9280: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
9290: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
92a0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
92b0: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
92c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
92d0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
92e0: 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20 30 29  Right, op, 0, 0)
92f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9300: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9310: 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54  _AND:.    case T
9320: 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54  K_OR:.    case T
9330: 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  K_PLUS:.    case
9340: 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61   TK_STAR:.    ca
9350: 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20  se TK_MINUS:.   
9360: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20   case TK_REM:.  
9370: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
9380: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  :.    case TK_BI
9390: 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  TOR:.    case TK
93a0: 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65  _SLASH:.    case
93b0: 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20   TK_LSHIFT:.    
93c0: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
93d0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
93e0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
93f0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
9400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9410: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9420: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9430: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9440: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
9450: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9460: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9470: 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20  _CONCAT: {.     
9480: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9490: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
94a0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
94b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
94c0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
94d0: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
94e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
94f0: 4f 50 5f 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30  OP_Concat8, 2, 0
9500: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
9510: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
9520: 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20  K_UMINUS: {.    
9530: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
9540: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
9550: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
9560: 74 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70  t );.      if( p
9570: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
9580: 41 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d  AT || pLeft->op=
9590: 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
95a0: 20 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20         Token *p 
95b0: 3d 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b  = &pLeft->token;
95c0: 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a  .        char *z
95d0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
95e0: 20 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20   p->n + 2 );.   
95f0: 20 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20       sprintf(z, 
9600: 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70  "-%.*s", p->n, p
9610: 2d 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66  ->z);.        if
9620: 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f  ( pLeft->op==TK_
9630: 46 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20  FLOAT ){.       
9640: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
9650: 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c  3(v, OP_Real, 0,
9660: 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a   0, z, p->n+1);.
9670: 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20          }else{. 
9680: 20 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74           codeInt
9690: 65 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b  eger(v, z, p->n+
96a0: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  1);.        }.  
96b0: 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65        sqliteFree
96c0: 28 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65  (z);.        bre
96d0: 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ak;.      }.    
96e0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67    /* Fall throug
96f0: 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f  h into TK_NOT */
9700: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9710: 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63  TK_BITNOT:.    c
9720: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
9730: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9740: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9750: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9760: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9770: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
9780: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9790: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
97a0: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
97b0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
97c0: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
97d0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
97e0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
97f0: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  er, 1, 0);.     
9800: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9810: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9820: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65  pLeft);.      de
9830: 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  st = sqlite3Vdbe
9840: 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b  CurrentAddr(v) +
9850: 20 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   2;.      sqlite
9860: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
9870: 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 1, dest);.    
9880: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9890: 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c  Op(v, OP_AddImm,
98a0: 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20   -1, 0);.    }. 
98b0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
98c0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
98d0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ON: {.      sqli
98e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
98f0: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45  OP_AggGet, 0, pE
9900: 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20  xpr->iAgg);.    
9910: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9920: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
9930: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
9940: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  E:.    case TK_F
9950: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
9960: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
9970: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
9980: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
9990: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
99a0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
99b0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
99c0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  ;.      int nId;
99d0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
99e0: 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e  r *zId;.      in
99f0: 74 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  t p2 = 0;.      
9a00: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20  int i;.      u8 
9a10: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
9a20: 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c  ->enc;.      Col
9a30: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
9a40: 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69  .      getFuncti
9a50: 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a  onName(pExpr, &z
9a60: 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20  Id, &nId);.     
9a70: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
9a80: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
9a90: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
9aa0: 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29  , nExpr, enc, 0)
9ab0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
9ac0: 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20  pDef!=0 );.     
9ad0: 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   nExpr = sqlite3
9ae0: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
9af0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
9b00: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
9b10: 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b  i<nExpr && i<32;
9b20: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
9b30: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
9b40: 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e  Constant(pList->
9b50: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
9b60: 20 20 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28           p2 |= (
9b70: 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
9b80: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
9b90: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26  f->needCollSeq &
9ba0: 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
9bb0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
9bc0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
9bd0: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
9be0: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
9bf0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
9c00: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
9c10: 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
9c20: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
9c30: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
9c40: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
9c50: 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
9c60: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
9c70: 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
9c80: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
9c90: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
9ca0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
9cb0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75  VdbeOp3(v, OP_Fu
9cc0: 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70  nction, nExpr, p
9cd0: 32 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  2, (char*)pDef, 
9ce0: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
9cf0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9d00: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
9d10: 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
9d20: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9d30: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
9d40: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
9d50: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9d60: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
9d70: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61  N: {.      int a
9d80: 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72 20  ddr;.      char 
9d90: 63 6f 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a 0a  const *affStr;..
9da0: 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20        /* Figure 
9db0: 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74 79  out the affinity
9dc0: 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61 74   to use to creat
9dd0: 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  e a key from the
9de0: 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a   results.      *
9df0: 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  * of the express
9e00: 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74 72  ion. affinityStr
9e10: 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69 63   stores a static
9e20: 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c 65   string suitable
9e30: 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50 33   for.      ** P3
9e40: 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72   of OP_MakeRecor
9e50: 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  d..      */.    
9e60: 20 20 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74    affStr = sqlit
9e70: 65 33 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67  e3AffinityString
9e80: 28 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e  (comparisonAffin
9e90: 69 74 79 28 70 45 78 70 72 29 29 3b 0a 0a 20 20  ity(pExpr));..  
9ea0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9eb0: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
9ec0: 65 72 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20  er, 1, 0);..    
9ed0: 20 20 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65    /* Code the <e
9ee0: 78 70 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72  xpr> from "<expr
9ef0: 3e 20 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65  > IN (...)". The
9f00: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9f10: 0a 20 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d  .      ** pExpr-
9f20: 3e 69 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73  >iTable contains
9f30: 20 74 68 65 20 76 61 6c 75 65 73 20 74 68 61 74   the values that
9f40: 20 6d 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e   make up the (..
9f50: 2e 29 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f  .) set..      */
9f60: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9f70: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9f80: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
9f90: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
9fa0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
9fb0: 72 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r(v);.      sqli
9fc0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9fd0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20  OP_NotNull, -1, 
9fe0: 61 64 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20  addr+4);        
9ff0: 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20      /* addr + 0 
a000: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
a010: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a020: 50 6f 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  Pop, 2, 0);.    
a030: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a040: 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38  Op(v, OP_String8
a050: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
a060: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a070: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61  v, OP_Goto, 0, a
a080: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
a090: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a0a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31  OP_MakeRecord, 1
a0b0: 2c 20 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f  , 0, affStr, P3_
a0c0: 53 54 41 54 49 43 29 3b 20 2f 2a 20 61 64 64 72  STATIC); /* addr
a0d0: 20 2b 20 34 20 2a 2f 0a 20 20 20 20 20 20 73 71   + 4 */.      sq
a0e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a0f0: 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70  , OP_Found, pExp
a100: 72 2d 3e 69 54 61 62 6c 65 2c 20 61 64 64 72 2b  r->iTable, addr+
a110: 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  7);.      sqlite
a120: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a130: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
a140: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a150: 20 20 2f 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f    /* addr + 6 */
a160: 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ..      break;. 
a170: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a180: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
a190: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
a1a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
a1b0: 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c      struct ExprL
a1c0: 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d  ist_item *pLItem
a1d0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
a1e0: 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  >a;.      Expr *
a1f0: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
a200: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
a210: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
a220: 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20  arse, pLeft);.  
a230: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a240: 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20  ddOp(v, OP_Dup, 
a250: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
a260: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a270: 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20  rse, pRight);.  
a280: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
a290: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
a2a0: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 30 2c  Right, OP_Ge, 0,
a2b0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
a2c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a2d0: 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b 0a 20  P_Pull, 1, 0);. 
a2e0: 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b 0a 20       pLItem++;. 
a2f0: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 4c       pRight = pL
a300: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
a310: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a320: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
a330: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
a340: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
a350: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
a360: 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  Le, 0, 0);.     
a370: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a380: 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20  p(v, OP_And, 0, 
a390: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
a3a0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
a3b0: 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61  TK_UPLUS:.    ca
a3c0: 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20  se TK_AS: {.    
a3d0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a3e0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a3f0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62  >pLeft);.      b
a400: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
a410: 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a  case TK_CASE: {.
a420: 20 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65        int expr_e
a430: 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20  nd_label;.      
a440: 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20  int jumpInst;.  
a450: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
a460: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20      int nExpr;. 
a470: 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20       int i;.    
a480: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
a490: 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74  st;.      struct
a4a0: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
a4b0: 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20 20 20  aListelem;..    
a4c0: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
a4d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
a4e0: 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
a4f0: 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
a500: 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
a510: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
a520: 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
a530: 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78 70     pEList = pExp
a540: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
a550: 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45 4c 69  aListelem = pELi
a560: 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e 45 78  st->a;.      nEx
a570: 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e 45 78  pr = pEList->nEx
a580: 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72 5f 65  pr;.      expr_e
a590: 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c 69 74  nd_label = sqlit
a5a0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
a5b0: 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  v);.      if( pE
a5c0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
a5d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a5e0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a5f0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
a600: 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28 69     }.      for(i
a610: 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69 3d 69  =0; i<nExpr; i=i
a620: 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  +2){.        sql
a630: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
a640: 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  rse, aListelem[i
a650: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
a660: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65    if( pExpr->pLe
a670: 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ft ){.          
a680: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a690: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31  (v, OP_Dup, 1, 1
a6a0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d  );.          jum
a6b0: 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f 6d 70  pInst = codeComp
a6c0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
a6d0: 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73 74 65  r->pLeft, aListe
a6e0: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20  lem[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 20 20 20 4f                 O
a710: 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20 20 20  P_Ne, 0, 1);.   
a720: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a730: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
a740: 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 1, 0);.      
a750: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a760: 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71     jumpInst = sq
a770: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a780: 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30  , OP_IfNot, 1, 0
a790: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
a7a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
a7b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61 4c 69  Code(pParse, aLi
a7c0: 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70  stelem[i+1].pExp
a7d0: 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  r);.        sqli
a7e0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a7f0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78 70 72  OP_Goto, 0, expr
a800: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
a810: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
a820: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
a830: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73  dr(v);.        s
a840: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
a850: 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74 2c 20  P2(v, jumpInst, 
a860: 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d 0a 20  addr);.      }. 
a870: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a880: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
a890: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a8a0: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
a8b0: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
a8c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 52 69    if( pExpr->pRi
a8d0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ght ){.        s
a8e0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a8f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
a900: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  ight);.      }el
a910: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
a920: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a930: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a940: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a950: 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
a960: 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78 70 72  lveLabel(v, expr
a970: 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20 20 20  _end_label);.   
a980: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a990: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53      case TK_RAIS
a9a0: 45 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21  E: {.      if( !
a9b0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
a9c0: 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  k ){.        sql
a9d0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
a9e0: 72 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20  rse,.           
a9f0: 20 20 20 20 20 20 20 20 20 20 20 20 22 52 41 49              "RAI
aa00: 53 45 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65  SE() may only be
aa10: 20 75 73 65 64 20 77 69 74 68 69 6e 20 61 20 74   used within a t
aa20: 72 69 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29  rigger-program")
aa30: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
aa40: 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72 65 74 75 72  ->nErr++;..retur
aa50: 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  n;.      }.     
aa60: 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c   if( pExpr->iCol
aa70: 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f 6c 6c 62 61  umn == OE_Rollba
aa80: 63 6b 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d 3e  ck ||..  pExpr->
aa90: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
aaa0: 6f 72 74 20 7c 7c 0a 09 20 20 70 45 78 70 72 2d  ort ||..  pExpr-
aab0: 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46  >iColumn == OE_F
aac0: 61 69 6c 20 29 7b 0a 09 20 20 73 71 6c 69 74 65  ail ){..  sqlite
aad0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48  3VdbeOp3(v, OP_H
aae0: 61 6c 74 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53  alt, SQLITE_CONS
aaf0: 54 52 41 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69  TRAINT, pExpr->i
ab00: 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20  Column,.        
ab10: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab20: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
ab30: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
ab40: 6e 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56 64  n);..  sqlite3Vd
ab50: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
ab60: 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
ab70: 20 7b 0a 09 20 20 61 73 73 65 72 74 28 20 70 45   {..  assert( pE
ab80: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
ab90: 4f 45 5f 49 67 6e 6f 72 65 20 29 3b 0a 09 20 20  OE_Ignore );..  
aba0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
abb0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50  , OP_Goto, 0, pP
abc0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d  arse->trigStack-
abd0: 3e 69 67 6e 6f 72 65 4a 75 6d 70 2c 0a 20 20 20  >ignoreJump,.   
abe0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
abf0: 20 20 20 20 20 20 20 20 22 28 49 47 4e 4f 52 45          "(IGNORE
ac00: 20 6a 75 6d 70 29 22 2c 20 30 29 3b 0a 20 20 20   jump)", 0);.   
ac10: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62     }.    }.    b
ac20: 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  reak;.  }.}../*.
ac30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ac40: 20 74 68 61 74 20 70 75 73 68 65 73 20 74 68 65   that pushes the
ac50: 20 76 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20   value of every 
ac60: 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67  element of the g
ac70: 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
ac80: 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65  on list onto the
ac90: 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65   stack..**.** Re
aca0: 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20  turn the number 
acb0: 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68  of elements push
acc0: 65 64 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63  ed onto the stac
acd0: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
ace0: 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73  3ExprCodeExprLis
acf0: 74 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  t(.  Parse *pPar
ad00: 73 65 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69  se,     /* Parsi
ad10: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
ad20: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
ad30: 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73     /* The expres
ad40: 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20  sion list to be 
ad50: 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74  coded */.){.  st
ad60: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
ad70: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74  em *pItem;.  int
ad80: 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76   i, n;.  Vdbe *v
ad90: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  ;.  if( pList==0
ada0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76   ) return 0;.  v
adb0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56 64 62   = sqlite3GetVdb
adc0: 65 28 70 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d  e(pParse);.  n =
add0: 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20   pList->nExpr;. 
ade0: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
adf0: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69  ->a, i=0; i<n; i
ae00: 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
ae10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ae20: 65 28 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d  e(pParse, pItem-
ae30: 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72  >pExpr);.  }.  r
ae40: 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
ae50: 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
ae60: 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78  for a boolean ex
ae70: 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68  pression such th
ae80: 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64  at a jump is mad
ae90: 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65  e.** to the labe
aea0: 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20  l "dest" if the 
aeb0: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72  expression is tr
aec0: 75 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  ue but execution
aed0: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
aee0: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
aef0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
af00: 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66   false..**.** If
af10: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
af20: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
af30: 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20  L (neither true 
af40: 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e  nor false), then
af50: 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d  .** take the jum
af60: 70 20 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e  p if the jumpIfN
af70: 75 6c 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65  ull flag is true
af80: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
af90: 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
afa0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
afb0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
afc0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
afd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
afe0: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
aff0: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
b000: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
b010: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
b020: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b030: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b040: 4c 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  LT:       op = O
b050: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
b060: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  k;.    case TK_L
b070: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
b080: 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Le;       break
b090: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  ;.    case TK_GT
b0a0: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
b0b0: 47 74 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Gt;       break;
b0c0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
b0d0: 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47         op = OP_G
b0e0: 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  e;       break;.
b0f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 20      case TK_NE: 
b100: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65        op = OP_Ne
b110: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b120: 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20 20     case TK_EQ:  
b130: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b       op = OP_Eq;
b140: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b150: 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c    case TK_ISNULL
b160: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 49 73 4e 75  :   op = OP_IsNu
b170: 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ll;   break;.   
b180: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
b190: 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75  :  op = OP_NotNu
b1a0: 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ll;  break;.    
b1b0: 64 65 66 61 75 6c 74 3a 20 20 62 72 65 61 6b 3b  default:  break;
b1c0: 0a 20 20 7d 0a 20 20 73 77 69 74 63 68 28 20 70  .  }.  switch( p
b1d0: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b1e0: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20  case TK_AND: {. 
b1f0: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
b200: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
b210: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
b220: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
b230: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b240: 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49  Left, d2, !jumpI
b250: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
b260: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
b270: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b280: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
b290: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
b2a0: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
b2b0: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
b2c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
b2e0: 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  R: {.      sqlit
b2f0: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
b300: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b310: 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
b320: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
b330: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
b340: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
b350: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
b360: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
b370: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b380: 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20  ase TK_NOT: {.  
b390: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
b3a0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
b3b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73  Expr->pLeft, des
b3c0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b3d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b3e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
b3f0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
b400: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
b410: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
b420: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
b430: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
b440: 51 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  Q: {.      sqlit
b450: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b460: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b470: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b480: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b490: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
b4a0: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
b4b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b4c0: 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70  >pLeft, pExpr->p
b4d0: 52 69 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c  Right, op, dest,
b4e0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
b4f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b500: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
b510: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
b520: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
b530: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b540: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b550: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
b560: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b570: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
b580: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b590: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b5a0: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
b5b0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
b5c0: 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79 20  on "x BETWEEN y 
b5d0: 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65 6d  AND z" is implem
b5e0: 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
b5f0: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
b600: 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33 0a   (x < y) GOTO 3.
b610: 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28 78        ** 2 IF (x
b620: 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73   <= z) GOTO <des
b630: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e 2e  t>.      ** 3 ..
b640: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
b650: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
b660: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
b670: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
b680: 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 20     Expr *pRight 
b690: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  = pExpr->pList->
b6a0: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
b6b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b6c0: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  e(pParse, pLeft)
b6d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b6e0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44  dbeAddOp(v, OP_D
b6f0: 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  up, 0, 0);.     
b700: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b710: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
b720: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 63  ;.      addr = c
b730: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
b740: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
b750: 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75 6d  , OP_Lt, 0, !jum
b760: 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20  pIfNull);..     
b770: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
b780: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
b790: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
b7a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b7b0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
b7c0: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
b7d0: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
b7e0: 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74 2c  ht, OP_Le, dest,
b7f0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20   jumpIfNull);.. 
b800: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b810: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65  AddOp(v, OP_Inte
b820: 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ger, 0, 0);.    
b830: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
b840: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 73  ngeP2(v, addr, s
b850: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
b860: 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20 20  tAddr(v));.     
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b880: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20  p(v, OP_Pop, 1, 
b890: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
b8a0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
b8b0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  lt: {.      sqli
b8c0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
b8d0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20  se, pExpr);.    
b8e0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b8f0: 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75 6d  Op(v, OP_If, jum
b900: 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a  pIfNull, dest);.
b910: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b920: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
b930: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
b940: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
b950: 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
b960: 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
b970: 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
b980: 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
b990: 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73  pression is fals
b9a0: 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a  e but execution.
b9b0: 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72  ** continues str
b9c0: 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68  aight thru if th
b9d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
b9e0: 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  true..**.** If t
b9f0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
ba00: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
ba10: 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
ba20: 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a 2a  r false) then.**
ba30: 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66 4e   jump if jumpIfN
ba40: 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20 66  ull is true or f
ba50: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20 6a  all through if j
ba60: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61 6c  umpIfNull is fal
ba70: 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  se..*/.void sqli
ba80: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 50  te3ExprIfFalse(P
ba90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
baa0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 64  pr *pExpr, int d
bab0: 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  est, int jumpIfN
bac0: 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  ull){.  Vdbe *v 
bad0: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
bae0: 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20  .  int op = 0;. 
baf0: 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78   if( v==0 || pEx
bb00: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
bb10: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
bb20: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
bb30: 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70 20  TK_LT:       op 
bb40: 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62  = OP_Ge;       b
bb50: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
bb60: 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_LE:       op =
bb70: 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72   OP_Gt;       br
bb80: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
bb90: 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GT:       op = 
bba0: 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Le;       bre
bbb0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
bbc0: 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  GE:       op = O
bbd0: 50 5f 4c 74 3b 20 20 20 20 20 20 20 62 72 65 61  P_Lt;       brea
bbe0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
bbf0: 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  E:       op = OP
bc00: 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Eq;       break
bc10: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  ;.    case TK_EQ
bc20: 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  :       op = OP_
bc30: 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b  Ne;       break;
bc40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
bc50: 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e  ULL:   op = OP_N
bc60: 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a  otNull;  break;.
bc70: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
bc80: 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 49 73  ULL:  op = OP_Is
bc90: 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b 0a 20  Null;   break;. 
bca0: 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72 65     default:  bre
bcb0: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
bcc0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
bcd0: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
bce0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
bcf0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
bd00: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
bd10: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
bd20: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
bd30: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
bd40: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
bd50: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
bd60: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
bd70: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bd80: 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20  se TK_OR: {.    
bd90: 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69 74    int d2 = sqlit
bda0: 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28  e3VdbeMakeLabel(
bdb0: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
bdc0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
bdd0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
bde0: 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  , d2, !jumpIfNul
bdf0: 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  l);.      sqlite
be00: 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61  3ExprIfFalse(pPa
be10: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
be20: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
be30: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
be40: 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
be50: 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20  abel(v, d2);.   
be60: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
be70: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
be80: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
be90: 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
bea0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
beb0: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
bec0: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
bed0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
bee0: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
bef0: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
bf00: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
bf10: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
bf20: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
bf30: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 73  TK_EQ: {.      s
bf40: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bf50: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
bf60: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
bf70: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
bf80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
bf90: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
bfa0: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
bfb0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
bfc0: 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64  r->pRight, op, d
bfd0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
bfe0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bff0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
c000: 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73  _ISNULL:.    cas
c010: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a  e TK_NOTNULL: {.
c020: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c030: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
c040: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
c050: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c060: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
c070: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
c080: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c090: 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20   TK_BETWEEN: {. 
c0a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72       /* The expr
c0b0: 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45 54  ession is "x BET
c0c0: 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20 49  WEEN y AND z". I
c0d0: 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64  t is implemented
c0e0: 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20   as:.      **.  
c0f0: 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3e      ** 1 IF (x >
c100: 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20  = y) GOTO 3.    
c110: 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65 73    ** 2 GOTO <des
c120: 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49 46  t>.      ** 3 IF
c130: 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c 64   (x > z) GOTO <d
c140: 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  est>.      */.  
c150: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20      int addr;.  
c160: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c170: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c180: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
c190: 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  ht = pExpr->pLis
c1a0: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20  t->a[0].pExpr;. 
c1b0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c1c0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65  Code(pParse, pLe
c1d0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
c1e0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c1f0: 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20  P_Dup, 0, 0);.  
c200: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c210: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
c220: 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ht);.      addr 
c230: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c240: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
c250: 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70     codeCompare(p
c260: 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52  Parse, pLeft, pR
c270: 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64 64  ight, OP_Ge, add
c280: 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  r+3, !jumpIfNull
c290: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
c2a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c2b0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
c2c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c2d0: 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20  dOp(v, OP_Goto, 
c2e0: 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  0, dest);.      
c2f0: 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e  pRight = pExpr->
c300: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
c310: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
c320: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c330: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
c340: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
c350: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
c360: 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c 20  t, OP_Gt, dest, 
c370: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
c380: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c390: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
c3a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c3b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c3c0: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
c3d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c3e0: 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e  P_IfNot, jumpIfN
c3f0: 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ull, dest);.    
c400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
c410: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61   }.}../*.** Do a
c420: 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e   deep comparison
c430: 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73 69   of two expressi
c440: 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75 72  on trees.  Retur
c450: 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f  n TRUE (non-zero
c460: 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72 65  ).** if they are
c470: 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20 72   identical and r
c480: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
c490: 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61 6e  hey differ in an
c4a0: 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71  y way..*/.int sq
c4b0: 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65  lite3ExprCompare
c4c0: 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72 20  (Expr *pA, Expr 
c4d0: 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  *pB){.  int i;. 
c4e0: 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20   if( pA==0 ){.  
c4f0: 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a    return pB==0;.
c500: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d 3d    }else if( pB==
c510: 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  0 ){.    return 
c520: 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d  0;.  }.  if( pA-
c530: 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65  >op!=pB->op ) re
c540: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73  turn 0;.  if( !s
c550: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
c560: 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d  e(pA->pLeft, pB-
c570: 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
c580: 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   0;.  if( !sqlit
c590: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41  e3ExprCompare(pA
c5a0: 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70 52  ->pRight, pB->pR
c5b0: 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20 30  ight) ) return 0
c5c0: 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73  ;.  if( pA->pLis
c5d0: 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  t ){.    if( pB-
c5e0: 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75  >pList==0 ) retu
c5f0: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 41  rn 0;.    if( pA
c600: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d  ->pList->nExpr!=
c610: 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  pB->pList->nExpr
c620: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
c630: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e   for(i=0; i<pA->
c640: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
c650: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21 73  +){.      if( !s
c660: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
c670: 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  e(pA->pList->a[i
c680: 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69  ].pExpr, pB->pLi
c690: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
c6a0: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
c6b0: 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 0;.      }.   
c6c0: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70   }.  }else if( p
c6d0: 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  B->pList ){.    
c6e0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20  return 0;.  }.  
c6f0: 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74 20  if( pA->pSelect 
c700: 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20 29  || pB->pSelect )
c710: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
c720: 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
c730: 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69  >iTable || pA->i
c740: 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c  Column!=pB->iCol
c750: 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  umn ) return 0;.
c760: 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e    if( pA->token.
c770: 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42 2d  z ){.    if( pB-
c780: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65  >token.z==0 ) re
c790: 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20  turn 0;.    if( 
c7a0: 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d  pB->token.n!=pA-
c7b0: 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72  >token.n ) retur
c7c0: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 0;.    if( sql
c7d0: 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41 2d  ite3StrNICmp(pA-
c7e0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f  >token.z, pB->to
c7f0: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
c800: 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e 20  .n)!=0 ) return 
c810: 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  0;.  }.  return 
c820: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20  1;.}../*.** Add 
c830: 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f  a new element to
c840: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67   the pParse->aAg
c850: 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72 65  g[] array and re
c860: 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a  turn its index..
c870: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
c880: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
c890: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
c8a0: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
c8b0: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
c8c0: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
c8d0: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
c8e0: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
c8f0: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
c900: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
c910: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
c920: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
c930: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
c940: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
c950: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
c960: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
c970: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
c980: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
c990: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
c9a0: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
c9b0: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
c9c0: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
c9d0: 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74  ./*.** Analyze t
c9e0: 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73 73  he given express
c9f0: 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20  ion looking for 
ca00: 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69  aggregate functi
ca10: 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76  ons and.** for v
ca20: 61 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65  ariables that ne
ca30: 65 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74  ed to be added t
ca40: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
ca50: 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d  gg[] array..** M
ca60: 61 6b 65 20 61 64 64 69 74 69 6f 6e 61 6c 20 65  ake additional e
ca70: 6e 74 72 69 65 73 20 74 6f 20 74 68 65 20 70 50  ntries to the pP
ca80: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
ca90: 61 79 20 61 73 20 6e 65 63 65 73 73 61 72 79 2e  ay as necessary.
caa0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
cab0: 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20  ine should only 
cac0: 62 65 20 63 61 6c 6c 65 64 20 61 66 74 65 72 20  be called after 
cad0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 68  the expression h
cae0: 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79  as been.** analy
caf0: 7a 65 64 20 62 79 20 73 71 6c 69 74 65 33 45 78  zed by sqlite3Ex
cb00: 70 72 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61  prResolveIds() a
cb10: 6e 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 68  nd sqlite3ExprCh
cb20: 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  eck()..**.** If 
cb30: 65 72 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c  errors are seen,
cb40: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
cb50: 6d 65 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d  message in zErrM
cb60: 73 67 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a  sg and return.**
cb70: 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65   the number of e
cb80: 72 72 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71  rrors..*/.int sq
cb90: 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
cba0: 41 67 67 72 65 67 61 74 65 73 28 50 61 72 73 65  Aggregates(Parse
cbb0: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
cbc0: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
cbd0: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
cbe0: 3b 0a 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30  ;.  int nErr = 0
cbf0: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
cc00: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
cc10: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
cc20: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
cc30: 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20  _COLUMN: {.     
cc40: 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e   aAgg = pParse->
cc50: 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28  aAgg;.      for(
cc60: 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e  i=0; i<pParse->n
cc70: 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Agg; i++){.     
cc80: 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69     if( aAgg[i].i
cc90: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
cca0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67  .        if( aAg
ccb0: 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62  g[i].pExpr->iTab
ccc0: 6c 65 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c  le==pExpr->iTabl
ccd0: 65 0a 20 20 20 20 20 20 20 20 20 26 26 20 61 41  e.         && aA
cce0: 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f  gg[i].pExpr->iCo
ccf0: 6c 75 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f  lumn==pExpr->iCo
cd00: 6c 75 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20  lumn ){.        
cd10: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20    break;.       
cd20: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20   }.      }.     
cd30: 20 69 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e   if( i>=pParse->
cd40: 6e 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20  nAgg ){.        
cd50: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
cd60: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
cd70: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
cd80: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
cd90: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
cda0: 73 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  sAgg = 0;.      
cdb0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
cdc0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
cdd0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
cde0: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
cdf0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
ce00: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41   }.    case TK_A
ce10: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
ce20: 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72       aAgg = pPar
ce30: 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20  se->aAgg;.      
ce40: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72 73  for(i=0; i<pPars
ce50: 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20  e->nAgg; i++){. 
ce60: 20 20 20 20 20 20 20 69 66 28 20 21 61 41 67 67         if( !aAgg
ce70: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
ce80: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
ce90: 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  ( sqlite3ExprCom
cea0: 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45 78  pare(aAgg[i].pEx
ceb0: 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20 20  pr, pExpr) ){.  
cec0: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
ced0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
cee0: 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50  .      if( i>=pP
cef0: 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20  arse->nAgg ){.  
cf00: 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70        u8 enc = p
cf10: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a  Parse->db->enc;.
cf20: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
cf30: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
cf40: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
cf50: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
cf60: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
cf70: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31  Agg[i].isAgg = 1
cf80: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
cf90: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
cfa0: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
cfb0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
cfc0: 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33  .pFunc = sqlite3
cfd0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61  FindFunction(pPa
cfe0: 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20  rse->db,.       
cff0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b        pExpr->tok
d000: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
d010: 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20  en.n,.          
d020: 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20     pExpr->pList 
d030: 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
d040: 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20  nExpr : 0, enc, 
d050: 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  0);.      }.    
d060: 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d 20    pExpr->iAgg = 
d070: 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  i;.      break;.
d080: 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c      }.    defaul
d090: 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  t: {.      if( p
d0a0: 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20  Expr->pLeft ){. 
d0b0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
d0c0: 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
d0d0: 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73  Aggregates(pPars
d0e0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d0f0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d100: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
d110: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a  Expr->pRight ){.
d120: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
d130: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
d140: 65 41 67 67 72 65 67 61 74 65 73 28 70 50 61 72  eAggregates(pPar
d150: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
d160: 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  t);.      }.    
d170: 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26    if( nErr==0 &&
d180: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b   pExpr->pList ){
d190: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  .        int n =
d1a0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
d1b0: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e  Expr;.        in
d1c0: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  t i;.        for
d1d0: 28 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26  (i=0; nErr==0 &&
d1e0: 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20   i<n; i++){.    
d1f0: 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c        nErr = sql
d200: 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
d210: 67 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65  ggregates(pParse
d220: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
d230: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
d240: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
d250: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d260: 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e  }.  }.  return n
d270: 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f  Err;.}../*.** Lo
d280: 63 61 74 65 20 61 20 75 73 65 72 20 66 75 6e 63  cate a user func
d290: 74 69 6f 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d  tion given a nam
d2a0: 65 2c 20 61 20 6e 75 6d 62 65 72 20 6f 66 20 61  e, a number of a
d2b0: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 61 20 66  rguments and a f
d2c0: 6c 61 67 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e  lag.** indicatin
d2d0: 67 20 77 68 65 74 68 65 72 20 74 68 65 20 66 75  g whether the fu
d2e0: 6e 63 74 69 6f 6e 20 70 72 65 66 65 72 73 20 55  nction prefers U
d2f0: 54 46 2d 31 36 20 6f 76 65 72 20 55 54 46 2d 38  TF-16 over UTF-8
d300: 2e 20 20 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70  .  Return a.** p
d310: 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 46 75  ointer to the Fu
d320: 6e 63 44 65 66 20 73 74 72 75 63 74 75 72 65 20  ncDef structure 
d330: 74 68 61 74 20 64 65 66 69 6e 65 73 20 74 68 61  that defines tha
d340: 74 20 66 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72  t function, or r
d350: 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66  eturn.** NULL if
d360: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f   the function do
d370: 65 73 20 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a  es not exist..**
d380: 0a 2a 2a 20 49 66 20 74 68 65 20 63 72 65 61 74  .** If the creat
d390: 65 46 6c 61 67 20 61 72 67 75 6d 65 6e 74 20 69  eFlag argument i
d3a0: 73 20 74 72 75 65 2c 20 74 68 65 6e 20 61 20 6e  s true, then a n
d3b0: 65 77 20 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44  ew (blank) FuncD
d3c0: 65 66 0a 2a 2a 20 73 74 72 75 63 74 75 72 65 20  ef.** structure 
d3d0: 69 73 20 63 72 65 61 74 65 64 20 61 6e 64 20 6c  is created and l
d3e0: 69 6b 65 64 20 69 6e 74 6f 20 74 68 65 20 22 64  iked into the "d
d3f0: 62 22 20 73 74 72 75 63 74 75 72 65 20 69 66 20  b" structure if 
d400: 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67  a.** no matching
d410: 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f   function previo
d420: 75 73 6c 79 20 65 78 69 73 74 65 64 2e 20 20 57  usly existed.  W
d430: 68 65 6e 20 63 72 65 61 74 65 46 6c 61 67 20 69  hen createFlag i
d440: 73 20 74 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68  s true.** and th
d450: 65 20 6e 41 72 67 20 70 61 72 61 6d 65 74 65 72  e nArg parameter
d460: 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c   is -1, then onl
d470: 79 20 61 20 66 75 6e 63 74 69 6f 6e 20 74 68 61  y a function tha
d480: 74 20 61 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79  t accepts.** any
d490: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
d4a0: 65 6e 74 73 20 77 69 6c 6c 20 62 65 20 72 65 74  ents will be ret
d4b0: 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  urned..**.** If 
d4c0: 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61  createFlag is fa
d4d0: 6c 73 65 20 61 6e 64 20 6e 41 72 67 20 69 73 20  lse and nArg is 
d4e0: 2d 31 2c 20 74 68 65 6e 20 74 68 65 20 66 69 72  -1, then the fir
d4f0: 73 74 20 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63  st valid.** func
d500: 74 69 6f 6e 20 66 6f 75 6e 64 20 69 73 20 72 65  tion found is re
d510: 74 75 72 6e 65 64 2e 20 20 41 20 66 75 6e 63 74  turned.  A funct
d520: 69 6f 6e 20 69 73 20 76 61 6c 69 64 20 69 66 20  ion is valid if 
d530: 65 69 74 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20  either xFunc.** 
d540: 6f 72 20 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d  or xStep is non-
d550: 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63  zero..**.** If c
d560: 72 65 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c  reateFlag is fal
d570: 73 65 2c 20 74 68 65 6e 20 61 20 66 75 6e 63 74  se, then a funct
d580: 69 6f 6e 20 77 69 74 68 20 74 68 65 20 72 65 71  ion with the req
d590: 75 69 72 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a  uired name and.*
d5a0: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * number of argu
d5b0: 6d 65 6e 74 73 20 6d 61 79 20 62 65 20 72 65 74  ments may be ret
d5c0: 75 72 6e 65 64 20 65 76 65 6e 20 69 66 20 74 68  urned even if th
d5d0: 65 20 65 54 65 78 74 52 65 70 20 66 6c 61 67 20  e eTextRep flag 
d5e0: 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63  does not.** matc
d5f0: 68 20 74 68 61 74 20 72 65 71 75 65 73 74 65 64  h that requested
d600: 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71  ..*/.FuncDef *sq
d610: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
d620: 6e 28 0a 20 20 73 71 6c 69 74 65 20 2a 64 62 2c  n(.  sqlite *db,
d630: 20 20 20 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70          /* An op
d640: 65 6e 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  en database */. 
d650: 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61   const char *zNa
d660: 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74  me, /* Name of t
d670: 68 65 20 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f  he function.  No
d680: 74 20 6e 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65  t null-terminate
d690: 64 20 2a 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65  d */.  int nName
d6a0: 2c 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ,         /* Num
d6b0: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
d6c0: 73 20 69 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f  s in the name */
d6d0: 0a 20 20 69 6e 74 20 6e 41 72 67 2c 20 20 20 20  .  int nArg,    
d6e0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
d6f0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d  of arguments.  -
d700: 31 20 6d 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62  1 means any numb
d710: 65 72 20 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20  er */.  u8 enc, 
d720: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 72             /* Pr
d730: 65 66 65 72 72 65 64 20 74 65 78 74 20 65 6e 63  eferred text enc
d740: 6f 64 69 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63  oding */.  int c
d750: 72 65 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a  reateFlag     /*
d760: 20 43 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72   Create new entr
d770: 79 20 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f  y if true and do
d780: 65 73 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65  es not otherwise
d790: 20 65 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46   exist */.){.  F
d7a0: 75 6e 63 44 65 66 20 2a 70 3b 20 20 20 20 20 20  uncDef *p;      
d7b0: 20 20 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76     /* Iterator v
d7c0: 61 72 69 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e  ariable */.  Fun
d7d0: 63 44 65 66 20 2a 70 46 69 72 73 74 3b 20 20 20  cDef *pFirst;   
d7e0: 20 2f 2a 20 46 69 72 73 74 20 66 75 6e 63 74 69   /* First functi
d7f0: 6f 6e 20 77 69 74 68 20 74 68 69 73 20 6e 61 6d  on with this nam
d800: 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a  e */.  FuncDef *
d810: 70 42 65 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65  pBest = 0; /* Be
d820: 73 74 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 73  st match found s
d830: 6f 20 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62  o far */.  int b
d840: 65 73 74 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a  estmatch = 0;  .
d850: 0a 0a 20 20 61 73 73 65 72 74 28 20 65 6e 63 3d  ..  assert( enc=
d860: 3d 53 51 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20  =SQLITE_UTF8 || 
d870: 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
d880: 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49  6LE || enc==SQLI
d890: 54 45 5f 55 54 46 31 36 42 45 20 29 3b 0a 20 20  TE_UTF16BE );.  
d8a0: 69 66 28 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41  if( nArg<-1 ) nA
d8b0: 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72  rg = -1;..  pFir
d8c0: 73 74 20 3d 20 28 46 75 6e 63 44 65 66 2a 29 73  st = (FuncDef*)s
d8d0: 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28 26  qlite3HashFind(&
d8e0: 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65  db->aFunc, zName
d8f0: 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28  , nName);.  for(
d900: 70 3d 70 46 69 72 73 74 3b 20 70 3b 20 70 3d 70  p=pFirst; p; p=p
d910: 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a  ->pNext){.    /*
d920: 20 44 75 72 69 6e 67 20 74 68 65 20 73 65 61 72   During the sear
d930: 63 68 20 66 6f 72 20 74 68 65 20 62 65 73 74 20  ch for the best 
d940: 66 75 6e 63 74 69 6f 6e 20 64 65 66 69 6e 69 74  function definit
d950: 69 6f 6e 2c 20 62 65 73 74 6d 61 74 63 68 20 69  ion, bestmatch i
d960: 73 20 73 65 74 0a 20 20 20 20 2a 2a 20 61 73 20  s set.    ** as 
d970: 66 6f 6c 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63  follows to indic
d980: 61 74 65 20 74 68 65 20 71 75 61 6c 69 74 79 20  ate the quality 
d990: 6f 66 20 74 68 65 20 6d 61 74 63 68 20 77 69 74  of the match wit
d9a0: 68 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f 6e  h the definition
d9b0: 0a 20 20 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20  .    ** pointed 
d9c0: 74 6f 20 62 79 20 70 42 65 73 74 3a 0a 20 20 20  to by pBest:.   
d9d0: 20 2a 2a 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42   **.    ** 0: pB
d9e0: 65 73 74 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20  est is NULL. No 
d9f0: 6d 61 74 63 68 20 68 61 73 20 62 65 65 6e 20 66  match has been f
da00: 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20  ound..    ** 1: 
da10: 41 20 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d  A variable argum
da20: 65 6e 74 73 20 66 75 6e 63 74 69 6f 6e 20 74 68  ents function th
da30: 61 74 20 70 72 65 66 65 72 73 20 55 54 46 2d 38  at prefers UTF-8
da40: 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 0a 20   when a UTF-16. 
da50: 20 20 20 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e     **    encodin
da60: 67 20 69 73 20 72 65 71 75 65 73 74 65 64 2c 20  g is requested, 
da70: 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20  or vice versa.. 
da80: 20 20 20 2a 2a 20 32 3a 20 41 20 76 61 72 69 61     ** 2: A varia
da90: 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75  ble arguments fu
daa0: 6e 63 74 69 6f 6e 20 74 68 61 74 20 75 73 65 73  nction that uses
dab0: 20 55 54 46 2d 31 36 42 45 20 77 68 65 6e 20 55   UTF-16BE when U
dac0: 54 46 2d 31 36 4c 45 20 69 73 0a 20 20 20 20 2a  TF-16LE is.    *
dad0: 2a 20 20 20 20 72 65 71 75 65 73 74 65 64 2c 20  *    requested, 
dae0: 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20  or vice versa.. 
daf0: 20 20 20 2a 2a 20 33 3a 20 41 20 76 61 72 69 61     ** 3: A varia
db00: 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20 66 75  ble arguments fu
db10: 6e 63 74 69 6f 6e 20 75 73 69 6e 67 20 74 68 65  nction using the
db20: 20 73 61 6d 65 20 74 65 78 74 20 65 6e 63 6f 64   same text encod
db30: 69 6e 67 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41  ing..    ** 4: A
db40: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
db50: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20  he exact number 
db60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71  of arguments req
db70: 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20  uested that.    
db80: 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54  **    prefers UT
db90: 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d 31  F-8 when a UTF-1
dba0: 36 20 65 6e 63 6f 64 69 6e 67 20 69 73 20 72 65  6 encoding is re
dbb0: 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63 65  quested, or vice
dbc0: 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35   versa..    ** 5
dbd0: 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69 74  : A function wit
dbe0: 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d 62  h the exact numb
dbf0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
dc00: 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a 20  requested that. 
dc10: 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72 73     **    prefers
dc20: 20 55 54 46 2d 31 36 4c 45 20 77 68 65 6e 20 55   UTF-16LE when U
dc30: 54 46 2d 31 36 42 45 20 69 73 20 72 65 71 75 65  TF-16BE is reque
dc40: 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65  sted, or vice ve
dc50: 72 73 61 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41  rsa..    ** 6: A
dc60: 6e 20 65 78 61 63 74 20 6d 61 74 63 68 2e 0a 20  n exact match.. 
dc70: 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c     **.    ** A l
dc80: 61 72 67 65 72 20 76 61 6c 75 65 20 6f 66 20 27  arger value of '
dc90: 6d 61 74 63 68 71 75 61 6c 27 20 69 6e 64 69 63  matchqual' indic
dca0: 61 74 65 73 20 61 20 6d 6f 72 65 20 64 65 73 69  ates a more desi
dcb0: 72 61 62 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20  rable match..   
dcc0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e   */.    if( p->n
dcd0: 41 72 67 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41  Arg==-1 || p->nA
dce0: 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67  rg==nArg || nArg
dcf0: 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 69 6e  ==-1 ){.      in
dd00: 74 20 6d 61 74 63 68 20 3d 20 31 3b 20 20 20 20  t match = 1;    
dd10: 20 20 20 20 20 20 2f 2a 20 51 75 61 6c 69 74 79        /* Quality
dd20: 20 6f 66 20 74 68 69 73 20 6d 61 74 63 68 20 2a   of this match *
dd30: 2f 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e  /.      if( p->n
dd40: 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72  Arg==nArg || nAr
dd50: 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20 20 20 20  g==-1 ){.       
dd60: 20 6d 61 74 63 68 20 3d 20 34 3b 0a 20 20 20 20   match = 4;.    
dd70: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 65 6e    }.      if( en
dd80: 63 3d 3d 70 2d 3e 69 50 72 65 66 45 6e 63 20 29  c==p->iPrefEnc )
dd90: 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20  {.        match 
dda0: 2b 3d 20 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20  += 2;.      }.  
ddb0: 20 20 20 20 65 6c 73 65 20 69 66 28 20 28 65 6e      else if( (en
ddc0: 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c  c==SQLITE_UTF16L
ddd0: 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45 6e 63  E && p->iPrefEnc
dde0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45  ==SQLITE_UTF16BE
ddf0: 29 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 20  ) ||.           
de00: 20 20 20 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45      (enc==SQLITE
de10: 5f 55 54 46 31 36 42 45 20 26 26 20 70 2d 3e 69  _UTF16BE && p->i
de20: 50 72 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f  PrefEnc==SQLITE_
de30: 55 54 46 31 36 4c 45 29 20 29 7b 0a 20 20 20 20  UTF16LE) ){.    
de40: 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 31 3b 0a      match += 1;.
de50: 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 69        }..      i
de60: 66 28 20 6d 61 74 63 68 3e 62 65 73 74 6d 61 74  f( match>bestmat
de70: 63 68 20 29 7b 0a 20 20 20 20 20 20 20 20 70 42  ch ){.        pB
de80: 65 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20  est = p;.       
de90: 20 62 65 73 74 6d 61 74 63 68 20 3d 20 6d 61 74   bestmatch = mat
dea0: 63 68 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ch;.      }.    
deb0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74  }.  }..  /* If t
dec0: 68 65 20 63 72 65 61 74 65 46 6c 61 67 20 70 61  he createFlag pa
ded0: 72 61 6d 65 74 65 72 20 69 73 20 74 72 75 65 2c  rameter is true,
dee0: 20 61 6e 64 20 74 68 65 20 73 65 61 63 68 20 64   and the seach d
def0: 69 64 20 6e 6f 74 20 72 65 76 65 61 6c 20 61 6e  id not reveal an
df00: 0a 20 20 2a 2a 20 65 78 61 63 74 20 6d 61 74 63  .  ** exact matc
df10: 68 20 66 6f 72 20 74 68 65 20 6e 61 6d 65 2c 20  h for the name, 
df20: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
df30: 6e 74 73 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67  nts and encoding
df40: 2c 20 74 68 65 6e 20 61 64 64 20 61 0a 20 20 2a  , then add a.  *
df50: 2a 20 6e 65 77 20 65 6e 74 72 79 20 74 6f 20 74  * new entry to t
df60: 68 65 20 68 61 73 68 20 74 61 62 6c 65 20 61 6e  he hash table an
df70: 64 20 72 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a  d return it..  *
df80: 2f 0a 20 20 69 66 28 20 63 72 65 61 74 65 46 6c  /.  if( createFl
df90: 61 67 20 26 26 20 62 65 73 74 6d 61 74 63 68 3c  ag && bestmatch<
dfa0: 36 20 26 26 20 0a 20 20 20 20 20 20 28 70 42 65  6 && .      (pBe
dfb0: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
dfc0: 63 28 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29  c(sizeof(*pBest)
dfd0: 2b 6e 4e 61 6d 65 2b 31 29 29 20 29 7b 0a 20 20  +nName+1)) ){.  
dfe0: 20 20 70 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20    pBest->nArg = 
dff0: 6e 41 72 67 3b 0a 20 20 20 20 70 42 65 73 74 2d  nArg;.    pBest-
e000: 3e 70 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b  >pNext = pFirst;
e010: 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  .    pBest->zNam
e020: 65 20 3d 20 28 63 68 61 72 2a 29 26 70 42 65 73  e = (char*)&pBes
e030: 74 5b 31 5d 3b 0a 20 20 20 20 70 42 65 73 74 2d  t[1];.    pBest-
e040: 3e 69 50 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b  >iPrefEnc = enc;
e050: 0a 20 20 20 20 6d 65 6d 63 70 79 28 70 42 65 73  .    memcpy(pBes
e060: 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c  t->zName, zName,
e070: 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20 70 42 65   nName);.    pBe
e080: 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d  st->zName[nName]
e090: 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c 69 74 65   = 0;.    sqlite
e0a0: 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
e0b0: 3e 61 46 75 6e 63 2c 20 70 42 65 73 74 2d 3e 7a  >aFunc, pBest->z
e0c0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f  Name, nName, (vo
e0d0: 69 64 2a 29 70 42 65 73 74 29 3b 0a 20 20 7d 0a  id*)pBest);.  }.
e0e0: 0a 20 20 69 66 28 20 70 42 65 73 74 20 26 26 20  .  if( pBest && 
e0f0: 28 70 42 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c  (pBest->xStep ||
e100: 20 70 42 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c   pBest->xFunc ||
e110: 20 63 72 65 61 74 65 46 6c 61 67 29 20 29 7b 0a   createFlag) ){.
e120: 20 20 20 20 72 65 74 75 72 6e 20 70 42 65 73 74      return pBest
e130: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30  ;.  }.  return 0
e140: 3b 0a 7d 0a                                      ;.}.