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

Artifact 31e48dd1d9d10fe8e2c307a4a4f36837ed11d3cf:


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 34 38 20 32 30 30 34 2f 30 36 2f 32 33 20  .148 2004/06/23 
0220: 31 32 3a 31 35 3a 35 35 20 64 61 6e 69 65 6c 6b  12:15:55 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 52 65 74 75 72 6e 20 74 68 65 20  *.** Return the 
06a0: 64 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f  default collatio
06b0: 6e 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74  n sequence for t
06c0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45  he expression pE
06d0: 78 70 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65  xpr. If.** there
06e0: 20 69 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63   is no default c
06f0: 6f 6c 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72  ollation type, r
0700: 65 74 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c  eturn 0..*/.Coll
0710: 53 65 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72  Seq *sqlite3Expr
0720: 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70  CollSeq(Parse *p
0730: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
0740: 70 72 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  pr){.  CollSeq *
0750: 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28  pColl = 0;.  if(
0760: 20 70 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43   pExpr ){.    pC
0770: 6f 6c 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f  oll = pExpr->pCo
0780: 6c 6c 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70  ll;.    if( pExp
0790: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 26 26 20  r->op==TK_AS && 
07a0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20  !pColl ){.      
07b0: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
07c0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
07d0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
07e0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28  .    }.  }.  if(
07f0: 20 73 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c   sqlite3CheckCol
0800: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f  lSeq(pParse, pCo
0810: 6c 6c 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c  ll) ){ .    pCol
0820: 6c 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  l = 0;.  }.  ret
0830: 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a  urn pColl;.}../*
0840: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 74 68 65  .** pExpr is the
0850: 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 6f 66   left operand of
0860: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
0870: 65 72 61 74 6f 72 2e 20 20 61 66 66 32 20 69 73  erator.  aff2 is
0880: 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66 66   the.** type aff
0890: 69 6e 69 74 79 20 6f 66 20 74 68 65 20 72 69 67  inity of the rig
08a0: 68 74 20 6f 70 65 72 61 6e 64 2e 20 20 54 68 69  ht operand.  Thi
08b0: 73 20 72 6f 75 74 69 6e 65 20 72 65 74 75 72 6e  s routine return
08c0: 73 20 74 68 65 0a 2a 2a 20 74 79 70 65 20 61 66  s the.** type af
08d0: 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f 75  finity that shou
08e0: 6c 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 74  ld be used for t
08f0: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
0900: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 63 68 61 72 20  erator..*/.char 
0910: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
0920: 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45 78  finity(Expr *pEx
0930: 70 72 2c 20 63 68 61 72 20 61 66 66 32 29 7b 0a  pr, char aff2){.
0940: 20 20 63 68 61 72 20 61 66 66 31 20 3d 20 73 71    char aff1 = sq
0950: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
0960: 79 28 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20  y(pExpr);.  if( 
0970: 61 66 66 31 20 26 26 20 61 66 66 32 20 29 7b 0a  aff1 && aff2 ){.
0980: 20 20 20 20 2f 2a 20 42 6f 74 68 20 73 69 64 65      /* Both side
0990: 73 20 6f 66 20 74 68 65 20 63 6f 6d 70 61 72 69  s of the compari
09a0: 73 6f 6e 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2e  son are columns.
09b0: 20 49 66 20 6f 6e 65 20 68 61 73 20 6e 75 6d 65   If one has nume
09c0: 72 69 63 20 6f 72 0a 20 20 20 20 2a 2a 20 69 6e  ric or.    ** in
09d0: 74 65 67 65 72 20 61 66 66 69 6e 69 74 79 2c 20  teger affinity, 
09e0: 75 73 65 20 74 68 61 74 2e 20 4f 74 68 65 72 77  use that. Otherw
09f0: 69 73 65 20 75 73 65 20 6e 6f 20 61 66 66 69 6e  ise use no affin
0a00: 69 74 79 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ity..    */.    
0a10: 69 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45  if( aff1==SQLITE
0a20: 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20  _AFF_INTEGER || 
0a30: 61 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46  aff2==SQLITE_AFF
0a40: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
0a50: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0a60: 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20  AFF_INTEGER;.   
0a70: 20 7d 65 6c 73 65 20 69 66 28 20 61 66 66 31 3d   }else if( aff1=
0a80: 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45  =SQLITE_AFF_NUME
0a90: 52 49 43 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c  RIC || aff2==SQL
0aa0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 20  ITE_AFF_NUMERIC 
0ab0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
0ac0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
0ad0: 49 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  IC;.    }else{. 
0ae0: 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49       return SQLI
0af0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20  TE_AFF_NONE;.   
0b00: 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21   }.  }else if( !
0b10: 61 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b  aff1 && !aff2 ){
0b20: 0a 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20  .    /* Neither 
0b30: 73 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70  side of the comp
0b40: 61 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75  arison is a colu
0b50: 6d 6e 2e 20 55 73 65 20 6e 75 6d 65 72 69 63 20  mn. Use numeric 
0b60: 61 66 66 69 6e 69 74 79 0a 20 20 20 20 2a 2a 20  affinity.    ** 
0b70: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
0b80: 6f 6e 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 72  on..    */.    r
0b90: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
0ba0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 65 6c 73  _NUMERIC;.  }els
0bb0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0bc0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0bd0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0be0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0bf0: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0c00: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0c10: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0c20: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0c30: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0c40: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0c50: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0c60: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0c70: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0c80: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0c90: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0ca0: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0cb0: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0cc0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0cd0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0ce0: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0cf0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0d00: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0d10: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0d20: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0d30: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0d40: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0d50: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0d60: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0d70: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0d80: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0d90: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0da0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0db0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0dc0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0dd0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0de0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0df0: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0e00: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0e10: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0e20: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0e30: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0e40: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0e50: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0e60: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0e70: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0e80: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0e90: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0ea0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0eb0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0ec0: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
0ed0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  aff;.}../*.** pE
0ee0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0ef0: 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  son expression, 
0f00: 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e  eg. '=', '<', IN
0f10: 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64  (...) etc..** id
0f20: 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68  x_affinity is th
0f30: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e  e affinity of an
0f40: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e   indexed column.
0f50: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
0f60: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  if the index wit
0f70: 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61  h affinity idx_a
0f80: 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75  ffinity may be u
0f90: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0fa0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
0fb0: 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  on in pExpr..*/.
0fc0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0fd0: 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20  AffinityOk(Expr 
0fe0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78  *pExpr, char idx
0ff0: 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68  _affinity){.  ch
1000: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
1010: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
1020: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20  r);.  return .  
1030: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
1040: 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20  FF_NONE) ||.    
1050: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
1060: 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f  _NUMERIC && idx_
1070: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
1080: 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c  _AFF_INTEGER) ||
1090: 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54  .    (aff==SQLIT
10a0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26  E_AFF_INTEGER &&
10b0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
10c0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
10d0: 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d  C) ||.    (aff==
10e0: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
10f0: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1100: 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74  he P1 value that
1110: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1120: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1130: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1140: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1150: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1160: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1170: 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a   pExpr2..** If j
1180: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
1190: 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  e, then set the 
11a0: 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20  low byte of the 
11b0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76  returned.** P1 v
11c0: 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65  alue to tell the
11d0: 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20   opcode to jump 
11e0: 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  if either expres
11f0: 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  sion.** evaluate
1200: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  s to NULL..*/.st
1210: 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43  atic int binaryC
1220: 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70  ompareP1(Expr *p
1230: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
1240: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
1250: 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ull){.  char aff
1260: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1270: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1280: 20 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29    return (((int)
1290: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
12a0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
12b0: 66 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66  ff))<<8)+(jumpIf
12c0: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Null?1:0);.}../*
12d0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
12e0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
12f0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1300: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1310: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1320: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1330: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1340: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1350: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1360: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1370: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1380: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1390: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
13a0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
13b0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
13c0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
13d0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
13e0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
13f0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1400: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1410: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1420: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1430: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
1440: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
1450: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1460: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1470: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1480: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
1490: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
14a0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
14b0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
14c0: 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29  ;.  if( !pColl )
14d0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
14e0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
14f0: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1500: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1510: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  Coll;.}../*.** C
1520: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1530: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
1540: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
1550: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
1560: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
1570: 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ode is obtained 
1580: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
1590: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
15a0: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
15b0: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
15c0: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
15d0: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
15e0: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a   gets freed..*/.
15f0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1600: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
1610: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1620: 67 68 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ght, Token *pTok
1630: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
1640: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
1650: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
1660: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
1670: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
1680: 2a 20 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  * When malloc fa
1690: 69 6c 73 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d  ils, we leak mem
16a0: 6f 72 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61  ory from pLeft a
16b0: 6e 64 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20  nd pRight */.   
16c0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
16d0: 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a   pNew->op = op;.
16e0: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
16f0: 70 4c 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70  pLeft;.  pNew->p
1700: 52 69 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a  Right = pRight;.
1710: 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a    if( pToken ){.
1720: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b      assert( pTok
1730: 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  en->dyn==0 );.  
1740: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20 3d 20    pNew->token = 
1750: 2a 70 54 6f 6b 65 6e 3b 0a 20 20 20 20 70 4e 65  *pToken;.    pNe
1760: 77 2d 3e 73 70 61 6e 20 3d 20 2a 70 54 6f 6b 65  w->span = *pToke
1770: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
1780: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
1790: 6b 65 6e 2e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20  ken.dyn==0 );.  
17a0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
17b0: 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20  token.z==0 );.  
17c0: 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e    assert( pNew->
17d0: 74 6f 6b 65 6e 2e 6e 3d 3d 30 20 29 3b 0a 20 20  token.n==0 );.  
17e0: 20 20 69 66 28 20 70 4c 65 66 74 20 26 26 20 70    if( pLeft && p
17f0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 73  Right ){.      s
1800: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
1810: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
1820: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
1830: 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  );.    }else{.  
1840: 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d      pNew->span =
1850: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20   pNew->token;.  
1860: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
1870: 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   pNew;.}../*.** 
1880: 53 65 74 20 74 68 65 20 45 78 70 72 2e 73 70 61  Set the Expr.spa
1890: 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65 20 67  n field of the g
18a0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
18b0: 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a 20 74  to span all.** t
18c0: 65 78 74 20 62 65 74 77 65 65 6e 20 74 68 65 20  ext between the 
18d0: 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65 6e 73  two given tokens
18e0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
18f0: 33 45 78 70 72 53 70 61 6e 28 45 78 70 72 20 2a  3ExprSpan(Expr *
1900: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4c  pExpr, Token *pL
1910: 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52 69 67  eft, Token *pRig
1920: 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70  ht){.  assert( p
1930: 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20 61 73  Right!=0 );.  as
1940: 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30 20 29  sert( pLeft!=0 )
1950: 3b 0a 20 20 2f 2a 20 4e 6f 74 65 3a 20 70 45 78  ;.  /* Note: pEx
1960: 70 72 20 6d 69 67 68 74 20 62 65 20 4e 55 4c 4c  pr might be NULL
1970: 20 64 75 65 20 74 6f 20 61 20 70 72 69 6f 72 20   due to a prior 
1980: 6d 61 6c 6c 6f 63 20 66 61 69 6c 75 72 65 20 2a  malloc failure *
1990: 2f 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  /.  if( pExpr &&
19a0: 20 70 52 69 67 68 74 2d 3e 7a 20 26 26 20 70 4c   pRight->z && pL
19b0: 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20 20 69 66  eft->z ){.    if
19c0: 28 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20  ( pLeft->dyn==0 
19d0: 26 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d  && pRight->dyn==
19e0: 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  0 ){.      pExpr
19f0: 2d 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74  ->span.z = pLeft
1a00: 2d 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72  ->z;.      pExpr
1a10: 2d 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68  ->span.n = pRigh
1a20: 74 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67  t->n + Addr(pRig
1a30: 68 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c  ht->z) - Addr(pL
1a40: 65 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c  eft->z);.    }el
1a50: 73 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  se{.      pExpr-
1a60: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20  >span.z = 0;.   
1a70: 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20   }.  }.}../*.** 
1a80: 43 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20  Construct a new 
1a90: 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20  expression node 
1aa0: 66 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  for a function w
1ab0: 69 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20  ith multiple.** 
1ac0: 61 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78  arguments..*/.Ex
1ad0: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46  pr *sqlite3ExprF
1ae0: 75 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74  unction(ExprList
1af0: 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a   *pList, Token *
1b00: 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20  pToken){.  Expr 
1b10: 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20  *pNew;.  pNew = 
1b20: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
1b30: 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20  zeof(Expr) );.  
1b40: 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20  if( pNew==0 ){. 
1b50: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70     /* sqlite3Exp
1b60: 72 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73  rListDelete(pLis
1b70: 74 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73  t); // Leak pLis
1b80: 74 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61  t when malloc fa
1b90: 69 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ils */.    retur
1ba0: 6e 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  n 0;.  }.  pNew-
1bb0: 3e 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f  >op = TK_FUNCTIO
1bc0: 4e 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  N;.  pNew->pList
1bd0: 20 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20   = pList;.  if( 
1be0: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73  pToken ){.    as
1bf0: 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79  sert( pToken->dy
1c00: 6e 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77  n==0 );.    pNew
1c10: 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65  ->token = *pToke
1c20: 6e 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  n;.  }else{.    
1c30: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20  pNew->token.z = 
1c40: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73  0;.  }.  pNew->s
1c50: 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65  pan = pNew->toke
1c60: 6e 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  n;.  return pNew
1c70: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72  ;.}../*.** Recur
1c80: 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e  sively delete an
1c90: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
1ca0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
1cb0: 33 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72  3ExprDelete(Expr
1cc0: 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30   *p){.  if( p==0
1cd0: 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28   ) return;.  if(
1ce0: 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73   p->span.dyn ) s
1cf0: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
1d00: 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69  )p->span.z);.  i
1d10: 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20  f( p->token.dyn 
1d20: 29 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68  ) sqliteFree((ch
1d30: 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b  ar*)p->token.z);
1d40: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  .  sqlite3ExprDe
1d50: 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a  lete(p->pLeft);.
1d60: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
1d70: 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a  ete(p->pRight);.
1d80: 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73    sqlite3ExprLis
1d90: 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74  tDelete(p->pList
1da0: 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65  );.  sqlite3Sele
1db0: 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c  ctDelete(p->pSel
1dc0: 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ect);.  sqliteFr
1dd0: 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a  ee(p);.}.../*.**
1de0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67   The following g
1df0: 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73  roup of routines
1e00: 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65   make deep copie
1e10: 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  s of expressions
1e20: 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20  ,.** expression 
1e30: 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c  lists, ID lists,
1e40: 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74   and select stat
1e50: 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70  ements.  The cop
1e60: 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65  ies can.** be de
1e70: 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20  leted (by being 
1e80: 70 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20  passed to their 
1e90: 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65  respective ...De
1ea0: 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29  lete() routines)
1eb0: 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65  .** without effe
1ec0: 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e  cting the origin
1ed0: 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65  als..**.** The e
1ee0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20  xpression list, 
1ef0: 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c  ID, and source l
1f00: 69 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73  ists return by s
1f10: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
1f20: 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49  p(),.** sqlite3I
1f30: 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20  dListDup(), and 
1f40: 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75  sqlite3SrcListDu
1f50: 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66  p() can not be f
1f60: 75 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20  urther expanded 
1f70: 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e  .** by subsequen
1f80: 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74  t calls to sqlit
1f90: 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72  e*ListAppend() r
1fa0: 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41  outines..**.** A
1fb0: 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74  ny tables that t
1fc0: 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74  he SrcList might
1fd0: 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f   point to are no
1fe0: 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f  t duplicated..*/
1ff0: 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78  .Expr *sqlite3Ex
2000: 70 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a  prDup(Expr *p){.
2010: 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20    Expr *pNew;.  
2020: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
2030: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
2040: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
2050: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
2060: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
2070: 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28  urn 0;.  memcpy(
2080: 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28  pNew, p, sizeof(
2090: 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70  *pNew));.  if( p
20a0: 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a  ->token.z!=0 ){.
20b0: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e      pNew->token.
20c0: 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  z = sqliteStrDup
20d0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a 20 20  (p->token.z);.  
20e0: 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79    pNew->token.dy
20f0: 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a  n = 1;.  }else{.
2100: 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77      assert( pNew
2110: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a  ->token.z==0 );.
2120: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e    }.  pNew->span
2130: 2e 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e  .z = 0;.  pNew->
2140: 70 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45  pLeft = sqlite3E
2150: 78 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29  xprDup(p->pLeft)
2160: 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74  ;.  pNew->pRight
2170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2180: 70 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  p(p->pRight);.  
2190: 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71  pNew->pList = sq
21a0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
21b0: 28 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e  (p->pList);.  pN
21c0: 65 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  ew->pSelect = sq
21d0: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
21e0: 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 72 65  ->pSelect);.  re
21f0: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69  turn pNew;.}.voi
2200: 64 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f  d sqlite3TokenCo
2210: 70 79 28 54 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54  py(Token *pTo, T
2220: 6f 6b 65 6e 20 2a 70 46 72 6f 6d 29 7b 0a 20 20  oken *pFrom){.  
2230: 69 66 28 20 70 54 6f 2d 3e 64 79 6e 20 29 20 73  if( pTo->dyn ) s
2240: 71 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a  qliteFree((char*
2250: 29 70 54 6f 2d 3e 7a 29 3b 0a 20 20 69 66 28 20  )pTo->z);.  if( 
2260: 70 46 72 6f 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20  pFrom->z ){.    
2270: 70 54 6f 2d 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e  pTo->n = pFrom->
2280: 6e 3b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  n;.    pTo->z = 
2290: 73 71 6c 69 74 65 53 74 72 4e 44 75 70 28 70 46  sqliteStrNDup(pF
22a0: 72 6f 6d 2d 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e  rom->z, pFrom->n
22b0: 29 3b 0a 20 20 20 20 70 54 6f 2d 3e 64 79 6e 20  );.    pTo->dyn 
22c0: 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20  = 1;.  }else{.  
22d0: 20 20 70 54 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20    pTo->z = 0;.  
22e0: 7d 0a 7d 0a 45 78 70 72 4c 69 73 74 20 2a 73 71  }.}.ExprList *sq
22f0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2300: 28 45 78 70 72 4c 69 73 74 20 2a 70 29 7b 0a 20  (ExprList *p){. 
2310: 20 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b   ExprList *pNew;
2320: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
2330: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
2340: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2350: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2360: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
2370: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
2380: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
2390: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
23a0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
23b0: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
23c0: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
23d0: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
23e0: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
23f0: 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nExpr*sizeof(p->
2400: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
2410: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
2420: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
2430: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2440: 20 7d 20 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   } .  for(i=0; i
2450: 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20  <p->nExpr; i++, 
2460: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78  pItem++){.    Ex
2470: 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70  pr *pNewExpr, *p
2480: 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74  OldExpr;.    pIt
2490: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77  em->pExpr = pNew
24a0: 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78  Expr = sqlite3Ex
24b0: 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d  prDup(pOldExpr =
24c0: 20 70 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b   p->a[i].pExpr);
24d0: 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78 70  .    if( pOldExp
24e0: 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26 20  r->span.z!=0 && 
24f0: 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20 20  pNewExpr ){.    
2500: 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b 65    /* Always make
2510: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 73   a copy of the s
2520: 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76 65  pan for top-leve
2530: 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69 6e  l expressions in
2540: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78   the.      ** ex
2550: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
2560: 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45 4c  The logic in SEL
2570: 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20 74  ECT processing t
2580: 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a 20  hat determines. 
2590: 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d 65       ** the name
25a0: 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e 20  s of columns in 
25b0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 6e  the result set n
25c0: 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72 6d  eeds this inform
25d0: 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 73  ation */.      s
25e0: 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28  qlite3TokenCopy(
25f0: 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e 2c  &pNewExpr->span,
2600: 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e   &pOldExpr->span
2610: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  );.    }.    ass
2620: 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d 30  ert( pNewExpr==0
2630: 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73 70   || pNewExpr->sp
2640: 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20 20  an.z!=0 .       
2650: 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70 72       || pOldExpr
2660: 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20 73  ->span.z==0 || s
2670: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
2680: 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74 65  iled );.    pIte
2690: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
26a0: 65 53 74 72 44 75 70 28 70 2d 3e 61 5b 69 5d 2e  eStrDup(p->a[i].
26b0: 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 49 74 65  zName);.    pIte
26c0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20 3d 20 70  m->sortOrder = p
26d0: 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65 72  ->a[i].sortOrder
26e0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 69 73 41  ;.    pItem->isA
26f0: 67 67 20 3d 20 70 2d 3e 61 5b 69 5d 2e 69 73 41  gg = p->a[i].isA
2700: 67 67 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64  gg;.    pItem->d
2710: 6f 6e 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72  one = 0;.  }.  r
2720: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 72  eturn pNew;.}.Sr
2730: 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 53 72  cList *sqlite3Sr
2740: 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69 73 74  cListDup(SrcList
2750: 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73 74 20   *p){.  SrcList 
2760: 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a  *pNew;.  int i;.
2770: 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69    int nByte;.  i
2780: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
2790: 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20 73 69   0;.  nByte = si
27a0: 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e  zeof(*p) + (p->n
27b0: 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70  Src>0 ? sizeof(p
27c0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53  ->a[0]) * (p->nS
27d0: 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e  rc-1) : 0);.  pN
27e0: 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  ew = sqliteMallo
27f0: 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b 0a 20  cRaw( nByte );. 
2800: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
2810: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
2820: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
2830: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
2840: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
2850: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
2860: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
2870: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
2880: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
2890: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
28a0: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
28b0: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
28c0: 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  NewItem->zDataba
28d0: 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  se = sqliteStrDu
28e0: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74  p(pOldItem->zDat
28f0: 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e 65 77  abase);.    pNew
2900: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
2910: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
2920: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
2930: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61   pNewItem->zAlia
2940: 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70  s = sqliteStrDup
2950: 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61  (pOldItem->zAlia
2960: 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  s);.    pNewItem
2970: 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c  ->jointype = pOl
2980: 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b  dItem->jointype;
2990: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
29a0: 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65  Cursor = pOldIte
29b0: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
29c0: 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d  pNewItem->pTab =
29d0: 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d   0;.    pNewItem
29e0: 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69  ->pSelect = sqli
29f0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f 6c  te3SelectDup(pOl
2a00: 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29 3b  dItem->pSelect);
2a10: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70  .    pNewItem->p
2a20: 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  On = sqlite3Expr
2a30: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 4f  Dup(pOldItem->pO
2a40: 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  n);.    pNewItem
2a50: 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69 74  ->pUsing = sqlit
2a60: 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c 64  e3IdListDup(pOld
2a70: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
2a80: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
2a90: 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69  ;.}.IdList *sqli
2aa0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 49 64 4c  te3IdListDup(IdL
2ab0: 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73  ist *p){.  IdLis
2ac0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
2ad0: 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  ;.  if( p==0 ) r
2ae0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20  eturn 0;.  pNew 
2af0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
2b00: 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29  w( sizeof(*pNew)
2b10: 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d   );.  if( pNew==
2b20: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
2b30: 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77  pNew->nId = pNew
2b40: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49  ->nAlloc = p->nI
2b50: 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73  d;.  pNew->a = s
2b60: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
2b70: 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d  p->nId*sizeof(p-
2b80: 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20  >a[0]) );.  if( 
2b90: 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74  pNew->a==0 ) ret
2ba0: 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30  urn 0;.  for(i=0
2bb0: 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29  ; i<p->nId; i++)
2bc0: 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  {.    struct IdL
2bd0: 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74  ist_item *pNewIt
2be0: 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d  em = &pNew->a[i]
2bf0: 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49 64 4c  ;.    struct IdL
2c00: 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74  ist_item *pOldIt
2c10: 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20  em = &p->a[i];. 
2c20: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
2c30: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
2c40: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
2c50: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
2c60: 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d  ->idx = pOldItem
2c70: 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74  ->idx;.  }.  ret
2c80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65  urn pNew;.}.Sele
2c90: 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63  ct *sqlite3Selec
2ca0: 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29 7b  tDup(Select *p){
2cb0: 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b  .  Select *pNew;
2cc0: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2cd0: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
2ce0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
2cf0: 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a  ( sizeof(*p) );.
2d00: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
2d10: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
2d20: 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d 20 70  ->isDistinct = p
2d30: 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a 20 20  ->isDistinct;.  
2d40: 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73  pNew->pEList = s
2d50: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
2d60: 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20  p(p->pEList);.  
2d70: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
2d80: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 70  ite3SrcListDup(p
2d90: 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d  ->pSrc);.  pNew-
2da0: 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69 74 65  >pWhere = sqlite
2db0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57 68 65  3ExprDup(p->pWhe
2dc0: 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72  re);.  pNew->pGr
2dd0: 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65 33 45  oupBy = sqlite3E
2de0: 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 47  xprListDup(p->pG
2df0: 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d  roupBy);.  pNew-
2e00: 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69 74  >pHaving = sqlit
2e10: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 48 61  e3ExprDup(p->pHa
2e20: 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  ving);.  pNew->p
2e30: 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69 74 65  OrderBy = sqlite
2e40: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
2e50: 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70 4e 65  pOrderBy);.  pNe
2e60: 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20  w->op = p->op;. 
2e70: 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20   pNew->pPrior = 
2e80: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
2e90: 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70  (p->pPrior);.  p
2ea0: 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20 70 2d  New->nLimit = p-
2eb0: 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65 77 2d  >nLimit;.  pNew-
2ec0: 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e 6e 4f  >nOffset = p->nO
2ed0: 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d 3e 7a  ffset;.  pNew->z
2ee0: 53 65 6c 65 63 74 20 3d 20 30 3b 0a 20 20 70 4e  Select = 0;.  pN
2ef0: 65 77 2d 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b  ew->iLimit = -1;
2f00: 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74  .  pNew->iOffset
2f10: 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 70   = -1;.  pNew->p
2f20: 70 4f 70 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20  pOpenTemp = 0;. 
2f30: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
2f40: 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65  ../*.** Add a ne
2f50: 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65  w element to the
2f60: 20 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65   end of an expre
2f70: 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20  ssion list.  If 
2f80: 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74  pList is.** init
2f90: 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e  ially NULL, then
2fa0: 20 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78   create a new ex
2fb0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a  pression list..*
2fc0: 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69  /.ExprList *sqli
2fd0: 74 65 33 45 78 70 72 4c 69 73 74 41 70 70 65 6e  te3ExprListAppen
2fe0: 64 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73  d(ExprList *pLis
2ff0: 74 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  t, Expr *pExpr, 
3000: 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29 7b 0a 20  Token *pName){. 
3010: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
3020: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
3030: 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f  iteMalloc( sizeo
3040: 66 28 45 78 70 72 4c 69 73 74 29 20 29 3b 0a 20  f(ExprList) );. 
3050: 20 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20     if( pList==0 
3060: 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69  ){.      /* sqli
3070: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45  te3ExprDelete(pE
3080: 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65  xpr); // Leak me
3090: 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66  mory if malloc f
30a0: 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 72 65  ails */.      re
30b0: 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a 20 20  turn 0;.    }.  
30c0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
30d0: 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b 0a 20 20  >nAlloc==0 );.  
30e0: 7d 0a 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e  }.  if( pList->n
30f0: 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d 3e 6e 45  Alloc<=pList->nE
3100: 78 70 72 20 29 7b 0a 20 20 20 20 70 4c 69 73 74  xpr ){.    pList
3110: 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c 69 73 74  ->nAlloc = pList
3120: 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20 34 3b 0a  ->nAlloc*2 + 4;.
3130: 20 20 20 20 70 4c 69 73 74 2d 3e 61 20 3d 20 73      pList->a = s
3140: 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 4c 69  qliteRealloc(pLi
3150: 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d 3e 6e 41  st->a, pList->nA
3160: 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 4c 69 73  lloc*sizeof(pLis
3170: 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20 20 20 69  t->a[0]));.    i
3180: 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d 30 20 29  f( pList->a==0 )
3190: 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71 6c 69 74  {.      /* sqlit
31a0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
31b0: 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d  pr); // Leak mem
31c0: 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61  ory if malloc fa
31d0: 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20 70 4c 69  ils */.      pLi
31e0: 73 74 2d 3e 6e 45 78 70 72 20 3d 20 70 4c 69 73  st->nExpr = pLis
31f0: 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30 3b 0a 20  t->nAlloc = 0;. 
3200: 20 20 20 20 20 72 65 74 75 72 6e 20 70 4c 69 73       return pLis
3210: 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 61  t;.    }.  }.  a
3220: 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21  ssert( pList->a!
3230: 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 45 78 70  =0 );.  if( pExp
3240: 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b 0a 20 20  r || pName ){.  
3250: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
3260: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
3270: 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69 73 74 2d  &pList->a[pList-
3280: 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20 20 20 6d  >nExpr++];.    m
3290: 65 6d 73 65 74 28 70 49 74 65 6d 2c 20 30 2c 20  emset(pItem, 0, 
32a0: 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d 29 29 3b  sizeof(*pItem));
32b0: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
32c0: 72 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 70  r = pExpr;.    p
32d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
32e0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
32f0: 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20  en(pName);.  }. 
3300: 20 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 7d   return pList;.}
3310: 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20 61  ../*.** Delete a
3320: 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73 73  n entire express
3330: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f 69  ion list..*/.voi
3340: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
3350: 74 44 65 6c 65 74 65 28 45 78 70 72 4c 69 73 74  tDelete(ExprList
3360: 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20   *pList){.  int 
3370: 69 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d  i;.  if( pList==
3380: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
3390: 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d  sert( pList->a!=
33a0: 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e 45 78  0 || (pList->nEx
33b0: 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74 2d 3e  pr==0 && pList->
33c0: 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a 20 20  nAlloc==0) );.  
33d0: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
33e0: 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e 41 6c  Expr<=pList->nAl
33f0: 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 69 3d 30  loc );.  for(i=0
3400: 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
3410: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  ; i++){.    sqli
3420: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 4c  te3ExprDelete(pL
3430: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
3440: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
3450: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a 4e 61  (pList->a[i].zNa
3460: 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  me);.  }.  sqlit
3470: 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29 3b  eFree(pList->a);
3480: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
3490: 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ist);.}../*.** W
34a0: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
34b0: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
34c0: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
34d0: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
34e0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
34f0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
3500: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
3510: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
3520: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
3530: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
3540: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
3550: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
3560: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
3570: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
3580: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
3590: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
35a0: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
35b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
35c0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 73 77 69  (Expr *p){.  swi
35d0: 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20  tch( p->op ){.  
35e0: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
35f0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
3600: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
3610: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  T:.    case TK_F
3620: 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 20 20 72  UNCTION:.      r
3630: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 63 61 73  eturn 0;.    cas
3640: 65 20 54 4b 5f 4e 55 4c 4c 3a 0a 20 20 20 20 63  e TK_NULL:.    c
3650: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 0a 20  ase TK_STRING:. 
3660: 20 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a     case TK_BLOB:
3670: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
3680: 45 47 45 52 3a 0a 20 20 20 20 63 61 73 65 20 54  EGER:.    case T
3690: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
36a0: 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20  e TK_VARIABLE:. 
36b0: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
36c0: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
36d0: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 65 66 74      if( p->pLeft
36e0: 20 26 26 20 21 73 71 6c 69 74 65 33 45 78 70 72   && !sqlite3Expr
36f0: 49 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c  IsConstant(p->pL
3700: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
3710: 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e 70 52  .      if( p->pR
3720: 69 67 68 74 20 26 26 20 21 73 71 6c 69 74 65 33  ight && !sqlite3
3730: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
3740: 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74 75  ->pRight) ) retu
3750: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
3760: 70 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20  p->pList ){.    
3770: 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20      int i;.     
3780: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d     for(i=0; i<p-
3790: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
37a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69  ++){.          i
37b0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 49  f( !sqlite3ExprI
37c0: 73 43 6f 6e 73 74 61 6e 74 28 70 2d 3e 70 4c 69  sConstant(p->pLi
37d0: 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20  st->a[i].pExpr) 
37e0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20  ) return 0;.    
37f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
3800: 20 20 20 20 72 65 74 75 72 6e 20 70 2d 3e 70 4c      return p->pL
3810: 65 66 74 21 3d 30 20 7c 7c 20 70 2d 3e 70 52 69  eft!=0 || p->pRi
3820: 67 68 74 21 3d 30 20 7c 7c 20 28 70 2d 3e 70 4c  ght!=0 || (p->pL
3830: 69 73 74 20 26 26 20 70 2d 3e 70 4c 69 73 74 2d  ist && p->pList-
3840: 3e 6e 45 78 70 72 3e 30 29 3b 0a 20 20 20 20 7d  >nExpr>0);.    }
3850: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3860: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
3870: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
3880: 6e 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61  n codes a consta
3890: 6e 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20  nt integer that 
38a0: 69 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a  is small enough.
38b0: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33  ** to fit in a 3
38c0: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
38d0: 65 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20  eturn 1 and put 
38e0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65  the value of the
38f0: 20 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a   integer.** in *
3900: 70 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20  pValue.  If the 
3910: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f  expression is no
3920: 74 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20  t an integer or 
3930: 69 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67  if it is too big
3940: 0a 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20  .** to fit in a 
3950: 73 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e  signed 32-bit in
3960: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20  teger, return 0 
3970: 61 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75  and leave *pValu
3980: 65 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a  e unchanged..*/.
3990: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49  int sqlite3ExprI
39a0: 73 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70  sInteger(Expr *p
39b0: 2c 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a  , int *pValue){.
39c0: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
39d0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
39e0: 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20  NTEGER: {.      
39f0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
3a00: 74 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  t32(p->token.z, 
3a10: 70 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20  pValue) ){.     
3a20: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
3a30: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
3a40: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
3a50: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
3a60: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
3a70: 7a 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  z = p->token.z;.
3a80: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 2d        int n = p-
3a90: 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20  >token.n;.      
3aa0: 69 66 28 20 6e 3e 30 20 26 26 20 7a 5b 30 5d 3d  if( n>0 && z[0]=
3ab0: 3d 27 2d 27 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d  ='-' ){ z++; n--
3ac0: 3b 20 7d 0a 20 20 20 20 20 20 77 68 69 6c 65 28  ; }.      while(
3ad0: 20 6e 3e 30 20 26 26 20 2a 7a 20 26 26 20 69 73   n>0 && *z && is
3ae0: 64 69 67 69 74 28 2a 7a 29 20 29 7b 20 7a 2b 2b  digit(*z) ){ z++
3af0: 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20 20 20 69  ; n--; }.      i
3b00: 66 28 20 6e 3d 3d 30 20 26 26 20 73 71 6c 69 74  f( n==0 && sqlit
3b10: 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f  e3GetInt32(p->to
3b20: 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29  ken.z, pValue) )
3b30: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
3b40: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
3b50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
3b60: 20 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53     case TK_UPLUS
3b70: 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  : {.      return
3b80: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
3b90: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
3ba0: 70 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20  pValue);.    }. 
3bb0: 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55     case TK_UMINU
3bc0: 53 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76  S: {.      int v
3bd0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
3be0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
3bf0: 28 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29  (p->pLeft, &v) )
3c00: 7b 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75  {.        *pValu
3c10: 65 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20  e = -v;.        
3c20: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
3c30: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
3c40: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
3c50: 3a 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72  : break;.  }.  r
3c60: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3c70: 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66  * Return TRUE if
3c80: 20 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e   the given strin
3c90: 67 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f  g is a row-id co
3ca0: 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e  lumn name..*/.in
3cb0: 74 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64  t sqlite3IsRowid
3cc0: 28 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b  (const char *z){
3cd0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74  .  if( sqlite3St
3ce0: 72 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44  rICmp(z, "_ROWID
3cf0: 5f 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  _")==0 ) return 
3d00: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
3d10: 53 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49  StrICmp(z, "ROWI
3d20: 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  D")==0 ) return 
3d30: 31 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33  1;.  if( sqlite3
3d40: 53 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22  StrICmp(z, "OID"
3d50: 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b  )==0 ) return 1;
3d60: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
3d70: 2f 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20  /*.** Given the 
3d80: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
3d90: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59   of the form X.Y
3da0: 2e 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73  .Z or Y.Z or jus
3db0: 74 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20  t Z, look up.** 
3dc0: 74 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65  that name in the
3dd0: 20 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74   set of source t
3de0: 61 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73  ables in pSrcLis
3df0: 74 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70  t and make the p
3e00: 45 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73  Expr .** express
3e10: 69 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62  ion node refer b
3e20: 61 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72  ack to that sour
3e30: 63 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  ce column.  The 
3e40: 66 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65  following change
3e50: 73 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f  s.** are made to
3e60: 20 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20   pExpr:.**.**   
3e70: 20 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20   pExpr->iDb     
3e80: 20 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e        Set the in
3e90: 64 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d  dex in db->aDb[]
3ea0: 20 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65   of the database
3eb0: 20 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20   holding.**     
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3ed0: 20 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a      the table..*
3ee0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62  *    pExpr->iTab
3ef0: 6c 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f  le        Set to
3f00: 20 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62   the cursor numb
3f10: 65 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65  er for the table
3f20: 20 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20   obtained.**    
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
3f40: 20 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69       from pSrcLi
3f50: 73 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  st..**    pExpr-
3f60: 3e 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53  >iColumn       S
3f70: 65 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e  et to the column
3f80: 20 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74   number within t
3f90: 68 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20  he table..**    
3fa0: 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20  pExpr->op       
3fb0: 20 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43       Set to TK_C
3fc0: 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78  OLUMN..**    pEx
3fd0: 70 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20  pr->pLeft       
3fe0: 20 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e    Any expression
3ff0: 20 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20   this points to 
4000: 69 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20  is deleted.**   
4010: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20   pExpr->pRight  
4020: 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73        Any expres
4030: 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73  sion this points
4040: 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a   to is deleted..
4050: 2a 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b  **.** The pDbTok
4060: 65 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f  en is the name o
4070: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28  f the database (
4080: 74 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20  the "X").  This 
4090: 76 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20  value may be.** 
40a0: 4e 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61  NULL meaning tha
40b0: 74 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65  t name is of the
40c0: 20 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20   form Y.Z or Z. 
40d0: 20 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64   Any available d
40e0: 61 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62  atabase.** can b
40f0: 65 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61  e used.  The pTa
4100: 62 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20  bleToken is the 
4110: 6e 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c  name of the tabl
4120: 65 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68  e (the "Y").  Th
4130: 69 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20  is.** value can 
4140: 62 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f  be NULL if pDbTo
4150: 6b 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c  ken is also NULL
4160: 2e 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65  .  If pTableToke
4170: 6e 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20  n is NULL it.** 
4180: 6d 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66  means that the f
4190: 6f 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20  orm of the name 
41a0: 69 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f  is Z and that co
41b0: 6c 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74  lumns from any t
41c0: 61 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75  able.** can be u
41d0: 73 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68  sed..**.** If th
41e0: 65 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65  e name cannot be
41f0: 20 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69   resolved unambi
4200: 67 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61  guously, leave a
4210: 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a  n error message.
4220: 2a 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64  ** in pParse and
4230: 20 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f   return non-zero
4240: 2e 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f  .  Return zero o
4250: 6e 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74  n success..*/.st
4260: 61 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e  atic int lookupN
4270: 61 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ame(.  Parse *pP
4280: 61 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68  arse,      /* Th
4290: 65 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78  e parsing contex
42a0: 74 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44  t */.  Token *pD
42b0: 62 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e  bToken,     /* N
42c0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
42d0: 61 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74  ase containing t
42e0: 61 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f  able, or NULL */
42f0: 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65  .  Token *pTable
4300: 54 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20  Token,  /* Name 
4310: 6f 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e  of table contain
4320: 69 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e  ing column, or N
4330: 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a  ULL */.  Token *
4340: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a  pColumnToken, /*
4350: 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c   Name of the col
4360: 75 6d 6e 2e 20 2a 2f 0a 20 20 53 72 63 4c 69 73  umn. */.  SrcLis
4370: 74 20 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 2f  t *pSrcList,   /
4380: 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c 65 73  * List of tables
4390: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
43a0: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f   column names */
43b0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
43c0: 69 73 74 2c 20 20 20 20 2f 2a 20 4c 69 73 74 20  ist,    /* List 
43d0: 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 20 75  of expressions u
43e0: 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 22  sed to resolve "
43f0: 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  AS" */.  Expr *p
4400: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
4410: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
4420: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
4430: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
4440: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  n */.){.  char *
4450: 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  zDb = 0;       /
4460: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
4470: 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22  tabase.  The "X"
4480: 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63   in X.Y.Z */.  c
4490: 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
44a0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
44b0: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22  he table.  The "
44c0: 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59  Y" in X.Y.Z or Y
44d0: 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  .Z */.  char *zC
44e0: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
44f0: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
4500: 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a  mn.  The "Z" */.
4510: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
4520: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
4530: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
4540: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
4550: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
4560: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
4570: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
4580: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  tTab = 0;      /
4590: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
45a0: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
45b0: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 20 2a 64 62   */.  sqlite *db
45c0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20   = pParse->db;  
45d0: 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65 20  /* The database 
45e0: 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28 20 70 43  */..  assert( pC
45f0: 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26 20 70 43  olumnToken && pC
4600: 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b  olumnToken->z );
4610: 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20 58 2e 59   /* The Z in X.Y
4620: 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20 4e 55 4c  .Z cannot be NUL
4630: 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20 73 71 6c  L */.  zDb = sql
4640: 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65  ite3NameFromToke
4650: 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a  n(pDbToken);.  z
4660: 54 61 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  Tab = sqlite3Nam
4670: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54 61 62 6c  eFromToken(pTabl
4680: 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20  eToken);.  zCol 
4690: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
46a0: 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f  mToken(pColumnTo
46b0: 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73 71 6c 69  ken);.  if( sqli
46c0: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
46d0: 64 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  d ){.    return 
46e0: 31 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f  1;  /* Leak memo
46f0: 72 79 20 28 7a 44 62 20 61 6e 64 20 7a 54 61 62  ry (zDb and zTab
4700: 29 20 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  ) if malloc fail
4710: 73 20 2a 2f 0a 20 20 7d 0a 20 20 61 73 73 65 72  s */.  }.  asser
4720: 74 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45  t( zTab==0 || pE
4730: 4c 69 73 74 3d 3d 30 20 29 3b 0a 0a 20 20 70 45  List==0 );..  pE
4740: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31  xpr->iTable = -1
4750: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
4760: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
4770: 2b 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  ++){.    struct 
4780: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  SrcList_item *pI
4790: 74 65 6d 20 3d 20 26 70 53 72 63 4c 69 73 74 2d  tem = &pSrcList-
47a0: 3e 61 5b 69 5d 3b 0a 20 20 20 20 54 61 62 6c 65  >a[i];.    Table
47b0: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
47c0: 70 54 61 62 3b 0a 20 20 20 20 43 6f 6c 75 6d 6e  pTab;.    Column
47d0: 20 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 69 66 28   *pCol;..    if(
47e0: 20 70 54 61 62 3d 3d 30 20 29 20 63 6f 6e 74 69   pTab==0 ) conti
47f0: 6e 75 65 3b 0a 20 20 20 20 61 73 73 65 72 74 28  nue;.    assert(
4800: 20 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b   pTab->nCol>0 );
4810: 0a 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b  .    if( zTab ){
4820: 0a 20 20 20 20 20 20 69 66 28 20 70 49 74 65 6d  .      if( pItem
4830: 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a 20 20 20 20  ->zAlias ){.    
4840: 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61      char *zTabNa
4850: 6d 65 20 3d 20 70 49 74 65 6d 2d 3e 7a 41 6c 69  me = pItem->zAli
4860: 61 73 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  as;.        if( 
4870: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
4880: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
4890: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
48a0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
48b0: 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d     char *zTabNam
48c0: 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d 65 3b  e = pTab->zName;
48d0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61  .        if( zTa
48e0: 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20 73 71 6c 69  bName==0 || sqli
48f0: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
4900: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
4910: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
4920: 20 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20    if( zDb!=0 && 
4930: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64  sqlite3StrICmp(d
4940: 62 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62  b->aDb[pTab->iDb
4950: 5d 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30  ].zName, zDb)!=0
4960: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f   ){.          co
4970: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
4980: 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  }.      }.    }.
4990: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
49a0: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 70  ab++) ){.      p
49b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
49c0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
49d0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20       pExpr->iDb 
49e0: 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20  = pTab->iDb;.   
49f0: 20 7d 0a 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20   }.    for(j=0, 
4a00: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
4a10: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
4a20: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
4a30: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
4a40: 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d  rICmp(pCol->zNam
4a50: 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20  e, zCol)==0 ){. 
4a60: 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20         cnt++;.  
4a70: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
4a80: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
4a90: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 70 45  rsor;.        pE
4aa0: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
4ab0: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 2f 2a  >iDb;.        /*
4ac0: 20 53 75 62 73 74 69 74 75 74 65 20 74 68 65 20   Substitute the 
4ad0: 72 6f 77 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31  rowid (column -1
4ae0: 29 20 66 6f 72 20 74 68 65 20 49 4e 54 45 47 45  ) for the INTEGE
4af0: 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f  R PRIMARY KEY */
4b00: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
4b10: 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61  iColumn = j==pTa
4b20: 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20  b->iPKey ? -1 : 
4b30: 6a 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  j;.        pExpr
4b40: 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61  ->affinity = pTa
4b50: 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e  b->aCol[j].affin
4b60: 69 74 79 3b 0a 20 20 20 20 20 20 20 20 70 45 78  ity;.        pEx
4b70: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
4b80: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
4b90: 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
4ba0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20        }.    }.  
4bb0: 7d 0a 0a 20 20 2f 2a 20 49 66 20 77 65 20 68 61  }..  /* If we ha
4bc0: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
4bd0: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
4be0: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
4bf0: 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a  ** it is a new.*
4c00: 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65   or old.* trigge
4c10: 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72  r argument refer
4c20: 65 6e 63 65 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ence.  */.  if( 
4c30: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
4c40: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
4c50: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
4c60: 21 3d 30 20 29 7b 0a 20 20 20 20 54 72 69 67 67  !=0 ){.    Trigg
4c70: 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67 67 65  erStack *pTrigge
4c80: 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73 65 2d  rStack = pParse-
4c90: 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20 20 20  >trigStack;.    
4ca0: 54 61 62 6c 65 20 2a 70 54 61 62 20 3d 20 30 3b  Table *pTab = 0;
4cb0: 0a 20 20 20 20 69 66 28 20 70 54 72 69 67 67 65  .    if( pTrigge
4cc0: 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 20 21  rStack->newIdx !
4cd0: 3d 20 2d 31 20 26 26 20 73 71 6c 69 74 65 33 53  = -1 && sqlite3S
4ce0: 74 72 49 43 6d 70 28 22 6e 65 77 22 2c 20 7a 54  trICmp("new", zT
4cf0: 61 62 29 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20  ab) == 0 ){.    
4d00: 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20    pExpr->iTable 
4d10: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
4d20: 3e 6e 65 77 49 64 78 3b 0a 20 20 20 20 20 20 61  >newIdx;.      a
4d30: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
4d40: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
4d50: 20 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67      pTab = pTrig
4d60: 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a  gerStack->pTab;.
4d70: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54      }else if( pT
4d80: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64  riggerStack->old
4d90: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
4da0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64  ite3StrICmp("old
4db0: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
4dc0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
4dd0: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
4de0: 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20  tack->oldIdx;.  
4df0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
4e00: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
4e10: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
4e20: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
4e30: 54 61 62 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  Tab;.    }..    
4e40: 69 66 28 20 70 54 61 62 20 29 7b 20 0a 20 20 20  if( pTab ){ .   
4e50: 20 20 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20     int j;.      
4e60: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
4e70: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20  Tab->aCol;.     
4e80: 20 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69   .      pExpr->i
4e90: 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a  Db = pTab->iDb;.
4ea0: 20 20 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a        cntTab++;.
4eb0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
4ec0: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   < pTab->nCol; j
4ed0: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
4ee0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
4ef0: 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a  3StrICmp(pCol->z
4f00: 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29  Name, zCol)==0 )
4f10: 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b  {.          cnt+
4f20: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  +;.          pEx
4f30: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
4f40: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
4f50: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
4f60: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
4f70: 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d   = pTab->aCol[j]
4f80: 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  .affinity;.     
4f90: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
4fa0: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
4fb0: 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].pColl;.       
4fc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
4fd0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
4fe0: 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  }.  }..  /*.  **
4ff0: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
5000: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
5010: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
5020: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
5030: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
5040: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
5050: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20  Col) ){.    cnt 
5060: 3d 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  = 1;.    pExpr->
5070: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
5080: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
5090: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
50a0: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f  NTEGER;.  }..  /
50b0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e  *.  ** If the in
50c0: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
50d0: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
50e0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
50f0: 20 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67   name Z.  ** mig
5100: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
5110: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
5120: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
5130: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
5140: 6e 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65  n.  ** we are re
5150: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
5160: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5170: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
5180: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a  ng command:.  **
5190: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
51a0: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
51b0: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
51c0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
51d0: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
51e0: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
51f0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
5200: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
5210: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
5220: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
5230: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
5240: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
5250: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
5260: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
5270: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
5280: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
5290: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
52a0: 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73  dy been.  ** res
52b0: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
52c0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
52d0: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
52e0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
52f0: 30 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29  0 && pEList!=0 )
5300: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
5310: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5320: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
5330: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
5340: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
5350: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
5360: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5370: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
5380: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5390: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
53a0: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
53b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
53c0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
53d0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
53e0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
53f0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
5400: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
5410: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
5420: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
5430: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
5440: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
5450: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
5460: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
5470: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
5480: 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20  }.    } .  }..  
5490: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
54a0: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
54b0: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
54c0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
54d0: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
54e0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
54f0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
5500: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
5510: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
5520: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
5530: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
5540: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
5550: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
5560: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
5570: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
5580: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
5590: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
55a0: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
55b0: 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69   pExpr..  */.  i
55c0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
55d0: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
55e0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
55f0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
5600: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
5610: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
5620: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
5630: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
5640: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
5650: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
5660: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
5670: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
5680: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
5690: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
56a0: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
56b0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
56c0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
56d0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
56e0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
56f0: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
5700: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
5710: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
5720: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
5730: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
5740: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
5750: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
5760: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
5770: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
5780: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
5790: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
57a0: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
57b0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
57c0: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
57d0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
57e0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
57f0: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
5800: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
5810: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
5820: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
5830: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
5840: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
5850: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
5860: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71  Free(zCol);.  sq
5870: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
5880: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
5890: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
58a0: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
58b0: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
58c0: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
58d0: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
58e0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
58f0: 55 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  UMN;.  sqlite3Au
5900: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
5910: 45 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b  Expr, pSrcList);
5920: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31  .  return cnt!=1
5930: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
5940: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
5950: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5960: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
5970: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
5980: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
5990: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
59a0: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
59b0: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
59c0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
59d0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
59e0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
59f0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
5a00: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
5a10: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
5a20: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
5a30: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
5a40: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
5a50: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
5a60: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
5a70: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
5a80: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
5a90: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
5aa0: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
5ab0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
5ac0: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
5ad0: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
5ae0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
5af0: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
5b00: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
5b10: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
5b20: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
5b30: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
5b40: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
5b50: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
5b60: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
5b70: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
5b80: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
5b90: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
5ba0: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
5bb0: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
5bc0: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
5bd0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
5be0: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
5bf0: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
5c00: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63  .**.** We also c
5c10: 68 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63  heck for instanc
5c20: 65 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  es of the IN ope
5c30: 72 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73  rator.  IN comes
5c40: 20 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73   in two.** forms
5c50: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
5c60: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
5c70: 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20  ist).** and.**  
5c80: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
5c90: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
5ca0: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f  .** The first fo
5cb0: 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rm is handled by
5cc0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
5cd0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  holding the list
5ce0: 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76  .** of allowed v
5cf0: 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f  alues.  The seco
5d00: 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74  nd form causes t
5d10: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e  he SELECT to gen
5d20: 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70  erate .** a temp
5d30: 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a  orary table..**.
5d40: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5d50: 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73  also looks for s
5d60: 63 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68  calar SELECTs th
5d70: 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61  at are part of a
5d80: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
5d90: 20 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79   If it finds any
5da0: 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63  , it generates c
5db0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
5dc0: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
5dd0: 65 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20  elect.** into a 
5de0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
5df0: 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d  ** Unknown colum
5e00: 6e 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f  ns or tables pro
5e10: 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20  voke an error.  
5e20: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
5e30: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  urns.** the numb
5e40: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
5e50: 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20  n and leaves an 
5e60: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
5e70: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
5e80: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
5e90: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a  ExprResolveIds(.
5ea0: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
5eb0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
5ec0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
5ed0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
5ee0: 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  t, /* List of ta
5ef0: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73  bles used to res
5f00: 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  olve column name
5f10: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
5f20: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
5f30: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
5f40: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
5f50: 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20   "AS" */.  Expr 
5f60: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a  *pExpr        /*
5f70: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
5f80: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
5f90: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
5fa0: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
5fb0: 7c 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  | pSrcList==0 ) 
5fc0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
5fd0: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
5fe0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
5ff0: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
6000: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e  t->a[i].iCursor>
6010: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  =0 && pSrcList->
6020: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61  a[i].iCursor<pPa
6030: 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d  rse->nTab );.  }
6040: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
6050: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
6060: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
6070: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
6080: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
6090: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
60a0: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
60b0: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
60c0: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
60d0: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
60e0: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
60f0: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
6100: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
6110: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
6120: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
6130: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
6140: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
6150: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
6160: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
6170: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
6180: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
6190: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
61a0: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
61b0: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
61c0: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
61d0: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
61e0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
61f0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
6200: 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65    if( lookupName
6210: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
6220: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53  pExpr->token, pS
6230: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
6240: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6250: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6260: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6270: 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f   .    }.  .    /
6280: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
6290: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
62a0: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
62b0: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
62c0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
62d0: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
62e0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
62f0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
6300: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
6310: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
6320: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
6330: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
6340: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52  Right;..      pR
6350: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6360: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
6370: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
6380: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
6390: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
63a0: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
63b0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
63c0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
63d0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
63e0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
63f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
6400: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
6410: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
6420: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
6430: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
6440: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
6450: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
6460: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
6470: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
6480: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
6490: 20 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70        if( lookup
64a0: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62  Name(pParse, pDb
64b0: 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d  , pTable, pColum
64c0: 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20  n, pSrcList, 0, 
64d0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
64e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
64f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6500: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
6510: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
6520: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
6530: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
6540: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
6550: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79  arse);.      Key
6560: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
6570: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
6580: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
6590: 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  of OP_OpenTemp i
65a0: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
65b0: 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20       if( v==0 ) 
65c0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
65d0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
65e0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
65f0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
6600: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
6610: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
6620: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
6630: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
6640: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
6650: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
6660: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
6670: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
6680: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
6690: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
66a0: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
66b0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
66c0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
66d0: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d   same way. A tem
66e0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20  porary table is 
66f0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
6700: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
6710: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
6720: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
6730: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
6740: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
6750: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
6760: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
6770: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
6780: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
6790: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
67a0: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
67b0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
67c0: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
67d0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
67e0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
67f0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
6800: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
6810: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
6820: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
6830: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
6840: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
6850: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
6860: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
6870: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
6880: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
6890: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
68a0: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
68b0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
68c0: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
68d0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
68e0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
68f0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
6900: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
6910: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
6920: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
6930: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
6940: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
6950: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
6960: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
6970: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
6980: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
6990: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
69a0: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
69b0: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
69c0: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
69d0: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
69e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
69f0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
6a00: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
6a10: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
6a20: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6a30: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
6a40: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
6a50: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
6a60: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
6a70: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
6a80: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
6a90: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
6aa0: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
6ab0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
6ac0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
6ad0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
6ae0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
6af0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
6b00: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
6b10: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
6b20: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
6b30: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
6b40: 20 28 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26   (pExpr->iTable&
6b50: 30 78 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78  0x0000FFFF)==pEx
6b60: 70 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20  pr->iTable );.  
6b70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c        sqlite3Sel
6b80: 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78 70  ect(pParse, pExp
6b90: 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f  r->pSelect, SRT_
6ba0: 53 65 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30  Set, iParm, 0, 0
6bb0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20  , 0, 0);.       
6bc0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
6bd0: 65 63 74 2d 3e 70 45 4c 69 73 74 20 26 26 20 70  ect->pEList && p
6be0: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
6bf0: 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29  EList->nExpr>0 )
6c00: 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b 65 79  { .          key
6c10: 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20  Info.aColl[0] = 
6c20: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  binaryCompareCol
6c30: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78  lSeq(pParse, pEx
6c40: 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20 20 20  pr->pLeft,.     
6c50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6c60: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d  pSelect->pEList-
6c70: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
6c80: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
6c90: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 70  lse if( pExpr->p
6ca0: 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20  List ){.        
6cb0: 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20 20 65  /* Case 2:     e
6cc0: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
6cd0: 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09 2a 2a  ).        **..**
6ce0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
6cf0: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
6d00: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
6d10: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
6d20: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
6d30: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
6d40: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
6d50: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
6d60: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
6d70: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
6d80: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
6d90: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
6da0: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
6db0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
6dc0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
6dd0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
6de0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
6df0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
6e00: 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e 73 74        char const
6e10: 20 2a 61 66 66 53 74 72 3b 0a 20 20 20 20 20 20   *affStr;.      
6e20: 20 20 69 66 28 20 21 61 66 66 69 6e 69 74 79 20    if( !affinity 
6e30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 66 66  ){.          aff
6e40: 69 6e 69 74 79 20 3d 20 53 51 4c 49 54 45 5f 41  inity = SQLITE_A
6e50: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
6e60: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 61 66      }.        af
6e70: 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41 66  fStr = sqlite3Af
6e80: 66 69 6e 69 74 79 53 74 72 69 6e 67 28 61 66 66  finityString(aff
6e90: 69 6e 69 74 79 29 3b 0a 20 20 20 20 20 20 20 20  inity);.        
6ea0: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
6eb0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d   = pExpr->pLeft-
6ec0: 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20 20 20 20 20  >pColl;..       
6ed0: 20 2f 2a 20 4c 6f 6f 70 20 74 68 72 6f 75 67 68   /* Loop through
6ee0: 20 65 61 63 68 20 65 78 70 72 65 73 73 69 6f 6e   each expression
6ef0: 20 69 6e 20 3c 65 78 70 72 6c 69 73 74 3e 2e 20   in <exprlist>. 
6f00: 2a 2f 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  */.        for(i
6f10: 3d 30 3b 20 69 3c 70 45 78 70 72 2d 3e 70 4c 69  =0; i<pExpr->pLi
6f20: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
6f30: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
6f40: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
6f50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
6f60: 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a 20 43  ..          /* C
6f70: 68 65 63 6b 20 74 68 61 74 20 74 68 65 20 65 78  heck that the ex
6f80: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
6f90: 74 61 6e 74 20 61 6e 64 20 76 61 6c 69 64 2e 20  tant and valid. 
6fa0: 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  */.          if(
6fb0: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43   !sqlite3ExprIsC
6fc0: 6f 6e 73 74 61 6e 74 28 70 45 32 29 20 29 7b 0a  onstant(pE2) ){.
6fd0: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
6fe0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
6ff0: 73 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  se,.            
7000: 20 20 22 72 69 67 68 74 2d 68 61 6e 64 20 73 69    "right-hand si
7010: 64 65 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  de of IN operato
7020: 72 20 6d 75 73 74 20 62 65 20 63 6f 6e 73 74 61  r must be consta
7030: 6e 74 22 29 3b 0a 20 20 20 20 20 20 20 20 20 20  nt");.          
7040: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
7050: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
7060: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
7070: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
7080: 45 32 2c 20 30 2c 20 30 29 20 29 7b 0a 20 20 20  E2, 0, 0) ){.   
7090: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
70a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  1;.          }..
70b0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
70c0: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
70d0: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
70e0: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
70f0: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
7100: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
7110: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29  ode(pParse, pE2)
7120: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
7130: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
7140: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
7150: 30 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54  0, affStr, P3_ST
7160: 41 54 49 43 29 3b 0a 20 20 20 20 20 20 20 20 20  ATIC);.         
7170: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7180: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
7190: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
71a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
71b0: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
71c0: 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ey, pExpr->iTabl
71d0: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 0);.        }
71e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
71f0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7200: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P3(v, addr, (voi
7210: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33  d *)&keyInfo, P3
7220: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
7230: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7240: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
7250: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
7260: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
7270: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
7280: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
7290: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
72a0: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
72b0: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
72c0: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
72d0: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
72e0: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
72f0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
7300: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
7310: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7320: 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  umn = pParse->nM
7330: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73  em++;.      if(s
7340: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
7350: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
7360: 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 70 45 78  ect, SRT_Mem,pEx
7370: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c  pr->iColumn,0,0,
7380: 30 2c 30 29 29 7b 0a 20 20 20 20 20 20 20 20 72  0,0)){.        r
7390: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
73a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
73b0: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
73c0: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
73d0: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
73e0: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
73f0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
7400: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
7410: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
7420: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
7430: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
7440: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
7450: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
7460: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
7470: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7480: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20  pExpr->pRight . 
7490: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
74a0: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
74b0: 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20  arse, pSrcList, 
74c0: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
74d0: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
74e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
74f0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
7500: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
7510: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
7520: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
7530: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
7540: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
7550: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
7560: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
7570: 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
7580: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
7590: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
75a0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
75b0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
75c0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
75d0: 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20  st, pArg) ){.   
75e0: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
75f0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
7600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
7610: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
7620: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
7630: 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20  pExpr is a node 
7640: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 20 66  that defines a f
7650: 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  unction of some 
7660: 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a  kind.  It might.
7670: 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63 74 69  ** be a syntacti
7680: 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20  c function like 
7690: 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74  "count(x)" or it
76a0: 20 6d 69 67 68 74 20 62 65 20 61 20 66 75 6e 63   might be a func
76b0: 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70  tion.** that imp
76c0: 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61  lements an opera
76d0: 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b  tor, like "a LIK
76e0: 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  E b".  .**.** Th
76f0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
7700: 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74   *pzName point t
7710: 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  o the name of th
7720: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a  e function and .
7730: 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20  ** *pnName hold 
7740: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
7750: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
7760: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a  function name..*
7770: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
7780: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78  tFunctionName(Ex
7790: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
77a0: 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20   char **pzName, 
77b0: 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20  int *pnName){.  
77c0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
77d0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
77e0: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
77f0: 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78     *pzName = pEx
7800: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
7810: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78     *pnName = pEx
7820: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
7830: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7840: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
7850: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
7860: 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20  e = "like";.    
7870: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
7880: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7890: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  }.    case TK_GL
78a0: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  OB: {.      *pzN
78b0: 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20  ame = "glob";.  
78c0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
78d0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
78e0: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
78f0: 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65   {.      *pzName
7900: 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e   = "can't happen
7910: 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65  ";.      *pnName
7920: 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65   = 12;.      bre
7930: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
7940: 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65  ./*.** Error che
7950: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
7960: 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
7970: 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  n.  Make sure al
7980: 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  l.** function na
7990: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
79a0: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
79b0: 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f  ions have the co
79c0: 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20  rrect.** number 
79d0: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
79e0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
79f0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
7a00: 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61  >zErrMsg.** if a
7a10: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
7a20: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
7a30: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
7a40: 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20  **.** if pIsAgg 
7a50: 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20  is not null and 
7a60: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
7a70: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
7a80: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b  function.** (lik
7a90: 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61  e count(*) or ma
7aa0: 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77  x(value)) then w
7ab0: 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70  rite a 1 into *p
7ac0: 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  IsAgg..*/.int sq
7ad0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 50  lite3ExprCheck(P
7ae0: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
7af0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61  pr *pExpr, int a
7b00: 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49  llowAgg, int *pI
7b10: 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72  sAgg){.  int nEr
7b20: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78  r = 0;.  if( pEx
7b30: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
7b40: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
7b50: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
7b60: 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63  e TK_GLOB:.    c
7b70: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20  ase TK_LIKE:.   
7b80: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
7b90: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
7ba0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20   = pExpr->pList 
7bb0: 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
7bc0: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
7bd0: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
7be0: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
7bf0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
7c00: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
7c10: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
7c20: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
7c30: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
7c40: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
7c50: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
7c60: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
7c70: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
7c80: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
7c90: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
7ca0: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
7cb0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
7cc0: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
7cd0: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
7ce0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
7cf0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
7d00: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
7d10: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
7d20: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
7d30: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
7d40: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
7d50: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
7d60: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
7d70: 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50 61 72    int enc = pPar
7d80: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 0a 20 20  se->db->enc;..  
7d90: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
7da0: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
7db0: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
7dc0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
7dd0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
7de0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
7df0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
7e00: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
7e10: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
7e20: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
7e30: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
7e40: 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63  Id, nId, -1, enc
7e50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
7e60: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
7e70: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
7e80: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
7e90: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
7ea0: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
7eb0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
7ec0: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
7ed0: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
7ee0: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
7ef0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
7f00: 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77  is_agg && !allow
7f10: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Agg ){.        s
7f20: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
7f30: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
7f40: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
7f50: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
7f60: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
7f70: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
7f80: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
7f90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
7fa0: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
7fb0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
7fc0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
7fd0: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
7fe0: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
7ff0: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
8000: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8010: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
8020: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8030: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8040: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
8050: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
8060: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
8070: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8080: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
8090: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
80a0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
80b0: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
80c0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
80d0: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
80e0: 20 20 20 20 69 66 28 20 70 49 73 41 67 67 20 29      if( pIsAgg )
80f0: 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20   *pIsAgg = 1;.  
8100: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8110: 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
8120: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
8130: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
8140: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
8150: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
8160: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20  >a[i].pExpr,.   
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f              allo
8190: 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c  wAgg && !is_agg,
81a0: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
81b0: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  }.      /* FIX M
81c0: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
81d0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
81e0: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
81f0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
8200: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
8210: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
8220: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
8230: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
8240: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
8250: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
8260: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
8270: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8280: 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20  Left, allowAgg, 
8290: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  pIsAgg);.      }
82a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
82b0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
82c0: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ght ){.        n
82d0: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Err = sqlite3Exp
82e0: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
82f0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c  Expr->pRight, al
8300: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
8310: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8320: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
8330: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
8340: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
8350: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
8360: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
8370: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
8380: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
8390: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
83a0: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
83b0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
83c0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
83d0: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
83e0: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
83f0: 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67  e, pE2, allowAgg
8400: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
8410: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8420: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8430: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
8440: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  r;.}../*.** Gene
8450: 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74  rate an instruct
8460: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75  ion that will pu
8470: 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65  t the integer de
8480: 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78  scribe by.** tex
8490: 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74  t z[0..n-1] on t
84a0: 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61  he stack..*/.sta
84b0: 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74  tic void codeInt
84c0: 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f  eger(Vdbe *v, co
84d0: 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
84e0: 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20   n){.  int i;.  
84f0: 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e  if( sqlite3GetIn
8500: 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20  t32(z, &i) ){.  
8510: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
8520: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
8530: 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65  , i, 0);.  }else
8540: 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73   if( sqlite3Fits
8550: 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20  In64Bits(z) ){. 
8560: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
8570: 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  3(v, OP_Integer,
8580: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
8590: 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74  }else{.    sqlit
85a0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
85b0: 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e  Real, 0, 0, z, n
85c0: 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  );.  }.}../*.** 
85d0: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e  Generate code in
85e0: 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56  to the current V
85f0: 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20  dbe to evaluate 
8600: 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70  the given.** exp
8610: 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76  ression and leav
8620: 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20  e the result on 
8630: 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b  the top of stack
8640: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
8650: 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20  3ExprCode(Parse 
8660: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
8670: 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76  Expr){.  Vdbe *v
8680: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
8690: 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66  ;.  int op;.  if
86a0: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
86b0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 73  =0 ) return;.  s
86c0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
86d0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
86e0: 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20 4f  PLUS:     op = O
86f0: 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65 61  P_Add;      brea
8700: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
8710: 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f 50  INUS:    op = OP
8720: 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65 61 6b  _Subtract; break
8730: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54  ;.    case TK_ST
8740: 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f  AR:     op = OP_
8750: 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b 3b  Multiply; break;
8760: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
8770: 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f 44  SH:    op = OP_D
8780: 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b 0a  ivide;   break;.
8790: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
87a0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41 6e        op = OP_An
87b0: 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  d;      break;. 
87c0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 20     case TK_OR:  
87d0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72 3b       op = OP_Or;
87e0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
87f0: 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20    case TK_LT:   
8800: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20      op = OP_Lt; 
8810: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8820: 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20   case TK_LE:    
8830: 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20     op = OP_Le;  
8840: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8850: 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20  case TK_GT:     
8860: 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20    op = OP_Gt;   
8870: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8880: 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20  ase TK_GE:      
8890: 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20   op = OP_Ge;    
88a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
88b0: 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20  se TK_NE:       
88c0: 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20  op = OP_Ne;     
88d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
88e0: 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f  e TK_EQ:       o
88f0: 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20  p = OP_Eq;      
8900: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8910: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70   TK_ISNULL:   op
8920: 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20   = OP_IsNull;   
8930: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8940: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20  TK_NOTNULL:  op 
8950: 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62  = OP_NotNull;  b
8960: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8970: 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20 3d  K_NOT:      op =
8980: 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62 72   OP_Not;      br
8990: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
89a0: 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d 20  _UMINUS:   op = 
89b0: 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72 65  OP_Negative; bre
89c0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
89d0: 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20 4f  BITAND:   op = O
89e0: 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65 61  P_BitAnd;   brea
89f0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8a00: 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f 50  ITOR:    op = OP
8a10: 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61 6b  _BitOr;    break
8a20: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  ;.    case TK_BI
8a30: 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  TNOT:   op = OP_
8a40: 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b 3b  BitNot;   break;
8a50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48  .    case TK_LSH
8a60: 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f 53  IFT:   op = OP_S
8a70: 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61 6b  hiftLeft;  break
8a80: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 53  ;.    case TK_RS
8a90: 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  HIFT:   op = OP_
8aa0: 53 68 69 66 74 52 69 67 68 74 3b 20 62 72 65 61  ShiftRight; brea
8ab0: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8ac0: 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50  EM:      op = OP
8ad0: 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72 65  _Remainder;  bre
8ae0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8af0: 46 4c 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20 4f  FLOAT:    op = O
8b00: 50 5f 52 65 61 6c 3b 20 20 20 20 20 20 20 62 72  P_Real;       br
8b10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8b20: 5f 53 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d 20  _STRING:   op = 
8b30: 4f 50 5f 53 74 72 69 6e 67 38 3b 20 20 20 20 20  OP_String8;     
8b40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8b50: 54 4b 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70 20  TK_BLOB:     op 
8b60: 3d 20 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20 20  = OP_HexBlob;   
8b70: 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66 61   break;.    defa
8b80: 75 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72 65  ult: op = 0; bre
8b90: 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63 68  ak;.  }.  switch
8ba0: 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20  ( pExpr->op ){. 
8bb0: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
8bc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70  N: {.      if( p
8bd0: 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b  Parse->useAgg ){
8be0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8bf0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
8c00: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
8c10: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  ->iAgg);.      }
8c20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
8c30: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20  iColumn>=0 ){.  
8c40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
8c50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c  eAddOp(v, OP_Col
8c60: 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  umn, pExpr->iTab
8c70: 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  le, pExpr->iColu
8c80: 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  mn);.      }else
8c90: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8ca0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8cb0: 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69  _Recno, pExpr->i
8cc0: 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20  Table, 0);.     
8cd0: 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
8ce0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8cf0: 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20  K_INTEGER: {.   
8d00: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
8d10: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
8d20: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
8d30: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
8d40: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
8d50: 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73  K_FLOAT:.    cas
8d60: 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20  e TK_STRING: {. 
8d70: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
8d80: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
8d90: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
8da0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
8db0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
8dc0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
8dd0: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
8de0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
8df0: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
8e00: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
8e10: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45  (v, op, 0, 0, pE
8e20: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20  xpr->token.z+1, 
8e30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31  pExpr->token.n-1
8e40: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
8e50: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
8e60: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
8e70: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
8e80: 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20 20  e TK_NULL: {.   
8e90: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8ea0: 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67  dOp(v, OP_String
8eb0: 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  8, 0, 0);.      
8ec0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
8ed0: 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c   case TK_VARIABL
8ee0: 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  E: {.      sqlit
8ef0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
8f00: 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70  P_Variable, pExp
8f10: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
8f20: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8f30: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
8f40: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
8f50: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
8f60: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
8f70: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
8f80: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
8f90: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70 31  : {.      int p1
8fa0: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
8fb0: 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  P1(pExpr->pLeft,
8fc0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
8fd0: 30 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  0);.      CollSe
8fe0: 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f  q *p3 = binaryCo
8ff0: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
9000: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9010: 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
9020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9030: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9040: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9050: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9060: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9070: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9080: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
9090: 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20 30 2c  p3(v, op, p1, 0,
90a0: 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f   (void *)p3, P3_
90b0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
90c0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
90d0: 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20   case TK_AND:.  
90e0: 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20    case TK_OR:.  
90f0: 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a    case TK_PLUS:.
9100: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52      case TK_STAR
9110: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49  :.    case TK_MI
9120: 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NUS:.    case TK
9130: 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54  _REM:.    case T
9140: 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61  K_BITAND:.    ca
9150: 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20  se TK_BITOR:.   
9160: 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 20   case TK_SLASH: 
9170: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
9180: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
9190: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
91a0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
91b0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
91c0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
91d0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
91e0: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
91f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
9200: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
9210: 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73  _LSHIFT:.    cas
9220: 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a 20  e TK_RSHIFT: {. 
9230: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
9240: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
9250: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
9260: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
9270: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
9280: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
9290: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
92a0: 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20  (v, op, 0, 0);. 
92b0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
92c0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  }.    case TK_CO
92d0: 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  NCAT: {.      sq
92e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
92f0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9300: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
9310: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
9320: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
9330: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9340: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9350: 43 6f 6e 63 61 74 38 2c 20 32 2c 20 30 29 3b 0a  Concat8, 2, 0);.
9360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9370: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
9380: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
9390: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
93a0: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
93b0: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
93c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
93d0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
93e0: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
93f0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
9400: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
9410: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
9420: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
9430: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
9440: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
9450: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
9460: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
9470: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9480: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
9490: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
94a0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
94b0: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
94c0: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
94d0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
94e0: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
94f0: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
9500: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
9510: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
9520: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9530: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
9540: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
9550: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
9560: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9570: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
9580: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
9590: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
95a0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
95b0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
95c0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
95d0: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
95e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
95f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
9600: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
9610: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
9620: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
9630: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9640: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9650: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
9660: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9670: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9680: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
9690: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
96a0: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
96b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
96c0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
96d0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
96e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
96f0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
9700: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
9710: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9720: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9730: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9740: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9750: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
9760: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
9770: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9780: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
9790: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
97a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
97b0: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
97c0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
97d0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
97e0: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
97f0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
9800: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
9810: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
9820: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
9830: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9840: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  zId;.      int p
9850: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  2 = 0;.      int
9860: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
9870: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
9880: 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  nc;.      CollSe
9890: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
98a0: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
98b0: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
98c0: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
98d0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
98e0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
98f0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
9900: 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
9910: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
9920: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
9930: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9940: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
9950: 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
9960: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9970: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
9980: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9990: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
99a0: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
99b0: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
99c0: 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c        p2 |= (1<<
99d0: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
99e0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
99f0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21  needCollSeq && !
9a00: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
9a10: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9a20: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9a30: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
9a40: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9a50: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9a60: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
9a70: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
9a80: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9a90: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
9aa0: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
9ab0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9ac0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
9ad0: 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
9ae0: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
9af0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
9b00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9b10: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
9b20: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20  ion, nExpr, p2, 
9b30: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
9b40: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
9b50: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9b60: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
9b70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9b80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9b90: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
9ba0: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
9bb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9bc0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9bd0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
9be0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  ;.      char con
9bf0: 73 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20  st *affStr;..   
9c00: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
9c10: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
9c20: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
9c30: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
9c40: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
9c50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
9c60: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
9c70: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
9c80: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
9c90: 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66  r.      ** P3 of
9ca0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
9cb0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
9cc0: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
9cd0: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63 6f  ffinityString(co
9ce0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
9cf0: 28 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  (pExpr));..     
9d00: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9d10: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9d20: 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   1, 0);..      /
9d30: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
9d40: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
9d50: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
9d60: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
9d70: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
9d80: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
9d90: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
9da0: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
9db0: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
9dc0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9dd0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9de0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9df0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
9e00: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
9e10: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
9e20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9e30: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
9e40: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
9e50: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
9e60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9e70: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
9e80: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
9e90: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9ea0: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
9eb0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
9ec0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
9ed0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
9ee0: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
9ef0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
9f00: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
9f10: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41  , affStr, P3_STA
9f20: 54 49 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20  TIC); /* addr + 
9f30: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
9f40: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9f50: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
9f60: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
9f70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9f80: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
9f90: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
9fa0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
9fb0: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
9fc0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9fd0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
9fe0: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TWEEN: {.      i
9ff0: 6e 74 20 70 31 3b 0a 20 20 20 20 20 20 43 6f 6c  nt p1;.      Col
a000: 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20 20 20 20  lSeq *p3;.      
a010: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a020: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a030: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
a040: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a050: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
a060: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a070: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a080: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
a090: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  .pExpr);.      p
a0a0: 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  1 = binaryCompar
a0b0: 65 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  eP1(pExpr->pLeft
a0c0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
a0d0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[0].pExpr, 0);.
a0e0: 20 20 20 20 20 20 70 33 20 3d 20 62 69 6e 61 72        p3 = binar
a0f0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
a100: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a110: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69  Left, pExpr->pLi
a120: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a130: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a140: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  beOp3(v, OP_Ge, 
a150: 70 31 2c 20 30 2c 20 28 76 6f 69 64 20 2a 29 70  p1, 0, (void *)p
a160: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
a170: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a180: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
a190: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
a1a0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a1b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a1c0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a1d0: 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 62 69  );.      p1 = bi
a1e0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45  naryCompareP1(pE
a1f0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
a200: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
a210: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a220: 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p3 = binaryCompa
a230: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
a240: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
a250: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
a260: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
a270: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a280: 76 2c 20 4f 50 5f 4c 65 2c 20 70 31 2c 20 30 2c  v, OP_Le, p1, 0,
a290: 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f   (void *)p3, P3_
a2a0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
a2b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a2c0: 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30  (v, OP_And, 0, 0
a2d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a2e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a2f0: 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
a300: 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
a310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a320: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a330: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
a340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a350: 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
a360: 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e       int expr_en
a370: 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69  d_label;.      i
a380: 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20  nt jumpInst;.   
a390: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a3a0: 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20     int nExpr;.  
a3b0: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
a3c0: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
a3d0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
a3e0: 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
a3f0: 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
a400: 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
a410: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
a420: 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
a430: 20 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70 72     nExpr = pExpr
a440: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
a450: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
a460: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
a470: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a480: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a490: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
a4a0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a4b0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a4c0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
a4d0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a4e0: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
a4f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a500: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a510: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
a520: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a530: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
a540: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
a550: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
a560: 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72  yCompareP1(pExpr
a570: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
a580: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a590: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
a5a0: 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 62   CollSeq *p3 = b
a5b0: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
a5c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
a5d0: 72 2d 3e 70 4c 65 66 74 2c 20 0a 20 20 20 20 20  r->pLeft, .     
a5e0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a5f0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a600: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
a610: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a620: 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b  , OP_Dup, 1, 1);
a630: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
a640: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
a650: 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 70  eOp3(v, OP_Ne, p
a660: 31 2c 20 30 2c 20 28 76 6f 69 64 20 2a 29 70 33  1, 0, (void *)p3
a670: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
a680: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
a690: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a6a0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
a6b0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a6c0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
a6d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6e0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
a6f0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
a700: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a710: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a720: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
a730: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
a740: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a750: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
a760: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
a770: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  el);.        add
a780: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
a790: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
a7a0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
a7b0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
a7c0: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
a7d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
a7e0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
a7f0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a800: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a810: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
a820: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
a830: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
a840: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
a850: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
a860: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
a870: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
a880: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a890: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a8a0: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
a8b0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a8c0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
a8d0: 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
a8e0: 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
a8f0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
a900: 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
a910: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
a920: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
a930: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a940: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
a950: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a960: 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
a970: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
a980: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
a990: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
a9a0: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
a9b0: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  ;..return;.     
a9c0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
a9d0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
a9e0: 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20  E_Rollback ||.. 
a9f0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
aa00: 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09  == OE_Abort ||..
aa10: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
aa20: 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09   == OE_Fail ){..
aa30: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
aa40: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
aa50: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
aa60: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
aa70: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
aa80: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
aa90: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
aaa0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73  ->token.n);..  s
aab0: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
aac0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
aad0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73    } else {..  as
aae0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
aaf0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72  lumn == OE_Ignor
ab00: 65 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56  e );..  sqlite3V
ab10: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 6f 74  dbeOp3(v, OP_Got
ab20: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
ab30: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
ab40: 75 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ump,.           
ab50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ab60: 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70 29 22 2c  "(IGNORE jump)",
ab70: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ab80: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
ab90: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
aba0: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
abb0: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
abc0: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
abd0: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
abe0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
abf0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
ac00: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
ac10: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
ac20: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
ac30: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
ac40: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
ac50: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
ac60: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
ac70: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
ac80: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
ac90: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
aca0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
acb0: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
acc0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
acd0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
ace0: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
acf0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20   Vdbe *v;.  if( 
ad00: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
ad10: 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  n 0;.  v = sqlit
ad20: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
ad30: 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
ad40: 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
ad50: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
ad60: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
ad70: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
ad80: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ad90: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
ada0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
adb0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
adc0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
add0: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
ade0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
adf0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
ae00: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
ae10: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
ae20: 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
ae30: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
ae40: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
ae50: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
ae60: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
ae70: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
ae80: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
ae90: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
aea0: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
aeb0: 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
aec0: 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
aed0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
aee0: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69   is true..*/.voi
aef0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
af00: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
af10: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
af20: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
af30: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
af40: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
af50: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
af60: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
af70: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
af80: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70  urn;.  switch( p
af90: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
afa0: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
afb0: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
afc0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
afd0: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
afe0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
aff0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b000: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
b010: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
b020: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b030: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
b040: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
b050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b060: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
b070: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
b080: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b090: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
b0a0: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
b0b0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b0c0: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
b0d0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
b0e0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b0f0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
b100: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
b110: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b120: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
b130: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b140: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b150: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
b160: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
b170: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b180: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b190: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
b1a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
b1b0: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
b1c0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b1d0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
b1e0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
b1f0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
b200: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b210: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b220: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
b230: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b240: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
b250: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b260: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
b270: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
b280: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
b290: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
b2a0: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
b2b0: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
b2c0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b2d0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b2e0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
b2f0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
b300: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
b310: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b320: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
b330: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
b340: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b350: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
b360: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
b370: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
b380: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
b390: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
b3a0: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
b3b0: 20 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61     int p1 = bina
b3c0: 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70  ryCompareP1(pExp
b3d0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
b3e0: 3e 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e  >pRight, jumpIfN
b3f0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ull);.      Coll
b400: 53 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79  Seq *p3 = binary
b410: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
b420: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b430: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
b440: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
b450: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b460: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b470: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b480: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b490: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
b4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4b0: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20  eOp3(v, op, p1, 
b4c0: 64 65 73 74 2c 20 28 76 6f 69 64 20 2a 29 70 33  dest, (void *)p3
b4d0: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
b4e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b4f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
b500: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
b510: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
b520: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b530: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b540: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b550: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b560: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
b570: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b580: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b590: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
b5a0: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b5b0: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
b5c0: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
b5d0: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
b5e0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
b5f0: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
b600: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
b610: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
b620: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
b630: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
b640: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
b650: 20 20 69 6e 74 20 70 31 3b 0a 20 20 20 20 20 20    int p1;.      
b660: 43 6f 6c 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20  CollSeq *p3;.   
b670: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b680: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b690: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b6a0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b6b0: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
b6c0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
b6d0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
b6e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
b6f0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
b700: 20 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p1 = binaryCom
b710: 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e 70 4c  pareP1(pExpr->pL
b720: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  eft, pExpr->pLis
b730: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 21  t->a[0].pExpr, !
b740: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
b750: 20 20 20 70 33 20 3d 20 62 69 6e 61 72 79 43 6f     p3 = binaryCo
b760: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
b770: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b780: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t, pExpr->pList-
b790: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
b7a0: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
b7b0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
b7c0: 4c 74 2c 20 70 31 2c 20 30 2c 20 28 76 6f 69 64  Lt, p1, 0, (void
b7d0: 20 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45   *)p3, P3_COLLSE
b7e0: 51 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  Q);..      sqlit
b7f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b800: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
b810: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
b820: 20 20 20 20 70 31 20 3d 20 62 69 6e 61 72 79 43      p1 = binaryC
b830: 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e  ompareP1(pExpr->
b840: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c  pLeft, pExpr->pL
b850: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c  ist->a[1].pExpr,
b860: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
b870: 20 20 20 20 70 33 20 3d 20 62 69 6e 61 72 79 43      p3 = binaryC
b880: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
b890: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b8a0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  ft, pExpr->pList
b8b0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
b8c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b8d0: 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c 20 70 31  Op3(v, OP_Le, p1
b8e0: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 20 2a 29  , dest, (void *)
b8f0: 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  p3, P3_COLLSEQ);
b900: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
b910: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
b920: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
b930: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b940: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
b950: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
b960: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
b970: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
b980: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
b990: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
b9a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
b9b0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
b9c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b9d0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
b9e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b9f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
ba00: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
ba10: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
ba20: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
ba30: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
ba40: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
ba50: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
ba60: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
ba70: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
ba80: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
ba90: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
baa0: 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
bab0: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
bac0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
bad0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bae0: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
baf0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
bb00: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
bb10: 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
bb20: 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
bb30: 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
bb40: 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f  IfNull is true o
bb50: 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
bb60: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
bb70: 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  false..*/.void s
bb80: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
bb90: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
bba0: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
bbb0: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
bbc0: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
bbd0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
bbe0: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
bbf0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
bc00: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
bc10: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
bc20: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
bc30: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
bc40: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
bc50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
bc60: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
bc70: 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20  p = OP_Gt;      
bc80: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
bc90: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
bca0: 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20   = OP_Le;       
bcb0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
bcc0: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
bcd0: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
bce0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
bcf0: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
bd00: 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72   OP_Eq;       br
bd10: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
bd20: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
bd30: 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ne;       bre
bd40: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
bd50: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
bd60: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
bd70: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
bd80: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
bd90: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
bda0: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
bdb0: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
bdc0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
bdd0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
bde0: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
bdf0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
be00: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
be10: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
be20: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
be30: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
be40: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
be50: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
be60: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
be70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
be80: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
be90: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
bea0: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
beb0: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
bec0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
bed0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
bee0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
bef0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
bf00: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
bf10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bf20: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
bf30: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
bf40: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
bf50: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
bf60: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
bf70: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
bf80: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
bf90: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
bfa0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
bfb0: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
bfc0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
bfd0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
bfe0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
bff0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
c000: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
c010: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
c020: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
c030: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
c040: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
c050: 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72  yCompareP1(pExpr
c060: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
c070: 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75  pRight, jumpIfNu
c080: 6c 6c 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ll);.      CollS
c090: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
c0a0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
c0b0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c0c0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
c0d0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c0e0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c0f0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
c100: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c110: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c120: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
c130: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c140: 4f 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20 64  Op3(v, op, p1, d
c150: 65 73 74 2c 20 28 76 6f 69 64 20 2a 29 70 33 2c  est, (void *)p3,
c160: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
c170: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c180: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
c190: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
c1a0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
c1b0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c1c0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c1d0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c1e0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c1f0: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
c200: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c210: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c220: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
c230: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c240: 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
c250: 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
c260: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
c270: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c280: 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
c290: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
c2a0: 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
c2b0: 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
c2c0: 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
c2d0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c2e0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
c2f0: 69 6e 74 20 70 31 3b 0a 20 20 20 20 20 20 43 6f  int p1;.      Co
c300: 6c 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20 20 20  llSeq *p3;.     
c310: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c320: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c330: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c340: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c350: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
c360: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c370: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c380: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
c390: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
c3a0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c3b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c3c0: 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 62 69 6e  ;.      p1 = bin
c3d0: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78  aryCompareP1(pEx
c3e0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
c3f0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
c400: 78 70 72 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  xpr, !jumpIfNull
c410: 29 3b 0a 20 20 20 20 20 20 70 33 20 3d 20 62 69  );.      p3 = bi
c420: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
c430: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
c440: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
c450: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c460: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
c470: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47  3VdbeOp3(v, OP_G
c480: 65 2c 20 70 31 2c 20 61 64 64 72 2b 33 2c 20 28  e, p1, addr+3, (
c490: 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f 43 4f  void *)p3, P3_CO
c4a0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 73 71  LLSEQ);.      sq
c4b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c4c0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
c4d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c4e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
c4f0: 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
c500: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c510: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c520: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
c530: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 31 20  Expr);.      p1 
c540: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
c550: 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  1(pExpr->pLeft, 
c560: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
c570: 31 5d 2e 70 45 78 70 72 2c 20 6a 75 6d 70 49 66  1].pExpr, jumpIf
c580: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 33 20  Null);.      p3 
c590: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
c5a0: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c5b0: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
c5c0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
c5d0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
c5e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c5f0: 4f 50 5f 47 74 2c 20 70 31 2c 20 64 65 73 74 2c  OP_Gt, p1, dest,
c600: 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f   (void *)p3, P3_
c610: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
c620: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c630: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
c640: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c650: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
c660: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
c670: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
c680: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
c690: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
c6a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
c6b0: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
c6c0: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
c6d0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
c6e0: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
c6f0: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
c700: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
c710: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
c720: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
c730: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
c740: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
c750: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
c760: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
c770: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
c780: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
c790: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
c7a0: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
c7b0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
c7c0: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
c7d0: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
c7e0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
c7f0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
c800: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
c810: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
c820: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
c830: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
c840: 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
c850: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
c860: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
c870: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
c880: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
c890: 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
c8a0: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
c8b0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
c8c0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
c8d0: 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
c8e0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
c8f0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
c900: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
c910: 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
c920: 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
c930: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
c940: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
c950: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
c960: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
c970: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
c980: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
c990: 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
c9a0: 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
c9b0: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
c9c0: 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
c9d0: 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
c9e0: 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
c9f0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
ca00: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
ca10: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
ca20: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
ca30: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
ca40: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
ca50: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
ca60: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ca70: 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  3StrNICmp(pA->to
ca80: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
ca90: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pB->token.n)
caa0: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
cab0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
cac0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
cad0: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
cae0: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
caf0: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
cb00: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n its index..*/.
cb10: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
cb20: 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a  dAggInfo(Parse *
cb30: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28  pParse){.  if( (
cb40: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30  pParse->nAgg & 0
cb50: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  x7)==0 ){.    in
cb60: 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e  t amt = pParse->
cb70: 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67  nAgg + 8;.    Ag
cb80: 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71  gExpr *aAgg = sq
cb90: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72  liteRealloc(pPar
cba0: 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69  se->aAgg, amt*si
cbb0: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
cbc0: 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  g[0]));.    if( 
cbd0: 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aAgg==0 ){.     
cbe0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
cbf0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  }.    pParse->aA
cc00: 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20  gg = aAgg;.  }. 
cc10: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
cc20: 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41  >aAgg[pParse->nA
cc30: 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  gg], 0, sizeof(p
cc40: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
cc50: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
cc60: 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a  e->nAgg++;.}../*
cc70: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
cc80: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
cc90: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
cca0: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
ccb0: 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
ccc0: 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
ccd0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
cce0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
ccf0: 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
cd00: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
cd10: 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
cd20: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
cd30: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
cd40: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
cd50: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
cd60: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
cd70: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
cd80: 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
cd90: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52   by sqlite3ExprR
cda0: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
cdb0: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
cdc0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
cdd0: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
cde0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
cdf0: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
ce00: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
ce10: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
ce20: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
ce30: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
ce40: 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70  regates(Parse *p
ce50: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
ce60: 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
ce70: 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20  AggExpr *aAgg;. 
ce80: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
ce90: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
cea0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
ceb0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
cec0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
ced0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  LUMN: {.      aA
cee0: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
cef0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
cf00: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
cf10: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
cf20: 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67  if( aAgg[i].isAg
cf30: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
cf40: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
cf50: 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ].pExpr->iTable=
cf60: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20  =pExpr->iTable. 
cf70: 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b          && aAgg[
cf80: 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
cf90: 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
cfa0: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
cfb0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
cfc0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
cfd0: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
cfe0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
cff0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
d000: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d010: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
d020: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
d030: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
d040: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
d050: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
d060: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
d070: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
d080: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
d090: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d0a0: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
d0b0: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
d0c0: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
d0d0: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
d0e0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
d0f0: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
d100: 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d      if( !aAgg[i]
d110: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
d120: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
d130: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
d140: 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
d150: 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
d160: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d170: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d180: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
d190: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
d1a0: 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
d1b0: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
d1c0: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
d1d0: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
d1e0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
d1f0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
d200: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
d210: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
d220: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
d230: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
d240: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
d250: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
d260: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
d270: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
d280: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
d290: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
d2a0: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
d2b0: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d2c0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
d2d0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d2e0: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
d2f0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d300: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
d310: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d320: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
d330: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
d340: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d350: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
d360: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d370: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d380: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d390: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d3a0: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
d3b0: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d3c0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
d3d0: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
d3e0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
d3f0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d400: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d410: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
d420: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
d430: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
d440: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d450: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
d460: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d470: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
d480: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
d490: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
d4a0: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
d4b0: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
d4c0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
d4d0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d4e0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d4f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d500: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
d510: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
d520: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
d530: 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20  n given a name, 
d540: 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  a number of argu
d550: 6d 65 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67  ments and a flag
d560: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77  .** indicating w
d570: 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
d580: 69 6f 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d  ion prefers UTF-
d590: 31 36 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20  16 over UTF-8.  
d5a0: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
d5b0: 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
d5c0: 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
d5d0: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 20 66  t defines that f
d5e0: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
d5f0: 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68  rn.** NULL if th
d600: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
d610: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
d620: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
d630: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
d640: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
d650: 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a  (blank) FuncDef.
d660: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
d670: 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65  created and like
d680: 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20  d into the "db" 
d690: 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a  structure if a.*
d6a0: 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75  * no matching fu
d6b0: 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  nction previousl
d6c0: 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e  y existed.  When
d6d0: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74   createFlag is t
d6e0: 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  rue.** and the n
d6f0: 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Arg parameter is
d700: 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61   -1, then only a
d710: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61   function that a
d720: 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75  ccepts.** any nu
d730: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
d740: 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  s will be return
d750: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65  ed..**.** If cre
d760: 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65  ateFlag is false
d770: 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c   and nArg is -1,
d780: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
d790: 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f  valid.** functio
d7a0: 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72  n found is retur
d7b0: 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e  ned.  A function
d7c0: 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74   is valid if eit
d7d0: 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20  her xFunc.** or 
d7e0: 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  xStep is non-zer
d7f0: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  o..**.** If crea
d800: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c  teFlag is false,
d810: 20 74 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e   then a function
d820: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
d830: 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e  ed name and.** n
d840: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
d850: 74 73 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  ts may be return
d860: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 65  ed even if the e
d870: 54 65 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65  TextRep flag doe
d880: 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74  s not.** match t
d890: 68 61 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a  hat requested..*
d8a0: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
d8b0: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a  e3FindFunction(.
d8c0: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
d8d0: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
d8e0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
d8f0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
d900: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
d910: 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e  function.  Not n
d920: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a  ull-terminated *
d930: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20  /.  int nName,  
d940: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
d950: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
d960: 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  n the name */.  
d970: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
d980: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
d990: 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d  arguments.  -1 m
d9a0: 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20  eans any number 
d9b0: 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20  */.  u8 enc,    
d9c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65          /* Prefe
d9d0: 72 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69  rred text encodi
d9e0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  ng */.  int crea
d9f0: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
da00: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
da10: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
da20: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
da30: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
da40: 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Def *p;         
da50: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
da60: 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  able */.  FuncDe
da70: 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a  f *pFirst;    /*
da80: 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   First function 
da90: 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a  with this name *
daa0: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65  /.  FuncDef *pBe
dab0: 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20  st = 0; /* Best 
dac0: 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66  match found so f
dad0: 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  ar */.  int best
dae0: 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20  match = 0;  ... 
daf0: 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51   assert( enc==SQ
db00: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
db10: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
db20: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
db30: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
db40: 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20   nArg<-1 ) nArg 
db50: 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20  = -1;..  pFirst 
db60: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
db70: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
db80: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
db90: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  Name);.  for(p=p
dba0: 46 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  First; p; p=p->p
dbb0: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75  Next){.    /* Du
dbc0: 72 69 6e 67 20 74 68 65 20 73 65 61 72 63 68 20  ring the search 
dbd0: 66 6f 72 20 74 68 65 20 62 65 73 74 20 66 75 6e  for the best fun
dbe0: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
dbf0: 2c 20 62 65 73 74 6d 61 74 63 68 20 69 73 20 73  , bestmatch is s
dc00: 65 74 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c  et.    ** as fol
dc10: 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lows to indicate
dc20: 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
dc30: 74 68 65 20 6d 61 74 63 68 20 77 69 74 68 20 74  the match with t
dc40: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20  he definition.  
dc50: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
dc60: 62 79 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a  by pBest:.    **
dc70: 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74  .    ** 0: pBest
dc80: 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74   is NULL. No mat
dc90: 63 68 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e  ch has been foun
dca0: 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76  d..    ** 1: A v
dcb0: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
dcc0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
dcd0: 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77 68  prefers UTF-8 wh
dce0: 65 6e 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20  en a UTF-16.    
dcf0: 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69  **    encoding i
dd00: 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
dd10: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
dd20: 2a 2a 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 2: A variable
dd30: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
dd40: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 55 54  ion that uses UT
dd50: 46 2d 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d  F-16BE when UTF-
dd60: 31 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20  16LE is.    **  
dd70: 20 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20    requested, or 
dd80: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
dd90: 2a 2a 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 3: A variable
dda0: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
ddb0: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61  ion using the sa
ddc0: 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  me text encoding
ddd0: 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75  ..    ** 4: A fu
dde0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
ddf0: 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  exact number of 
de00: 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73  arguments reques
de10: 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ted that.    ** 
de20: 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d 38     prefers UTF-8
de30: 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   when a UTF-16 e
de40: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65  ncoding is reque
de50: 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65  sted, or vice ve
de60: 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41  rsa..    ** 5: A
de70: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
de80: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20  he exact number 
de90: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71  of arguments req
dea0: 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20  uested that.    
deb0: 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54  **    prefers UT
dec0: 46 2d 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d  F-16LE when UTF-
ded0: 31 36 42 45 20 69 73 20 72 65 71 75 65 73 74 65  16BE is requeste
dee0: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
def0: 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65  ..    ** 6: An e
df00: 78 61 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20  xact match..    
df10: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67  **.    ** A larg
df20: 65 72 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74  er value of 'mat
df30: 63 68 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65  chqual' indicate
df40: 73 20 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62  s a more desirab
df50: 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f  le match..    */
df60: 0a 20 20 20 20 69 66 28 20 28 70 2d 3e 78 53 74  .    if( (p->xSt
df70: 65 70 7c 7c 70 2d 3e 78 46 75 6e 63 20 29 20 26  ep||p->xFunc ) &
df80: 26 20 28 70 2d 3e 6e 41 72 67 3d 3d 2d 31 7c 7c  & (p->nArg==-1||
df90: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 7c 7c 6e  p->nArg==nArg||n
dfa0: 41 72 67 3d 3d 2d 31 29 20 29 7b 0a 20 20 20 20  Arg==-1) ){.    
dfb0: 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b    int match = 1;
dfc0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
dfd0: 6c 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74  lity of this mat
dfe0: 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ch */.      if( 
dff0: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c  p->nArg==nArg ||
e000: 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20   nArg==-1 ){.   
e010: 20 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a       match = 4;.
e020: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
e030: 28 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45  ( enc==p->iPrefE
e040: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  nc ){.        ma
e050: 74 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  tch += 2;.      
e060: 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
e070: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
e080: 46 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65  F16LE && p->iPre
e090: 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
e0a0: 31 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20  16BE) ||.       
e0b0: 20 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51          (enc==SQ
e0c0: 4c 49 54 45 5f 55 54 46 31 36 42 45 20 26 26 20  LITE_UTF16BE && 
e0d0: 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c  p->iPrefEnc==SQL
e0e0: 49 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a  ITE_UTF16LE) ){.
e0f0: 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d          match +=
e100: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
e110: 20 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73     if( match>bes
e120: 74 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  tmatch ){.      
e130: 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20    pBest = p;.   
e140: 20 20 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d       bestmatch =
e150: 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a   match;.      }.
e160: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
e170: 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61  If the createFla
e180: 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  g parameter is t
e190: 72 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61  rue, and the sea
e1a0: 63 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61  ch did not revea
e1b0: 6c 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20  l an.  ** exact 
e1c0: 6d 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61  match for the na
e1d0: 6d 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  me, number of ar
e1e0: 67 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f  guments and enco
e1f0: 64 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61  ding, then add a
e200: 0a 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20  .  ** new entry 
e210: 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
e220: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e  e and return it.
e230: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61  .  */.  if( crea
e240: 74 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61  teFlag && bestma
e250: 74 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20  tch<6 && .      
e260: 28 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d  (pBest = sqliteM
e270: 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42  alloc(sizeof(*pB
e280: 65 73 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20 29  est)+nName+1)) )
e290: 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72  {.    pBest->nAr
e2a0: 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42  g = nArg;.    pB
e2b0: 65 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69  est->pNext = pFi
e2c0: 72 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e  rst;.    pBest->
e2d0: 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
e2e0: 70 42 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70 42  pBest[1];.    pB
e2f0: 65 73 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d 20  est->iPrefEnc = 
e300: 65 6e 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  enc;.    memcpy(
e310: 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  pBest->zName, zN
e320: 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
e330: 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e   pBest->zName[nN
e340: 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 73 71  ame] = 0;.    sq
e350: 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74 28  lite3HashInsert(
e360: 26 64 62 2d 3e 61 46 75 6e 63 2c 20 70 42 65 73  &db->aFunc, pBes
e370: 74 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 2c  t->zName, nName,
e380: 20 28 76 6f 69 64 2a 29 70 42 65 73 74 29 3b 0a   (void*)pBest);.
e390: 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74    }..  if( pBest
e3a0: 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65   && (pBest->xSte
e3b0: 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e  p || pBest->xFun
e3c0: 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29  c || createFlag)
e3d0: 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
e3e0: 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Best;.  }.  retu
e3f0: 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.