/ Hex Artifact Content
Login

Artifact f05a5594679fe5297d41578d2e0ffff827772906:


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 33 35 20 32 30 30 34 2f 30 36 2f 30 36 20  .135 2004/06/06 
0220: 30 39 3a 34 34 3a 30 34 20 64 61 6e 69 65 6c 6b  09:44:04 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 63 68 61 72 20 63 6f  type.h>..char co
0270: 6e 73 74 20 2a 73 71 6c 69 74 65 33 41 66 66 69  nst *sqlite3Affi
0280: 6e 69 74 79 53 74 72 69 6e 67 28 63 68 61 72 20  nityString(char 
0290: 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 73 77 69  affinity){.  swi
02a0: 74 63 68 28 20 61 66 66 69 6e 69 74 79 20 29 7b  tch( affinity ){
02b0: 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45  .    case SQLITE
02c0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3a 20 72 65  _AFF_INTEGER: re
02d0: 74 75 72 6e 20 22 69 22 3b 0a 20 20 20 20 63 61  turn "i";.    ca
02e0: 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  se SQLITE_AFF_NU
02f0: 4d 45 52 49 43 3a 20 72 65 74 75 72 6e 20 22 6e  MERIC: return "n
0300: 22 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ";.    case SQLI
0310: 54 45 5f 41 46 46 5f 54 45 58 54 3a 20 20 20 20  TE_AFF_TEXT:    
0320: 72 65 74 75 72 6e 20 22 74 22 3b 0a 20 20 20 20  return "t";.    
0330: 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f  case SQLITE_AFF_
0340: 4e 4f 4e 45 3a 20 20 20 20 72 65 74 75 72 6e 20  NONE:    return 
0350: 22 6f 22 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  "o";.    default
0360: 3a 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 30  :.      assert(0
0370: 29 3b 0a 20 20 7d 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  );.  }.}.../*.**
0380: 20 52 65 74 75 72 6e 20 74 68 65 20 27 61 66 66   Return the 'aff
0390: 69 6e 69 74 79 27 20 6f 66 20 74 68 65 20 65 78  inity' of the ex
03a0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69  pression pExpr i
03b0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
03c0: 70 45 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d  pExpr is a colum
03d0: 6e 2c 20 61 20 72 65 66 65 72 65 6e 63 65 20 74  n, a reference t
03e0: 6f 20 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61  o a column via a
03f0: 6e 20 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a  n 'AS' alias,.**
0400: 20 6f 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74   or a sub-select
0410: 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
0420: 73 20 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c  s the return val
0430: 75 65 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a  ue, then the .**
0440: 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61   affinity of tha
0450: 74 20 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75  t column is retu
0460: 72 6e 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c  rned. Otherwise,
0470: 20 30 78 30 30 20 69 73 20 72 65 74 75 72 6e 65   0x00 is returne
0480: 64 2c 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67  d,.** indicating
0490: 20 6e 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72   no affinity for
04a0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
04b0: 0a 2a 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20  .**.** i.e. the 
04c0: 57 48 45 52 45 20 63 6c 61 75 73 65 20 65 78 70  WHERE clause exp
04d0: 72 65 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65  resssions in the
04e0: 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65   following state
04f0: 6d 65 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76  ments all.** hav
0500: 65 20 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a  e an affinity:.*
0510: 2a 0a 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c  *.** CREATE TABL
0520: 45 20 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45  E t1(a);.** SELE
0530: 43 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45  CT * FROM t1 WHE
0540: 52 45 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE a;.** SELECT 
0550: 61 20 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57  a AS b FROM t1 W
0560: 48 45 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43  HERE b;.** SELEC
0570: 54 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52  T * FROM t1 WHER
0580: 45 20 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d  E (select a from
0590: 20 74 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71   t1);.*/.char sq
05a0: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
05b0: 79 28 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  y(Expr *pExpr){.
05c0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d    if( pExpr->op=
05d0: 3d 54 4b 5f 41 53 20 29 7b 0a 20 20 20 20 72 65  =TK_AS ){.    re
05e0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
05f0: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0600: 70 4c 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66  pLeft);.  }.  if
0610: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0620: 53 45 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65  SELECT ){.    re
0630: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
0640: 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e  Affinity(pExpr->
0650: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
0660: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
0670: 7d 0a 20 20 72 65 74 75 72 6e 20 70 45 78 70 72  }.  return pExpr
0680: 2d 3e 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f  ->affinity;.}../
0690: 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 74 68  *.** pExpr is th
06a0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f  e left operand o
06b0: 66 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  f a comparison o
06c0: 70 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69  perator.  aff2 i
06d0: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
06e0: 66 69 6e 69 74 79 20 6f 66 20 74 68 65 20 72 69  finity of the ri
06f0: 67 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68  ght operand.  Th
0700: 69 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72  is routine retur
0710: 6e 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61  ns the.** type a
0720: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0730: 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20  uld be used for 
0740: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f  the comparison o
0750: 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72  perator..*/.char
0760: 20 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41   sqlite3CompareA
0770: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
0780: 78 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b  xpr, char aff2){
0790: 0a 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73  .  char aff1 = s
07a0: 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69  qlite3ExprAffini
07b0: 74 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28  ty(pExpr);.  if(
07c0: 20 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b   aff1 && aff2 ){
07d0: 0a 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64  .    /* Both sid
07e0: 65 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72  es of the compar
07f0: 69 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73  ison are columns
0800: 2e 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d  . If one has num
0810: 65 72 69 63 20 6f 72 0a 20 20 20 20 2a 2a 20 69  eric or.    ** i
0820: 6e 74 65 67 65 72 20 61 66 66 69 6e 69 74 79 2c  nteger affinity,
0830: 20 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72   use that. Other
0840: 77 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69  wise use no affi
0850: 6e 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  nity..    */.   
0860: 20 69 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54   if( aff1==SQLIT
0870: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c  E_AFF_INTEGER ||
0880: 20 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46   aff2==SQLITE_AF
0890: 46 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20  F_INTEGER ){.   
08a0: 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45     return SQLITE
08b0: 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20  _AFF_INTEGER;.  
08c0: 20 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 31    }else if( aff1
08d0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  ==SQLITE_AFF_NUM
08e0: 45 52 49 43 20 7c 7c 20 61 66 66 32 3d 3d 53 51  ERIC || aff2==SQ
08f0: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0900: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0910: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45   SQLITE_AFF_NUME
0920: 52 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  RIC;.    }else{.
0930: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
0940: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20  ITE_AFF_NONE;.  
0950: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
0960: 21 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29  !aff1 && !aff2 )
0970: 7b 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72  {.    /* Neither
0980: 20 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d   side of the com
0990: 70 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c  parison is a col
09a0: 75 6d 6e 2e 20 55 73 65 20 6e 75 6d 65 72 69 63  umn. Use numeric
09b0: 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a   affinity.    **
09c0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
09d0: 73 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  son..    */.    
09e0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
09f0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 65 6c  F_NUMERIC;.  }el
0a00: 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73  se{.    /* One s
0a10: 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  ide is a column,
0a20: 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f   the other is no
0a30: 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d  t. Use the colum
0a40: 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a  ns affinity. */.
0a50: 20 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31      return (aff1
0a60: 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a   + aff2);.  }.}.
0a70: 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20  ./*.** pExpr is 
0a80: 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  a comparison ope
0a90: 72 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74  rator.  Return t
0aa0: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
0ab0: 20 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20   that should.** 
0ac0: 62 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f  be applied to bo
0ad0: 74 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f  th operands prio
0ae0: 72 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63  r to doing the c
0af0: 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74  omparison..*/.st
0b00: 61 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72  atic char compar
0b10: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70  isonAffinity(Exp
0b20: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61  r *pExpr){.  cha
0b30: 72 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28  r aff;.  assert(
0b40: 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45   pExpr->op==TK_E
0b50: 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  Q || pExpr->op==
0b60: 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e  TK_IN || pExpr->
0b70: 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20  op==TK_LT ||.   
0b80: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
0b90: 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72  ==TK_GT || pExpr
0ba0: 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70  ->op==TK_GE || p
0bb0: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20  Expr->op==TK_LE 
0bc0: 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  ||.          pEx
0bd0: 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b  pr->op==TK_NE );
0be0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
0bf0: 2d 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66  ->pLeft );.  aff
0c00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
0c10: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
0c20: 65 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70  eft);.  if( pExp
0c30: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
0c40: 20 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f   aff = sqlite3Co
0c50: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
0c60: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66  xpr->pRight, aff
0c70: 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66  );.  }.  else if
0c80: 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  ( pExpr->pSelect
0c90: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0ca0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0cb0: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c  nity(pExpr->pSel
0cc0: 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  ect->pEList->a[0
0cd0: 5d 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20  ].pExpr, aff);. 
0ce0: 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61   }.  else if( !a
0cf0: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
0d00: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0d10: 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  IC;.  }.  return
0d20: 20 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70   aff;.}../*.** p
0d30: 45 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72  Expr is a compar
0d40: 69 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c  ison expression,
0d50: 20 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49   eg. '=', '<', I
0d60: 4e 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69  N(...) etc..** i
0d70: 64 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74  dx_affinity is t
0d80: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61  he affinity of a
0d90: 6e 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e  n indexed column
0da0: 2e 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a  . Return true.**
0db0: 20 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69   if the index wi
0dc0: 74 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f  th affinity idx_
0dd0: 61 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20  affinity may be 
0de0: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
0df0: 74 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69  t.** the compari
0e00: 73 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f  son in pExpr..*/
0e10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65  .int sqlite3Inde
0e20: 78 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72  xAffinityOk(Expr
0e30: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64   *pExpr, char id
0e40: 78 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63  x_affinity){.  c
0e50: 68 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72  har aff = compar
0e60: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
0e70: 70 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20  pr);.  return . 
0e80: 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f     (aff==SQLITE_
0e90: 41 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20  AFF_NONE) ||.   
0ea0: 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46   (aff==SQLITE_AF
0eb0: 46 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78  F_NUMERIC && idx
0ec0: 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54  _affinity==SQLIT
0ed0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c  E_AFF_INTEGER) |
0ee0: 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49  |.    (aff==SQLI
0ef0: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26  TE_AFF_INTEGER &
0f00: 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d  & idx_affinity==
0f10: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0f20: 49 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d  IC) ||.    (aff=
0f30: 3d 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a  =idx_affinity);.
0f40: 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  }../*.** Return 
0f50: 74 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61  the P1 value tha
0f60: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
0f70: 20 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f   for a binary co
0f80: 6d 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f  mparison.** opco
0f90: 64 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65  de (OP_Eq, OP_Ge
0fa0: 20 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63   etc.) used to c
0fb0: 6f 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e  ompare pExpr1 an
0fc0: 64 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20  d pExpr2..** If 
0fd0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72  jumpIfNull is tr
0fe0: 75 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65  ue, then set the
0ff0: 20 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65   low byte of the
1000: 20 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20   returned.** P1 
1010: 76 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68  value to tell th
1020: 65 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70  e opcode to jump
1030: 20 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65   if either expre
1040: 73 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74  ssion.** evaluat
1050: 65 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73  es to NULL..*/.s
1060: 74 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79  tatic int binary
1070: 43 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a  CompareP1(Expr *
1080: 70 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45  pExpr1, Expr *pE
1090: 78 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66  xpr2, int jumpIf
10a0: 4e 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66  Null){.  char af
10b0: 66 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  f = sqlite3ExprA
10c0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b  ffinity(pExpr2);
10d0: 0a 20 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74  .  return (((int
10e0: 29 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41  )sqlite3CompareA
10f0: 66 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20  ffinity(pExpr1, 
1100: 61 66 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49  aff))<<8)+(jumpI
1110: 66 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f  fNull?1:0);.}../
1120: 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61  *.** Construct a
1130: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
1140: 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72 6e 20  node and return 
1150: 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69 74 2e  a pointer to it.
1160: 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f 72 20    Memory.** for 
1170: 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f 62 74  this node is obt
1180: 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c 69 74  ained from sqlit
1190: 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68 65 20  eMalloc().  The 
11a0: 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f 6e  calling function
11b0: 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73 69 62  .** is responsib
11c0: 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20 73 75  le for making su
11d0: 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76 65 6e  re the node even
11e0: 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72 65 65  tually gets free
11f0: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
1200: 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70 2c 20  te3Expr(int op, 
1210: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1220: 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b 65 6e  r *pRight, Token
1230: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
1240: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
1250: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
1260: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
1270: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
1280: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
1290: 6c 6f 63 20 66 61 69 6c 73 2c 20 77 65 20 6c 65  loc fails, we le
12a0: 61 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 70  ak memory from p
12b0: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
12c0: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
12d0: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
12e0: 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  = op;.  pNew->pL
12f0: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70  eft = pLeft;.  p
1300: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  New->pRight = pR
1310: 69 67 68 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b  ight;.  if( pTok
1320: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1330: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
1340: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   );.    pNew->to
1350: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
1360: 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20     pNew->span = 
1370: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65  *pToken;.  }else
1380: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e  {.    assert( pN
1390: 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d 3d 30  ew->token.dyn==0
13a0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13b0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  pNew->token.z==0
13c0: 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20   );.    assert( 
13d0: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 30  pNew->token.n==0
13e0: 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66   );.    if( pLef
13f0: 74 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20  t && pRight ){. 
1400: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1410: 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66  Span(pNew, &pLef
1420: 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67 68 74  t->span, &pRight
1430: 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d 65 6c  ->span);.    }el
1440: 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e  se{.      pNew->
1450: 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b  span = pNew->tok
1460: 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20  en;.    }.  }.  
1470: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a  return pNew;.}..
1480: 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78  /*.** Set the Ex
1490: 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66  pr.span field of
14a0: 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65   the given expre
14b0: 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c  ssion to span al
14c0: 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65  l.** text betwee
14d0: 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20  n the two given 
14e0: 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20  tokens..*/.void 
14f0: 73 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28  sqlite3ExprSpan(
1500: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b  Expr *pExpr, Tok
1510: 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e  en *pLeft, Token
1520: 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73   *pRight){.  ass
1530: 65 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29  ert( pRight!=0 )
1540: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66  ;.  assert( pLef
1550: 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 4e 6f 74  t!=0 );.  /* Not
1560: 65 3a 20 70 45 78 70 72 20 6d 69 67 68 74 20 62  e: pExpr might b
1570: 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20 61 20  e NULL due to a 
1580: 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 20 66 61 69  prior malloc fai
1590: 6c 75 72 65 20 2a 2f 0a 20 20 69 66 28 20 70 45  lure */.  if( pE
15a0: 78 70 72 20 26 26 20 70 52 69 67 68 74 2d 3e 7a  xpr && pRight->z
15b0: 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a   && pLeft->z ){.
15c0: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 64      if( pLeft->d
15d0: 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68 74 2d  yn==0 && pRight-
15e0: 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20 20 20  >dyn==0 ){.     
15f0: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d   pExpr->span.z =
1600: 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20 20 20   pLeft->z;.     
1610: 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 20 3d   pExpr->span.n =
1620: 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 41 64 64   pRight->n + Add
1630: 72 28 70 52 69 67 68 74 2d 3e 7a 29 20 2d 20 41  r(pRight->z) - A
1640: 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29 3b 0a 20  ddr(pLeft->z);. 
1650: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1660: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 3d 20  pExpr->span.z = 
1670: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
1680: 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20  /*.** Construct 
1690: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
16a0: 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63   node for a func
16b0: 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70  tion with multip
16c0: 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e  le.** arguments.
16d0: 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65  .*/.Expr *sqlite
16e0: 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28 45 78  3ExprFunction(Ex
16f0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 54  prList *pList, T
1700: 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20  oken *pToken){. 
1710: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70   Expr *pNew;.  p
1720: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
1730: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29  oc( sizeof(Expr)
1740: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
1750: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71 6c 69  0 ){.    /* sqli
1760: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
1770: 65 28 70 4c 69 73 74 29 3b 20 2f 2f 20 4c 65 61  e(pList); // Lea
1780: 6b 20 70 4c 69 73 74 20 77 68 65 6e 20 6d 61 6c  k pList when mal
1790: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20  loc fails */.   
17a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
17b0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b 5f 46   pNew->op = TK_F
17c0: 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65 77 2d  UNCTION;.  pNew-
17d0: 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a  >pList = pList;.
17e0: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
17f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1800: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1810: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
1820: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c 73 65  *pToken;.  }else
1830: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
1840: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 70  n.z = 0;.  }.  p
1850: 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77  New->span = pNew
1860: 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74 75 72  ->token;.  retur
1870: 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  n pNew;.}../*.**
1880: 20 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c   Recursively del
1890: 65 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f  ete an expressio
18a0: 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
18b0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
18c0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66  e(Expr *p){.  if
18d0: 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  ( p==0 ) return;
18e0: 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64  .  if( p->span.d
18f0: 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  yn ) sqliteFree(
1900: 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a  (char*)p->span.z
1910: 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65  );.  if( p->toke
1920: 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72  n.dyn ) sqliteFr
1930: 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b  ee((char*)p->tok
1940: 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33  en.z);.  sqlite3
1950: 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c  ExprDelete(p->pL
1960: 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  eft);.  sqlite3E
1970: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69  xprDelete(p->pRi
1980: 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  ght);.  sqlite3E
1990: 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d  xprListDelete(p-
19a0: 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74  >pList);.  sqlit
19b0: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70  e3SelectDelete(p
19c0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71  ->pSelect);.  sq
19d0: 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a  liteFree(p);.}..
19e0: 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f  ./*.** The follo
19f0: 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f  wing group of ro
1a00: 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70  utines make deep
1a10: 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65   copies of expre
1a20: 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65  ssions,.** expre
1a30: 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20  ssion lists, ID 
1a40: 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63  lists, and selec
1a50: 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54  t statements.  T
1a60: 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a  he copies can.**
1a70: 20 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20   be deleted (by 
1a80: 62 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20  being passed to 
1a90: 74 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65  their respective
1aa0: 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75   ...Delete() rou
1ab0: 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75  tines).** withou
1ac0: 74 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20  t effecting the 
1ad0: 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a  originals..**.**
1ae0: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
1af0: 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f  list, ID, and so
1b00: 75 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72  urce lists retur
1b10: 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  n by sqlite3Expr
1b20: 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71  ListDup(),.** sq
1b30: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29  lite3IdListDup()
1b40: 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63  , and sqlite3Src
1b50: 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f  ListDup() can no
1b60: 74 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70  t be further exp
1b70: 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62  anded .** by sub
1b80: 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f  sequent calls to
1b90: 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65   sqlite*ListAppe
1ba0: 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a  nd() routines..*
1bb0: 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20  *.** Any tables 
1bc0: 74 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74  that the SrcList
1bd0: 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20   might point to 
1be0: 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74  are not duplicat
1bf0: 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ed..*/.Expr *sql
1c00: 69 74 65 33 45 78 70 72 44 75 70 28 45 78 70 72  ite3ExprDup(Expr
1c10: 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e   *p){.  Expr *pN
1c20: 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ew;.  if( p==0 )
1c30: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
1c40: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
1c50: 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20  Raw( sizeof(*p) 
1c60: 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30  );.  if( pNew==0
1c70: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d   ) return 0;.  m
1c80: 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73  emcpy(pNew, p, s
1c90: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20  izeof(*pNew));. 
1ca0: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21   if( p->token.z!
1cb0: 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 ){.    pNew->
1cc0: 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65  token.z = sqlite
1cd0: 53 74 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e  StrDup(p->token.
1ce0: 7a 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  z);.    pNew->to
1cf0: 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d  ken.dyn = 1;.  }
1d00: 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74  else{.    assert
1d10: 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d  ( pNew->token.z=
1d20: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77  =0 );.  }.  pNew
1d30: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20  ->span.z = 0;.  
1d40: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71  pNew->pLeft = sq
1d50: 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e  lite3ExprDup(p->
1d60: 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pLeft);.  pNew->
1d70: 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33  pRight = sqlite3
1d80: 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68  ExprDup(p->pRigh
1d90: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73  t);.  pNew->pLis
1da0: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
1db0: 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29  istDup(p->pList)
1dc0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63  ;.  pNew->pSelec
1dd0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
1de0: 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29  tDup(p->pSelect)
1df0: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1e00: 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54  .}.void sqlite3T
1e10: 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a  okenCopy(Token *
1e20: 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f  pTo, Token *pFro
1e30: 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64  m){.  if( pTo->d
1e40: 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28  yn ) sqliteFree(
1e50: 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a  (char*)pTo->z);.
1e60: 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29    if( pFrom->z )
1e70: 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70  {.    pTo->n = p
1e80: 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f  From->n;.    pTo
1e90: 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  ->z = sqliteStrN
1ea0: 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46  Dup(pFrom->z, pF
1eb0: 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f  rom->n);.    pTo
1ec0: 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c  ->dyn = 1;.  }el
1ed0: 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d  se{.    pTo->z =
1ee0: 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69   0;.  }.}.ExprLi
1ef0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
1f00: 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20  istDup(ExprList 
1f10: 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20  *p){.  ExprList 
1f20: 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20  *pNew;.  struct 
1f30: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
1f40: 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  Item;.  int i;. 
1f50: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
1f60: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
1f70: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
1f80: 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20  eof(*pNew) );.  
1f90: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65  if( pNew==0 ) re
1fa0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  turn 0;.  pNew->
1fb0: 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e 41  nExpr = pNew->nA
1fc0: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72 3b  lloc = p->nExpr;
1fd0: 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49 74  .  pNew->a = pIt
1fe0: 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  em = sqliteMallo
1ff0: 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a 65  c( p->nExpr*size
2000: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
2010: 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29 20   if( pItem==0 ) 
2020: 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20 4c 65  return 0;  /* Le
2030: 61 6b 73 20 6d 65 6d 6f 72 79 20 61 66 74 65 72  aks memory after
2040: 20 61 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72   a malloc failur
2050: 65 20 2a 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20  e */.  for(i=0; 
2060: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  i<p->nExpr; i++,
2070: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45   pItem++){.    E
2080: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
2090: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
20a0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
20b0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
20c0: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
20d0: 3d 20 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  = p->a[i].pExpr)
20e0: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
20f0: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
2100: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
2110: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
2120: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
2130: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
2140: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
2150: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
2160: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
2170: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
2180: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
2190: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
21a0: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
21b0: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
21c0: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
21d0: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
21e0: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
21f0: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
2200: 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  (&pNewExpr->span
2210: 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  , &pOldExpr->spa
2220: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  n);.    }.    as
2230: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d  sert( pNewExpr==
2240: 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73  0 || pNewExpr->s
2250: 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20  pan.z!=0 .      
2260: 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70        || pOldExp
2270: 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20  r->span.z==0 || 
2280: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
2290: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74  ailed );.    pIt
22a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
22b0: 74 65 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d  teStrDup(p->a[i]
22c0: 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74  .zName);.    pIt
22d0: 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20  em->sortOrder = 
22e0: 70 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  p->a[i].sortOrde
22f0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73  r;.    pItem->is
2300: 41 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73  Agg = p->a[i].is
2310: 41 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e  Agg;.    pItem->
2320: 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20  done = 0;.  }.  
2330: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53  return pNew;.}.S
2340: 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53  rcList *sqlite3S
2350: 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73  rcListDup(SrcLis
2360: 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74  t *p){.  SrcList
2370: 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b   *pNew;.  int i;
2380: 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20  .  int nByte;.  
2390: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
23a0: 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73  n 0;.  nByte = s
23b0: 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e  izeof(*p) + (p->
23c0: 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28  nSrc>0 ? sizeof(
23d0: 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e  p->a[0]) * (p->n
23e0: 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70  Src-1) : 0);.  p
23f0: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
2400: 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a  ocRaw( nByte );.
2410: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
2420: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
2430: 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e  ->nSrc = pNew->n
2440: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b  Alloc = p->nSrc;
2450: 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d  .  for(i=0; i<p-
2460: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
2470: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
2480: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
2490: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
24a0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
24b0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
24c0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
24d0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62  pNewItem->zDatab
24e0: 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ase = sqliteStrD
24f0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61  up(pOldItem->zDa
2500: 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65  tabase);.    pNe
2510: 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73  wItem->zName = s
2520: 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64  qliteStrDup(pOld
2530: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
2540: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69    pNewItem->zAli
2550: 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  as = sqliteStrDu
2560: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  p(pOldItem->zAli
2570: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
2580: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
2590: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
25a0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
25b0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
25c0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
25d0: 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20   pNewItem->pTab 
25e0: 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  = 0;.    pNewIte
25f0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
2600: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f  ite3SelectDup(pO
2610: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  ldItem->pSelect)
2620: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
2630: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
2640: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  rDup(pOldItem->p
2650: 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  On);.    pNewIte
2660: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
2670: 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c  te3IdListDup(pOl
2680: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
2690: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
26a0: 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c  w;.}.IdList *sql
26b0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64  ite3IdListDup(Id
26c0: 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69  List *p){.  IdLi
26d0: 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20  st *pNew;.  int 
26e0: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
26f0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
2700: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2710: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77  aw( sizeof(*pNew
2720: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
2730: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2740: 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65   pNew->nId = pNe
2750: 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e  w->nAlloc = p->n
2760: 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  Id;.  pNew->a = 
2770: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
2780: 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70   p->nId*sizeof(p
2790: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
27a0: 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65   pNew->a==0 ) re
27b0: 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d  turn 0;.  for(i=
27c0: 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b  0; i<p->nId; i++
27d0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ){.    struct Id
27e0: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49  List_item *pNewI
27f0: 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69  tem = &pNew->a[i
2800: 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64  ];.    struct Id
2810: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49  List_item *pOldI
2820: 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a  tem = &p->a[i];.
2830: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
2840: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
2850: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
2860: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
2870: 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65  m->idx = pOldIte
2880: 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65  m->idx;.  }.  re
2890: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c  turn pNew;.}.Sel
28a0: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
28b0: 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29  ctDup(Select *p)
28c0: 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77  {.  Select *pNew
28d0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
28e0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
28f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2900: 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b  w( sizeof(*p) );
2910: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
2920: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
2930: 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20  w->isDistinct = 
2940: 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20  p->isDistinct;. 
2950: 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20   pNew->pEList = 
2960: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2970: 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  up(p->pEList);. 
2980: 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71   pNew->pSrc = sq
2990: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
29a0: 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77  p->pSrc);.  pNew
29b0: 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74  ->pWhere = sqlit
29c0: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68  e3ExprDup(p->pWh
29d0: 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47  ere);.  pNew->pG
29e0: 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33  roupBy = sqlite3
29f0: 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70  ExprListDup(p->p
2a00: 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77  GroupBy);.  pNew
2a10: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
2a20: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48  te3ExprDup(p->pH
2a30: 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e  aving);.  pNew->
2a40: 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74  pOrderBy = sqlit
2a50: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
2a60: 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e  >pOrderBy);.  pN
2a70: 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a  ew->op = p->op;.
2a80: 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d    pNew->pPrior =
2a90: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75   sqlite3SelectDu
2aa0: 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20  p(p->pPrior);.  
2ab0: 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70  pNew->nLimit = p
2ac0: 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77  ->nLimit;.  pNew
2ad0: 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e  ->nOffset = p->n
2ae0: 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e  Offset;.  pNew->
2af0: 7a 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70  zSelect = 0;.  p
2b00: 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31  New->iLimit = -1
2b10: 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65  ;.  pNew->iOffse
2b20: 74 20 3d 20 2d 31 3b 0a 20 20 72 65 74 75 72 6e  t = -1;.  return
2b30: 20 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a   pNew;.}.../*.**
2b40: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
2b50: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
2b60: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
2b70: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
2b80: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
2b90: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
2ba0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2bb0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
2bc0: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
2bd0: 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c  ListAppend(ExprL
2be0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72  ist *pList, Expr
2bf0: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
2c00: 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c  pName){.  if( pL
2c10: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
2c20: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
2c30: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
2c40: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
2c50: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
2c60: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
2c70: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f  Delete(pExpr); /
2c80: 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66  / Leak memory if
2c90: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
2ca0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
2cb0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
2cc0: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
2cd0: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
2ce0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
2cf0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
2d00: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
2d10: 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
2d20: 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69  c*2 + 4;.    pLi
2d30: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
2d40: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
2d50: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
2d60: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
2d70: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
2d80: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
2d90: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
2da0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
2db0: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
2dc0: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2dd0: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78        pList->nEx
2de0: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  pr = pList->nAll
2df0: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  oc = 0;.      re
2e00: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20  turn pList;.    
2e10: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
2e20: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
2e30: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
2e40: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
2e50: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2e60: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
2e70: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
2e80: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
2e90: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
2ea0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
2eb0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
2ec0: 70 72 3b 0a 20 20 20 20 69 66 28 20 70 4e 61 6d  pr;.    if( pNam
2ed0: 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  e ){.      sqlit
2ee0: 65 33 53 65 74 4e 53 74 72 69 6e 67 28 26 70 49  e3SetNString(&pI
2ef0: 74 65 6d 2d 3e 7a 4e 61 6d 65 2c 20 70 4e 61 6d  tem->zName, pNam
2f00: 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d 3e 6e 2c 20  e->z, pName->n, 
2f10: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
2f20: 33 44 65 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e  3Dequote(pItem->
2f30: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 7d 0a 20 20  zName);.    }.  
2f40: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
2f50: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
2f60: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
2f70: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
2f80: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
2f90: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
2fa0: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
2fb0: 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
2fc0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  t==0 ) return;. 
2fd0: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
2fe0: 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e  a!=0 || (pList->
2ff0: 6e 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73  nExpr==0 && pLis
3000: 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b  t->nAlloc==0) );
3010: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74  .  assert( pList
3020: 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e  ->nExpr<=pList->
3030: 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28  nAlloc );.  for(
3040: 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45  i=0; i<pList->nE
3050: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73  xpr; i++){.    s
3060: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
3070: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
3080: 70 72 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46  pr);.    sqliteF
3090: 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ree(pList->a[i].
30a0: 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71  zName);.  }.  sq
30b0: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
30c0: 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  a);.  sqliteFree
30d0: 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  (pList);.}../*.*
30e0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
30f0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
3100: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
3110: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
3120: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
3130: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
3140: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
3150: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
3160: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
3170: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
3180: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
3190: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
31a0: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
31b0: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
31c0: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
31d0: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
31e0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
31f0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
3200: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
3210: 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b  switch( p->op ){
3220: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a  .    case TK_ID:
3230: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
3240: 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  UMN:.    case TK
3250: 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  _DOT:.    case T
3260: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  K_FUNCTION:.    
3270: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
3280: 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20  case TK_NULL:.  
3290: 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47    case TK_STRING
32a0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  :.    case TK_BL
32b0: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OB:.    case TK_
32c0: 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63 61 73  INTEGER:.    cas
32d0: 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20  e TK_FLOAT:.    
32e0: 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45  case TK_VARIABLE
32f0: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  :.      return 1
3300: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b  ;.    default: {
3310: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 4c  .      if( p->pL
3320: 65 66 74 20 26 26 20 21 73 71 6c 69 74 65 33 45  eft && !sqlite3E
3330: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d  xprIsConstant(p-
3340: 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72 6e  >pLeft) ) return
3350: 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70 2d   0;.      if( p-
3360: 3e 70 52 69 67 68 74 20 26 26 20 21 73 71 6c 69  >pRight && !sqli
3370: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
3380: 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29 20 72  t(p->pRight) ) r
3390: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69  eturn 0;.      i
33a0: 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  f( p->pList ){. 
33b0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
33c0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
33d0: 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72  <p->pList->nExpr
33e0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
33f0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
3400: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e  prIsConstant(p->
3410: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
3420: 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  r) ) return 0;. 
3430: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
3440: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
3450: 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70 2d 3e  >pLeft!=0 || p->
3460: 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28 70 2d  pRight!=0 || (p-
3470: 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70 4c 69  >pList && p->pLi
3480: 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a 20 20  st->nExpr>0);.  
3490: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
34a0: 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20   0;.}../*.** If 
34b0: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
34c0: 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63 6f 6e  sion codes a con
34d0: 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20 74 68  stant integer th
34e0: 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75  at is small enou
34f0: 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20  gh.** to fit in 
3500: 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65 72  a 32-bit integer
3510: 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64 20 70  , return 1 and p
3520: 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  ut the value of 
3530: 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69  the integer.** i
3540: 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66 20 74  n *pValue.  If t
3550: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
3560: 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65 72 20   not an integer 
3570: 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f 6f 20  or if it is too 
3580: 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e  big.** to fit in
3590: 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62 69 74   a signed 32-bit
35a0: 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72 6e   integer, return
35b0: 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a 70 56   0 and leave *pV
35c0: 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a  alue unchanged..
35d0: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
35e0: 70 72 49 73 49 6e 74 65 67 65 72 28 45 78 70 72  prIsInteger(Expr
35f0: 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65   *p, int *pValue
3600: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
3610: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
3620: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
3630: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 47 65     if( sqlite3Ge
3640: 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e  tInt32(p->token.
3650: 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a 20 20  z, pValue) ){.  
3660: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
3670: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72        }.      br
3680: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
3690: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
36a0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
36b0: 72 20 2a 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e  r *z = p->token.
36c0: 7a 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 20 3d  z;.      int n =
36d0: 20 70 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20   p->token.n;.   
36e0: 20 20 20 69 66 28 20 6e 3e 30 20 26 26 20 7a 5b     if( n>0 && z[
36f0: 30 5d 3d 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20  0]=='-' ){ z++; 
3700: 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 77 68 69  n--; }.      whi
3710: 6c 65 28 20 6e 3e 30 20 26 26 20 2a 7a 20 26 26  le( n>0 && *z &&
3720: 20 69 73 64 69 67 69 74 28 2a 7a 29 20 29 7b 20   isdigit(*z) ){ 
3730: 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  z++; n--; }.    
3740: 20 20 69 66 28 20 6e 3d 3d 30 20 26 26 20 73 71    if( n==0 && sq
3750: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d  lite3GetInt32(p-
3760: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65  >token.z, pValue
3770: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
3780: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
3790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
37a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
37b0: 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72 65 74  LUS: {.      ret
37c0: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 49  urn sqlite3ExprI
37d0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
37e0: 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20 20 20  t, pValue);.    
37f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d  }.    case TK_UM
3800: 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e  INUS: {.      in
3810: 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28 20 73  t v;.      if( s
3820: 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65  qlite3ExprIsInte
3830: 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76  ger(p->pLeft, &v
3840: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a 70 56  ) ){.        *pV
3850: 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20  alue = -v;.     
3860: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3870: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3880: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
3890: 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a  ult: break;.  }.
38a0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
38b0: 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45  *.** Return TRUE
38c0: 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73 74   if the given st
38d0: 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69 64  ring is a row-id
38e0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f   column name..*/
38f0: 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52 6f  .int sqlite3IsRo
3900: 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20 2a  wid(const char *
3910: 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74 65  z){.  if( sqlite
3920: 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f  3StrICmp(z, "_RO
3930: 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74 75  WID_")==0 ) retu
3940: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
3950: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 52  te3StrICmp(z, "R
3960: 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  OWID")==0 ) retu
3970: 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c 69  rn 1;.  if( sqli
3980: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f  te3StrICmp(z, "O
3990: 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e  ID")==0 ) return
39a0: 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   1;.  return 0;.
39b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74  }../*.** Given t
39c0: 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c  he name of a col
39d0: 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  umn of the form 
39e0: 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20  X.Y.Z or Y.Z or 
39f0: 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a  just Z, look up.
3a00: 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69 6e 20  ** that name in 
3a10: 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75 72 63  the set of sourc
3a20: 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53 72 63  e tables in pSrc
3a30: 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20 74 68  List and make th
3a40: 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78 70 72  e pExpr .** expr
3a50: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65  ession node refe
3a60: 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74 20 73  r back to that s
3a70: 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54  ource column.  T
3a80: 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61  he following cha
3a90: 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65  nges.** are made
3aa0: 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a   to pExpr:.**.**
3ab0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 20      pExpr->iDb  
3ac0: 20 20 20 20 20 20 20 20 20 53 65 74 20 74 68 65           Set the
3ad0: 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e 61 44   index in db->aD
3ae0: 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74 61 62  b[] of the datab
3af0: 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20  ase holding.**  
3b00: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b10: 20 20 20 20 20 20 20 74 68 65 20 74 61 62 6c 65         the table
3b20: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69  ..**    pExpr->i
3b30: 54 61 62 6c 65 20 20 20 20 20 20 20 20 53 65 74  Table        Set
3b40: 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72 20 6e   to the cursor n
3b50: 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20 74 61  umber for the ta
3b60: 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20  ble obtained.** 
3b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3b80: 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70 53 72          from pSr
3b90: 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78  cList..**    pEx
3ba0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20  pr->iColumn     
3bb0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 6f 6c    Set to the col
3bc0: 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74 68 69  umn number withi
3bd0: 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20  n the table..** 
3be0: 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20     pExpr->op    
3bf0: 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 54          Set to T
3c00: 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20  K_COLUMN..**    
3c10: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20 20 20  pExpr->pLeft    
3c20: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
3c30: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
3c40: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a  to is deleted.**
3c50: 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68      pExpr->pRigh
3c60: 74 20 20 20 20 20 20 20 20 41 6e 79 20 65 78 70  t        Any exp
3c70: 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69  ression this poi
3c80: 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65  nts to is delete
3c90: 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62  d..**.** The pDb
3ca0: 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e 61 6d  Token is the nam
3cb0: 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73  e of the databas
3cc0: 65 20 28 74 68 65 20 22 58 22 29 2e 20 20 54 68  e (the "X").  Th
3cd0: 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62 65 0a  is value may be.
3ce0: 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20  ** NULL meaning 
3cf0: 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f 66 20  that name is of 
3d00: 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20  the form Y.Z or 
3d10: 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61 62 6c  Z.  Any availabl
3d20: 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20 63 61  e database.** ca
3d30: 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68 65 20  n be used.  The 
3d40: 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74  pTableToken is t
3d50: 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 74  he name of the t
3d60: 61 62 6c 65 20 28 74 68 65 20 22 59 22 29 2e 20  able (the "Y"). 
3d70: 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63   This.** value c
3d80: 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20 70 44  an be NULL if pD
3d90: 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e  bToken is also N
3da0: 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c 65 54  ULL.  If pTableT
3db0: 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a  oken is NULL it.
3dc0: 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20 74 68  ** means that th
3dd0: 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61  e form of the na
3de0: 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68 61 74  me is Z and that
3df0: 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e   columns from an
3e00: 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62  y table.** can b
3e10: 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  e used..**.** If
3e20: 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74   the name cannot
3e30: 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75 6e 61   be resolved una
3e40: 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76  mbiguously, leav
3e50: 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61  e an error messa
3e60: 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 20  ge.** in pParse 
3e70: 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a  and return non-z
3e80: 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a 65 72  ero.  Return zer
3e90: 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f  o on success..*/
3ea0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b  .static int look
3eb0: 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73 65 20  upName(.  Parse 
3ec0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 2f 2a  *pParse,      /*
3ed0: 20 54 68 65 20 70 61 72 73 69 6e 67 20 63 6f 6e   The parsing con
3ee0: 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20  text */.  Token 
3ef0: 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f  *pDbToken,     /
3f00: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
3f10: 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e  tabase containin
3f20: 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c  g table, or NULL
3f30: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61   */.  Token *pTa
3f40: 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61  bleToken,  /* Na
3f50: 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74  me of table cont
3f60: 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f  aining column, o
3f70: 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65  r NULL */.  Toke
3f80: 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c  n *pColumnToken,
3f90: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
3fa0: 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 53 72 63  column. */.  Src
3fb0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20  List *pSrcList, 
3fc0: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62    /* List of tab
3fd0: 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  les used to reso
3fe0: 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73  lve column names
3ff0: 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a   */.  ExprList *
4000: 70 45 4c 69 73 74 2c 20 20 20 20 2f 2a 20 4c 69  pEList,    /* Li
4010: 73 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e  st of expression
4020: 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  s used to resolv
4030: 65 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72  e "AS" */.  Expr
4040: 20 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 20   *pExpr         
4050: 20 2f 2a 20 4d 61 6b 65 20 74 68 69 73 20 45 58   /* Make this EX
4060: 50 52 20 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f  PR node point to
4070: 20 74 68 65 20 73 65 6c 65 63 74 65 64 20 63 6f   the selected co
4080: 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61  lumn */.){.  cha
4090: 72 20 2a 7a 44 62 20 3d 20 30 3b 20 20 20 20 20  r *zDb = 0;     
40a0: 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65    /* Name of the
40b0: 20 64 61 74 61 62 61 73 65 2e 20 20 54 68 65 20   database.  The 
40c0: 22 58 22 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a  "X" in X.Y.Z */.
40d0: 20 20 63 68 61 72 20 2a 7a 54 61 62 20 3d 20 30    char *zTab = 0
40e0: 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f  ;      /* Name o
40f0: 66 20 74 68 65 20 74 61 62 6c 65 2e 20 20 54 68  f the table.  Th
4100: 65 20 22 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f  e "Y" in X.Y.Z o
4110: 72 20 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20  r Y.Z */.  char 
4120: 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20  *zCol = 0;      
4130: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63  /* Name of the c
4140: 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20  olumn.  The "Z" 
4150: 2a 2f 0a 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20  */.  int i, j;  
4160: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f            /* Loo
4170: 70 20 63 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20  p counters */.  
4180: 69 6e 74 20 63 6e 74 20 3d 20 30 3b 20 20 20 20  int cnt = 0;    
4190: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
41a0: 66 20 6d 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d  f matching colum
41b0: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74  n names */.  int
41c0: 20 63 6e 74 54 61 62 20 3d 20 30 3b 20 20 20 20   cntTab = 0;    
41d0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
41e0: 61 74 63 68 69 6e 67 20 74 61 62 6c 65 20 6e 61  atching table na
41f0: 6d 65 73 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20  mes */.  sqlite 
4200: 2a 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  *db = pParse->db
4210: 3b 20 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61  ;  /* The databa
4220: 73 65 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  se */..  assert(
4230: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
4240: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
4250: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
4260: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
4270: 4e 55 4c 4c 20 2a 2f 0a 20 20 69 66 28 20 70 44  NULL */.  if( pD
4280: 62 54 6f 6b 65 6e 20 26 26 20 70 44 62 54 6f 6b  bToken && pDbTok
4290: 65 6e 2d 3e 7a 20 29 7b 0a 20 20 20 20 7a 44 62  en->z ){.    zDb
42a0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
42b0: 28 70 44 62 54 6f 6b 65 6e 2d 3e 7a 2c 20 70 44  (pDbToken->z, pD
42c0: 62 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a 20 20 20 20  bToken->n);.    
42d0: 73 71 6c 69 74 65 33 44 65 71 75 6f 74 65 28 7a  sqlite3Dequote(z
42e0: 44 62 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  Db);.  }else{.  
42f0: 20 20 7a 44 62 20 3d 20 30 3b 0a 20 20 7d 0a 20    zDb = 0;.  }. 
4300: 20 69 66 28 20 70 54 61 62 6c 65 54 6f 6b 65 6e   if( pTableToken
4310: 20 26 26 20 70 54 61 62 6c 65 54 6f 6b 65 6e 2d   && pTableToken-
4320: 3e 7a 20 29 7b 0a 20 20 20 20 7a 54 61 62 20 3d  >z ){.    zTab =
4330: 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70   sqliteStrNDup(p
4340: 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 7a 2c 20 70  TableToken->z, p
4350: 54 61 62 6c 65 54 6f 6b 65 6e 2d 3e 6e 29 3b 0a  TableToken->n);.
4360: 20 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f      sqlite3Dequo
4370: 74 65 28 7a 54 61 62 29 3b 0a 20 20 7d 65 6c 73  te(zTab);.  }els
4380: 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 7a  e{.    assert( z
4390: 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 7a 54 61  Db==0 );.    zTa
43a0: 62 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 7a 43 6f  b = 0;.  }.  zCo
43b0: 6c 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75  l = sqliteStrNDu
43c0: 70 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e  p(pColumnToken->
43d0: 7a 2c 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d  z, pColumnToken-
43e0: 3e 6e 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 65  >n);.  sqlite3De
43f0: 71 75 6f 74 65 28 7a 43 6f 6c 29 3b 0a 20 20 69  quote(zCol);.  i
4400: 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f  f( sqlite3_mallo
4410: 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20 20  c_failed ){.    
4420: 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4c 65  return 1;  /* Le
4430: 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62 20 61  ak memory (zDb a
4440: 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61 6c 6c  nd zTab) if mall
4450: 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a  oc fails */.  }.
4460: 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d    assert( zTab==
4470: 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 29  0 || pEList==0 )
4480: 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  ;..  pExpr->iTab
4490: 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28 69  le = -1;.  for(i
44a0: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
44b0: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
44c0: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
44d0: 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 53  tem *pItem = &pS
44e0: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20 20  rcList->a[i];.  
44f0: 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20    Table *pTab = 
4500: 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20 20  pItem->pTab;.   
4510: 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a   Column *pCol;..
4520: 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30 20      if( pTab==0 
4530: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
4540: 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43  assert( pTab->nC
4550: 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66 28 20  ol>0 );.    if( 
4560: 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69 66  zTab ){.      if
4570: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
4580: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
4590: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74 65  *zTabName = pIte
45a0: 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20 20  m->zAlias;.     
45b0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
45c0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
45d0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
45e0: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  nue;.      }else
45f0: 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20 2a  {.        char *
4600: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
4610: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
4620: 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20  if( zTabName==0 
4630: 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  || sqlite3StrICm
4640: 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62  p(zTabName, zTab
4650: 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b  )!=0 ) continue;
4660: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62  .        if( zDb
4670: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
4680: 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70 54  rICmp(db->aDb[pT
4690: 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20  ab->iDb].zName, 
46a0: 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20  zDb)!=0 ){.     
46b0: 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a 20       continue;. 
46c0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
46d0: 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 30  .    }.    if( 0
46e0: 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b 0a  ==(cntTab++) ){.
46f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4700: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
4710: 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45 78 70  rsor;.      pExp
4720: 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e 69  r->iDb = pTab->i
4730: 44 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f  Db;.    }.    fo
4740: 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61 62  r(j=0, pCol=pTab
4750: 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d 3e  ->aCol; j<pTab->
4760: 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b  nCol; j++, pCol+
4770: 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71  +){.      if( sq
4780: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f  lite3StrICmp(pCo
4790: 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d  l->zName, zCol)=
47a0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6e  =0 ){.        cn
47b0: 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 45 78  t++;.        pEx
47c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74  pr->iTable = pIt
47d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
47e0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
47f0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
4800: 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74 75       /* Substitu
4810: 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63 6f  te the rowid (co
4820: 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68 65  lumn -1) for the
4830: 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59   INTEGER PRIMARY
4840: 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20 20   KEY */.        
4850: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
4860: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
4870: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
4880: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
4890: 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  y = pTab->aCol[j
48a0: 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  ].affinity;.    
48b0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
48c0: 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20   }.    }.  }..  
48d0: 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f  /* If we have no
48e0: 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76  t already resolv
48f0: 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65  ed the name, the
4900: 6e 20 6d 61 79 62 65 20 0a 20 20 2a 2a 20 69 74  n maybe .  ** it
4910: 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f   is a new.* or o
4920: 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72 67  ld.* trigger arg
4930: 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65 0a  ument reference.
4940: 20 20 2a 2f 0a 20 20 69 66 28 20 7a 44 62 3d 3d    */.  if( zDb==
4950: 30 20 26 26 20 7a 54 61 62 21 3d 30 20 26 26 20  0 && zTab!=0 && 
4960: 63 6e 74 3d 3d 30 20 26 26 20 70 50 61 72 73 65  cnt==0 && pParse
4970: 2d 3e 74 72 69 67 53 74 61 63 6b 21 3d 30 20 29  ->trigStack!=0 )
4980: 7b 0a 20 20 20 20 54 72 69 67 67 65 72 53 74 61  {.    TriggerSta
4990: 63 6b 20 2a 70 54 72 69 67 67 65 72 53 74 61 63  ck *pTriggerStac
49a0: 6b 20 3d 20 70 50 61 72 73 65 2d 3e 74 72 69 67  k = pParse->trig
49b0: 53 74 61 63 6b 3b 0a 20 20 20 20 54 61 62 6c 65  Stack;.    Table
49c0: 20 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20   *pTab = 0;.    
49d0: 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63  if( pTriggerStac
49e0: 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20  k->newIdx != -1 
49f0: 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d  && sqlite3StrICm
4a00: 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d  p("new", zTab) =
4a10: 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78  = 0 ){.      pEx
4a20: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
4a30: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49  iggerStack->newI
4a40: 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  dx;.      assert
4a50: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
4a60: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 70  >pTab );.      p
4a70: 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74  Tab = pTriggerSt
4a80: 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d  ack->pTab;.    }
4a90: 65 6c 73 65 20 69 66 28 20 70 54 72 69 67 67 65  else if( pTrigge
4aa0: 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21  rStack->oldIdx !
4ab0: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
4ac0: 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54  trICmp("old", zT
4ad0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
4ae0: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
4af0: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
4b00: 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20 20 20 61  >oldIdx;.      a
4b10: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
4b20: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
4b30: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
4b40: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
4b50: 20 20 20 20 7d 0a 0a 20 20 20 20 69 66 28 20 70      }..    if( p
4b60: 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 69 6e  Tab ){ .      in
4b70: 74 20 6a 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d  t j;.      Colum
4b80: 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e  n *pCol = pTab->
4b90: 61 43 6f 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20  aCol;.      .   
4ba0: 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20     pExpr->iDb = 
4bb0: 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20  pTab->iDb;.     
4bc0: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
4bd0: 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54   for(j=0; j < pT
4be0: 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70  ab->nCol; j++, p
4bf0: 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20  Col++) {.       
4c00: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
4c10: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
4c20: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
4c30: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
4c40: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
4c50: 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62  Column = j==pTab
4c60: 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a  ->iPKey ? -1 : j
4c70: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
4c80: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54  r->affinity = pT
4c90: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69  ab->aCol[j].affi
4ca0: 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20 20  nity;.          
4cb0: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
4cc0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
4cd0: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 50 65   }..  /*.  ** Pe
4ce0: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
4cf0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
4d00: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 2a 2f 0a   the ROWID.  */.
4d10: 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20    if( cnt==0 && 
4d20: 63 6e 74 54 61 62 3d 3d 31 20 26 26 20 73 71 6c  cntTab==1 && sql
4d30: 69 74 65 33 49 73 52 6f 77 69 64 28 7a 43 6f 6c  ite3IsRowid(zCol
4d40: 29 20 29 7b 0a 20 20 20 20 63 6e 74 20 3d 20 31  ) ){.    cnt = 1
4d50: 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f  ;.    pExpr->iCo
4d60: 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 70  lumn = -1;.    p
4d70: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
4d80: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
4d90: 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20  GER;.  }..  /*. 
4da0: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
4db0: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
4dc0: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
4dd0: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
4de0: 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67 68 74 20  me Z.  ** might 
4df0: 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65 73 75  refer to an resu
4e00: 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20 20 54  lt-set alias.  T
4e10: 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66 6f 72  his happens, for
4e20: 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e 0a 20   example, when. 
4e30: 20 2a 2a 20 77 65 20 61 72 65 20 72 65 73 6f 6c   ** we are resol
4e40: 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e 20 74 68  ving names in th
4e50: 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20 6f  e WHERE clause o
4e60: 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20  f the following 
4e70: 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a 0a 20 20  command:.  **.  
4e80: 2a 2a 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b  **     SELECT a+
4e90: 62 20 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c  b AS x FROM tabl
4ea0: 65 20 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20  e WHERE x<10;.  
4eb0: 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61 73 65 73  **.  ** In cases
4ec0: 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c   like this, repl
4ed0: 61 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61  ace pExpr with a
4ee0: 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70   copy of the exp
4ef0: 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 2a  ression that.  *
4f00: 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75  * forms the resu
4f10: 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22 61  lt set entry ("a
4f20: 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70  +b" in the examp
4f30: 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69  le) and return i
4f40: 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 2a 2a  mmediately..  **
4f50: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
4f60: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
4f70: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
4f80: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
4f90: 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73 6f 6c 76  been.  ** resolv
4fa0: 65 64 20 62 79 20 74 68 65 20 74 69 6d 65 20 74  ed by the time t
4fb0: 68 65 20 57 48 45 52 45 20 63 6c 61 75 73 65 20  he WHERE clause 
4fc0: 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20 20 2a  is resolved..  *
4fd0: 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26  /.  if( cnt==0 &
4fe0: 26 20 70 45 4c 69 73 74 21 3d 30 20 29 7b 0a 20  & pEList!=0 ){. 
4ff0: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 3c 70 45     for(j=0; j<pE
5000: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 6a 2b 2b  List->nExpr; j++
5010: 29 7b 0a 20 20 20 20 20 20 63 68 61 72 20 2a 7a  ){.      char *z
5020: 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e 61 5b 6a  As = pEList->a[j
5030: 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 69  ].zName;.      i
5040: 66 28 20 7a 41 73 21 3d 30 20 26 26 20 73 71 6c  f( zAs!=0 && sql
5050: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 41 73 2c  ite3StrICmp(zAs,
5060: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
5070: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78       assert( pEx
5080: 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20  pr->pLeft==0 && 
5090: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30  pExpr->pRight==0
50a0: 20 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70   );.        pExp
50b0: 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20  r->op = TK_AS;. 
50c0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
50d0: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
50e0: 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20     pExpr->pLeft 
50f0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
5100: 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45  (pEList->a[j].pE
5110: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
5120: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
5130: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5140: 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44 62 3d 3d  zTab==0 && zDb==
5150: 30 20 29 3b 0a 20 20 20 20 20 20 20 20 72 65 74  0 );.        ret
5160: 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 0;.      }. 
5170: 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20 2f 2a 0a     } .  }..  /*.
5180: 20 20 2a 2a 20 49 66 20 58 20 61 6e 64 20 59 20    ** If X and Y 
5190: 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20 6f 74 68  are NULL (in oth
51a0: 65 72 20 77 6f 72 64 73 20 69 66 20 6f 6e 6c 79  er words if only
51b0: 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   the column name
51c0: 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75 70 70 6c   Z is.  ** suppl
51d0: 69 65 64 29 20 61 6e 64 20 74 68 65 20 76 61 6c  ied) and the val
51e0: 75 65 20 6f 66 20 5a 20 69 73 20 65 6e 63 6c 6f  ue of Z is enclo
51f0: 73 65 64 20 69 6e 20 64 6f 75 62 6c 65 2d 71 75  sed in double-qu
5200: 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20 2a 2a 20  otes, then.  ** 
5210: 5a 20 69 73 20 61 20 73 74 72 69 6e 67 20 6c 69  Z is a string li
5220: 74 65 72 61 6c 20 69 66 20 69 74 20 64 6f 65 73  teral if it does
5230: 6e 27 74 20 6d 61 74 63 68 20 61 6e 79 20 63 6f  n't match any co
5240: 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20 49 6e 20  lumn names.  In 
5250: 74 68 61 74 0a 20 20 2a 2a 20 63 61 73 65 2c 20  that.  ** case, 
5260: 77 65 20 6e 65 65 64 20 74 6f 20 72 65 74 75 72  we need to retur
5270: 6e 20 72 69 67 68 74 20 61 77 61 79 20 61 6e 64  n right away and
5280: 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79 20 63 68   not make any ch
5290: 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a 20 70 45  anges to.  ** pE
52a0: 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  xpr..  */.  if( 
52b0: 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61 62 3d 3d  cnt==0 && zTab==
52c0: 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65  0 && pColumnToke
52d0: 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20 29 7b 0a  n->z[0]=='"' ){.
52e0: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a      sqliteFree(z
52f0: 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  Col);.    return
5300: 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20   0;.  }..  /*.  
5310: 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61 6e 73 20  ** cnt==0 means 
5320: 74 68 65 72 65 20 77 61 73 20 6e 6f 74 20 6d 61  there was not ma
5330: 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d 65 61 6e  tch.  cnt>1 mean
5340: 73 20 74 68 65 72 65 20 77 65 72 65 20 74 77 6f  s there were two
5350: 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65 20 6d 61   or.  ** more ma
5360: 74 63 68 65 73 2e 20 20 45 69 74 68 65 72 20 77  tches.  Either w
5370: 61 79 2c 20 77 65 20 68 61 76 65 20 61 6e 20 65  ay, we have an e
5380: 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20 69 66 28  rror..  */.  if(
5390: 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20 20 20 63   cnt!=1 ){.    c
53a0: 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20 20 20 20  har *z = 0;.    
53b0: 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20 20 20 20  char *zErr;.    
53c0: 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30 20 3f 20  zErr = cnt==0 ? 
53d0: 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75 6d 6e 3a  "no such column:
53e0: 20 25 73 22 20 3a 20 22 61 6d 62 69 67 75 6f 75   %s" : "ambiguou
53f0: 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 25  s column name: %
5400: 73 22 3b 0a 20 20 20 20 69 66 28 20 7a 44 62 20  s";.    if( zDb 
5410: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5420: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 44  SetString(&z, zD
5430: 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c 20 22 2e  b, ".", zTab, ".
5440: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
5450: 20 7d 65 6c 73 65 20 69 66 28 20 7a 54 61 62 20   }else if( zTab 
5460: 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  ){.      sqlite3
5470: 53 65 74 53 74 72 69 6e 67 28 26 7a 2c 20 7a 54  SetString(&z, zT
5480: 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30  ab, ".", zCol, 0
5490: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
54a0: 20 20 20 20 7a 20 3d 20 73 71 6c 69 74 65 53 74      z = sqliteSt
54b0: 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20 20 20 20  rDup(zCol);.    
54c0: 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72  }.    sqlite3Err
54d0: 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 7a 45  orMsg(pParse, zE
54e0: 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73 71 6c 69  rr, z);.    sqli
54f0: 74 65 46 72 65 65 28 7a 29 3b 0a 20 20 7d 0a 0a  teFree(z);.  }..
5500: 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e    /* Clean up an
5510: 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20  d return.  */.  
5520: 73 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b  sqliteFree(zDb);
5530: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54  .  sqliteFree(zT
5540: 61 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ab);.  sqliteFre
5550: 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74  e(zCol);.  sqlit
5560: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
5570: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45  pr->pLeft);.  pE
5580: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a  xpr->pLeft = 0;.
5590: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
55a0: 65 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68  ete(pExpr->pRigh
55b0: 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69  t);.  pExpr->pRi
55c0: 67 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72  ght = 0;.  pExpr
55d0: 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e  ->op = TK_COLUMN
55e0: 3b 0a 20 20 73 71 6c 69 74 65 33 41 75 74 68 52  ;.  sqlite3AuthR
55f0: 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78 70  ead(pParse, pExp
5600: 72 2c 20 70 53 72 63 4c 69 73 74 29 3b 0a 20 20  r, pSrcList);.  
5610: 72 65 74 75 72 6e 20 63 6e 74 21 3d 31 3b 0a 7d  return cnt!=1;.}
5620: 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ../*.** This rou
5630: 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e 20 65 78  tine walks an ex
5640: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 20 61 6e  pression tree an
5650: 64 20 72 65 73 6f 6c 76 65 73 20 72 65 66 65 72  d resolves refer
5660: 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74 61 62 6c  ences to.** tabl
5670: 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65  e columns.  Node
5680: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 49 44  s of the form ID
5690: 2e 49 44 20 6f 72 20 49 44 20 72 65 73 6f 6c 76  .ID or ID resolv
56a0: 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64  e into an.** ind
56b0: 65 78 20 74 6f 20 74 68 65 20 74 61 62 6c 65 20  ex to the table 
56c0: 69 6e 20 74 68 65 20 74 61 62 6c 65 20 6c 69 73  in the table lis
56d0: 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d 6e 20 6f  t and a column o
56e0: 66 66 73 65 74 2e 20 20 54 68 65 20 0a 2a 2a 20  ffset.  The .** 
56f0: 45 78 70 72 2e 6f 70 63 6f 64 65 20 66 6f 72 20  Expr.opcode for 
5700: 73 75 63 68 20 6e 6f 64 65 73 20 69 73 20 63 68  such nodes is ch
5710: 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43 4f 4c 55  anged to TK_COLU
5720: 4d 4e 2e 20 20 54 68 65 20 45 78 70 72 2e 69 54  MN.  The Expr.iT
5730: 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65 20 69 73  able.** value is
5740: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
5750: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 72 65 66  index of the ref
5760: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 20 69 6e  erenced table in
5770: 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20 70 6c 75   pTabList.** plu
5780: 73 20 74 68 65 20 22 62 61 73 65 22 20 76 61 6c  s the "base" val
5790: 75 65 2e 20 20 54 68 65 20 62 61 73 65 20 76 61  ue.  The base va
57a0: 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69 6d 61 74  lue will ultimat
57b0: 65 6c 79 20 62 65 63 6f 6d 65 20 74 68 65 0a 2a  ely become the.*
57c0: 2a 20 56 44 42 45 20 63 75 72 73 6f 72 20 6e 75  * VDBE cursor nu
57d0: 6d 62 65 72 20 66 6f 72 20 61 20 63 75 72 73 6f  mber for a curso
57e0: 72 20 74 68 61 74 20 69 73 20 70 6f 69 6e 74 69  r that is pointi
57f0: 6e 67 20 69 6e 74 6f 20 74 68 65 20 72 65 66 65  ng into the refe
5800: 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62 6c 65 2e  renced.** table.
5810: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
5820: 6d 6e 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  mn value is chan
5830: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
5840: 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 0a   of the column .
5850: 2a 2a 20 6f 66 20 74 68 65 20 72 65 66 65 72 65  ** of the refere
5860: 6e 63 65 64 20 74 61 62 6c 65 2e 20 20 54 68 65  nced table.  The
5870: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
5880: 6c 75 65 20 66 6f 72 20 74 68 65 20 73 70 65 63  lue for the spec
5890: 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20 63 6f 6c  ial.** ROWID col
58a0: 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41 6e 79 20  umn is -1.  Any 
58b0: 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52 59 20  INTEGER PRIMARY 
58c0: 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73 20 74 72  KEY column is tr
58d0: 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20 61 6c 69  ied as an.** ali
58e0: 61 73 20 66 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a  as for ROWID..**
58f0: 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63 68 65 63  .** We also chec
5900: 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63 65 73 20  k for instances 
5910: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
5920: 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73 20 69 6e  or.  IN comes in
5930: 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73 3a 0a 2a   two.** forms:.*
5940: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  *.**           e
5950: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
5960: 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ).** and.**     
5970: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53        expr IN (S
5980: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
5990: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
59a0: 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72  is handled by cr
59b0: 65 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c  eating a set hol
59c0: 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a  ding the list.**
59d0: 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75   of allowed valu
59e0: 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  es.  The second 
59f0: 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20  form causes the 
5a00: 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61  SELECT to genera
5a10: 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  te .** a tempora
5a20: 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20  ry table..**.** 
5a30: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73  This routine als
5a40: 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63 61 6c  o looks for scal
5a50: 61 72 20 53 45 4c 45 43 54 73 20 74 68 61 74 20  ar SELECTs that 
5a60: 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e 20 65  are part of an e
5a70: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20 49 66  xpression..** If
5a80: 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c 20 69   it finds any, i
5a90: 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f 64 65  t generates code
5aa0: 20 74 6f 20 77 72 69 74 65 20 74 68 65 20 76 61   to write the va
5ab0: 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65 6c 65  lue of that sele
5ac0: 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d 65 6d  ct.** into a mem
5ad0: 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20  ory cell..**.** 
5ae0: 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d 6e 73 20  Unknown columns 
5af0: 6f 72 20 74 61 62 6c 65 73 20 70 72 6f 76 6f 6b  or tables provok
5b00: 65 20 61 6e 20 65 72 72 6f 72 2e 20 20 54 68 65  e an error.  The
5b10: 20 66 75 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e   function return
5b20: 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72 20  s.** the number 
5b30: 6f 66 20 65 72 72 6f 72 73 20 73 65 65 6e 20 61  of errors seen a
5b40: 6e 64 20 6c 65 61 76 65 73 20 61 6e 20 65 72 72  nd leaves an err
5b50: 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e 20 70 50  or message on pP
5b60: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 2e 0a 2a  arse->zErrMsg..*
5b70: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
5b80: 72 52 65 73 6f 6c 76 65 49 64 73 28 0a 20 20 50  rResolveIds(.  P
5b90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5ba0: 20 20 2f 2a 20 54 68 65 20 70 61 72 73 65 72 20    /* The parser 
5bb0: 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 53 72 63  context */.  Src
5bc0: 4c 69 73 74 20 2a 70 53 72 63 4c 69 73 74 2c 20  List *pSrcList, 
5bd0: 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65  /* List of table
5be0: 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  s used to resolv
5bf0: 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a  e column names *
5c00: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45  /.  ExprList *pE
5c10: 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73 74 20 6f  List,  /* List o
5c20: 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73  f expressions us
5c30: 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22 41  ed to resolve "A
5c40: 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  S" */.  Expr *pE
5c50: 78 70 72 20 20 20 20 20 20 20 20 2f 2a 20 54 68  xpr        /* Th
5c60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20  e expression to 
5c70: 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a  be analyzed. */.
5c80: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a 20 20 69  ){.  int i;..  i
5c90: 66 28 20 70 45 78 70 72 3d 3d 30 20 7c 7c 20 70  f( pExpr==0 || p
5ca0: 53 72 63 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  SrcList==0 ) ret
5cb0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
5cc0: 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
5cd0: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 61 73  rc; i++){.    as
5ce0: 73 65 72 74 28 20 70 53 72 63 4c 69 73 74 2d 3e  sert( pSrcList->
5cf0: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20  a[i].iCursor>=0 
5d00: 26 26 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  && pSrcList->a[i
5d10: 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61 72 73 65  ].iCursor<pParse
5d20: 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d 0a 20 20  ->nTab );.  }.  
5d30: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
5d40: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
5d50: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
5d60: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
5d70: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
5d80: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
5d90: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
5da0: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
5db0: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
5dc0: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
5dd0: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
5de0: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
5df0: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
5e00: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
5e10: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
5e20: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
5e30: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
5e40: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
5e50: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
5e60: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
5e70: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
5e80: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
5e90: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
5ea0: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
5eb0: 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d  ifier is the nam
5ec0: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 64 2e 0a  e of a columnd..
5ed0: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
5ee0: 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 69  TK_ID: {.      i
5ef0: 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50  f( lookupName(pP
5f00: 61 72 73 65 2c 20 30 2c 20 30 2c 20 26 70 45 78  arse, 0, 0, &pEx
5f10: 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53 72 63 4c  pr->token, pSrcL
5f20: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78  ist, pEList, pEx
5f30: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
5f40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5f50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 20 0a 20  .      break; . 
5f60: 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f 2a 20 41     }.  .    /* A
5f70: 20 74 61 62 6c 65 20 6e 61 6d 65 20 61 6e 64 20   table name and 
5f80: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20 20 20 20  column name:    
5f90: 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a 20 4f 72   ID.ID.    ** Or
5fa0: 20 61 20 64 61 74 61 62 61 73 65 2c 20 74 61 62   a database, tab
5fb0: 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20  le and column:  
5fc0: 49 44 2e 49 44 2e 49 44 0a 20 20 20 20 2a 2f 0a  ID.ID.ID.    */.
5fd0: 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a      case TK_DOT:
5fe0: 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a   {.      Token *
5ff0: 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20 20 54  pColumn;.      T
6000: 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b 0a 20 20  oken *pTable;.  
6010: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a      Token *pDb;.
6020: 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67        Expr *pRig
6030: 68 74 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  ht;..      pRigh
6040: 74 20 3d 20 70 45 78 70 72 2d 3e 70 52 69 67 68  t = pExpr->pRigh
6050: 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 52 69  t;.      if( pRi
6060: 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29  ght->op==TK_ID )
6070: 7b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  {.        pDb = 
6080: 30 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  0;.        pTabl
6090: 65 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c 65 66  e = &pExpr->pLef
60a0: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
60b0: 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52 69    pColumn = &pRi
60c0: 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  ght->token;.    
60d0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
60e0: 20 61 73 73 65 72 74 28 20 70 52 69 67 68 74 2d   assert( pRight-
60f0: 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29 3b 0a 20  >op==TK_DOT );. 
6100: 20 20 20 20 20 20 20 70 44 62 20 3d 20 26 70 45         pDb = &pE
6110: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
6120: 6e 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 6c  n;.        pTabl
6130: 65 20 3d 20 26 70 52 69 67 68 74 2d 3e 70 4c 65  e = &pRight->pLe
6140: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
6150: 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26 70 52     pColumn = &pR
6160: 69 67 68 74 2d 3e 70 52 69 67 68 74 2d 3e 74 6f  ight->pRight->to
6170: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  ken;.      }.   
6180: 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d     if( lookupNam
6190: 65 28 70 50 61 72 73 65 2c 20 70 44 62 2c 20 70  e(pParse, pDb, p
61a0: 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d 6e 2c 20  Table, pColumn, 
61b0: 70 53 72 63 4c 69 73 74 2c 20 30 2c 20 70 45 78  pSrcList, 0, pEx
61c0: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  pr) ){.        r
61d0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
61e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
61f0: 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20 54 4b    }..    case TK
6200: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61  _IN: {.      cha
6210: 72 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20  r affinity;.    
6220: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
6230: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
6240: 65 29 3b 0a 20 20 20 20 20 20 4b 65 79 49 6e 66  e);.      KeyInf
6250: 6f 20 6b 65 79 49 6e 66 6f 3b 0a 0a 20 20 20 20  o keyInfo;..    
6260: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
6270: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 69 66 28  urn 1;.      if(
6280: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
6290: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
62a0: 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  SrcList, pEList,
62b0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 20 29   pExpr->pLeft) )
62c0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
62d0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
62e0: 20 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c    affinity = sql
62f0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
6300: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
6310: 0a 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65  .      /* Whethe
6320: 72 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20  r this is an 'x 
6330: 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f  IN(SELECT...)' o
6340: 72 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72  r an 'x IN(<expr
6350: 6c 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a  list>)'.      **
6360: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69   expression it i
6370: 73 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61  s handled the sa
6380: 6d 65 20 77 61 79 2e 20 41 20 74 65 6d 70 6f 72  me way. A tempor
6390: 61 72 79 20 74 61 62 6c 65 20 69 73 20 0a 20 20  ary table is .  
63a0: 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69      ** filled wi
63b0: 74 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20  th single-field 
63c0: 69 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65  index keys repre
63d0: 73 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75  senting the resu
63e0: 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f  lts.      ** fro
63f0: 6d 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20  m the SELECT or 
6400: 74 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a  the <exprlist>..
6410: 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a        **.      *
6420: 2a 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70  * If the 'x' exp
6430: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c  ression is a col
6440: 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68  umn value, or th
6450: 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20  e SELECT....    
6460: 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72    ** statement r
6470: 65 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20  eturns a column 
6480: 76 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20  value, then the 
6490: 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74  affinity of that
64a0: 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e  .      ** column
64b0: 20 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c   is used to buil
64c0: 64 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73  d the index keys
64d0: 2e 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e  . If both 'x' an
64e0: 64 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53  d the.      ** S
64f0: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
6500: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
6510: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
6520: 69 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20  inity is used.  
6530: 20 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72      ** if either
6540: 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45   column has NUME
6550: 52 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61  RIC or INTEGER a
6560: 66 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74  ffinity. If neit
6570: 68 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27  her.      ** 'x'
6580: 20 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e   nor the SELECT.
6590: 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65  .. statement are
65a0: 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e   columns, then n
65b0: 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a  umeric affinity.
65c0: 20 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64        ** is used
65d0: 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20  ..      */.     
65e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
65f0: 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
6600: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
6610: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
6620: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
6630: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
6640: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 6b 65 79  d = 1;.      key
6650: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
6660: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c  pParse->db->pDfl
6670: 74 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 73 71 6c  tColl;.      sql
6680: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
6690: 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78 70  P_OpenTemp, pExp
66a0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 5c 0a  r->iTable, 0, \.
66b0: 20 20 20 20 20 20 20 20 20 20 20 28 63 68 61 72             (char
66c0: 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b  *)&keyInfo, P3_K
66d0: 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20 73  EYINFO);.      s
66e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
66f0: 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75  v, OP_SetNumColu
6700: 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  mns, pExpr->iTab
6710: 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69  le, 1);..      i
6720: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
6730: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20  t ){.        /* 
6740: 43 61 73 65 20 31 3a 20 20 20 20 20 65 78 70 72  Case 1:     expr
6750: 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29   IN (SELECT ...)
6760: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  .        **.    
6770: 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20      ** Generate 
6780: 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68  code to write th
6790: 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65  e results of the
67a0: 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65   select into the
67b0: 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20   temporary.     
67c0: 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f     ** table allo
67d0: 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64  cated and opened
67e0: 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20   above..        
67f0: 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  */.        int i
6800: 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54  Parm = pExpr->iT
6810: 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61  able +  (((int)a
6820: 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20  ffinity)<<16);. 
6830: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
6840: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
6850: 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
6860: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
6870: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
6880: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
6890: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
68a0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
68b0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 65 6c  0, 0);.      }el
68c0: 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c  se if( pExpr->pL
68d0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ist ){.        /
68e0: 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65 78  * Case 2:     ex
68f0: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
6900: 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a 20  .        **..** 
6910: 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73 73  For each express
6920: 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69 6e  ion, build an in
6930: 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68 65  dex key from the
6940: 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64 0a   evaluation and.
6950: 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72 65          ** store
6960: 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70 6f   it in the tempo
6970: 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20 3c  rary table. If <
6980: 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75 6d  expr> is a colum
6990: 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20 20  n, then use.    
69a0: 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c 75      ** that colu
69b0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68 65  mns affinity whe
69c0: 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65 78  n building index
69d0: 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72 3e   keys. If <expr>
69e0: 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20 20   is not.        
69f0: 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73 65  ** a column, use
6a00: 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74   numeric affinit
6a10: 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20  y..        */.  
6a20: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
6a30: 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74 20       char const 
6a40: 2a 61 66 66 53 74 72 3b 0a 20 20 20 20 20 20 20  *affStr;.       
6a50: 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20 29   if( !affinity )
6a60: 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66 69  {.          affi
6a70: 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41 46  nity = SQLITE_AF
6a80: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 20  F_NUMERIC;.     
6a90: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 66 66     }.        aff
6aa0: 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66 66  Str = sqlite3Aff
6ab0: 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66 69  inityString(affi
6ac0: 6e 69 74 79 29 3b 0a 0a 20 20 20 20 20 20 20 20  nity);..        
6ad0: 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68 20  /* Loop through 
6ae0: 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e 20  each expression 
6af0: 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20 2a  in <exprlist>. *
6b00: 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  /.        for(i=
6b10: 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69 73  0; i<pExpr->pLis
6b20: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
6b30: 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20 2a            Expr *
6b40: 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  pE2 = pExpr->pLi
6b50: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a  st->a[i].pExpr;.
6b60: 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43 68  .          /* Ch
6b70: 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 78 70  eck that the exp
6b80: 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74  ression is const
6b90: 61 6e 74 20 61 6e 64 20 76 61 6c 69 64 2e 20 2a  ant and valid. *
6ba0: 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20  /.          if( 
6bb0: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
6bc0: 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a 20  nstant(pE2) ){. 
6bd0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
6be0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
6bf0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
6c00: 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64   "right-hand sid
6c10: 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f 72  e of IN operator
6c20: 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61 6e   must be constan
6c30: 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t");.           
6c40: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
6c50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
6c60: 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72   if( sqlite3Expr
6c70: 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45  Check(pParse, pE
6c80: 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20 20  2, 0, 0) ){.    
6c90: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
6ca0: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
6cb0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
6cc0: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
6cd0: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
6ce0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
6cf0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
6d00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
6d10: 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b  de(pParse, pE2);
6d20: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
6d30: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
6d40: 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c 20 61  MakeKey, 1, 0, a
6d50: 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49 43  ffStr, P3_STATIC
6d60: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
6d70: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
6d80: 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20   OP_String8, 0, 
6d90: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  0);.          sq
6da0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
6db0: 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20  , OP_PutStrKey, 
6dc0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
6dd0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
6de0: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
6df0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
6e00: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
6e10: 20 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73       /* This has
6e20: 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20   to be a scalar 
6e30: 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74  SELECT.  Generat
6e40: 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68  e code to put th
6e50: 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65  e.      ** value
6e60: 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20   of this select 
6e70: 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c  in a memory cell
6e80: 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20   and record the 
6e90: 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20  number.      ** 
6ea0: 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65  of the memory ce
6eb0: 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20  ll in iColumn.. 
6ec0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45       */.      pE
6ed0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70  xpr->iColumn = p
6ee0: 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20  Parse->nMem++;. 
6ef0: 20 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53       if(sqlite3S
6f00: 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
6f10: 78 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52  xpr->pSelect, SR
6f20: 54 5f 4d 65 6d 2c 70 45 78 70 72 2d 3e 69 43 6f  T_Mem,pExpr->iCo
6f30: 6c 75 6d 6e 2c 30 2c 30 2c 30 2c 30 29 29 7b 0a  lumn,0,0,0,0)){.
6f40: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
6f50: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
6f60: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20  break;.    }..  
6f70: 20 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73    /* For all els
6f80: 65 2c 20 6a 75 73 74 20 72 65 63 75 72 73 69 76  e, just recursiv
6f90: 65 6c 79 20 77 61 6c 6b 20 74 68 65 20 74 72 65  ely walk the tre
6fa0: 65 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74  e */.    default
6fb0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45  : {.      if( pE
6fc0: 78 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20  xpr->pLeft.     
6fd0: 20 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 52   && sqlite3ExprR
6fe0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
6ff0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
7000: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
7010: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
7020: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7030: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
7040: 70 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26  pRight .      &&
7050: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
7060: 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70  lveIds(pParse, p
7070: 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c  SrcList, pEList,
7080: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20   pExpr->pRight) 
7090: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
70a0: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
70b0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
70c0: 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ist ){.        i
70d0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78  nt i;.        Ex
70e0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
70f0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
7100: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
7110: 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
7120: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
7130: 78 70 72 20 2a 70 41 72 67 20 3d 20 70 4c 69 73  xpr *pArg = pLis
7140: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20  t->a[i].pExpr;. 
7150: 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c           if( sql
7160: 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49  ite3ExprResolveI
7170: 64 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c  ds(pParse, pSrcL
7180: 69 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 41 72  ist, pEList, pAr
7190: 67 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  g) ){.          
71a0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
71b0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
71c0: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
71d0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
71e0: 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69  }../*.** pExpr i
71f0: 73 20 61 20 6e 6f 64 65 20 74 68 61 74 20 64 65  s a node that de
7200: 66 69 6e 65 73 20 61 20 66 75 6e 63 74 69 6f 6e  fines a function
7210: 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20   of some kind.  
7220: 49 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61  It might.** be a
7230: 20 73 79 6e 74 61 63 74 69 63 20 66 75 6e 63 74   syntactic funct
7240: 69 6f 6e 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28  ion like "count(
7250: 78 29 22 20 6f 72 20 69 74 20 6d 69 67 68 74 20  x)" or it might 
7260: 62 65 20 61 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a  be a function.**
7270: 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73   that implements
7280: 20 61 6e 20 6f 70 65 72 61 74 6f 72 2c 20 6c 69   an operator, li
7290: 6b 65 20 22 61 20 4c 49 4b 45 20 62 22 2e 20 20  ke "a LIKE b".  
72a0: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74  .**.** This rout
72b0: 69 6e 65 20 6d 61 6b 65 73 20 2a 70 7a 4e 61 6d  ine makes *pzNam
72c0: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e  e point to the n
72d0: 61 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74  ame of the funct
72e0: 69 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 4e  ion and .** *pnN
72f0: 61 6d 65 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d  ame hold the num
7300: 62 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72  ber of character
7310: 73 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f  s in the functio
7320: 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69  n name..*/.stati
7330: 63 20 76 6f 69 64 20 67 65 74 46 75 6e 63 74 69  c void getFuncti
7340: 6f 6e 4e 61 6d 65 28 45 78 70 72 20 2a 70 45 78  onName(Expr *pEx
7350: 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a  pr, const char *
7360: 2a 70 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e  *pzName, int *pn
7370: 4e 61 6d 65 29 7b 0a 20 20 73 77 69 74 63 68 28  Name){.  switch(
7380: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
7390: 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49    case TK_FUNCTI
73a0: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  ON: {.      *pzN
73b0: 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  ame = pExpr->tok
73c0: 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  en.z;.      *pnN
73d0: 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b  ame = pExpr->tok
73e0: 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 62 72 65 61  en.n;.      brea
73f0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
7400: 65 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20  e TK_LIKE: {.   
7410: 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 6c 69     *pzName = "li
7420: 6b 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  ke";.      *pnNa
7430: 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62 72  me = 4;.      br
7440: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
7450: 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20  ase TK_GLOB: {. 
7460: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22       *pzName = "
7470: 67 6c 6f 62 22 3b 0a 20 20 20 20 20 20 2a 70 6e  glob";.      *pn
7480: 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20  Name = 4;.      
7490: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
74a0: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
74b0: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 61 6e    *pzName = "can
74c0: 27 74 20 68 61 70 70 65 6e 22 3b 0a 20 20 20 20  't happen";.    
74d0: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a    *pnName = 12;.
74e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
74f0: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
7500: 45 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20  Error check the 
7510: 66 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20  functions in an 
7520: 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b  expression.  Mak
7530: 65 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75  e sure all.** fu
7540: 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65  nction names are
7550: 20 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20   recognized and 
7560: 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61  all functions ha
7570: 76 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a  ve the correct.*
7580: 2a 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  * number of argu
7590: 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e  ments.  Leave an
75a0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
75b0: 6e 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73  n pParse->zErrMs
75c0: 67 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67  g.** if anything
75d0: 20 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75   is amiss.  Retu
75e0: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
75f0: 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69   errors..**.** i
7600: 66 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20  f pIsAgg is not 
7610: 6e 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78  null and this ex
7620: 70 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61  pression is an a
7630: 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
7640: 6e 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74  n.** (like count
7650: 28 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65  (*) or max(value
7660: 29 29 20 74 68 65 6e 20 77 72 69 74 65 20 61 20  )) then write a 
7670: 31 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a  1 into *pIsAgg..
7680: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
7690: 70 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70  prCheck(Parse *p
76a0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
76b0: 70 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67  pr, int allowAgg
76c0: 2c 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a  , int *pIsAgg){.
76d0: 20 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a    int nErr = 0;.
76e0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
76f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
7700: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
7710: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  {.    case TK_GL
7720: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OB:.    case TK_
7730: 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54  LIKE:.    case T
7740: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
7750: 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70      int n = pExp
7760: 72 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72  r->pList ? pExpr
7770: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a  ->pList->nExpr :
7780: 20 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f   0;  /* Number o
7790: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
77a0: 20 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68       int no_such
77b0: 5f 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20  _func = 0;      
77c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73   /* True if no s
77d0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69  uch function exi
77e0: 73 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  sts */.      int
77f0: 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20   wrong_num_args 
7800: 3d 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65  = 0;     /* True
7810: 20 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72   if wrong number
7820: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f   of arguments */
7830: 0a 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67  .      int is_ag
7840: 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20  g = 0;          
7850: 20 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73     /* True if is
7860: 20 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75   an aggregate fu
7870: 6e 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  nction */.      
7880: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74  int i;.      int
7890: 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
78a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
78b0: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
78c0: 20 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d   in function nam
78d0: 65 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74  e */.      const
78e0: 20 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20   char *zId;     
78f0: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75         /* The fu
7900: 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a  nction name. */.
7910: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
7920: 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 69  Def;.      int i
7930: 50 72 65 66 45 6e 63 20 3d 20 28 70 50 61 72 73  PrefEnc = (pPars
7940: 65 2d 3e 64 62 2d 3e 65 6e 63 3d 3d 54 45 58 54  e->db->enc==TEXT
7950: 5f 55 74 66 38 29 3f 30 3a 31 3b 0a 0a 20 20 20  _Utf8)?0:1;..   
7960: 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61     getFunctionNa
7970: 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c 20  me(pExpr, &zId, 
7980: 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65  &nId);.      pDe
7990: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
79a0: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
79b0: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e 2c  db, zId, nId, n,
79c0: 20 69 50 72 65 66 45 6e 63 2c 20 30 29 3b 0a 20   iPrefEnc, 0);. 
79d0: 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30       if( pDef==0
79e0: 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65 66   ){.        pDef
79f0: 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
7a00: 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64  nction(pParse->d
7a10: 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31 2c  b, zId, nId, -1,
7a20: 20 69 50 72 65 66 45 6e 63 2c 20 30 29 3b 0a 20   iPrefEnc, 0);. 
7a30: 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d         if( pDef=
7a40: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  =0 ){.          
7a50: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31  no_such_func = 1
7a60: 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b  ;.        }else{
7a70: 0a 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67  .          wrong
7a80: 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20  _num_args = 1;. 
7a90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7aa0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73  else{.        is
7ab0: 5f 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75  _agg = pDef->xFu
7ac0: 6e 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20  nc==0;.      }. 
7ad0: 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20       if( is_agg 
7ae0: 26 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a  && !allowAgg ){.
7af0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
7b00: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
7b10: 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65  "misuse of aggre
7b20: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e  gate function %.
7b30: 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29  *s()", nId, zId)
7b40: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
7b50: 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  ;.        is_agg
7b60: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
7b70: 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75  e if( no_such_fu
7b80: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
7b90: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
7ba0: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66  arse, "no such f
7bb0: 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20  unction: %.*s", 
7bc0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
7bd0: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
7be0: 20 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67   }else if( wrong
7bf0: 5f 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20  _num_args ){.   
7c00: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7c10: 72 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f  rMsg(pParse,"wro
7c20: 6e 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67  ng number of arg
7c30: 75 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69  uments to functi
7c40: 6f 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20  on %.*s()",.    
7c50: 20 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49           nId, zI
7c60: 64 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  d);.        nErr
7c70: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
7c80: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
7c90: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
7ca0: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
7cb0: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28  ION;.        if(
7cc0: 20 70 49 73 41 67 67 20 29 20 2a 70 49 73 41 67   pIsAgg ) *pIsAg
7cd0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  g = 1;.      }. 
7ce0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45       for(i=0; nE
7cf0: 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b  rr==0 && i<n; i+
7d00: 2b 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72  +){.        nErr
7d10: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68   = sqlite3ExprCh
7d20: 65 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70  eck(pParse, pExp
7d30: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
7d40: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
7d50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7d60: 20 20 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26       allowAgg &&
7d70: 20 21 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67   !is_agg, pIsAgg
7d80: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
7d90: 20 2f 2a 2a 20 54 4f 44 4f 3a 20 20 43 6f 6d 70   /** TODO:  Comp
7da0: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
7db0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
7dc0: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
7dd0: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
7de0: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a  f the function *
7df0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  /.    }.    defa
7e00: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ult: {.      if(
7e10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
7e20: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20  .        nErr = 
7e30: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
7e40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
7e50: 70 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c  pLeft, allowAgg,
7e60: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
7e70: 7d 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72  }.      if( nErr
7e80: 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52  ==0 && pExpr->pR
7e90: 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20  ight ){.        
7ea0: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
7eb0: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
7ec0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61  pExpr->pRight, a
7ed0: 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29  llowAgg, pIsAgg)
7ee0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
7ef0: 69 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70  if( nErr==0 && p
7f00: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
7f10: 20 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70         int n = p
7f20: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
7f30: 70 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20  pr;.        int 
7f40: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
7f50: 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69  =0; nErr==0 && i
7f60: 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  <n; i++){.      
7f70: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
7f80: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
7f90: 69 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  i].pExpr;.      
7fa0: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
7fb0: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
7fc0: 73 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67  se, pE2, allowAg
7fd0: 67 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20  g, pIsAgg);.    
7fe0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
7ff0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
8000: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45  .  }.  return nE
8010: 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  rr;.}../*.** Ret
8020: 75 72 6e 20 6f 6e 65 20 6f 66 20 74 68 65 20 53  urn one of the S
8030: 51 4c 49 54 45 5f 41 46 46 5f 2a 20 61 66 66 69  QLITE_AFF_* affi
8040: 6e 69 74 79 20 74 79 70 65 73 20 74 68 61 74 20  nity types that 
8050: 69 6e 64 69 63 61 74 65 73 20 74 68 65 20 6c 69  indicates the li
8060: 6b 65 6c 79 0a 2a 2a 20 64 61 74 61 20 74 79 70  kely.** data typ
8070: 65 20 6f 66 20 74 68 65 20 72 65 73 75 6c 74 20  e of the result 
8080: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
8090: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 4e  ression..**.** N
80a0: 6f 74 20 65 76 65 72 79 20 65 78 70 72 65 73 73  ot every express
80b0: 69 6f 6e 20 68 61 73 20 61 20 66 69 78 65 64 20  ion has a fixed 
80c0: 74 79 70 65 2e 20 20 49 66 20 74 68 65 20 74 79  type.  If the ty
80d0: 70 65 20 63 61 6e 6e 6f 74 20 62 65 20 64 65 74  pe cannot be det
80e0: 65 72 6d 69 6e 65 64 0a 2a 2a 20 61 74 20 63 6f  ermined.** at co
80f0: 6d 70 69 6c 65 2d 74 69 6d 65 2c 20 74 68 65 6e  mpile-time, then
8100: 20 74 72 79 20 74 6f 20 72 65 74 75 72 6e 20 74   try to return t
8110: 68 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79  he type affinity
8120: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
8130: 6f 6e 0a 2a 2a 20 69 73 20 61 20 63 6f 6c 75 6d  on.** is a colum
8140: 6e 2e 20 20 4f 74 68 65 72 77 69 73 65 20 6a 75  n.  Otherwise ju
8150: 73 74 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45  st return SQLITE
8160: 5f 41 46 46 5f 4e 4f 4e 45 2e 0a 2a 2a 0a 2a 2a  _AFF_NONE..**.**
8170: 20 54 68 65 20 73 71 6c 69 74 65 33 45 78 70 72   The sqlite3Expr
8180: 52 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64  ResolveIds() and
8190: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
81a0: 6b 28 29 20 72 6f 75 74 69 6e 65 73 20 6d 75 73  k() routines mus
81b0: 74 20 68 61 76 65 0a 2a 2a 20 62 6f 74 68 20 62  t have.** both b
81c0: 65 65 6e 20 63 61 6c 6c 65 64 20 6f 6e 20 74 68  een called on th
81d0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 62 65 66  e expression bef
81e0: 6f 72 65 20 69 74 20 69 73 20 70 61 73 73 65 64  ore it is passed
81f0: 20 74 6f 20 74 68 69 73 20 72 6f 75 74 69 6e 65   to this routine
8200: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
8210: 45 78 70 72 54 79 70 65 28 45 78 70 72 20 2a 70  ExprType(Expr *p
8220: 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  ){.  if( p==0 ) 
8230: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
8240: 46 5f 4e 4f 4e 45 3b 0a 20 20 77 68 69 6c 65 28  F_NONE;.  while(
8250: 20 70 20 29 20 73 77 69 74 63 68 28 20 70 2d 3e   p ) switch( p->
8260: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
8270: 4b 5f 43 4f 4e 43 41 54 3a 0a 20 20 20 20 63 61  K_CONCAT:.    ca
8280: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20 20  se TK_STRING:.  
8290: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 0a    case TK_BLOB:.
82a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
82b0: 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 0a 20  ITE_AFF_TEXT;.. 
82c0: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 0a 20     case TK_AS:. 
82d0: 20 20 20 20 20 70 20 3d 20 70 2d 3e 70 4c 65 66       p = p->pLef
82e0: 74 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  t;.      break;.
82f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
8300: 49 41 42 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  IABLE:.    case 
8310: 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 20 20 72  TK_NULL:.      r
8320: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
8330: 5f 4e 4f 4e 45 3b 0a 0a 20 20 20 20 63 61 73 65  _NONE;..    case
8340: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 20 20 2f 2a   TK_SELECT:   /*
8350: 2a 2a 20 46 49 58 20 4d 45 20 2a 2a 2a 2a 2f 0a  ** FIX ME ****/.
8360: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
8370: 4d 4e 3a 20 20 20 2f 2a 2a 2a 20 46 49 58 20 4d  MN:   /*** FIX M
8380: 45 20 2a 2a 2a 2a 2f 0a 20 20 20 20 63 61 73 65  E ****/.    case
8390: 20 54 4b 5f 43 41 53 45 3a 20 20 20 20 20 2f 2a   TK_CASE:     /*
83a0: 2a 2a 20 46 49 58 20 4d 45 20 2a 2a 2a 2a 2f 0a  ** FIX ME ****/.
83b0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20  .    default:.  
83c0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
83d0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20  E_AFF_NUMERIC;. 
83e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 53 51 4c 49   }.  return SQLI
83f0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 7d 0a 0a  TE_AFF_NONE;.}..
8400: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 61  /*.** Generate a
8410: 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74 68  n instruction th
8420: 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65 20  at will put the 
8430: 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62 65  integer describe
8440: 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30 2e   by.** text z[0.
8450: 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74 61  .n-1] on the sta
8460: 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ck..*/.static vo
8470: 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28 56  id codeInteger(V
8480: 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68  dbe *v, const ch
8490: 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a 20  ar *z, int n){. 
84a0: 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73 71   int i;.  if( sq
84b0: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a 2c  lite3GetInt32(z,
84c0: 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c 69   &i) ){.    sqli
84d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
84e0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 30  OP_Integer, i, 0
84f0: 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 73  );.  }else if( s
8500: 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42 69  qlite3FitsIn64Bi
8510: 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71 6c  ts(z) ){.    sql
8520: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
8530: 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 2c  P_Integer, 0, 0,
8540: 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65 7b   z, n);.  }else{
8550: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
8560: 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20  Op3(v, OP_Real, 
8570: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
8580: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
8590: 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68 65  te code into the
85a0: 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74 6f   current Vdbe to
85b0: 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67 69   evaluate the gi
85c0: 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ven.** expressio
85d0: 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65 20  n and leave the 
85e0: 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74 6f  result on the to
85f0: 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2f 0a 76  p of stack..*/.v
8600: 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 43  oid sqlite3ExprC
8610: 6f 64 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  ode(Parse *pPars
8620: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
8630: 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61  .  Vdbe *v = pPa
8640: 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e  rse->pVdbe;.  in
8650: 74 20 6f 70 3b 0a 20 20 69 66 28 20 76 3d 3d 30  t op;.  if( v==0
8660: 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72   || pExpr==0 ) r
8670: 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28  eturn;.  switch(
8680: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
8690: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 20    case TK_PLUS: 
86a0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 64 64 3b      op = OP_Add;
86b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
86c0: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 20   case TK_MINUS: 
86d0: 20 20 20 6f 70 20 3d 20 4f 50 5f 53 75 62 74 72     op = OP_Subtr
86e0: 61 63 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  act; break;.    
86f0: 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 20 20 20  case TK_STAR:   
8700: 20 20 6f 70 20 3d 20 4f 50 5f 4d 75 6c 74 69 70    op = OP_Multip
8710: 6c 79 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ly; break;.    c
8720: 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 20 20  ase TK_SLASH:   
8730: 20 6f 70 20 3d 20 4f 50 5f 44 69 76 69 64 65 3b   op = OP_Divide;
8740: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8750: 73 65 20 54 4b 5f 41 4e 44 3a 20 20 20 20 20 20  se TK_AND:      
8760: 6f 70 20 3d 20 4f 50 5f 41 6e 64 3b 20 20 20 20  op = OP_And;    
8770: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8780: 65 20 54 4b 5f 4f 52 3a 20 20 20 20 20 20 20 6f  e TK_OR:       o
8790: 70 20 3d 20 4f 50 5f 4f 72 3b 20 20 20 20 20 20  p = OP_Or;      
87a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
87b0: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70   TK_LT:       op
87c0: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
87d0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
87e0: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_LE:       op 
87f0: 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62  = OP_Le;       b
8800: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8810: 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_GT:       op =
8820: 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72   OP_Gt;       br
8830: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8840: 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GE:       op = 
8850: 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ge;       bre
8860: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8870: 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  NE:       op = O
8880: 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ne;       brea
8890: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
88a0: 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  Q:       op = OP
88b0: 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Eq;       break
88c0: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
88d0: 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  NULL:   op = OP_
88e0: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
88f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
8900: 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e  NULL:  op = OP_N
8910: 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a  otNull;  break;.
8920: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a      case TK_NOT:
8930: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 6f        op = OP_No
8940: 74 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  t;      break;. 
8950: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
8960: 53 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 4e 65 67  S:   op = OP_Neg
8970: 61 74 69 76 65 3b 20 62 72 65 61 6b 3b 0a 20 20  ative; break;.  
8980: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44    case TK_BITAND
8990: 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74 41  :   op = OP_BitA
89a0: 6e 64 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  nd;   break;.   
89b0: 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 20   case TK_BITOR: 
89c0: 20 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74 4f 72     op = OP_BitOr
89d0: 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ;    break;.    
89e0: 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20  case TK_BITNOT: 
89f0: 20 20 6f 70 20 3d 20 4f 50 5f 42 69 74 4e 6f 74    op = OP_BitNot
8a00: 3b 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  ;   break;.    c
8a10: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 20 20  ase TK_LSHIFT:  
8a20: 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66 74 4c 65   op = OP_ShiftLe
8a30: 66 74 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20  ft;  break;.    
8a40: 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20  case TK_RSHIFT: 
8a50: 20 20 6f 70 20 3d 20 4f 50 5f 53 68 69 66 74 52    op = OP_ShiftR
8a60: 69 67 68 74 3b 20 62 72 65 61 6b 3b 0a 20 20 20  ight; break;.   
8a70: 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 20 20 20   case TK_REM:   
8a80: 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 6d 61 69     op = OP_Remai
8a90: 6e 64 65 72 3b 20 20 62 72 65 61 6b 3b 0a 20 20  nder;  break;.  
8aa0: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
8ab0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 52 65 61 6c      op = OP_Real
8ac0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8ad0: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
8ae0: 47 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53 74 72  G:   op = OP_Str
8af0: 69 6e 67 38 3b 20 20 20 20 20 62 72 65 61 6b 3b  ing8;     break;
8b00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f  .    case TK_BLO
8b10: 42 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 48  B:     op = OP_H
8b20: 65 78 42 6c 6f 62 3b 20 20 20 20 62 72 65 61 6b  exBlob;    break
8b30: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62  ;.    default: b
8b40: 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74  reak;.  }.  swit
8b50: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
8b60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
8b70: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  UMN: {.      if(
8b80: 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20   pParse->useAgg 
8b90: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
8ba0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8bb0: 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78  P_AggGet, 0, pEx
8bc0: 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20  pr->iAgg);.     
8bd0: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
8be0: 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a  ->iColumn>=0 ){.
8bf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
8c00: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43  dbeAddOp(v, OP_C
8c10: 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54  olumn, pExpr->iT
8c20: 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f  able, pExpr->iCo
8c30: 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  lumn);.      }el
8c40: 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  se{.        sqli
8c50: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
8c60: 4f 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d  OP_Recno, pExpr-
8c70: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
8c80: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8c90: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8ca0: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
8cb0: 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72       codeInteger
8cc0: 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  (v, pExpr->token
8cd0: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
8ce0: 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  .n);.      break
8cf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8d00: 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63   TK_FLOAT:.    c
8d10: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
8d20: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8d30: 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20  beOp3(v, op, 0, 
8d40: 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  0, pExpr->token.
8d50: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
8d60: 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  n);.      sqlite
8d70: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  3VdbeDequoteP3(v
8d80: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
8d90: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
8da0: 73 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20  se TK_BLOB: {.  
8db0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8dc0: 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20  p3(v, op, 0, 0, 
8dd0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31  pExpr->token.z+1
8de0: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
8df0: 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  -1);.      sqlit
8e00: 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  e3VdbeDequoteP3(
8e10: 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72  v, -1);.      br
8e20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
8e30: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
8e40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8e50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
8e60: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
8e70: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
8e80: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
8e90: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
8ea0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
8eb0: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
8ec0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
8ed0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8ee0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
8ef0: 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LT:.    case TK_
8f00: 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LE:.    case TK_
8f10: 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GT:.    case TK_
8f20: 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  GE:.    case TK_
8f30: 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NE:.    case TK_
8f40: 45 51 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  EQ: {.      int 
8f50: 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p1 = binaryCompa
8f60: 72 65 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66  reP1(pExpr->pLef
8f70: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
8f80: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
8f90: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
8fa0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
8fb0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8fc0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
8fd0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
8fe0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
8ff0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 70  beAddOp(v, op, p
9000: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
9010: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9020: 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63  se TK_AND:.    c
9030: 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63  ase TK_OR:.    c
9040: 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20  ase TK_PLUS:.   
9050: 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20   case TK_STAR:. 
9060: 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53     case TK_MINUS
9070: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  :.    case TK_RE
9080: 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  M:.    case TK_B
9090: 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20  ITAND:.    case 
90a0: 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61  TK_BITOR:.    ca
90b0: 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20 7b 0a 20  se TK_SLASH: {. 
90c0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
90d0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
90e0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
90f0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9100: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
9110: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
9120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9130: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
9140: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9150: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  }.    case TK_LS
9160: 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65 20 54  HIFT:.    case T
9170: 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20 20 20 20  K_RSHIFT: {.    
9180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
9190: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
91a0: 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20  >pRight);.      
91b0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
91c0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
91d0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
91e0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
91f0: 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20   op, 0, 0);.    
9200: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
9210: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41     case TK_CONCA
9220: 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  T: {.      sqlit
9230: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
9240: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
9250: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
9260: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
9270: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
9280: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9290: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e  eAddOp(v, OP_Con
92a0: 63 61 74 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20  cat, 2, 0);.    
92b0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
92c0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
92d0: 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20  S: {.      Expr 
92e0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
92f0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73  pLeft;.      ass
9300: 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20  ert( pLeft );.  
9310: 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f      if( pLeft->o
9320: 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20 70  p==TK_FLOAT || p
9330: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 54  Left->op==TK_INT
9340: 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20 20  EGER ){.        
9350: 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65 66  Token *p = &pLef
9360: 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20  t->token;.      
9370: 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c 69    char *z = sqli
9380: 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20 2b  teMalloc( p->n +
9390: 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73 70   2 );.        sp
93a0: 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73 22  rintf(z, "-%.*s"
93b0: 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a 20  , p->n, p->z);. 
93c0: 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74         if( pLeft
93d0: 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 29  ->op==TK_FLOAT )
93e0: 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  {.          sqli
93f0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
9400: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
9410: 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20  p->n+1);.       
9420: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9430: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
9440: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
9450: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 73       }.        s
9460: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
9470: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9480: 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46 61     }.      /* Fa
9490: 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f 20  ll through into 
94a0: 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d 0a  TK_NOT */.    }.
94b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4e      case TK_BITN
94c0: 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OT:.    case TK_
94d0: 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  NOT: {.      sql
94e0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
94f0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9500: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9510: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70  3VdbeAddOp(v, op
9520: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
9530: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9540: 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a  case TK_ISNULL:.
9550: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e      case TK_NOTN
9560: 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  ULL: {.      int
9570: 20 64 65 73 74 3b 0a 20 20 20 20 20 20 73 71 6c   dest;.      sql
9580: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9590: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20   OP_Integer, 1, 
95a0: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
95b0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
95c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
95d0: 0a 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71  .      dest = sq
95e0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
95f0: 41 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20  Addr(v) + 2;.   
9600: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9610: 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65  dOp(v, op, 1, de
9620: 73 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  st);.      sqlit
9630: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9640: 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29  P_AddImm, -1, 0)
9650: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65 61  ;.    }.    brea
9660: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  k;.    case TK_A
9670: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  GG_FUNCTION: {. 
9680: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9690: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47  AddOp(v, OP_AggG
96a0: 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69 41  et, 0, pExpr->iA
96b0: 67 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  gg);.      break
96c0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
96d0: 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61   TK_GLOB:.    ca
96e0: 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20  se TK_LIKE:.    
96f0: 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
9700: 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
9710: 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70  st *pList = pExp
9720: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20  r->pList;.      
9730: 69 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73  int nExpr = pLis
9740: 74 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  t ? pList->nExpr
9750: 20 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63   : 0;.      Func
9760: 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20  Def *pDef;.     
9770: 20 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20   int nId;.      
9780: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b  const char *zId;
9790: 0a 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20  .      int p2 = 
97a0: 30 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  0;.      int i;.
97b0: 20 20 20 20 20 20 69 6e 74 20 69 50 72 65 66 45        int iPrefE
97c0: 6e 63 20 3d 20 28 70 50 61 72 73 65 2d 3e 64 62  nc = (pParse->db
97d0: 2d 3e 65 6e 63 3d 3d 54 45 58 54 5f 55 74 66 38  ->enc==TEXT_Utf8
97e0: 29 3f 30 3a 31 3b 0a 20 20 20 20 20 20 67 65 74  )?0:1;.      get
97f0: 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78  FunctionName(pEx
9800: 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b  pr, &zId, &nId);
9810: 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71  .      pDef = sq
9820: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
9830: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49  n(pParse->db, zI
9840: 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c 20 69  d, nId, nExpr, i
9850: 50 72 65 66 45 6e 63 2c 20 30 29 3b 0a 20 20 20  PrefEnc, 0);.   
9860: 20 20 20 61 73 73 65 72 74 28 20 70 44 65 66 21     assert( pDef!
9870: 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45 78 70  =0 );.      nExp
9880: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  r = sqlite3ExprC
9890: 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50 61 72  odeExprList(pPar
98a0: 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20 20 20  se, pList);.    
98b0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78    for(i=0; i<nEx
98c0: 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29  pr && i<32; i++)
98d0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73 71  {.        if( sq
98e0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
98f0: 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e  ant(pList->a[i].
9900: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
9910: 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29      p2 |= (1<<i)
9920: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9930: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
9940: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46  3VdbeOp3(v, OP_F
9950: 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20  unction, nExpr, 
9960: 70 32 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c  p2, (char*)pDef,
9970: 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20   P3_FUNCDEF);.  
9980: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9990: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c  .    case TK_SEL
99a0: 45 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ECT: {.      sql
99b0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
99c0: 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78   OP_MemLoad, pEx
99d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b  pr->iColumn, 0);
99e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
99f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9a00: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
9a10: 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  addr;.      char
9a20: 20 63 6f 6e 73 74 20 2a 61 66 66 53 74 72 3b 0a   const *affStr;.
9a30: 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75 72 65  .      /* Figure
9a40: 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e 69 74   out the affinit
9a50: 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72 65 61  y to use to crea
9a60: 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20 74 68  te a key from th
9a70: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
9a80: 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72 65 73  ** of the expres
9a90: 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79 53 74  sion. affinitySt
9aa0: 72 20 73 74 6f 72 65 73 20 61 20 73 74 61 74 69  r stores a stati
9ab0: 63 20 73 74 72 69 6e 67 20 73 75 69 74 61 62 6c  c string suitabl
9ac0: 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a 20 50  e for.      ** P
9ad0: 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 4b 65 79 2e  3 of OP_MakeKey.
9ae0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9af0: 61 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33  affStr = sqlite3
9b00: 41 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63  AffinityString(c
9b10: 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74  omparisonAffinit
9b20: 79 28 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20  y(pExpr));..    
9b30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
9b40: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
9b50: 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 1, 0);..      
9b60: 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
9b70: 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
9b80: 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
9b90: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
9ba0: 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
9bb0: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
9bc0: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
9bd0: 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
9be0: 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
9bf0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9c00: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9c10: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
9c20: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
9c30: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
9c40: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
9c50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9c60: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
9c70: 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20  dr+4);          
9c80: 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f    /* addr + 0 */
9c90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9ca0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
9cb0: 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 2, 0);.      
9cc0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9cd0: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
9ce0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
9cf0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9d00: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
9d10: 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+7);.      sqli
9d20: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
9d30: 5f 4d 61 6b 65 4b 65 79 2c 20 31 2c 20 30 2c 20  _MakeKey, 1, 0, 
9d40: 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41 54 49  affStr, P3_STATI
9d50: 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20 34 20  C); /* addr + 4 
9d60: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
9d70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9d80: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
9d90: 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20  able, addr+7);. 
9da0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9db0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
9dc0: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20  mm, -1, 0);     
9dd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
9de0: 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20  addr + 6 */..   
9df0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9e00: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
9e10: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  EEN: {.      sql
9e20: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9e30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9e40: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9e50: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9e60: 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  _Dup, 0, 0);.   
9e70: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9e80: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9e90: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
9ea0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
9eb0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9ec0: 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a 20 20  OP_Ge, 0, 0);.  
9ed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9ee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c  ddOp(v, OP_Pull,
9ef0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
9f00: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9f10: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
9f20: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
9f30: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f40: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4c 65  beAddOp(v, OP_Le
9f50: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
9f60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9f70: 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29  v, OP_And, 0, 0)
9f80: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9f90: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9fa0: 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65  _UPLUS:.    case
9fb0: 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20   TK_AS: {.      
9fc0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
9fd0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
9fe0: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72 65  Left);.      bre
9ff0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a000: 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20  se TK_CASE: {.  
a010: 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e 64      int expr_end
a020: 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e  _label;.      in
a030: 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20  t jumpInst;.    
a040: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
a050: 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20    int nExpr;.   
a060: 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20 20     int i;..     
a070: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
a080: 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73 73  List);.      ass
a090: 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69 73  ert((pExpr->pLis
a0a0: 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d 3d  t->nExpr % 2) ==
a0b0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
a0c0: 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  t(pExpr->pList->
a0d0: 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20 20  nExpr > 0);.    
a0e0: 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70 72 2d    nExpr = pExpr-
a0f0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  >pList->nExpr;. 
a100: 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61       expr_end_la
a110: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
a120: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
a130: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a140: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
a150: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a160: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a170: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
a180: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
a190: 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
a1a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a1b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
a1c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
a1d0: 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  i].pExpr);.     
a1e0: 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c     if( pExpr->pL
a1f0: 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20 20  eft ){.         
a200: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a210: 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20  p(v, OP_Dup, 1, 
a220: 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  1);.          ju
a230: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33  mpInst = sqlite3
a240: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a250: 4e 65 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  Ne, 1, 0);.     
a260: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a270: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
a280: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
a290: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 20  }else{.         
a2a0: 20 6a 75 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69   jumpInst = sqli
a2b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a2c0: 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b  OP_IfNot, 1, 0);
a2d0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a2e0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a2f0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a300: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 2b 31 5d 2e  ->pList->a[i+1].
a310: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
a320: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a330: 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
a340: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b  expr_end_label);
a350: 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d 20  .        addr = 
a360: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
a370: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
a380: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
a390: 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e  angeP2(v, jumpIn
a3a0: 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20  st, addr);.     
a3b0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
a3c0: 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20  pr->pLeft ){.   
a3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a3e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c  AddOp(v, OP_Pop,
a3f0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   1, 0);.      }.
a400: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a410: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20  >pRight ){.     
a420: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a430: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a440: 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  ->pRight);.     
a450: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a460: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a470: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a480: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20  0, 0);.      }. 
a490: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
a4a0: 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20  ResolveLabel(v, 
a4b0: 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b  expr_end_label);
a4c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a4d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
a4e0: 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20 69  RAISE: {.      i
a4f0: 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69 67  f( !pParse->trig
a500: 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20 20  Stack ){.       
a510: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
a520: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
a530: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a540: 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e 6c  "RAISE() may onl
a550: 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69 6e  y be used within
a560: 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67 72   a trigger-progr
a570: 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 70 50  am");.        pP
a580: 61 72 73 65 2d 3e 6e 45 72 72 2b 2b 3b 0a 09 72  arse->nErr++;..r
a590: 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
a5a0: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
a5b0: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 52 6f  iColumn == OE_Ro
a5c0: 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20 20 70 45 78  llback ||..  pEx
a5d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
a5e0: 45 5f 41 62 6f 72 74 20 7c 7c 0a 09 20 20 70 45  E_Abort ||..  pE
a5f0: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20  xpr->iColumn == 
a600: 4f 45 5f 46 61 69 6c 20 29 7b 0a 09 20 20 73 71  OE_Fail ){..  sq
a610: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a620: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
a630: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
a640: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
a670: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
a680: 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73 71 6c 69 74  ken.n);..  sqlit
a690: 65 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28  e3VdbeDequoteP3(
a6a0: 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 7d 20  v, -1);.      } 
a6b0: 65 6c 73 65 20 7b 0a 09 20 20 61 73 73 65 72 74  else {..  assert
a6c0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
a6d0: 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
a6e0: 0a 09 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f  ..  sqlite3VdbeO
a6f0: 70 33 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p3(v, OP_Goto, 0
a700: 2c 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  , pParse->trigSt
a710: 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 2c  ack->ignoreJump,
a720: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
a730: 20 20 20 20 20 20 20 20 20 20 20 20 22 28 49 47              "(IG
a740: 4e 4f 52 45 20 6a 75 6d 70 29 22 2c 20 30 29 3b  NORE jump)", 0);
a750: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
a760: 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 7d 0a     break;.  }.}.
a770: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a780: 63 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73  code that pushes
a790: 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76   the value of ev
a7a0: 65 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74  ery element of t
a7b0: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
a7c0: 65 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f  ession list onto
a7d0: 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a   the stack..**.*
a7e0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d  * Return the num
a7f0: 62 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20  ber of elements 
a800: 70 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20  pushed onto the 
a810: 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stack..*/.int sq
a820: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70  lite3ExprCodeExp
a830: 72 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a  rList(.  Parse *
a840: 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50  pParse,     /* P
a850: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
a860: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
a870: 69 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78  ist    /* The ex
a880: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f  pression list to
a890: 20 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a   be coded */.){.
a8a0: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
a8b0: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20  t_item *pItem;. 
a8c0: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62   int i, n;.  Vdb
a8d0: 65 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69 73  e *v;.  if( pLis
a8e0: 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  t==0 ) return 0;
a8f0: 0a 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65  .  v = sqlite3Ge
a900: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
a910: 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70   n = pList->nExp
a920: 72 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70  r;.  for(pItem=p
a930: 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c  List->a, i=0; i<
a940: 6e 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  n; i++, pItem++)
a950: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
a960: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49  rCode(pParse, pI
a970: 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d  tem->pExpr);.  }
a980: 0a 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a  .  return n;.}..
a990: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
a9a0: 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61  ode for a boolea
a9b0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63  n expression suc
a9c0: 68 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73  h that a jump is
a9d0: 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20   made.** to the 
a9e0: 6c 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20  label "dest" if 
a9f0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69  the expression i
aa00: 73 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75  s true but execu
aa10: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
aa20: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
aa30: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
aa40: 6e 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a  n is false..**.*
aa50: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
aa60: 69 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f  ion evaluates to
aa70: 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74   NULL (neither t
aa80: 72 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20  rue nor false), 
aa90: 74 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65  then.** take the
aaa0: 20 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d   jump if the jum
aab0: 70 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20  pIfNull flag is 
aac0: 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  true..*/.void sq
aad0: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
aae0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
aaf0: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
ab00: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
ab10: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
ab20: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
ab30: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
ab40: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
ab50: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
ab60: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
ab70: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
ab80: 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20 6f 70   TK_LT:       op
ab90: 20 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20   = OP_Lt;       
aba0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
abb0: 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_LE:       op 
abc0: 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20 62  = OP_Le;       b
abd0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
abe0: 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_GT:       op =
abf0: 20 4f 50 5f 47 74 3b 20 20 20 20 20 20 20 62 72   OP_Gt;       br
ac00: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
ac10: 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _GE:       op = 
ac20: 4f 50 5f 47 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ge;       bre
ac30: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
ac40: 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f  NE:       op = O
ac50: 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65 61  P_Ne;       brea
ac60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  k;.    case TK_E
ac70: 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  Q:       op = OP
ac80: 5f 45 71 3b 20 20 20 20 20 20 20 62 72 65 61 6b  _Eq;       break
ac90: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  ;.    case TK_IS
aca0: 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  NULL:   op = OP_
acb0: 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b 3b  IsNull;   break;
acc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
acd0: 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50 5f 4e  NULL:  op = OP_N
ace0: 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61 6b 3b 0a  otNull;  break;.
acf0: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20 62 72      default:  br
ad00: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
ad10: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
ad20: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
ad30: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20   {.      int d2 
ad40: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
ad50: 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
ad60: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
ad70: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
ad80: 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a  r->pLeft, d2, !j
ad90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ada0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
adb0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
adc0: 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
add0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ade0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
adf0: 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
ae00: 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
ae10: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ae20: 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73  TK_OR: {.      s
ae30: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
ae40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ae50: 70 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d  pLeft, dest, jum
ae60: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ae70: 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
ae80: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ae90: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
aea0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
aeb0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
aec0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
aed0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
aee0: 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
aef0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
af00: 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c   dest, jumpIfNul
af10: 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  l);.      break;
af20: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
af30: 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_LT:.    case 
af40: 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_LE:.    case 
af50: 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20  TK_GT:.    case 
af60: 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_GE:.    case 
af70: 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20  TK_NE:.    case 
af80: 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 69  TK_EQ: {.      i
af90: 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f  nt p1 = binaryCo
afa0: 6d 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e 70  mpareP1(pExpr->p
afb0: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
afc0: 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  ght, jumpIfNull)
afd0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
afe0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
aff0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b000: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b010: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b020: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
b030: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b040: 64 4f 70 28 76 2c 20 6f 70 2c 20 70 31 2c 20 64  dOp(v, op, p1, d
b050: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
b060: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b070: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20  e TK_ISNULL:.   
b080: 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c   case TK_NOTNULL
b090: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
b0a0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b0b0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
b0c0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
b0d0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
b0e0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
b0f0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b100: 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a  case TK_BETWEEN:
b110: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64   {.      int add
b120: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
b130: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b140: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
b150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b160: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
b170: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
b180: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b190: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b1a0: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
b1b0: 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20 73  ;.      addr = s
b1c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b1d0: 76 2c 20 4f 50 5f 4c 74 2c 20 21 6a 75 6d 70 49  v, OP_Lt, !jumpI
b1e0: 66 4e 75 6c 6c 2c 20 30 29 3b 0a 20 20 20 20 20  fNull, 0);.     
b1f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b200: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b210: 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70  pList->a[1].pExp
b220: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
b230: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b240: 5f 4c 65 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c  _Le, jumpIfNull,
b250: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
b260: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b270: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
b280: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
b290: 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76  e3VdbeChangeP2(v
b2a0: 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56  , addr, sqlite3V
b2b0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
b2c0: 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ));.      sqlite
b2d0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b2e0: 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20  _Pop, 1, 0);.   
b2f0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b300: 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20      default: {. 
b310: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b320: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b330: 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pr);.      sqlit
b340: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
b350: 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  P_If, jumpIfNull
b360: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
b370: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
b380: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
b390: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
b3a0: 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
b3b0: 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
b3c0: 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
b3d0: 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
b3e0: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
b3f0: 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
b400: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
b410: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
b420: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
b430: 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
b440: 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
b450: 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
b460: 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
b470: 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
b480: 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
b490: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
b4a0: 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68 72  true or fall thr
b4b0: 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e 75  ough if jumpIfNu
b4c0: 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a  ll is false..*/.
b4d0: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
b4e0: 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a 70  IfFalse(Parse *p
b4f0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
b500: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
b510: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
b520: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
b530: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
b540: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
b550: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
b560: 20 72 65 74 75 72 6e 3b 0a 20 20 73 77 69 74 63   return;.  switc
b570: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
b580: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20      case TK_LT: 
b590: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 65        op = OP_Ge
b5a0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
b5b0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20     case TK_LE:  
b5c0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b       op = OP_Gt;
b5d0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
b5e0: 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20    case TK_GT:   
b5f0: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
b600: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b610: 20 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20   case TK_GE:    
b620: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20     op = OP_Lt;  
b630: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b640: 63 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20  case TK_NE:     
b650: 20 20 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20    op = OP_Eq;   
b660: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b670: 61 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20  ase TK_EQ:      
b680: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
b690: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b6a0: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20  se TK_ISNULL:   
b6b0: 6f 70 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b  op = OP_NotNull;
b6c0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b6d0: 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f  e TK_NOTNULL:  o
b6e0: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
b6f0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
b700: 75 6c 74 3a 20 20 62 72 65 61 6b 3b 0a 20 20 7d  ult:  break;.  }
b710: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
b720: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
b730: 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
b740: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
b750: 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
b760: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
b770: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b780: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b790: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
b7a0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
b7b0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b7c0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b7d0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f   }.    case TK_O
b7e0: 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64  R: {.      int d
b7f0: 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d  2 = sqlite3VdbeM
b800: 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20  akeLabel(v);.   
b810: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b820: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
b830: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21  pr->pLeft, d2, !
b840: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b850: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b860: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
b870: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
b880: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b890: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b8a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b8b0: 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61   d2);.      brea
b8c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
b8d0: 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20  e TK_NOT: {.    
b8e0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54    sqlite3ExprIfT
b8f0: 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  rue(pParse, pExp
b900: 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c 20  r->pLeft, dest, 
b910: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b930: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 0a      case TK_LT:.
b940: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 0a      case TK_LE:.
b950: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a 0a      case TK_GT:.
b960: 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a 0a      case TK_GE:.
b970: 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a 0a      case TK_NE:.
b980: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a 20      case TK_EQ: 
b990: 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d  {.      int p1 =
b9a0: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31   binaryCompareP1
b9b0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70  (pExpr->pLeft, p
b9c0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6a 75  Expr->pRight, ju
b9d0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
b9e0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b9f0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ba00: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
ba10: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ba20: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
ba30: 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ght);.      sqli
ba40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ba50: 6f 70 2c 20 70 31 2c 20 64 65 73 74 29 3b 0a 20  op, p1, dest);. 
ba60: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ba70: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
ba80: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
ba90: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
baa0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
bab0: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
bac0: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
bad0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
bae0: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
baf0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
bb00: 20 20 20 7d 0a 23 69 66 20 30 0a 20 20 20 20 63     }.#if 0.    c
bb10: 61 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20  ase TK_IN: {.   
bb20: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
bb30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
bb40: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
bb50: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
bb60: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
bb70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
bb80: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
bb90: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e  dbeAddOp(v, OP_N
bba0: 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64 72  otNull, -1, addr
bbb0: 2b 33 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +3);.      sqlit
bbc0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
bbd0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
bbe0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bbf0: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
bc00: 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 3f   0, jumpIfNull ?
bc10: 20 64 65 73 74 20 3a 20 61 64 64 72 2b 34 29 3b   dest : addr+4);
bc20: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
bc30: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
bc40: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bc50: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 46  AddOp(v, OP_NotF
bc60: 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61  ound, pExpr->iTa
bc70: 62 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  ble, dest);.    
bc80: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
bc90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bca0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 6f 74 46 6f  p(v, OP_SetNotFo
bcb0: 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  und, pExpr->iTab
bcc0: 6c 65 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20  le, dest);.     
bcd0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
bce0: 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20      }.#endif.   
bcf0: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
bd00: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64  : {.      int ad
bd10: 64 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  dr;.      sqlite
bd20: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
bd30: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
bd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bd50: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75  beAddOp(v, OP_Du
bd60: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
bd70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bd80: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bd90: 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
bda0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
bdb0: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
bdc0: 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20  ntAddr(v);.     
bdd0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bde0: 70 28 76 2c 20 4f 50 5f 47 65 2c 20 21 6a 75 6d  p(v, OP_Ge, !jum
bdf0: 70 49 66 4e 75 6c 6c 2c 20 61 64 64 72 2b 33 29  pIfNull, addr+3)
be00: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
be10: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50  dbeAddOp(v, OP_P
be20: 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20  op, 1, 0);.     
be30: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
be40: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
be50: 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73 71   dest);.      sq
be60: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
be70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
be80: 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b  st->a[1].pExpr);
be90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bea0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 74  beAddOp(v, OP_Gt
beb0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
bec0: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
bed0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
bee0: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
bef0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
bf00: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
bf10: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
bf20: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
bf30: 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73   jumpIfNull, des
bf40: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
bf50: 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a  .    }.  }.}../*
bf60: 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f  .** Do a deep co
bf70: 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20  mparison of two 
bf80: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73  expression trees
bf90: 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45 20 28  .  Return TRUE (
bfa0: 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20  non-zero).** if 
bfb0: 74 68 65 79 20 61 72 65 20 69 64 65 6e 74 69 63  they are identic
bfc0: 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20 46 41  al and return FA
bfd0: 4c 53 45 20 69 66 20 74 68 65 79 20 64 69 66 66  LSE if they diff
bfe0: 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a  er in any way..*
bff0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c000: 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20 2a 70  rCompare(Expr *p
c010: 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a 20 20  A, Expr *pB){.  
c020: 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 41 3d  int i;.  if( pA=
c030: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
c040: 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20   pB==0;.  }else 
c050: 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20  if( pB==0 ){.   
c060: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c070: 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d   if( pA->op!=pB-
c080: 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  >op ) return 0;.
c090: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
c0a0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
c0b0: 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20  eft, pB->pLeft) 
c0c0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
c0d0: 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43 6f  ( !sqlite3ExprCo
c0e0: 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67 68 74  mpare(pA->pRight
c0f0: 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20 29 20  , pB->pRight) ) 
c100: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
c110: 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pA->pList ){.   
c120: 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d   if( pB->pList==
c130: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
c140: 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d    if( pA->pList-
c150: 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73  >nExpr!=pB->pLis
c160: 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72  t->nExpr ) retur
c170: 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  n 0;.    for(i=0
c180: 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e  ; i<pA->pList->n
c190: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
c1a0: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
c1b0: 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c  prCompare(pA->pL
c1c0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  ist->a[i].pExpr,
c1d0: 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d   pB->pList->a[i]
c1e0: 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20  .pExpr) ){.     
c1f0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20     return 0;.   
c200: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c     }.    }.  }el
c210: 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74  se if( pB->pList
c220: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30   ){.    return 0
c230: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e  ;.  }.  if( pA->
c240: 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70  pSelect || pB->p
c250: 53 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20  Select ) return 
c260: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69 54 61  0;.  if( pA->iTa
c270: 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20  ble!=pB->iTable 
c280: 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d  || pA->iColumn!=
c290: 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65  pB->iColumn ) re
c2a0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
c2b0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20  ->token.z ){.   
c2c0: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a   if( pB->token.z
c2d0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
c2e0: 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65      if( pB->toke
c2f0: 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e  n.n!=pA->token.n
c300: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
c310: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 4e   if( sqlite3StrN
c320: 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a  ICmp(pA->token.z
c330: 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  , pB->token.z, p
c340: 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29  B->token.n)!=0 )
c350: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
c360: 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a   return 1;.}../*
c370: 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
c380: 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 50 61  ement to the pPa
c390: 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61  rse->aAgg[] arra
c3a0: 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 73  y and return its
c3b0: 20 69 6e 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69   index..*/.stati
c3c0: 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67 49  c int appendAggI
c3d0: 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72 73  nfo(Parse *pPars
c3e0: 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72 73  e){.  if( (pPars
c3f0: 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d 3d  e->nAgg & 0x7)==
c400: 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74  0 ){.    int amt
c410: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 20   = pParse->nAgg 
c420: 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70 72  + 8;.    AggExpr
c430: 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65 52   *aAgg = sqliteR
c440: 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61  ealloc(pParse->a
c450: 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28  Agg, amt*sizeof(
c460: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29  pParse->aAgg[0])
c470: 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67 3d  );.    if( aAgg=
c480: 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75  =0 ){.      retu
c490: 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20  rn -1;.    }.   
c4a0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d 20   pParse->aAgg = 
c4b0: 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73  aAgg;.  }.  mems
c4c0: 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67 67  et(&pParse->aAgg
c4d0: 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20  [pParse->nAgg], 
c4e0: 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73 65  0, sizeof(pParse
c4f0: 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72  ->aAgg[0]));.  r
c500: 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41  eturn pParse->nA
c510: 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41  gg++;.}../*.** A
c520: 6e 61 6c 79 7a 65 20 74 68 65 20 67 69 76 65 6e  nalyze the given
c530: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b   expression look
c540: 69 6e 67 20 66 6f 72 20 61 67 67 72 65 67 61 74  ing for aggregat
c550: 65 20 66 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a  e functions and.
c560: 2a 2a 20 66 6f 72 20 76 61 72 69 61 62 6c 65 73  ** for variables
c570: 20 74 68 61 74 20 6e 65 65 64 20 74 6f 20 62 65   that need to be
c580: 20 61 64 64 65 64 20 74 6f 20 74 68 65 20 70 50   added to the pP
c590: 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72  arse->aAgg[] arr
c5a0: 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69  ay..** Make addi
c5b0: 74 69 6f 6e 61 6c 20 65 6e 74 72 69 65 73 20 74  tional entries t
c5c0: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
c5d0: 67 67 5b 5d 20 61 72 72 61 79 20 61 73 20 6e 65  gg[] array as ne
c5e0: 63 65 73 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54  cessary..**.** T
c5f0: 68 69 73 20 72 6f 75 74 69 6e 65 20 73 68 6f 75  his routine shou
c600: 6c 64 20 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65  ld only be calle
c610: 64 20 61 66 74 65 72 20 74 68 65 20 65 78 70 72  d after the expr
c620: 65 73 73 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a  ession has been.
c630: 2a 2a 20 61 6e 61 6c 79 7a 65 64 20 62 79 20 73  ** analyzed by s
c640: 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c 76  qlite3ExprResolv
c650: 65 49 64 73 28 29 20 61 6e 64 20 73 71 6c 69 74  eIds() and sqlit
c660: 65 33 45 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a  e3ExprCheck()..*
c670: 2a 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61  *.** If errors a
c680: 72 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61  re seen, leave a
c690: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20  n error message 
c6a0: 69 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72  in zErrMsg and r
c6b0: 65 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d  eturn.** the num
c6c0: 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a  ber of errors..*
c6d0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
c6e0: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
c6f0: 65 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  es(Parse *pParse
c700: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
c710: 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45 78    int i;.  AggEx
c720: 70 72 20 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20  pr *aAgg;.  int 
c730: 6e 45 72 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28  nErr = 0;..  if(
c740: 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75   pExpr==0 ) retu
c750: 72 6e 20 30 3b 0a 20 20 73 77 69 74 63 68 28 20  rn 0;.  switch( 
c760: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
c770: 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a   case TK_COLUMN:
c780: 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d 20   {.      aAgg = 
c790: 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
c7a0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
c7b0: 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b  Parse->nAgg; i++
c7c0: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 61  ){.        if( a
c7d0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
c7e0: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
c7f0: 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 70 45 78   if( aAgg[i].pEx
c800: 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pr->iTable==pExp
c810: 72 2d 3e 69 54 61 62 6c 65 0a 20 20 20 20 20 20  r->iTable.      
c820: 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45     && aAgg[i].pE
c830: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  xpr->iColumn==pE
c840: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
c850: 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
c860: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
c870: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d   }.      if( i>=
c880: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
c890: 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65          i = appe
c8a0: 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65  ndAggInfo(pParse
c8b0: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69  );.        if( i
c8c0: 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  <0 ) return 1;. 
c8d0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
c8e0: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30  Agg[i].isAgg = 0
c8f0: 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  ;.        pParse
c900: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
c910: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 7d  = pExpr;.      }
c920: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
c930: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72  gg = i;.      br
c940: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
c950: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
c960: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  ION: {.      aAg
c970: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
c980: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
c990: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
c9a0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
c9b0: 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67  f( !aAgg[i].isAg
c9c0: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
c9d0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
c9e0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  3ExprCompare(aAg
c9f0: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
ca00: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
ca10: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
ca20: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
ca30: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
ca40: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  gg ){.        in
ca50: 74 20 69 50 72 65 66 45 6e 63 20 3d 20 28 70 50  t iPrefEnc = (pP
ca60: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3d 3d 54  arse->db->enc==T
ca70: 45 58 54 5f 55 74 66 38 29 3f 30 3a 31 3b 0a 20  EXT_Utf8)?0:1;. 
ca80: 20 20 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e         i = appen
ca90: 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29  dAggInfo(pParse)
caa0: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 69 3c  ;.        if( i<
cab0: 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20  0 ) return 1;.  
cac0: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
cad0: 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b  gg[i].isAgg = 1;
cae0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
caf0: 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d  >aAgg[i].pExpr =
cb00: 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20   pExpr;.        
cb10: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
cb20: 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46  pFunc = sqlite3F
cb30: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
cb40: 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20  se->db,.        
cb50: 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65       pExpr->toke
cb60: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
cb70: 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  n.n,.           
cb80: 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f    pExpr->pList ?
cb90: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e   pExpr->pList->n
cba0: 45 78 70 72 20 3a 20 30 2c 20 69 50 72 65 66 45  Expr : 0, iPrefE
cbb0: 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a  nc, 0);.      }.
cbc0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67        pExpr->iAg
cbd0: 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65  g = i;.      bre
cbe0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
cbf0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69  fault: {.      i
cc00: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
cc10: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
cc20: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  = sqlite3ExprAna
cc30: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
cc40: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
cc50: 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  eft);.      }.  
cc60: 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30 20      if( nErr==0 
cc70: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
cc80: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
cc90: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
cca0: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
ccb0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ccc0: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d 0a  Right);.      }.
ccd0: 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d        if( nErr==
cce0: 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69 73  0 && pExpr->pLis
ccf0: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  t ){.        int
cd00: 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73   n = pExpr->pLis
cd10: 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  t->nExpr;.      
cd20: 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 20    int i;.       
cd30: 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d 3d   for(i=0; nErr==
cd40: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
cd50: 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d            nErr =
cd60: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
cd70: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70 50  yzeAggregates(pP
cd80: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69  arse, pExpr->pLi
cd90: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b  st->a[i].pExpr);
cda0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
cdb0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
cdc0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
cdd0: 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn nErr;.}../*.*
cde0: 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20  * Locate a user 
cdf0: 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61  function given a
ce00: 20 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20   name, a number 
ce10: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  of arguments and
ce20: 20 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63   a flag.** indic
ce30: 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 74 68  ating whether th
ce40: 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65  e function prefe
ce50: 72 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55  rs UTF-16 over U
ce60: 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a  TF-8.  Return a.
ce70: 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
ce80: 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  e FuncDef struct
ce90: 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
cea0: 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20   that function, 
ceb0: 6f 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c  or return.** NUL
cec0: 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  L if the functio
ced0: 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
cee0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
cef0: 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65  reateFlag argume
cf00: 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
cf10: 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46   a new (blank) F
cf20: 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
cf30: 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
cf40: 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68  nd liked into th
cf50: 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65  e "db" structure
cf60: 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63   if a.** no matc
cf70: 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72  hing function pr
cf80: 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
cf90: 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c  .  When createFl
cfa0: 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e  ag is true.** an
cfb0: 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d  d the nArg param
cfc0: 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e  eter is -1, then
cfd0: 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e   only a function
cfe0: 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a   that accepts.**
cff0: 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61   any number of a
d000: 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  rguments will be
d010: 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
d020: 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
d030: 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67  s false and nArg
d040: 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65   is -1, then the
d050: 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20   first valid.** 
d060: 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
d070: 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66  s returned.  A f
d080: 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64  unction is valid
d090: 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63   if either xFunc
d0a0: 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20  .** or xStep is 
d0b0: 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
d0c0: 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  If createFlag is
d0d0: 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66   false, then a f
d0e0: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
d0f0: 20 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61   required name a
d100: 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  nd.** number of 
d110: 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65  arguments may be
d120: 20 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69   returned even i
d130: 66 20 74 68 65 20 65 54 65 78 74 52 65 70 20 66  f the eTextRep f
d140: 6c 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  lag does not.** 
d150: 6d 61 74 63 68 20 74 68 61 74 20 72 65 71 75 65  match that reque
d160: 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  sted..*/.FuncDef
d170: 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e   *sqlite3FindFun
d180: 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 20  ction(.  sqlite 
d190: 2a 64 62 2c 20 20 20 20 20 20 20 20 2f 2a 20 41  *db,        /* A
d1a0: 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
d1b0: 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
d1c0: 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20  *zName, /* Name 
d1d0: 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  of the function.
d1e0: 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69    Not null-termi
d1f0: 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  nated */.  int n
d200: 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Name,         /*
d210: 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
d220: 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
d230: 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
d240: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
d250: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
d260: 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20  .  -1 means any 
d270: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 69 6e 74 20  number */.  int 
d280: 65 54 65 78 74 52 65 70 2c 20 20 20 20 20 20 2f  eTextRep,      /
d290: 2a 20 54 72 75 65 20 74 6f 20 72 65 74 72 69 65  * True to retrie
d2a0: 76 65 20 55 54 46 2d 31 36 20 76 65 72 73 69 6f  ve UTF-16 versio
d2b0: 6e 73 2e 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65  ns. */.  int cre
d2c0: 61 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43  ateFlag     /* C
d2d0: 72 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20  reate new entry 
d2e0: 69 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73  if true and does
d2f0: 20 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65   not otherwise e
d300: 78 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e  xist */.){.  Fun
d310: 63 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20  cDef *p;        
d320: 20 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72   /* Iterator var
d330: 69 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44  iable */.  FuncD
d340: 65 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f  ef *pFirst;    /
d350: 2a 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e  * First function
d360: 20 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20   with this name 
d370: 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42  */.  FuncDef *pB
d380: 65 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74  est = 0; /* Best
d390: 20 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20   match found so 
d3a0: 66 61 72 20 2a 2f 0a 20 20 69 6e 74 20 6d 61 74  far */.  int mat
d3b0: 63 68 71 75 61 6c 20 3d 20 30 3b 20 20 0a 0a 20  chqual = 0;  .. 
d3c0: 20 2f 2a 20 4e 6f 72 6d 61 6c 69 7a 65 20 61 72   /* Normalize ar
d3d0: 67 75 6d 65 6e 74 20 76 61 6c 75 65 73 20 74 6f  gument values to
d3e0: 20 73 69 6d 70 6c 69 66 79 20 63 6f 6d 70 61 72   simplify compar
d3f0: 69 73 6f 6e 73 20 62 65 6c 6f 77 2e 20 2a 2f 0a  isons below. */.
d400: 20 20 69 66 28 20 65 54 65 78 74 52 65 70 20 29    if( eTextRep )
d410: 20 65 54 65 78 74 52 65 70 20 3d 20 31 3b 0a 20   eTextRep = 1;. 
d420: 20 69 66 28 20 6e 41 72 67 3c 2d 31 20 29 20 6e   if( nArg<-1 ) n
d430: 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20 70 46 69  Arg = -1;..  pFi
d440: 72 73 74 20 3d 20 28 46 75 6e 63 44 65 66 2a 29  rst = (FuncDef*)
d450: 73 71 6c 69 74 65 33 48 61 73 68 46 69 6e 64 28  sqlite3HashFind(
d460: 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d  &db->aFunc, zNam
d470: 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 66 6f 72  e, nName);.  for
d480: 28 70 3d 70 46 69 72 73 74 3b 20 70 3b 20 70 3d  (p=pFirst; p; p=
d490: 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20 20 20 69  p->pNext){.    i
d4a0: 66 28 20 31 20 7c 7c 20 70 2d 3e 78 46 75 6e 63  f( 1 || p->xFunc
d4b0: 20 7c 7c 20 70 2d 3e 78 53 74 65 70 20 29 7b 0a   || p->xStep ){.
d4c0: 20 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72        if( p->nAr
d4d0: 67 3d 3d 6e 41 72 67 20 26 26 20 70 2d 3e 69 50  g==nArg && p->iP
d4e0: 72 65 66 45 6e 63 3d 3d 65 54 65 78 74 52 65 70  refEnc==eTextRep
d4f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 41   ){.        /* A
d500: 20 70 65 72 66 65 63 74 20 6d 61 74 63 68 2e 20   perfect match. 
d510: 2a 2f 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  */.        pBest
d520: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 6d 61   = p;.        ma
d530: 74 63 68 71 75 61 6c 20 3d 20 34 3b 0a 20 20 20  tchqual = 4;.   
d540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d550: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 2d    }.      if( p-
d560: 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 29 7b 0a 20  >nArg==nArg ){. 
d570: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d580: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 6d 61   of arguments ma
d590: 74 63 68 65 73 2c 20 62 75 74 20 6e 6f 74 20 74  tches, but not t
d5a0: 68 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  he text encoding
d5b0: 20 2a 2f 0a 20 20 20 20 20 20 20 20 70 42 65 73   */.        pBes
d5c0: 74 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 6d  t = p;.        m
d5d0: 61 74 63 68 71 75 61 6c 20 3d 20 33 3b 0a 20 20  atchqual = 3;.  
d5e0: 20 20 20 20 7d 0a 20 20 20 20 20 20 65 6c 73 65      }.      else
d5f0: 20 69 66 28 20 28 70 2d 3e 6e 41 72 67 3c 30 29   if( (p->nArg<0)
d600: 20 7c 7c 20 28 6e 41 72 67 3c 30 29 20 29 7b 0a   || (nArg<0) ){.
d610: 20 20 20 20 20 20 20 20 69 66 28 20 6d 61 74 63          if( matc
d620: 68 71 75 61 6c 3c 32 20 26 26 20 70 2d 3e 69 50  hqual<2 && p->iP
d630: 72 65 66 45 6e 63 3d 3d 65 54 65 78 74 52 65 70  refEnc==eTextRep
d640: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   ){.          /*
d650: 20 4d 61 74 63 68 65 64 20 61 20 76 61 72 61 72   Matched a varar
d660: 67 73 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68  gs function with
d670: 20 63 6f 72 72 65 63 74 20 74 65 78 74 20 65 6e   correct text en
d680: 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 20 20 20 20  coding */.      
d690: 20 20 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20      pBest = p;. 
d6a0: 20 20 20 20 20 20 20 20 20 6d 61 74 63 68 71 75           matchqu
d6b0: 61 6c 20 3d 20 32 3b 0a 20 20 20 20 20 20 20 20  al = 2;.        
d6c0: 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20 6d 61  }.        if( ma
d6d0: 74 63 68 71 75 61 6c 3c 31 20 29 7b 0a 20 20 20  tchqual<1 ){.   
d6e0: 20 20 20 20 20 20 20 2f 2a 20 4d 61 74 63 68 65         /* Matche
d6f0: 64 20 61 20 76 61 72 61 72 67 73 20 66 75 6e 63  d a varargs func
d700: 74 69 6f 6e 20 77 69 74 68 20 69 6e 63 6f 72 72  tion with incorr
d710: 65 63 74 20 74 65 78 74 20 65 6e 63 6f 64 69 6e  ect text encodin
d720: 67 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  g */.          p
d730: 42 65 73 74 20 3d 20 70 3b 0a 20 20 20 20 20 20  Best = p;.      
d740: 20 20 20 20 6d 61 74 63 68 71 75 61 6c 20 3d 20      matchqual = 
d750: 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  1;.        }.   
d760: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a     }.    }.  }..
d770: 20 20 69 66 28 20 63 72 65 61 74 65 46 6c 61 67    if( createFlag
d780: 20 26 26 20 6d 61 74 63 68 71 75 61 6c 3c 34 20   && matchqual<4 
d790: 26 26 20 0a 20 20 20 20 20 20 28 70 42 65 73 74  && .      (pBest
d7a0: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28   = sqliteMalloc(
d7b0: 73 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e  sizeof(*pBest)+n
d7c0: 4e 61 6d 65 2b 31 29 29 20 29 7b 0a 20 20 20 20  Name+1)) ){.    
d7d0: 70 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41  pBest->nArg = nA
d7e0: 72 67 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70  rg;.    pBest->p
d7f0: 4e 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20  Next = pFirst;. 
d800: 20 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20     pBest->zName 
d810: 3d 20 28 63 68 61 72 2a 29 26 70 42 65 73 74 5b  = (char*)&pBest[
d820: 31 5d 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28 70  1];.    memcpy(p
d830: 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e 61  Best->zName, zNa
d840: 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20 20  me, nName);.    
d850: 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e 61  pBest->zName[nNa
d860: 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71 6c  me] = 0;.    sql
d870: 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28 26  ite3HashInsert(&
d880: 64 62 2d 3e 61 46 75 6e 63 2c 20 70 42 65 73 74  db->aFunc, pBest
d890: 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c 20  ->zName, nName, 
d8a0: 28 76 6f 69 64 2a 29 70 42 65 73 74 29 3b 0a 20  (void*)pBest);. 
d8b0: 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74 20   }..  if( pBest 
d8c0: 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65 70  && (pBest->xStep
d8d0: 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e 63   || pBest->xFunc
d8e0: 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29 20   || createFlag) 
d8f0: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
d900: 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  est;.  }.  retur
d910: 6e 20 30 3b 0a 7d 0a 0a                          n 0;.}..