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

Artifact 9ae0e55a230802da35a55fd6e87533cca0301af9:


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 35 20 32 30 30 34 2f 30 36 2f 31 39 20  .145 2004/06/19 
0220: 31 34 3a 34 39 3a 31 32 20 64 72 68 20 45 78 70  14:49:12 drh Exp
0230: 20 24 0a 2a 2f 0a 23 69 6e 63 6c 75 64 65 20 22   $.*/.#include "
0240: 73 71 6c 69 74 65 49 6e 74 2e 68 22 0a 23 69 6e  sqliteInt.h".#in
0250: 63 6c 75 64 65 20 3c 63 74 79 70 65 2e 68 3e 0a  clude <ctype.h>.
0260: 0a 63 68 61 72 20 63 6f 6e 73 74 20 2a 73 71 6c  .char const *sql
0270: 69 74 65 33 41 66 66 69 6e 69 74 79 53 74 72 69  ite3AffinityStri
0280: 6e 67 28 63 68 61 72 20 61 66 66 69 6e 69 74 79  ng(char affinity
0290: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66  ){.  switch( aff
02a0: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 63 61 73  inity ){.    cas
02b0: 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  e SQLITE_AFF_INT
02c0: 45 47 45 52 3a 20 72 65 74 75 72 6e 20 22 69 22  EGER: return "i"
02d0: 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49 54  ;.    case SQLIT
02e0: 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 72  E_AFF_NUMERIC: r
02f0: 65 74 75 72 6e 20 22 6e 22 3b 0a 20 20 20 20 63  eturn "n";.    c
0300: 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  ase SQLITE_AFF_T
0310: 45 58 54 3a 20 20 20 20 72 65 74 75 72 6e 20 22  EXT:    return "
0320: 74 22 3b 0a 20 20 20 20 63 61 73 65 20 53 51 4c  t";.    case SQL
0330: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20 20  ITE_AFF_NONE:   
0340: 20 72 65 74 75 72 6e 20 22 6f 22 3b 0a 20 20 20   return "o";.   
0350: 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20 20 20   default:.      
0360: 61 73 73 65 72 74 28 30 29 3b 0a 20 20 7d 0a 7d  assert(0);.  }.}
0370: 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20  .../*.** Return 
0380: 74 68 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f  the 'affinity' o
0390: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
03a0: 20 70 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a   pExpr if any..*
03b0: 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73  *.** If pExpr is
03c0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66   a column, a ref
03d0: 65 72 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75  erence to a colu
03e0: 6d 6e 20 76 69 61 20 61 6e 20 27 41 53 27 20 61  mn via an 'AS' a
03f0: 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75  lias,.** or a su
0400: 62 2d 73 65 6c 65 63 74 20 77 69 74 68 20 61 20  b-select with a 
0410: 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65  column as the re
0420: 74 75 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e  turn value, then
0430: 20 74 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74   the .** affinit
0440: 79 20 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e  y of that column
0450: 20 69 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74   is returned. Ot
0460: 68 65 72 77 69 73 65 2c 20 30 78 30 30 20 69 73  herwise, 0x00 is
0470: 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e   returned,.** in
0480: 64 69 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69  dicating no affi
0490: 6e 69 74 79 20 66 6f 72 20 74 68 65 20 65 78 70  nity for the exp
04a0: 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69  ression..**.** i
04b0: 2e 65 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c  .e. the WHERE cl
04c0: 61 75 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e  ause expresssion
04d0: 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69  s in the followi
04e0: 6e 67 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c  ng statements al
04f0: 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66  l.** have an aff
0500: 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45  inity:.**.** CRE
0510: 41 54 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b  ATE TABLE t1(a);
0520: 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f  .** SELECT * FRO
0530: 4d 20 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a  M t1 WHERE a;.**
0540: 20 53 45 4c 45 43 54 20 61 20 41 53 20 62 20 46   SELECT a AS b F
0550: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a  ROM t1 WHERE b;.
0560: 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d  ** SELECT * FROM
0570: 20 74 31 20 57 48 45 52 45 20 28 73 65 6c 65 63   t1 WHERE (selec
0580: 74 20 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f  t a from t1);.*/
0590: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 45 78 70  .char sqlite3Exp
05a0: 72 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  rAffinity(Expr *
05b0: 70 45 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45  pExpr){.  if( pE
05c0: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29  xpr->op==TK_AS )
05d0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
05e0: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
05f0: 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a  (pExpr->pLeft);.
0600: 20 20 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d    }.  if( pExpr-
0610: 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29  >op==TK_SELECT )
0620: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c  {.    return sql
0630: 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79  ite3ExprAffinity
0640: 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d  (pExpr->pSelect-
0650: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
0660: 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  xpr);.  }.  retu
0670: 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69  rn pExpr->affini
0680: 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74  ty;.}../*.** Ret
0690: 75 72 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20  urn the default 
06a0: 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e  collation sequen
06b0: 63 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ce for the expre
06c0: 73 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a  ssion pExpr. If.
06d0: 2a 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64  ** there is no d
06e0: 65 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e  efault collation
06f0: 20 74 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e   type, return 0.
0700: 0a 2a 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c  .*/.CollSeq *sql
0710: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
0720: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
0730: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43  xpr *pExpr){.  C
0740: 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20  ollSeq *pColl = 
0750: 30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 29  0;.  if( pExpr )
0760: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45  {.    pColl = pE
0770: 78 70 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20  xpr->pColl;.    
0780: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
0790: 4b 5f 41 53 20 26 26 20 21 70 43 6f 6c 6c 20 29  K_AS && !pColl )
07a0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 73  {.      return s
07b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
07c0: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
07d0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20  >pLeft);.    }. 
07e0: 20 7d 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33   }.  if( sqlite3
07f0: 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61  CheckCollSeq(pPa
0800: 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a  rse, pColl) ){ .
0810: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20      pColl = 0;. 
0820: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c   }.  return pCol
0830: 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  l;.}../*.** pExp
0840: 72 20 69 73 20 74 68 65 20 6c 65 66 74 20 6f 70  r is the left op
0850: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0860: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0870: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0880: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0890: 20 74 68 65 20 72 69 67 68 74 20 6f 70 65 72 61   the right opera
08a0: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
08b0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
08c0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
08d0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
08e0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
08f0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
0900: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0910: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0920: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0930: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0940: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0950: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0960: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0970: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0980: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0990: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
09a0: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
09b0: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
09c0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
09d0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
09e0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
09f0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
0a00: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0a10: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0a20: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
0a30: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0a40: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0a50: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
0a60: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
0a70: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
0a80: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0a90: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0aa0: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
0ab0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0ac0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
0ad0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
0ae0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
0af0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
0b00: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0b10: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0b20: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0b30: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0b40: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 55 73 65 20  s a column. Use 
0b50: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
0b60: 0a 20 20 20 20 2a 2a 20 66 6f 72 20 74 68 65 20  .    ** for the 
0b70: 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 20 20 20 20  comparison..    
0b80: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 53 51  */.    return SQ
0b90: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
0ba0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f  ;.  }else{.    /
0bb0: 2a 20 4f 6e 65 20 73 69 64 65 20 69 73 20 61 20  * One side is a 
0bc0: 63 6f 6c 75 6d 6e 2c 20 74 68 65 20 6f 74 68 65  column, the othe
0bd0: 72 20 69 73 20 6e 6f 74 2e 20 55 73 65 20 74 68  r is not. Use th
0be0: 65 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69  e columns affini
0bf0: 74 79 2e 20 2a 2f 0a 20 20 20 20 72 65 74 75 72  ty. */.    retur
0c00: 6e 20 28 61 66 66 31 20 2b 20 61 66 66 32 29 3b  n (aff1 + aff2);
0c10: 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  .  }.}../*.** pE
0c20: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0c30: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 52  son operator.  R
0c40: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
0c50: 66 66 69 6e 69 74 79 20 74 68 61 74 20 73 68 6f  ffinity that sho
0c60: 75 6c 64 0a 2a 2a 20 62 65 20 61 70 70 6c 69 65  uld.** be applie
0c70: 64 20 74 6f 20 62 6f 74 68 20 6f 70 65 72 61 6e  d to both operan
0c80: 64 73 20 70 72 69 6f 72 20 74 6f 20 64 6f 69 6e  ds prior to doin
0c90: 67 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  g the comparison
0ca0: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  ..*/.static char
0cb0: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
0cc0: 69 74 79 28 45 78 70 72 20 2a 70 45 78 70 72 29  ity(Expr *pExpr)
0cd0: 7b 0a 20 20 63 68 61 72 20 61 66 66 3b 0a 20 20  {.  char aff;.  
0ce0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0cf0: 70 3d 3d 54 4b 5f 45 51 20 7c 7c 20 70 45 78 70  p==TK_EQ || pExp
0d00: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20  r->op==TK_IN || 
0d10: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54  pExpr->op==TK_LT
0d20: 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45   ||.          pE
0d30: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c  xpr->op==TK_GT |
0d40: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0d50: 47 45 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  GE || pExpr->op=
0d60: 3d 54 4b 5f 4c 45 20 7c 7c 0a 20 20 20 20 20 20  =TK_LE ||.      
0d70: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0d80: 4b 5f 4e 45 20 29 3b 0a 20 20 61 73 73 65 72 74  K_NE );.  assert
0d90: 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29  ( pExpr->pLeft )
0da0: 3b 0a 20 20 61 66 66 20 3d 20 73 71 6c 69 74 65  ;.  aff = sqlite
0db0: 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70 45  3ExprAffinity(pE
0dc0: 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 69  xpr->pLeft);.  i
0dd0: 66 28 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  f( pExpr->pRight
0de0: 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71   ){.    aff = sq
0df0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
0e00: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 52 69 67  nity(pExpr->pRig
0e10: 68 74 2c 20 61 66 66 29 3b 0a 20 20 7d 0a 20 20  ht, aff);.  }.  
0e20: 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e  else if( pExpr->
0e30: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 61  pSelect ){.    a
0e40: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
0e50: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
0e60: 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69  r->pSelect->pELi
0e70: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20  st->a[0].pExpr, 
0e80: 61 66 66 29 3b 0a 20 20 7d 0a 20 20 65 6c 73 65  aff);.  }.  else
0e90: 20 69 66 28 20 21 61 66 66 20 29 7b 0a 20 20 20   if( !aff ){.   
0ea0: 20 61 66 66 20 3d 20 53 51 4c 49 54 45 5f 41 46   aff = SQLITE_AF
0eb0: 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 7d 0a 20  F_NUMERIC;.  }. 
0ec0: 20 72 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a   return aff;.}..
0ed0: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0ee0: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 65 78 70 72   comparison expr
0ef0: 65 73 73 69 6f 6e 2c 20 65 67 2e 20 27 3d 27 2c  ession, eg. '=',
0f00: 20 27 3c 27 2c 20 49 4e 28 2e 2e 2e 29 20 65 74   '<', IN(...) et
0f10: 63 2e 0a 2a 2a 20 69 64 78 5f 61 66 66 69 6e 69  c..** idx_affini
0f20: 74 79 20 69 73 20 74 68 65 20 61 66 66 69 6e 69  ty is the affini
0f30: 74 79 20 6f 66 20 61 6e 20 69 6e 64 65 78 65 64  ty of an indexed
0f40: 20 63 6f 6c 75 6d 6e 2e 20 52 65 74 75 72 6e 20   column. Return 
0f50: 74 72 75 65 0a 2a 2a 20 69 66 20 74 68 65 20 69  true.** if the i
0f60: 6e 64 65 78 20 77 69 74 68 20 61 66 66 69 6e 69  ndex with affini
0f70: 74 79 20 69 64 78 5f 61 66 66 69 6e 69 74 79 20  ty idx_affinity 
0f80: 6d 61 79 20 62 65 20 75 73 65 64 20 74 6f 20 69  may be used to i
0f90: 6d 70 6c 65 6d 65 6e 74 0a 2a 2a 20 74 68 65 20  mplement.** the 
0fa0: 63 6f 6d 70 61 72 69 73 6f 6e 20 69 6e 20 70 45  comparison in pE
0fb0: 78 70 72 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  xpr..*/.int sqli
0fc0: 74 65 33 49 6e 64 65 78 41 66 66 69 6e 69 74 79  te3IndexAffinity
0fd0: 4f 6b 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20  Ok(Expr *pExpr, 
0fe0: 63 68 61 72 20 69 64 78 5f 61 66 66 69 6e 69 74  char idx_affinit
0ff0: 79 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  y){.  char aff =
1000: 20 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e   comparisonAffin
1010: 69 74 79 28 70 45 78 70 72 29 3b 0a 20 20 72 65  ity(pExpr);.  re
1020: 74 75 72 6e 20 0a 20 20 20 20 28 61 66 66 3d 3d  turn .    (aff==
1030: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 29  SQLITE_AFF_NONE)
1040: 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 53 51   ||.    (aff==SQ
1050: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
1060: 20 26 26 20 69 64 78 5f 61 66 66 69 6e 69 74 79   && idx_affinity
1070: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
1080: 45 47 45 52 29 20 7c 7c 0a 20 20 20 20 28 61 66  EGER) ||.    (af
1090: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e  f==SQLITE_AFF_IN
10a0: 54 45 47 45 52 20 26 26 20 69 64 78 5f 61 66 66  TEGER && idx_aff
10b0: 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41 46  inity==SQLITE_AF
10c0: 46 5f 4e 55 4d 45 52 49 43 29 20 7c 7c 0a 20 20  F_NUMERIC) ||.  
10d0: 20 20 28 61 66 66 3d 3d 69 64 78 5f 61 66 66 69    (aff==idx_affi
10e0: 6e 69 74 79 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  nity);.}../*.** 
10f0: 52 65 74 75 72 6e 20 74 68 65 20 50 31 20 76 61  Return the P1 va
1100: 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c 64 20  lue that should 
1110: 62 65 20 75 73 65 64 20 66 6f 72 20 61 20 62 69  be used for a bi
1120: 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f 6e 0a  nary comparison.
1130: 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f 45 71  ** opcode (OP_Eq
1140: 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20 75 73  , OP_Ge etc.) us
1150: 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20 70 45  ed to compare pE
1160: 78 70 72 31 20 61 6e 64 20 70 45 78 70 72 32 2e  xpr1 and pExpr2.
1170: 0a 2a 2a 20 49 66 20 6a 75 6d 70 49 66 4e 75 6c  .** If jumpIfNul
1180: 6c 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e 20  l is true, then 
1190: 73 65 74 20 74 68 65 20 6c 6f 77 20 62 79 74 65  set the low byte
11a0: 20 6f 66 20 74 68 65 20 72 65 74 75 72 6e 65 64   of the returned
11b0: 0a 2a 2a 20 50 31 20 76 61 6c 75 65 20 74 6f 20  .** P1 value to 
11c0: 74 65 6c 6c 20 74 68 65 20 6f 70 63 6f 64 65 20  tell the opcode 
11d0: 74 6f 20 6a 75 6d 70 20 69 66 20 65 69 74 68 65  to jump if eithe
11e0: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
11f0: 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c  evaluates to NUL
1200: 4c 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  L..*/.static int
1210: 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 31   binaryCompareP1
1220: 28 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45  (Expr *pExpr1, E
1230: 78 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74  xpr *pExpr2, int
1240: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20   jumpIfNull){.  
1250: 63 68 61 72 20 61 66 66 20 3d 20 73 71 6c 69 74  char aff = sqlit
1260: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
1270: 45 78 70 72 32 29 3b 0a 20 20 72 65 74 75 72 6e  Expr2);.  return
1280: 20 28 28 28 69 6e 74 29 73 71 6c 69 74 65 33 43   (((int)sqlite3C
1290: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70  ompareAffinity(p
12a0: 45 78 70 72 31 2c 20 61 66 66 29 29 3c 3c 38 29  Expr1, aff))<<8)
12b0: 2b 28 6a 75 6d 70 49 66 4e 75 6c 6c 3f 31 3a 30  +(jumpIfNull?1:0
12c0: 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  );.}../*.** Retu
12d0: 72 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20  rn a pointer to 
12e0: 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  the collation se
12f0: 71 75 65 6e 63 65 20 74 68 61 74 20 73 68 6f 75  quence that shou
1300: 6c 64 20 62 65 20 75 73 65 64 20 62 79 0a 2a 2a  ld be used by.**
1310: 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61 72   a binary compar
1320: 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 20 63 6f  ison operator co
1330: 6d 70 61 72 69 6e 67 20 70 4c 65 66 74 20 61 6e  mparing pLeft an
1340: 64 20 70 52 69 67 68 74 2e 0a 2a 2a 0a 2a 2a 20  d pRight..**.** 
1350: 49 66 20 74 68 65 20 6c 65 66 74 20 68 61 6e 64  If the left hand
1360: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
1370: 61 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75  a collating sequ
1380: 65 6e 63 65 20 74 79 70 65 2c 20 74 68 65 6e 20  ence type, then 
1390: 69 74 20 69 73 0a 2a 2a 20 75 73 65 64 2e 20 4f  it is.** used. O
13a0: 74 68 65 72 77 69 73 65 20 74 68 65 20 63 6f 6c  therwise the col
13b0: 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20  lation sequence 
13c0: 66 6f 72 20 74 68 65 20 72 69 67 68 74 20 68 61  for the right ha
13d0: 6e 64 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  nd expression.**
13e0: 20 69 73 20 75 73 65 64 2c 20 6f 72 20 74 68 65   is used, or the
13f0: 20 64 65 66 61 75 6c 74 20 28 42 49 4e 41 52 59   default (BINARY
1400: 29 20 69 66 20 6e 65 69 74 68 65 72 20 65 78 70  ) if neither exp
1410: 72 65 73 73 69 6f 6e 20 68 61 73 20 61 20 63 6f  ression has a co
1420: 6c 6c 61 74 69 6e 67 0a 2a 2a 20 74 79 70 65 2e  llating.** type.
1430: 0a 2a 2f 0a 73 74 61 74 69 63 20 43 6f 6c 6c 53  .*/.static CollS
1440: 65 71 2a 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  eq* binaryCompar
1450: 65 43 6f 6c 6c 53 65 71 28 50 61 72 73 65 20 2a  eCollSeq(Parse *
1460: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 4c  pParse, Expr *pL
1470: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1480: 74 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70  t){.  CollSeq *p
1490: 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78  Coll = sqlite3Ex
14a0: 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  prCollSeq(pParse
14b0: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 69 66 28 20  , pLeft);.  if( 
14c0: 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 70 43  !pColl ){.    pC
14d0: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
14e0: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
14f0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 0a 20 20   pRight);.  }.  
1500: 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a  return pColl;.}.
1510: 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  ./*.** Construct
1520: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
1530: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
1540: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
1550: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
1560: 72 20 74 68 69 73 20 6e 6f 64 65 20 69 73 20 6f  r this node is o
1570: 62 74 61 69 6e 65 64 20 66 72 6f 6d 20 73 71 6c  btained from sql
1580: 69 74 65 4d 61 6c 6c 6f 63 28 29 2e 20 20 54 68  iteMalloc().  Th
1590: 65 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69  e calling functi
15a0: 6f 6e 0a 2a 2a 20 69 73 20 72 65 73 70 6f 6e 73  on.** is respons
15b0: 69 62 6c 65 20 66 6f 72 20 6d 61 6b 69 6e 67 20  ible for making 
15c0: 73 75 72 65 20 74 68 65 20 6e 6f 64 65 20 65 76  sure the node ev
15d0: 65 6e 74 75 61 6c 6c 79 20 67 65 74 73 20 66 72  entually gets fr
15e0: 65 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71  eed..*/.Expr *sq
15f0: 6c 69 74 65 33 45 78 70 72 28 69 6e 74 20 6f 70  lite3Expr(int op
1600: 2c 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45  , Expr *pLeft, E
1610: 78 70 72 20 2a 70 52 69 67 68 74 2c 20 54 6f 6b  xpr *pRight, Tok
1620: 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45  en *pToken){.  E
1630: 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65  xpr *pNew;.  pNe
1640: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
1650: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29  ( sizeof(Expr) )
1660: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
1670: 29 7b 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d  ){.    /* When m
1680: 61 6c 6c 6f 63 20 66 61 69 6c 73 2c 20 77 65 20  alloc fails, we 
1690: 6c 65 61 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d  leak memory from
16a0: 20 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68   pLeft and pRigh
16b0: 74 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20  t */.    return 
16c0: 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f  0;.  }.  pNew->o
16d0: 70 20 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e  p = op;.  pNew->
16e0: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
16f0: 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20   pNew->pRight = 
1700: 70 52 69 67 68 74 3b 0a 20 20 69 66 28 20 70 54  pRight;.  if( pT
1710: 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65  oken ){.    asse
1720: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d  rt( pToken->dyn=
1730: 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  =0 );.    pNew->
1740: 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b  token = *pToken;
1750: 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20  .    pNew->span 
1760: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
1770: 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20  se{.    assert( 
1780: 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 3d  pNew->token.dyn=
1790: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17a0: 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d  ( pNew->token.z=
17b0: 3d 30 20 29 3b 0a 20 20 20 20 61 73 73 65 72 74  =0 );.    assert
17c0: 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 6e 3d  ( pNew->token.n=
17d0: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
17e0: 65 66 74 20 26 26 20 70 52 69 67 68 74 20 29 7b  eft && pRight ){
17f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1800: 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c  prSpan(pNew, &pL
1810: 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67  eft->span, &pRig
1820: 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  ht->span);.    }
1830: 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 4e 65 77  else{.      pNew
1840: 2d 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74  ->span = pNew->t
1850: 6f 6b 65 6e 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  oken;.    }.  }.
1860: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
1870: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1880: 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20  Expr.span field 
1890: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
18a0: 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20  ression to span 
18b0: 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77  all.** text betw
18c0: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
18d0: 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69  n tokens..*/.voi
18e0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61  d sqlite3ExprSpa
18f0: 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  n(Expr *pExpr, T
1900: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
1910: 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61  en *pRight){.  a
1920: 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
1930: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1940: 65 66 74 21 3d 30 20 29 3b 0a 20 20 2f 2a 20 4e  eft!=0 );.  /* N
1950: 6f 74 65 3a 20 70 45 78 70 72 20 6d 69 67 68 74  ote: pExpr might
1960: 20 62 65 20 4e 55 4c 4c 20 64 75 65 20 74 6f 20   be NULL due to 
1970: 61 20 70 72 69 6f 72 20 6d 61 6c 6c 6f 63 20 66  a prior malloc f
1980: 61 69 6c 75 72 65 20 2a 2f 0a 20 20 69 66 28 20  ailure */.  if( 
1990: 70 45 78 70 72 20 26 26 20 70 52 69 67 68 74 2d  pExpr && pRight-
19a0: 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29  >z && pLeft->z )
19b0: 7b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d  {.    if( pLeft-
19c0: 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67 68  >dyn==0 && pRigh
19d0: 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20 20  t->dyn==0 ){.   
19e0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
19f0: 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20 20   = pLeft->z;.   
1a00: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e     pExpr->span.n
1a10: 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20 41   = pRight->n + A
1a20: 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20 2d  ddr(pRight->z) -
1a30: 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29 3b   Addr(pLeft->z);
1a40: 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  .    }else{.    
1a50: 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20    pExpr->span.z 
1a60: 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d  = 0;.    }.  }.}
1a70: 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63  ../*.** Construc
1a80: 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69  t a new expressi
1a90: 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66 75  on node for a fu
1aa0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c 74  nction with mult
1ab0: 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e 74  iple.** argument
1ac0: 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  s..*/.Expr *sqli
1ad0: 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e 28  te3ExprFunction(
1ae0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
1af0: 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29 7b   Token *pToken){
1b00: 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20  .  Expr *pNew;. 
1b10: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
1b20: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
1b30: 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  r) );.  if( pNew
1b40: 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73 71  ==0 ){.    /* sq
1b50: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c  lite3ExprListDel
1b60: 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2f 20 4c  ete(pList); // L
1b70: 65 61 6b 20 70 4c 69 73 74 20 77 68 65 6e 20 6d  eak pList when m
1b80: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
1b90: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
1ba0: 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54 4b  .  pNew->op = TK
1bb0: 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e 65  _FUNCTION;.  pNe
1bc0: 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73 74  w->pList = pList
1bd0: 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20 29  ;.  if( pToken )
1be0: 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 54  {.    assert( pT
1bf0: 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a  oken->dyn==0 );.
1c00: 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 20      pNew->token 
1c10: 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65 6c  = *pToken;.  }el
1c20: 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f  se{.    pNew->to
1c30: 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 20  ken.z = 0;.  }. 
1c40: 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e   pNew->span = pN
1c50: 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65 74  ew->token;.  ret
1c60: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
1c70: 2a 2a 20 52 65 63 75 72 73 69 76 65 6c 79 20 64  ** Recursively d
1c80: 65 6c 65 74 65 20 61 6e 20 65 78 70 72 65 73 73  elete an express
1c90: 69 6f 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69  ion tree..*/.voi
1ca0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  d sqlite3ExprDel
1cb0: 65 74 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ete(Expr *p){.  
1cc0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
1cd0: 6e 3b 0a 20 20 69 66 28 20 70 2d 3e 73 70 61 6e  n;.  if( p->span
1ce0: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  .dyn ) sqliteFre
1cf0: 65 28 28 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e  e((char*)p->span
1d00: 2e 7a 29 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f  .z);.  if( p->to
1d10: 6b 65 6e 2e 64 79 6e 20 29 20 73 71 6c 69 74 65  ken.dyn ) sqlite
1d20: 46 72 65 65 28 28 63 68 61 72 2a 29 70 2d 3e 74  Free((char*)p->t
1d30: 6f 6b 65 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74  oken.z);.  sqlit
1d40: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e  e3ExprDelete(p->
1d50: 70 4c 65 66 74 29 3b 0a 20 20 73 71 6c 69 74 65  pLeft);.  sqlite
1d60: 33 45 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70  3ExprDelete(p->p
1d70: 52 69 67 68 74 29 3b 0a 20 20 73 71 6c 69 74 65  Right);.  sqlite
1d80: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
1d90: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c  p->pList);.  sql
1da0: 69 74 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65  ite3SelectDelete
1db0: 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20  (p->pSelect);.  
1dc0: 73 71 6c 69 74 65 46 72 65 65 28 70 29 3b 0a 7d  sqliteFree(p);.}
1dd0: 0a 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c  .../*.** The fol
1de0: 6c 6f 77 69 6e 67 20 67 72 6f 75 70 20 6f 66 20  lowing group of 
1df0: 72 6f 75 74 69 6e 65 73 20 6d 61 6b 65 20 64 65  routines make de
1e00: 65 70 20 63 6f 70 69 65 73 20 6f 66 20 65 78 70  ep copies of exp
1e10: 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70  ressions,.** exp
1e20: 72 65 73 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49  ression lists, I
1e30: 44 20 6c 69 73 74 73 2c 20 61 6e 64 20 73 65 6c  D lists, and sel
1e40: 65 63 74 20 73 74 61 74 65 6d 65 6e 74 73 2e 20  ect statements. 
1e50: 20 54 68 65 20 63 6f 70 69 65 73 20 63 61 6e 0a   The copies can.
1e60: 2a 2a 20 62 65 20 64 65 6c 65 74 65 64 20 28 62  ** be deleted (b
1e70: 79 20 62 65 69 6e 67 20 70 61 73 73 65 64 20 74  y being passed t
1e80: 6f 20 74 68 65 69 72 20 72 65 73 70 65 63 74 69  o their respecti
1e90: 76 65 20 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72  ve ...Delete() r
1ea0: 6f 75 74 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68  outines).** with
1eb0: 6f 75 74 20 65 66 66 65 63 74 69 6e 67 20 74 68  out effecting th
1ec0: 65 20 6f 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a  e originals..**.
1ed0: 2a 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f  ** The expressio
1ee0: 6e 20 6c 69 73 74 2c 20 49 44 2c 20 61 6e 64 20  n list, ID, and 
1ef0: 73 6f 75 72 63 65 20 6c 69 73 74 73 20 72 65 74  source lists ret
1f00: 75 72 6e 20 62 79 20 73 71 6c 69 74 65 33 45 78  urn by sqlite3Ex
1f10: 70 72 4c 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20  prListDup(),.** 
1f20: 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70  sqlite3IdListDup
1f30: 28 29 2c 20 61 6e 64 20 73 71 6c 69 74 65 33 53  (), and sqlite3S
1f40: 72 63 4c 69 73 74 44 75 70 28 29 20 63 61 6e 20  rcListDup() can 
1f50: 6e 6f 74 20 62 65 20 66 75 72 74 68 65 72 20 65  not be further e
1f60: 78 70 61 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73  xpanded .** by s
1f70: 75 62 73 65 71 75 65 6e 74 20 63 61 6c 6c 73 20  ubsequent calls 
1f80: 74 6f 20 73 71 6c 69 74 65 2a 4c 69 73 74 41 70  to sqlite*ListAp
1f90: 70 65 6e 64 28 29 20 72 6f 75 74 69 6e 65 73 2e  pend() routines.
1fa0: 0a 2a 2a 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65  .**.** Any table
1fb0: 73 20 74 68 61 74 20 74 68 65 20 53 72 63 4c 69  s that the SrcLi
1fc0: 73 74 20 6d 69 67 68 74 20 70 6f 69 6e 74 20 74  st might point t
1fd0: 6f 20 61 72 65 20 6e 6f 74 20 64 75 70 6c 69 63  o are not duplic
1fe0: 61 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  ated..*/.Expr *s
1ff0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 45 78  qlite3ExprDup(Ex
2000: 70 72 20 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a  pr *p){.  Expr *
2010: 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30  pNew;.  if( p==0
2020: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70   ) return 0;.  p
2030: 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  New = sqliteMall
2040: 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70  ocRaw( sizeof(*p
2050: 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d  ) );.  if( pNew=
2060: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2070: 20 6d 65 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c   memcpy(pNew, p,
2080: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b   sizeof(*pNew));
2090: 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e  .  if( p->token.
20a0: 7a 21 3d 30 20 29 7b 0a 20 20 20 20 70 4e 65 77  z!=0 ){.    pNew
20b0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69  ->token.z = sqli
20c0: 74 65 53 74 72 44 75 70 28 70 2d 3e 74 6f 6b 65  teStrDup(p->toke
20d0: 6e 2e 7a 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e  n.z);.    pNew->
20e0: 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20  token.dyn = 1;. 
20f0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 61 73 73 65   }else{.    asse
2100: 72 74 28 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e  rt( pNew->token.
2110: 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e  z==0 );.  }.  pN
2120: 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a  ew->span.z = 0;.
2130: 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20    pNew->pLeft = 
2140: 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70  sqlite3ExprDup(p
2150: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77  ->pLeft);.  pNew
2160: 2d 3e 70 52 69 67 68 74 20 3d 20 73 71 6c 69 74  ->pRight = sqlit
2170: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 52 69  e3ExprDup(p->pRi
2180: 67 68 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  ght);.  pNew->pL
2190: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
21a0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4c 69 73  rListDup(p->pLis
21b0: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c  t);.  pNew->pSel
21c0: 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c  ect = sqlite3Sel
21d0: 65 63 74 44 75 70 28 70 2d 3e 70 53 65 6c 65 63  ectDup(p->pSelec
21e0: 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  t);.  return pNe
21f0: 77 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65  w;.}.void sqlite
2200: 33 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e  3TokenCopy(Token
2210: 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46   *pTo, Token *pF
2220: 72 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d  rom){.  if( pTo-
2230: 3e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  >dyn ) sqliteFre
2240: 65 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29  e((char*)pTo->z)
2250: 3b 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a  ;.  if( pFrom->z
2260: 20 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d   ){.    pTo->n =
2270: 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70   pFrom->n;.    p
2280: 54 6f 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74  To->z = sqliteSt
2290: 72 4e 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20  rNDup(pFrom->z, 
22a0: 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70  pFrom->n);.    p
22b0: 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d  To->dyn = 1;.  }
22c0: 65 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a  else{.    pTo->z
22d0: 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72   = 0;.  }.}.Expr
22e0: 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70  List *sqlite3Exp
22f0: 72 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73  rListDup(ExprLis
2300: 74 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73  t *p){.  ExprLis
2310: 74 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63  t *pNew;.  struc
2320: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
2330: 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b  *pItem;.  int i;
2340: 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65  .  if( p==0 ) re
2350: 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d  turn 0;.  pNew =
2360: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73   sqliteMalloc( s
2370: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
2380: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
2390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
23a0: 2d 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e  ->nExpr = pNew->
23b0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70  nAlloc = p->nExp
23c0: 72 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70  r;.  pNew->a = p
23d0: 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c  Item = sqliteMal
23e0: 6c 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69  loc( p->nExpr*si
23f0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
2400: 0a 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20  .  if( pItem==0 
2410: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
2420: 65 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74  e(pNew);.    ret
2430: 75 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 66 6f  urn 0;.  } .  fo
2440: 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70  r(i=0; i<p->nExp
2450: 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29  r; i++, pItem++)
2460: 7b 0a 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77  {.    Expr *pNew
2470: 45 78 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b  Expr, *pOldExpr;
2480: 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70  .    pItem->pExp
2490: 72 20 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73  r = pNewExpr = s
24a0: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 4f  qlite3ExprDup(pO
24b0: 6c 64 45 78 70 72 20 3d 20 70 2d 3e 61 5b 69 5d  ldExpr = p->a[i]
24c0: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  .pExpr);.    if(
24d0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
24e0: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
24f0: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
2500: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
2510: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
2520: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
2530: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
2540: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
2550: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
2560: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
2570: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
2580: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
2590: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
25a0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
25b0: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
25c0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
25d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
25e0: 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45 78 70  kenCopy(&pNewExp
25f0: 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78  r->span, &pOldEx
2600: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  pr->span);.    }
2610: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
2620: 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77  wExpr==0 || pNew
2630: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
2640: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
2650: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pOldExpr->span.z
2660: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
2670: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a  alloc_failed );.
2680: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
2690: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
26a0: 70 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a  p->a[i].zName);.
26b0: 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f      pItem->sortO
26c0: 72 64 65 72 20 3d 20 70 2d 3e 61 5b 69 5d 2e 73  rder = p->a[i].s
26d0: 6f 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49  ortOrder;.    pI
26e0: 74 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 2d 3e  tem->isAgg = p->
26f0: 61 5b 69 5d 2e 69 73 41 67 67 3b 0a 20 20 20 20  a[i].isAgg;.    
2700: 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b  pItem->done = 0;
2710: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
2720: 65 77 3b 0a 7d 0a 53 72 63 4c 69 73 74 20 2a 73  ew;.}.SrcList *s
2730: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
2740: 28 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20  (SrcList *p){.  
2750: 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20  SrcList *pNew;. 
2760: 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42   int i;.  int nB
2770: 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20  yte;.  if( p==0 
2780: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42  ) return 0;.  nB
2790: 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29  yte = sizeof(*p)
27a0: 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20   + (p->nSrc>0 ? 
27b0: 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20  sizeof(p->a[0]) 
27c0: 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20  * (p->nSrc-1) : 
27d0: 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c  0);.  pNew = sql
27e0: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42  iteMallocRaw( nB
27f0: 79 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  yte );.  if( pNe
2800: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
2810: 0a 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20  .  pNew->nSrc = 
2820: 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70  pNew->nAlloc = p
2830: 2d 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d  ->nSrc;.  for(i=
2840: 30 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b  0; i<p->nSrc; i+
2850: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53  +){.    struct S
2860: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65  rcList_item *pNe
2870: 77 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61  wItem = &pNew->a
2880: 5b 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20  [i];.    struct 
2890: 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f  SrcList_item *pO
28a0: 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69  ldItem = &p->a[i
28b0: 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  ];.    pNewItem-
28c0: 3e 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c  >zDatabase = sql
28d0: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
28e0: 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a  em->zDatabase);.
28f0: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e      pNewItem->zN
2900: 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ame = sqliteStrD
2910: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61  up(pOldItem->zNa
2920: 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  me);.    pNewIte
2930: 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69  m->zAlias = sqli
2940: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
2950: 6d 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20  m->zAlias);.    
2960: 70 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79  pNewItem->jointy
2970: 70 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a  pe = pOldItem->j
2980: 6f 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65  ointype;.    pNe
2990: 77 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d  wItem->iCursor =
29a0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73   pOldItem->iCurs
29b0: 6f 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  or;.    pNewItem
29c0: 2d 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20  ->pTab = 0;.    
29d0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63  pNewItem->pSelec
29e0: 74 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63  t = sqlite3Selec
29f0: 74 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  tDup(pOldItem->p
2a00: 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65  Select);.    pNe
2a10: 77 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c  wItem->pOn = sql
2a20: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64  ite3ExprDup(pOld
2a30: 49 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20  Item->pOn);.    
2a40: 70 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67  pNewItem->pUsing
2a50: 20 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74   = sqlite3IdList
2a60: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55  Dup(pOldItem->pU
2a70: 73 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74  sing);.  }.  ret
2a80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69  urn pNew;.}.IdLi
2a90: 73 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73  st *sqlite3IdLis
2aa0: 74 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b  tDup(IdList *p){
2ab0: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
2ac0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
2ad0: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
2ae0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
2af0: 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f  MallocRaw( sizeo
2b00: 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66  f(*pNew) );.  if
2b10: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
2b20: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49  rn 0;.  pNew->nI
2b30: 64 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  d = pNew->nAlloc
2b40: 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65   = p->nId;.  pNe
2b50: 77 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c  w->a = sqliteMal
2b60: 6c 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73  locRaw( p->nId*s
2b70: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29  izeof(p->a[0]) )
2b80: 3b 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d  ;.  if( pNew->a=
2b90: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
2ba0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
2bb0: 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74  Id; i++){.    st
2bc0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
2bd0: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
2be0: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
2bf0: 72 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d  ruct IdList_item
2c00: 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d   *pOldItem = &p-
2c10: 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49  >a[i];.    pNewI
2c20: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
2c30: 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74  iteStrDup(pOldIt
2c40: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20  em->zName);.    
2c50: 70 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20  pNewItem->idx = 
2c60: 70 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20  pOldItem->idx;. 
2c70: 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77   }.  return pNew
2c80: 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69  ;.}.Select *sqli
2c90: 74 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c  te3SelectDup(Sel
2ca0: 65 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63  ect *p){.  Selec
2cb0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70  t *pNew;.  if( p
2cc0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2cd0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
2ce0: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
2cf0: 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  (*p) );.  if( pN
2d00: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
2d10: 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74  ;.  pNew->isDist
2d20: 69 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74  inct = p->isDist
2d30: 69 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45  inct;.  pNew->pE
2d40: 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78  List = sqlite3Ex
2d50: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c  prListDup(p->pEL
2d60: 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53  ist);.  pNew->pS
2d70: 72 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c  rc = sqlite3SrcL
2d80: 69 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b  istDup(p->pSrc);
2d90: 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20  .  pNew->pWhere 
2da0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
2db0: 28 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70  (p->pWhere);.  p
2dc0: 4e 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20  New->pGroupBy = 
2dd0: 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44  sqlite3ExprListD
2de0: 75 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b  up(p->pGroupBy);
2df0: 0a 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67  .  pNew->pHaving
2e00: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75   = sqlite3ExprDu
2e10: 70 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20  p(p->pHaving);. 
2e20: 20 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20   pNew->pOrderBy 
2e30: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  = sqlite3ExprLis
2e40: 74 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79  tDup(p->pOrderBy
2e50: 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20  );.  pNew->op = 
2e60: 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70  p->op;.  pNew->p
2e70: 50 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53  Prior = sqlite3S
2e80: 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69  electDup(p->pPri
2e90: 6f 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69  or);.  pNew->nLi
2ea0: 6d 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b  mit = p->nLimit;
2eb0: 0a 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74  .  pNew->nOffset
2ec0: 20 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20   = p->nOffset;. 
2ed0: 20 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d   pNew->zSelect =
2ee0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d   0;.  pNew->iLim
2ef0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
2f00: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
2f10: 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65 6d   pNew->ppOpenTem
2f20: 70 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20  p = 0;.  return 
2f30: 70 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  pNew;.}.../*.** 
2f40: 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e  Add a new elemen
2f50: 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20  t to the end of 
2f60: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
2f70: 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73  st.  If pList is
2f80: 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55  .** initially NU
2f90: 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20  LL, then create 
2fa0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
2fb0: 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69   list..*/.ExprLi
2fc0: 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c  st *sqlite3ExprL
2fd0: 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69  istAppend(ExprLi
2fe0: 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20  st *pList, Expr 
2ff0: 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70  *pExpr, Token *p
3000: 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69  Name){.  if( pLi
3010: 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69  st==0 ){.    pLi
3020: 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  st = sqliteMallo
3030: 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69  c( sizeof(ExprLi
3040: 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70  st) );.    if( p
3050: 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20  List==0 ){.     
3060: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
3070: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
3080: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
3090: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
30a0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a        return 0;.
30b0: 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74      }.    assert
30c0: 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d  ( pList->nAlloc=
30d0: 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  =0 );.  }.  if( 
30e0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70  pList->nAlloc<=p
30f0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20  List->nExpr ){. 
3100: 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63     pList->nAlloc
3110: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
3120: 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73  *2 + 4;.    pLis
3130: 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61  t->a = sqliteRea
3140: 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70  lloc(pList->a, p
3150: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a  List->nAlloc*siz
3160: 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29  eof(pList->a[0])
3170: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74  );.    if( pList
3180: 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ->a==0 ){.      
3190: 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  /* sqlite3ExprDe
31a0: 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20  lete(pExpr); // 
31b0: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d  Leak memory if m
31c0: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
31d0: 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70       pList->nExp
31e0: 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  r = pList->nAllo
31f0: 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74  c = 0;.      ret
3200: 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d  urn pList;.    }
3210: 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70  .  }.  assert( p
3220: 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20  List->a!=0 );.  
3230: 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61  if( pExpr || pNa
3240: 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74  me ){.    struct
3250: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3260: 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e  pItem = &pList->
3270: 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b  a[pList->nExpr++
3280: 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49  ];.    memset(pI
3290: 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a  tem, 0, sizeof(*
32a0: 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74  pItem));.    pIt
32b0: 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
32c0: 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e  r;.    pItem->zN
32d0: 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  ame = sqlite3Nam
32e0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65  eFromToken(pName
32f0: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
3300: 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  pList;.}../*.** 
3310: 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65  Delete an entire
3320: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
3330: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
3340: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
3350: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29  ExprList *pList)
3360: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
3370: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
3380: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
3390: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
33a0: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
33b0: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
33c0: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
33d0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
33e0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
33f0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 4c 69 73   for(i=0; i<pLis
3400: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a  t->nExpr; i++){.
3410: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44      sqlite3ExprD
3420: 65 6c 65 74 65 28 70 4c 69 73 74 2d 3e 61 5b 69  elete(pList->a[i
3430: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71  ].pExpr);.    sq
3440: 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e  liteFree(pList->
3450: 61 5b 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 7d  a[i].zName);.  }
3460: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c  .  sqliteFree(pL
3470: 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74  ist->a);.  sqlit
3480: 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a  eFree(pList);.}.
3490: 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65  ./*.** Walk an e
34a0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
34b0: 20 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65   Return 1 if the
34c0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63   expression is c
34d0: 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30  onstant.** and 0
34e0: 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20   if it involves 
34f0: 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a  variables..**.**
3500: 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f 73 65   For the purpose
3510: 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74 69  s of this functi
3520: 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f  on, a double-quo
3530: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
3540: 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e  "abc").** is con
3550: 73 69 64 65 72 65 64 20 61 20 76 61 72 69 61 62  sidered a variab
3560: 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c 65 2d  le but a single-
3570: 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65  quoted string (e
3580: 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a 2a 20  x: 'abc') is.** 
3590: 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69  a constant..*/.i
35a0: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
35b0: 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70  Constant(Expr *p
35c0: 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 2d 3e  ){.  switch( p->
35d0: 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54  op ){.    case T
35e0: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
35f0: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
3600: 73 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63  se TK_DOT:.    c
3610: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
3620: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
3630: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c  .    case TK_NUL
3640: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  L:.    case TK_S
3650: 54 52 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20  TRING:.    case 
3660: 54 4b 5f 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_BLOB:.    cas
3670: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20  e TK_INTEGER:.  
3680: 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a    case TK_FLOAT:
3690: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52  .    case TK_VAR
36a0: 49 41 42 4c 45 3a 0a 20 20 20 20 20 20 72 65 74  IABLE:.      ret
36b0: 75 72 6e 20 31 3b 0a 20 20 20 20 64 65 66 61 75  urn 1;.    defau
36c0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
36d0: 70 2d 3e 70 4c 65 66 74 20 26 26 20 21 73 71 6c  p->pLeft && !sql
36e0: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
36f0: 6e 74 28 70 2d 3e 70 4c 65 66 74 29 20 29 20 72  nt(p->pLeft) ) r
3700: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 69  eturn 0;.      i
3710: 66 28 20 70 2d 3e 70 52 69 67 68 74 20 26 26 20  f( p->pRight && 
3720: 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f  !sqlite3ExprIsCo
3730: 6e 73 74 61 6e 74 28 70 2d 3e 70 52 69 67 68 74  nstant(p->pRight
3740: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
3750: 20 20 20 20 69 66 28 20 70 2d 3e 70 4c 69 73 74      if( p->pList
3760: 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e 74 20   ){.        int 
3770: 69 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  i;.        for(i
3780: 3d 30 3b 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e  =0; i<p->pList->
3790: 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20  nExpr; i++){.   
37a0: 20 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69         if( !sqli
37b0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
37c0: 74 28 70 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d  t(p->pList->a[i]
37d0: 2e 70 45 78 70 72 29 20 29 20 72 65 74 75 72 6e  .pExpr) ) return
37e0: 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20   0;.        }.  
37f0: 20 20 20 20 7d 0a 20 20 20 20 20 20 72 65 74 75      }.      retu
3800: 72 6e 20 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c  rn p->pLeft!=0 |
3810: 7c 20 70 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c  | p->pRight!=0 |
3820: 7c 20 28 70 2d 3e 70 4c 69 73 74 20 26 26 20 70  | (p->pList && p
3830: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ->pList->nExpr>0
3840: 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72  );.    }.  }.  r
3850: 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn 0;.}../*.*
3860: 2a 20 49 66 20 74 68 65 20 67 69 76 65 6e 20 65  * If the given e
3870: 78 70 72 65 73 73 69 6f 6e 20 63 6f 64 65 73 20  xpression codes 
3880: 61 20 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67  a constant integ
3890: 65 72 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c  er that is small
38a0: 20 65 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69   enough.** to fi
38b0: 74 20 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e  t in a 32-bit in
38c0: 74 65 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20  teger, return 1 
38d0: 61 6e 64 20 70 75 74 20 74 68 65 20 76 61 6c 75  and put the valu
38e0: 65 20 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72  e of the integer
38f0: 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20  .** in *pValue. 
3900: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
3910: 6f 6e 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74  on is not an int
3920: 65 67 65 72 20 6f 72 20 69 66 20 69 74 20 69 73  eger or if it is
3930: 20 74 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66   too big.** to f
3940: 69 74 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33  it in a signed 3
3950: 32 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72  2-bit integer, r
3960: 65 74 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76  eturn 0 and leav
3970: 65 20 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e  e *pValue unchan
3980: 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ged..*/.int sqli
3990: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
39a0: 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70  (Expr *p, int *p
39b0: 56 61 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68  Value){.  switch
39c0: 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  ( p->op ){.    c
39d0: 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20  ase TK_INTEGER: 
39e0: 7b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  {.      if( sqli
39f0: 74 65 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74  te3GetInt32(p->t
3a00: 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20  oken.z, pValue) 
3a10: 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72  ){.        retur
3a20: 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  n 1;.      }.   
3a30: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
3a40: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
3a50: 4e 47 3a 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73  NG: {.      cons
3a60: 74 20 63 68 61 72 20 2a 7a 20 3d 20 70 2d 3e 74  t char *z = p->t
3a70: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
3a80: 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  t n = p->token.n
3a90: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
3aa0: 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20  && z[0]=='-' ){ 
3ab0: 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  z++; n--; }.    
3ac0: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
3ad0: 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28 2a 7a  *z && isdigit(*z
3ae0: 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d  ) ){ z++; n--; }
3af0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
3b00: 26 26 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  && sqlite3GetInt
3b10: 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  32(p->token.z, p
3b20: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
3b30: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
3b40: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
3b50: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3b60: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
3b70: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
3b80: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
3b90: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
3ba0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
3bb0: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
3bc0: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
3bd0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
3be0: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
3bf0: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
3c00: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
3c10: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
3c20: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
3c30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
3c40: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
3c50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
3c60: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
3c70: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
3c80: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
3c90: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
3ca0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
3cb0: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
3cc0: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
3cd0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
3ce0: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
3cf0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
3d00: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3d10: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
3d20: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
3d30: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
3d40: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
3d50: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
3d60: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
3d70: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
3d80: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
3d90: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
3da0: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
3db0: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
3dc0: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
3dd0: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
3de0: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
3df0: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
3e00: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
3e10: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
3e20: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
3e30: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
3e40: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
3e50: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
3e60: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
3e70: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
3e80: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
3e90: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
3ea0: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
3eb0: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
3ec0: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
3ed0: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
3ee0: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
3ef0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
3f00: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
3f10: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
3f20: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
3f30: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
3f40: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
3f50: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
3f60: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
3f70: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
3f80: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
3f90: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
3fa0: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
3fb0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
3fc0: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
3fd0: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
3fe0: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
3ff0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
4000: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
4010: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
4020: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
4030: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
4040: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
4050: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
4060: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
4070: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
4080: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
4090: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
40a0: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
40b0: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
40c0: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
40d0: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
40e0: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
40f0: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
4100: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
4110: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
4120: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
4130: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
4140: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
4150: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
4160: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
4170: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
4180: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
4190: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
41a0: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
41b0: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
41c0: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
41d0: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
41e0: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
41f0: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
4200: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
4210: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
4220: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
4230: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
4240: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
4250: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4260: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
4270: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4280: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
4290: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
42a0: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
42b0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
42c0: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
42d0: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
42e0: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
42f0: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
4300: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
4310: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
4320: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
4330: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
4340: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
4350: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
4360: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
4370: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
4380: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
4390: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
43a0: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
43b0: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
43c0: 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  /* List of expre
43d0: 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72  ssions used to r
43e0: 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20  esolve "AS" */. 
43f0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
4400: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
4410: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
4420: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
4430: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
4440: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
4450: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
4460: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
4470: 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e   The "X" in X.Y.
4480: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  Z */.  char *zTa
4490: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
44a0: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
44b0: 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e  .  The "Y" in X.
44c0: 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20  Y.Z or Y.Z */.  
44d0: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20  char *zCol = 0; 
44e0: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
44f0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  the column.  The
4500: 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   "Z" */.  int i,
4510: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
4520: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
4530: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
4540: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
4550: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
4560: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
4570: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
4580: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
4590: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
45a0: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71  le names */.  sq
45b0: 6c 69 74 65 20 2a 64 62 20 3d 20 70 50 61 72 73  lite *db = pPars
45c0: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
45d0: 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61 73  atabase */..  as
45e0: 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f 6b  sert( pColumnTok
45f0: 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f 6b  en && pColumnTok
4600: 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65 20  en->z ); /* The 
4610: 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e 6f  Z in X.Y.Z canno
4620: 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20 7a  t be NULL */.  z
4630: 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  Db = sqlite3Name
4640: 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f 6b  FromToken(pDbTok
4650: 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73 71  en);.  zTab = sq
4660: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
4670: 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29 3b  en(pTableToken);
4680: 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74 65  .  zCol = sqlite
4690: 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70  3NameFromToken(p
46a0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20 20  ColumnToken);.  
46b0: 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c  if( sqlite3_mall
46c0: 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20 20  oc_failed ){.   
46d0: 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20 4c   return 1;  /* L
46e0: 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62 20  eak memory (zDb 
46f0: 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61 6c  and zTab) if mal
4700: 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 7d  loc fails */.  }
4710: 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d  .  assert( zTab=
4720: 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20  =0 || pEList==0 
4730: 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61  );..  pExpr->iTa
4740: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72 28  ble = -1;.  for(
4750: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
4760: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
4770: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
4780: 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70  item *pItem = &p
4790: 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a 20  SrcList->a[i];. 
47a0: 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20 3d     Table *pTab =
47b0: 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20   pItem->pTab;.  
47c0: 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a    Column *pCol;.
47d0: 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30  .    if( pTab==0
47e0: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
47f0: 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e   assert( pTab->n
4800: 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66 28  Col>0 );.    if(
4810: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 69   zTab ){.      i
4820: 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73  f( pItem->zAlias
4830: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72   ){.        char
4840: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
4850: 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
4860: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
4870: 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c  trICmp(zTabName,
4880: 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74   zTab)!=0 ) cont
4890: 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c 73  inue;.      }els
48a0: 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  e{.        char 
48b0: 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62  *zTabName = pTab
48c0: 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20  ->zName;.       
48d0: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
48e0: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
48f0: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
4900: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
4910: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 44  ;.        if( zD
4920: 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  b!=0 && sqlite3S
4930: 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70  trICmp(db->aDb[p
4940: 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c  Tab->iDb].zName,
4950: 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20   zDb)!=0 ){.    
4960: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
4970: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
4980: 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  }.    }.    if( 
4990: 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29 7b  0==(cntTab++) ){
49a0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
49b0: 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43  able = pItem->iC
49c0: 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45 78  ursor;.      pEx
49d0: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
49e0: 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20 66  iDb;.    }.    f
49f0: 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54 61  or(j=0, pCol=pTa
4a00: 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62 2d  b->aCol; j<pTab-
4a10: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c  >nCol; j++, pCol
4a20: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 73  ++){.      if( s
4a30: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
4a40: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
4a50: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 63  ==0 ){.        c
4a60: 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70 45  nt++;.        pE
4a70: 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49  xpr->iTable = pI
4a80: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
4a90: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62        pExpr->iDb
4aa0: 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20   = pTab->iDb;.  
4ab0: 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69 74        /* Substit
4ac0: 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28 63  ute the rowid (c
4ad0: 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74 68  olumn -1) for th
4ae0: 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41 52  e INTEGER PRIMAR
4af0: 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20 20  Y KEY */.       
4b00: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
4b10: 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79  = j==pTab->iPKey
4b20: 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20   ? -1 : j;.     
4b30: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
4b40: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
4b50: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
4b60: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c       pExpr->pCol
4b70: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a  l = pTab->aCol[j
4b80: 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20  ].pColl;.       
4b90: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
4ba0: 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
4bb0: 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74 20 61  If we have not a
4bc0: 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65 64 20  lready resolved 
4bd0: 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d  the name, then m
4be0: 61 79 62 65 20 0a 20 20 2a 2a 20 69 74 20 69 73  aybe .  ** it is
4bf0: 20 61 20 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e   a new.* or old.
4c00: 2a 20 74 72 69 67 67 65 72 20 61 72 67 75 6d 65  * trigger argume
4c10: 6e 74 20 72 65 66 65 72 65 6e 63 65 0a 20 20 2a  nt reference.  *
4c20: 2f 0a 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26  /.  if( zDb==0 &
4c30: 26 20 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74  & zTab!=0 && cnt
4c40: 3d 3d 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74  ==0 && pParse->t
4c50: 72 69 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20  rigStack!=0 ){. 
4c60: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
4c70: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
4c80: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
4c90: 63 6b 3b 0a 20 20 20 20 54 61 62 6c 65 20 2a 70  ck;.    Table *p
4ca0: 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 69 66 28  Tab = 0;.    if(
4cb0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
4cc0: 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20  newIdx != -1 && 
4cd0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22  sqlite3StrICmp("
4ce0: 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30  new", zTab) == 0
4cf0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
4d00: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
4d10: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b  erStack->newIdx;
4d20: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
4d30: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
4d40: 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54 61 62  ab );.      pTab
4d50: 20 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b   = pTriggerStack
4d60: 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 65 6c 73  ->pTab;.    }els
4d70: 65 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74  e if( pTriggerSt
4d80: 61 63 6b 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d  ack->oldIdx != -
4d90: 31 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49  1 && sqlite3StrI
4da0: 43 6d 70 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29  Cmp("old", zTab)
4db0: 20 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 70   == 0 ){.      p
4dc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
4dd0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
4de0: 64 49 64 78 3b 0a 20 20 20 20 20 20 61 73 73 65  dIdx;.      asse
4df0: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
4e00: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
4e10: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
4e20: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
4e30: 20 7d 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62   }..    if( pTab
4e40: 20 29 7b 20 0a 20 20 20 20 20 20 69 6e 74 20 6a   ){ .      int j
4e50: 3b 0a 20 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a  ;.      Column *
4e60: 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f  pCol = pTab->aCo
4e70: 6c 3b 0a 20 20 20 20 20 20 0a 20 20 20 20 20 20  l;.      .      
4e80: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
4e90: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 63 6e  b->iDb;.      cn
4ea0: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 66 6f  tTab++;.      fo
4eb0: 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54 61 62 2d  r(j=0; j < pTab-
4ec0: 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c  >nCol; j++, pCol
4ed0: 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20 69 66  ++) {.        if
4ee0: 28 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  ( sqlite3StrICmp
4ef0: 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43  (pCol->zName, zC
4f00: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
4f10: 20 20 20 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20      cnt++;.     
4f20: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
4f30: 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69  umn = j==pTab->i
4f40: 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20  PKey ? -1 : j;. 
4f50: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
4f60: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
4f70: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
4f80: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  y;.          pEx
4f90: 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62  pr->pColl = pTab
4fa0: 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b  ->aCol[j].pColl;
4fb0: 0a 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b  .          break
4fc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
4fd0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20    }.    }.  }.. 
4fe0: 20 2f 2a 0a 20 20 2a 2a 20 50 65 72 68 61 70 73   /*.  ** Perhaps
4ff0: 20 74 68 65 20 6e 61 6d 65 20 69 73 20 61 20 72   the name is a r
5000: 65 66 65 72 65 6e 63 65 20 74 6f 20 74 68 65 20  eference to the 
5010: 52 4f 57 49 44 0a 20 20 2a 2f 0a 20 20 69 66 28  ROWID.  */.  if(
5020: 20 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61   cnt==0 && cntTa
5030: 62 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49  b==1 && sqlite3I
5040: 73 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a  sRowid(zCol) ){.
5050: 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20      cnt = 1;.   
5060: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
5070: 3d 20 2d 31 3b 0a 20 20 20 20 70 45 78 70 72 2d  = -1;.    pExpr-
5080: 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49  >affinity = SQLI
5090: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a  TE_AFF_INTEGER;.
50a0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
50b0: 66 20 74 68 65 20 69 6e 70 75 74 20 69 73 20 6f  f the input is o
50c0: 66 20 74 68 65 20 66 6f 72 6d 20 5a 20 28 6e 6f  f the form Z (no
50d0: 74 20 59 2e 5a 20 6f 72 20 58 2e 59 2e 5a 29 20  t Y.Z or X.Y.Z) 
50e0: 74 68 65 6e 20 74 68 65 20 6e 61 6d 65 20 5a 0a  then the name Z.
50f0: 20 20 2a 2a 20 6d 69 67 68 74 20 72 65 66 65 72    ** might refer
5100: 20 74 6f 20 61 6e 20 72 65 73 75 6c 74 2d 73 65   to an result-se
5110: 74 20 61 6c 69 61 73 2e 20 20 54 68 69 73 20 68  t alias.  This h
5120: 61 70 70 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d  appens, for exam
5130: 70 6c 65 2c 20 77 68 65 6e 0a 20 20 2a 2a 20 77  ple, when.  ** w
5140: 65 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20  e are resolving 
5150: 6e 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45  names in the WHE
5160: 52 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65  RE clause of the
5170: 20 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61   following comma
5180: 6e 64 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  nd:.  **.  **   
5190: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
51a0: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
51b0: 52 45 20 78 3c 31 30 3b 0a 20 20 2a 2a 0a 20 20  RE x<10;.  **.  
51c0: 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b 65  ** In cases like
51d0: 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20 70   this, replace p
51e0: 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70 79  Expr with a copy
51f0: 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73 69   of the expressi
5200: 6f 6e 20 74 68 61 74 0a 20 20 2a 2a 20 66 6f 72  on that.  ** for
5210: 6d 73 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  ms the result se
5220: 74 20 65 6e 74 72 79 20 28 22 61 2b 62 22 20 69  t entry ("a+b" i
5230: 6e 20 74 68 65 20 65 78 61 6d 70 6c 65 29 20 61  n the example) a
5240: 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d 65 64 69  nd return immedi
5250: 61 74 65 6c 79 2e 0a 20 20 2a 2a 20 4e 6f 74 65  ately..  ** Note
5260: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
5270: 73 69 6f 6e 20 69 6e 20 74 68 65 20 72 65 73 75  sion in the resu
5280: 6c 74 20 73 65 74 20 73 68 6f 75 6c 64 20 68 61  lt set should ha
5290: 76 65 20 61 6c 72 65 61 64 79 20 62 65 65 6e 0a  ve already been.
52a0: 20 20 2a 2a 20 72 65 73 6f 6c 76 65 64 20 62 79    ** resolved by
52b0: 20 74 68 65 20 74 69 6d 65 20 74 68 65 20 57 48   the time the WH
52c0: 45 52 45 20 63 6c 61 75 73 65 20 69 73 20 72 65  ERE clause is re
52d0: 73 6f 6c 76 65 64 2e 0a 20 20 2a 2f 0a 20 20 69  solved..  */.  i
52e0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c  f( cnt==0 && pEL
52f0: 69 73 74 21 3d 30 20 29 7b 0a 20 20 20 20 66 6f  ist!=0 ){.    fo
5300: 72 28 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d  r(j=0; j<pEList-
5310: 3e 6e 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20  >nExpr; j++){.  
5320: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
5330: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
5340: 6d 65 3b 0a 20 20 20 20 20 20 69 66 28 20 7a 41  me;.      if( zA
5350: 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53  s!=0 && sqlite3S
5360: 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c  trICmp(zAs, zCol
5370: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5380: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
5390: 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72  Left==0 && pExpr
53a0: 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20  ->pRight==0 );. 
53b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
53c0: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
53d0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
53e0: 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20 70 45   = j;.        pE
53f0: 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  xpr->pLeft = sql
5400: 69 74 65 33 45 78 70 72 44 75 70 28 70 45 4c 69  ite3ExprDup(pELi
5410: 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78 70 72 29 3b  st->a[j].pExpr);
5420: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 46  .        sqliteF
5430: 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 20  ree(zCol);.     
5440: 20 20 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d     assert( zTab=
5450: 3d 30 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a  =0 && zDb==0 );.
5460: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
5470: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 20  ;.      }.    } 
5480: 0a 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20  .  }..  /*.  ** 
5490: 49 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e  If X and Y are N
54a0: 55 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f  ULL (in other wo
54b0: 72 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20  rds if only the 
54c0: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73  column name Z is
54d0: 0a 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20  .  ** supplied) 
54e0: 61 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66  and the value of
54f0: 20 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69   Z is enclosed i
5500: 6e 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c  n double-quotes,
5510: 20 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20   then.  ** Z is 
5520: 61 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  a string literal
5530: 20 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d   if it doesn't m
5540: 61 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20  atch any column 
5550: 6e 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a  names.  In that.
5560: 20 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65    ** case, we ne
5570: 65 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67  ed to return rig
5580: 68 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20  ht away and not 
5590: 6d 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73  make any changes
55a0: 20 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a   to.  ** pExpr..
55b0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
55c0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20  0 && zTab==0 && 
55d0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b  pColumnToken->z[
55e0: 30 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73  0]=='"' ){.    s
55f0: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
5600: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
5610: 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e   }..  /*.  ** cn
5620: 74 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65  t==0 means there
5630: 20 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20   was not match. 
5640: 20 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65   cnt>1 means the
5650: 72 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20  re were two or. 
5660: 20 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73   ** more matches
5670: 2e 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77  .  Either way, w
5680: 65 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e  e have an error.
5690: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21  .  */.  if( cnt!
56a0: 3d 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a  =1 ){.    char *
56b0: 7a 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20  z = 0;.    char 
56c0: 2a 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20  *zErr;.    zErr 
56d0: 3d 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73  = cnt==0 ? "no s
56e0: 75 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20  uch column: %s" 
56f0: 3a 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c  : "ambiguous col
5700: 75 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20  umn name: %s";. 
5710: 20 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20     if( zDb ){.  
5720: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
5730: 72 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e  ring(&z, zDb, ".
5740: 22 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43  ", zTab, ".", zC
5750: 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73  ol, 0);.    }els
5760: 65 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20  e if( zTab ){.  
5770: 20 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74      sqlite3SetSt
5780: 72 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22  ring(&z, zTab, "
5790: 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20  .", zCol, 0);.  
57a0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a    }else{.      z
57b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
57c0: 7a 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20  zCol);.    }.   
57d0: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
57e0: 28 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a  (pParse, zErr, z
57f0: 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  );.    sqliteFre
5800: 65 28 7a 29 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  e(z);.  }..  /* 
5810: 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74  Clean up and ret
5820: 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74  urn.  */.  sqlit
5830: 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71  eFree(zDb);.  sq
5840: 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a  liteFree(zTab);.
5850: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
5860: 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  l);.  sqlite3Exp
5870: 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70  rDelete(pExpr->p
5880: 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  Left);.  pExpr->
5890: 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c  pLeft = 0;.  sql
58a0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
58b0: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
58c0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d   pExpr->pRight =
58d0: 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20   0;.  pExpr->op 
58e0: 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 73  = TK_COLUMN;.  s
58f0: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
5900: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 53  Parse, pExpr, pS
5910: 72 63 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72  rcList);.  retur
5920: 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a  n cnt!=1;.}../*.
5930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
5940: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
5950: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
5960: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
5970: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
5980: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
5990: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
59a0: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
59b0: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
59c0: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
59d0: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
59e0: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
59f0: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
5a00: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
5a10: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
5a20: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
5a30: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
5a40: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
5a50: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
5a60: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
5a70: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
5a80: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
5a90: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
5aa0: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
5ab0: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
5ac0: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
5ad0: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
5ae0: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
5af0: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
5b00: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
5b10: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
5b20: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
5b30: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
5b40: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
5b50: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
5b60: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
5b70: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
5b80: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
5b90: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
5ba0: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
5bb0: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
5bc0: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
5bd0: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
5be0: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
5bf0: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 57  r ROWID..**.** W
5c00: 65 20 61 6c 73 6f 20 63 68 65 63 6b 20 66 6f 72  e also check for
5c10: 20 69 6e 73 74 61 6e 63 65 73 20 6f 66 20 74 68   instances of th
5c20: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2e 20 20  e IN operator.  
5c30: 49 4e 20 63 6f 6d 65 73 20 69 6e 20 74 77 6f 0a  IN comes in two.
5c40: 2a 2a 20 66 6f 72 6d 73 3a 0a 2a 2a 0a 2a 2a 20  ** forms:.**.** 
5c50: 20 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49            expr I
5c60: 4e 20 28 65 78 70 72 6c 69 73 74 29 0a 2a 2a 20  N (exprlist).** 
5c70: 61 6e 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  and.**          
5c80: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
5c90: 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20   ...).**.** The 
5ca0: 66 69 72 73 74 20 66 6f 72 6d 20 69 73 20 68 61  first form is ha
5cb0: 6e 64 6c 65 64 20 62 79 20 63 72 65 61 74 69 6e  ndled by creatin
5cc0: 67 20 61 20 73 65 74 20 68 6f 6c 64 69 6e 67 20  g a set holding 
5cd0: 74 68 65 20 6c 69 73 74 0a 2a 2a 20 6f 66 20 61  the list.** of a
5ce0: 6c 6c 6f 77 65 64 20 76 61 6c 75 65 73 2e 20 20  llowed values.  
5cf0: 54 68 65 20 73 65 63 6f 6e 64 20 66 6f 72 6d 20  The second form 
5d00: 63 61 75 73 65 73 20 74 68 65 20 53 45 4c 45 43  causes the SELEC
5d10: 54 20 74 6f 20 67 65 6e 65 72 61 74 65 20 0a 2a  T to generate .*
5d20: 2a 20 61 20 74 65 6d 70 6f 72 61 72 79 20 74 61  * a temporary ta
5d30: 62 6c 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ble..**.** This 
5d40: 72 6f 75 74 69 6e 65 20 61 6c 73 6f 20 6c 6f 6f  routine also loo
5d50: 6b 73 20 66 6f 72 20 73 63 61 6c 61 72 20 53 45  ks for scalar SE
5d60: 4c 45 43 54 73 20 74 68 61 74 20 61 72 65 20 70  LECTs that are p
5d70: 61 72 74 20 6f 66 20 61 6e 20 65 78 70 72 65 73  art of an expres
5d80: 73 69 6f 6e 2e 0a 2a 2a 20 49 66 20 69 74 20 66  sion..** If it f
5d90: 69 6e 64 73 20 61 6e 79 2c 20 69 74 20 67 65 6e  inds any, it gen
5da0: 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 77  erates code to w
5db0: 72 69 74 65 20 74 68 65 20 76 61 6c 75 65 20 6f  rite the value o
5dc0: 66 20 74 68 61 74 20 73 65 6c 65 63 74 0a 2a 2a  f that select.**
5dd0: 20 69 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63   into a memory c
5de0: 65 6c 6c 2e 0a 2a 2a 0a 2a 2a 20 55 6e 6b 6e 6f  ell..**.** Unkno
5df0: 77 6e 20 63 6f 6c 75 6d 6e 73 20 6f 72 20 74 61  wn columns or ta
5e00: 62 6c 65 73 20 70 72 6f 76 6f 6b 65 20 61 6e 20  bles provoke an 
5e10: 65 72 72 6f 72 2e 20 20 54 68 65 20 66 75 6e 63  error.  The func
5e20: 74 69 6f 6e 20 72 65 74 75 72 6e 73 0a 2a 2a 20  tion returns.** 
5e30: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72  the number of er
5e40: 72 6f 72 73 20 73 65 65 6e 20 61 6e 64 20 6c 65  rors seen and le
5e50: 61 76 65 73 20 61 6e 20 65 72 72 6f 72 20 6d 65  aves an error me
5e60: 73 73 61 67 65 20 6f 6e 20 70 50 61 72 73 65 2d  ssage on pParse-
5e70: 3e 7a 45 72 72 4d 73 67 2e 0a 2a 2f 0a 69 6e 74  >zErrMsg..*/.int
5e80: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
5e90: 6c 76 65 49 64 73 28 0a 20 20 50 61 72 73 65 20  lveIds(.  Parse 
5ea0: 2a 70 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20  *pParse,     /* 
5eb0: 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65  The parser conte
5ec0: 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20  xt */.  SrcList 
5ed0: 2a 70 53 72 63 4c 69 73 74 2c 20 2f 2a 20 4c 69  *pSrcList, /* Li
5ee0: 73 74 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65  st of tables use
5ef0: 64 20 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c  d to resolve col
5f00: 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45  umn names */.  E
5f10: 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c  xprList *pEList,
5f20: 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70    /* List of exp
5f30: 72 65 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f  ressions used to
5f40: 20 72 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f   resolve "AS" */
5f50: 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20  .  Expr *pExpr  
5f60: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
5f70: 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e  ression to be an
5f80: 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b 0a 20 20  alyzed. */.){.  
5f90: 69 6e 74 20 69 3b 0a 0a 20 20 69 66 28 20 70 45  int i;..  if( pE
5fa0: 78 70 72 3d 3d 30 20 7c 7c 20 70 53 72 63 4c 69  xpr==0 || pSrcLi
5fb0: 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  st==0 ) return 0
5fc0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
5fd0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
5fe0: 2b 2b 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28  ++){.    assert(
5ff0: 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e   pSrcList->a[i].
6000: 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20 70 53  iCursor>=0 && pS
6010: 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75  rcList->a[i].iCu
6020: 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e 54 61  rsor<pParse->nTa
6030: 62 20 29 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  b );.  }.  switc
6040: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
6050: 20 20 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75      /* Double-qu
6060: 6f 74 65 64 20 73 74 72 69 6e 67 73 20 28 65 78  oted strings (ex
6070: 3a 20 22 61 62 63 22 29 20 61 72 65 20 75 73 65  : "abc") are use
6080: 64 20 61 73 20 69 64 65 6e 74 69 66 69 65 72 73  d as identifiers
6090: 20 69 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69   if.    ** possi
60a0: 62 6c 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20  ble.  Otherwise 
60b0: 74 68 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73  they remain as s
60c0: 74 72 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d  trings.  Single-
60d0: 71 75 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74  quoted.    ** st
60e0: 72 69 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27  rings (ex: 'abc'
60f0: 29 20 61 72 65 20 61 6c 77 61 79 73 20 73 74 72  ) are always str
6100: 69 6e 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20  ing literals..  
6110: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
6120: 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
6130: 20 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65   if( pExpr->toke
6140: 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62  n.z[0]=='\'' ) b
6150: 72 65 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46  reak;.      /* F
6160: 61 6c 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68  all thru into th
6170: 65 20 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20  e TK_ID case if 
6180: 74 68 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65  this is a double
6190: 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a  -quoted string *
61a0: 2f 0a 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41  /.    }.    /* A
61b0: 20 6c 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72   lone identifier
61c0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
61d0: 61 20 63 6f 6c 75 6d 6e 64 2e 0a 20 20 20 20 2a  a columnd..    *
61e0: 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 44  /.    case TK_ID
61f0: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6c 6f  : {.      if( lo
6200: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
6210: 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74   0, 0, &pExpr->t
6220: 6f 6b 65 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20  oken, pSrcList, 
6230: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 29 20 29  pEList, pExpr) )
6240: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
6250: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
6260: 20 20 62 72 65 61 6b 3b 20 0a 20 20 20 20 7d 0a    break; .    }.
6270: 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62 6c    .    /* A tabl
6280: 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75 6d  e name and colum
6290: 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e 49  n name:     ID.I
62a0: 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64 61  D.    ** Or a da
62b0: 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61 6e  tabase, table an
62c0: 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49 44  d column:  ID.ID
62d0: 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  .ID.    */.    c
62e0: 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20 20  ase TK_DOT: {.  
62f0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75      Token *pColu
6300: 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20  mn;.      Token 
6310: 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 54  *pTable;.      T
6320: 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20 20  oken *pDb;.     
6330: 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a 0a   Expr *pRight;..
6340: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
6350: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
6360: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
6370: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
6380: 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20       pDb = 0;.  
6390: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
63a0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
63b0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ken;.        pCo
63c0: 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e  lumn = &pRight->
63d0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  token;.      }el
63e0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
63f0: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
6400: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
6410: 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e    pDb = &pExpr->
6420: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
6430: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
6440: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74  pRight->pLeft->t
6450: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
6460: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
6470: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  >pRight->token;.
6480: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
6490: 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61  ( lookupName(pPa
64a0: 72 73 65 2c 20 70 44 62 2c 20 70 54 61 62 6c 65  rse, pDb, pTable
64b0: 2c 20 70 43 6f 6c 75 6d 6e 2c 20 70 53 72 63 4c  , pColumn, pSrcL
64c0: 69 73 74 2c 20 30 2c 20 70 45 78 70 72 29 20 29  ist, 0, pExpr) )
64d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
64e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
64f0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
6500: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
6510: 7b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  {.      char aff
6520: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 56 64 62  inity;.      Vdb
6530: 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33 47 65  e *v = sqlite3Ge
6540: 74 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20  tVdbe(pParse);. 
6550: 20 20 20 20 20 4b 65 79 49 6e 66 6f 20 6b 65 79       KeyInfo key
6560: 49 6e 66 6f 3b 0a 20 20 20 20 20 20 69 6e 74 20  Info;.      int 
6570: 61 64 64 72 3b 20 20 20 20 20 20 20 20 2f 2a 20  addr;        /* 
6580: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
6590: 65 6e 54 65 6d 70 20 69 6e 73 74 72 75 63 74 69  enTemp instructi
65a0: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 69 66 28  on */..      if(
65b0: 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31   v==0 ) return 1
65c0: 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69  ;.      if( sqli
65d0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
65e0: 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69  s(pParse, pSrcLi
65f0: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70  st, pEList, pExp
6600: 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20  r->pLeft) ){.   
6610: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
6620: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 66 66       }.      aff
6630: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
6640: 78 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70  xprAffinity(pExp
6650: 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a 20 20 20 20  r->pLeft);..    
6660: 20 20 2f 2a 20 57 68 65 74 68 65 72 20 74 68 69    /* Whether thi
6670: 73 20 69 73 20 61 6e 20 27 78 20 49 4e 28 53 45  s is an 'x IN(SE
6680: 4c 45 43 54 2e 2e 2e 29 27 20 6f 72 20 61 6e 20  LECT...)' or an 
6690: 27 78 20 49 4e 28 3c 65 78 70 72 6c 69 73 74 3e  'x IN(<exprlist>
66a0: 29 27 0a 20 20 20 20 20 20 2a 2a 20 65 78 70 72  )'.      ** expr
66b0: 65 73 73 69 6f 6e 20 69 74 20 69 73 20 68 61 6e  ession it is han
66c0: 64 6c 65 64 20 74 68 65 20 73 61 6d 65 20 77 61  dled the same wa
66d0: 79 2e 20 41 20 74 65 6d 70 6f 72 61 72 79 20 74  y. A temporary t
66e0: 61 62 6c 65 20 69 73 20 0a 20 20 20 20 20 20 2a  able is .      *
66f0: 2a 20 66 69 6c 6c 65 64 20 77 69 74 68 20 73 69  * filled with si
6700: 6e 67 6c 65 2d 66 69 65 6c 64 20 69 6e 64 65 78  ngle-field index
6710: 20 6b 65 79 73 20 72 65 70 72 65 73 65 6e 74 69   keys representi
6720: 6e 67 20 74 68 65 20 72 65 73 75 6c 74 73 0a 20  ng the results. 
6730: 20 20 20 20 20 2a 2a 20 66 72 6f 6d 20 74 68 65       ** from the
6740: 20 53 45 4c 45 43 54 20 6f 72 20 74 68 65 20 3c   SELECT or the <
6750: 65 78 70 72 6c 69 73 74 3e 2e 0a 20 20 20 20 20  exprlist>..     
6760: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 49 66 20   **.      ** If 
6770: 74 68 65 20 27 78 27 20 65 78 70 72 65 73 73 69  the 'x' expressi
6780: 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 76  on is a column v
6790: 61 6c 75 65 2c 20 6f 72 20 74 68 65 20 53 45 4c  alue, or the SEL
67a0: 45 43 54 2e 2e 2e 0a 20 20 20 20 20 20 2a 2a 20  ECT....      ** 
67b0: 73 74 61 74 65 6d 65 6e 74 20 72 65 74 75 72 6e  statement return
67c0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
67d0: 2c 20 74 68 65 6e 20 74 68 65 20 61 66 66 69 6e  , then the affin
67e0: 69 74 79 20 6f 66 20 74 68 61 74 0a 20 20 20 20  ity of that.    
67f0: 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20 69 73 20 75    ** column is u
6800: 73 65 64 20 74 6f 20 62 75 69 6c 64 20 74 68 65  sed to build the
6810: 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20   index keys. If 
6820: 62 6f 74 68 20 27 78 27 20 61 6e 64 20 74 68 65  both 'x' and the
6830: 0a 20 20 20 20 20 20 2a 2a 20 53 45 4c 45 43 54  .      ** SELECT
6840: 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72  ... statement ar
6850: 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20  e columns, then 
6860: 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79  numeric affinity
6870: 20 69 73 20 75 73 65 64 0a 20 20 20 20 20 20 2a   is used.      *
6880: 2a 20 69 66 20 65 69 74 68 65 72 20 63 6f 6c 75  * if either colu
6890: 6d 6e 20 68 61 73 20 4e 55 4d 45 52 49 43 20 6f  mn has NUMERIC o
68a0: 72 20 49 4e 54 45 47 45 52 20 61 66 66 69 6e 69  r INTEGER affini
68b0: 74 79 2e 20 49 66 20 6e 65 69 74 68 65 72 0a 20  ty. If neither. 
68c0: 20 20 20 20 20 2a 2a 20 27 78 27 20 6e 6f 72 20       ** 'x' nor 
68d0: 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74  the SELECT... st
68e0: 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75  atement are colu
68f0: 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69  mns, then numeri
6900: 63 20 61 66 66 69 6e 69 74 79 0a 20 20 20 20 20  c affinity.     
6910: 20 2a 2a 20 69 73 20 75 73 65 64 2e 0a 20 20 20   ** is used..   
6920: 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78 70     */.      pExp
6930: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61 72  r->iTable = pPar
6940: 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a 20 20 20 20  se->nTab++;.    
6950: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
6960: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
6970: 4f 70 65 6e 54 65 6d 70 2c 20 70 45 78 70 72 2d  OpenTemp, pExpr-
6980: 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20  >iTable, 0);.   
6990: 20 20 20 6d 65 6d 73 65 74 28 26 6b 65 79 49 6e     memset(&keyIn
69a0: 66 6f 2c 20 30 2c 20 73 69 7a 65 6f 66 28 6b 65  fo, 0, sizeof(ke
69b0: 79 49 6e 66 6f 29 29 3b 0a 20 20 20 20 20 20 6b  yInfo));.      k
69c0: 65 79 49 6e 66 6f 2e 6e 46 69 65 6c 64 20 3d 20  eyInfo.nField = 
69d0: 31 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  1;.      sqlite3
69e0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
69f0: 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70  SetNumColumns, p
6a00: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 31 29  Expr->iTable, 1)
6a10: 3b 0a 0a 20 20 20 20 20 20 69 66 28 20 70 45 78  ;..      if( pEx
6a20: 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20  pr->pSelect ){. 
6a30: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31         /* Case 1
6a40: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53  :     expr IN (S
6a50: 45 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20  ELECT ...).     
6a60: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
6a70: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
6a80: 6f 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75  o write the resu
6a90: 6c 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63  lts of the selec
6aa0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f  t into the tempo
6ab0: 72 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20  rary.        ** 
6ac0: 74 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20  table allocated 
6ad0: 61 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65  and opened above
6ae0: 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20  ..        */.   
6af0: 20 20 20 20 20 69 6e 74 20 69 50 61 72 6d 20 3d       int iParm =
6b00: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2b   pExpr->iTable +
6b10: 20 20 28 28 28 69 6e 74 29 61 66 66 69 6e 69 74    (((int)affinit
6b20: 79 29 3c 3c 31 36 29 3b 0a 20 20 20 20 20 20 20  y)<<16);.       
6b30: 20 61 73 73 65 72 74 28 20 28 70 45 78 70 72 2d   assert( (pExpr-
6b40: 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30 46 46  >iTable&0x0000FF
6b50: 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62  FF)==pExpr->iTab
6b60: 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  le );.        sq
6b70: 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
6b80: 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  se, pExpr->pSele
6b90: 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61  ct, SRT_Set, iPa
6ba0: 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  rm, 0, 0, 0, 0);
6bb0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 45 78  .        if( pEx
6bc0: 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  pr->pSelect->pEL
6bd0: 69 73 74 20 26 26 20 70 45 78 70 72 2d 3e 70 53  ist && pExpr->pS
6be0: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 6e  elect->pEList->n
6bf0: 45 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20  Expr>0 ){ .     
6c00: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
6c10: 6c 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f  ll[0] = binaryCo
6c20: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
6c30: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
6c40: 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  t,.             
6c50: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d   pExpr->pSelect-
6c60: 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  >pEList->a[0].pE
6c70: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  xpr);.        }.
6c80: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
6c90: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a  pExpr->pList ){.
6ca0: 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20          /* Case 
6cb0: 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28  2:     expr IN (
6cc0: 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20  exprlist).      
6cd0: 20 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63    **..** For eac
6ce0: 68 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75  h expression, bu
6cf0: 69 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79  ild an index key
6d00: 20 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61   from the evalua
6d10: 74 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20  tion and.       
6d20: 20 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20   ** store it in 
6d30: 74 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61  the temporary ta
6d40: 62 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69  ble. If <expr> i
6d50: 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e  s a column, then
6d60: 20 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20   use.        ** 
6d70: 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66  that columns aff
6d80: 69 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64  inity when build
6d90: 69 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20  ing index keys. 
6da0: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74  If <expr> is not
6db0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f  .        ** a co
6dc0: 6c 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69  lumn, use numeri
6dd0: 63 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20  c affinity..    
6de0: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69      */.        i
6df0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 20 20 63 68  nt i;.        ch
6e00: 61 72 20 63 6f 6e 73 74 20 2a 61 66 66 53 74 72  ar const *affStr
6e10: 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61  ;.        if( !a
6e20: 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20  ffinity ){.     
6e30: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
6e40: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52  SQLITE_AFF_NUMER
6e50: 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  IC;.        }.  
6e60: 20 20 20 20 20 20 61 66 66 53 74 72 20 3d 20 73        affStr = s
6e70: 71 6c 69 74 65 33 41 66 66 69 6e 69 74 79 53 74  qlite3AffinitySt
6e80: 72 69 6e 67 28 61 66 66 69 6e 69 74 79 29 3b 0a  ring(affinity);.
6e90: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
6ea0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
6eb0: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
6ec0: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
6ed0: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
6ee0: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
6ef0: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
6f00: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
6f10: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
6f20: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
6f30: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
6f40: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
6f50: 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ].pExpr;..      
6f60: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
6f70: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
6f80: 20 69 73 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64   is constant and
6f90: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20   valid. */.     
6fa0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
6fb0: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
6fc0: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
6fd0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
6fe0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
6ff0: 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68 74            "right
7000: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
7010: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
7020: 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20  e constant");.  
7030: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
7040: 20 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a   1;.          }.
7050: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
7060: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
7070: 50 61 72 73 65 2c 20 70 45 32 2c 20 30 2c 20 30  Parse, pE2, 0, 0
7080: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7090: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
70a0: 20 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20       }..        
70b0: 20 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68    /* Evaluate th
70c0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64  e expression and
70d0: 20 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20   insert it into 
70e0: 74 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a  the temp table *
70f0: 2f 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  /.          sqli
7100: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
7110: 73 65 2c 20 70 45 32 29 3b 0a 20 20 20 20 20 20  se, pE2);.      
7120: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
7130: 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63  p3(v, OP_MakeRec
7140: 6f 72 64 2c 20 31 2c 20 30 2c 20 61 66 66 53 74  ord, 1, 0, affSt
7150: 72 2c 20 50 33 5f 53 54 41 54 49 43 29 3b 0a 20  r, P3_STATIC);. 
7160: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7170: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
7180: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
7190: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
71a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
71b0: 5f 50 75 74 53 74 72 4b 65 79 2c 20 70 45 78 70  _PutStrKey, pExp
71c0: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
71d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
71e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
71f0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 61 64  beChangeP3(v, ad
7200: 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b 65 79  dr, (void *)&key
7210: 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e 46 4f  Info, P3_KEYINFO
7220: 29 3b 0a 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  );..      break;
7230: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
7240: 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20   TK_SELECT: {.  
7250: 20 20 20 20 2f 2a 20 54 68 69 73 20 68 61 73 20      /* This has 
7260: 74 6f 20 62 65 20 61 20 73 63 61 6c 61 72 20 53  to be a scalar S
7270: 45 4c 45 43 54 2e 20 20 47 65 6e 65 72 61 74 65  ELECT.  Generate
7280: 20 63 6f 64 65 20 74 6f 20 70 75 74 20 74 68 65   code to put the
7290: 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c 75 65 20  .      ** value 
72a0: 6f 66 20 74 68 69 73 20 73 65 6c 65 63 74 20 69  of this select i
72b0: 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20  n a memory cell 
72c0: 61 6e 64 20 72 65 63 6f 72 64 20 74 68 65 20 6e  and record the n
72d0: 75 6d 62 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f  umber.      ** o
72e0: 66 20 74 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c  f the memory cel
72f0: 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20  l in iColumn..  
7300: 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 70 45 78      */.      pEx
7310: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 50  pr->iColumn = pP
7320: 61 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20  arse->nMem++;.  
7330: 20 20 20 20 69 66 28 73 71 6c 69 74 65 33 53 65      if(sqlite3Se
7340: 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45 78  lect(pParse, pEx
7350: 70 72 2d 3e 70 53 65 6c 65 63 74 2c 20 53 52 54  pr->pSelect, SRT
7360: 5f 4d 65 6d 2c 70 45 78 70 72 2d 3e 69 43 6f 6c  _Mem,pExpr->iCol
7370: 75 6d 6e 2c 30 2c 30 2c 30 2c 30 29 29 7b 0a 20  umn,0,0,0,0)){. 
7380: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7390: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
73a0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20  reak;.    }..   
73b0: 20 2f 2a 20 46 6f 72 20 61 6c 6c 20 65 6c 73 65   /* For all else
73c0: 2c 20 6a 75 73 74 20 72 65 63 75 72 73 69 76 65  , just recursive
73d0: 6c 79 20 77 61 6c 6b 20 74 68 65 20 74 72 65 65  ly walk the tree
73e0: 20 2a 2f 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   */.    default:
73f0: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
7400: 70 72 2d 3e 70 4c 65 66 74 0a 20 20 20 20 20 20  pr->pLeft.      
7410: 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  && sqlite3ExprRe
7420: 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65 2c  solveIds(pParse,
7430: 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69 73   pSrcList, pELis
7440: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  t, pExpr->pLeft)
7450: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
7460: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
7470: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
7480: 52 69 67 68 74 20 0a 20 20 20 20 20 20 26 26 20  Right .      && 
7490: 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f 6c  sqlite3ExprResol
74a0: 76 65 49 64 73 28 70 50 61 72 73 65 2c 20 70 53  veIds(pParse, pS
74b0: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
74c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 20 29  pExpr->pRight) )
74d0: 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e  {.        return
74e0: 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20   1;.      }.    
74f0: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 69    if( pExpr->pLi
7500: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
7510: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 45 78 70  t i;.        Exp
7520: 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70  rList *pList = p
7530: 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20  Expr->pList;.   
7540: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
7550: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b  pList->nExpr; i+
7560: 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78  +){.          Ex
7570: 70 72 20 2a 70 41 72 67 20 3d 20 70 4c 69 73 74  pr *pArg = pList
7580: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[i].pExpr;.  
7590: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
75a0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
75b0: 73 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69  s(pParse, pSrcLi
75c0: 73 74 2c 20 70 45 4c 69 73 74 2c 20 70 41 72 67  st, pEList, pArg
75d0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
75e0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20   return 1;.     
75f0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d       }.        }
7600: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
7610: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
7620: 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73  ../*.** pExpr is
7630: 20 61 20 6e 6f 64 65 20 74 68 61 74 20 64 65 66   a node that def
7640: 69 6e 65 73 20 61 20 66 75 6e 63 74 69 6f 6e 20  ines a function 
7650: 6f 66 20 73 6f 6d 65 20 6b 69 6e 64 2e 20 20 49  of some kind.  I
7660: 74 20 6d 69 67 68 74 0a 2a 2a 20 62 65 20 61 20  t might.** be a 
7670: 73 79 6e 74 61 63 74 69 63 20 66 75 6e 63 74 69  syntactic functi
7680: 6f 6e 20 6c 69 6b 65 20 22 63 6f 75 6e 74 28 78  on like "count(x
7690: 29 22 20 6f 72 20 69 74 20 6d 69 67 68 74 20 62  )" or it might b
76a0: 65 20 61 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  e a function.** 
76b0: 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 73 20  that implements 
76c0: 61 6e 20 6f 70 65 72 61 74 6f 72 2c 20 6c 69 6b  an operator, lik
76d0: 65 20 22 61 20 4c 49 4b 45 20 62 22 2e 20 20 0a  e "a LIKE b".  .
76e0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
76f0: 6e 65 20 6d 61 6b 65 73 20 2a 70 7a 4e 61 6d 65  ne makes *pzName
7700: 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 6e 61   point to the na
7710: 6d 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  me of the functi
7720: 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a 70 6e 4e 61  on and .** *pnNa
7730: 6d 65 20 68 6f 6c 64 20 74 68 65 20 6e 75 6d 62  me hold the numb
7740: 65 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73  er of characters
7750: 20 69 6e 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   in the function
7760: 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   name..*/.static
7770: 20 76 6f 69 64 20 67 65 74 46 75 6e 63 74 69 6f   void getFunctio
7780: 6e 4e 61 6d 65 28 45 78 70 72 20 2a 70 45 78 70  nName(Expr *pExp
7790: 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 2a  r, const char **
77a0: 70 7a 4e 61 6d 65 2c 20 69 6e 74 20 2a 70 6e 4e  pzName, int *pnN
77b0: 61 6d 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  ame){.  switch( 
77c0: 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20  pExpr->op ){.   
77d0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
77e0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  N: {.      *pzNa
77f0: 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  me = pExpr->toke
7800: 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  n.z;.      *pnNa
7810: 6d 65 20 3d 20 70 45 78 70 72 2d 3e 74 6f 6b 65  me = pExpr->toke
7820: 6e 2e 6e 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  n.n;.      break
7830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7840: 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a 20 20 20 20   TK_LIKE: {.    
7850: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 6c 69 6b    *pzName = "lik
7860: 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d  e";.      *pnNam
7870: 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62 72 65  e = 4;.      bre
7880: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
7890: 73 65 20 54 4b 5f 47 4c 4f 42 3a 20 7b 0a 20 20  se TK_GLOB: {.  
78a0: 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 67      *pzName = "g
78b0: 6c 6f 62 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e  lob";.      *pnN
78c0: 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20 20 62  ame = 4;.      b
78d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
78e0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
78f0: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 61 6e 27   *pzName = "can'
7900: 74 20 68 61 70 70 65 6e 22 3b 0a 20 20 20 20 20  t happen";.     
7910: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
7920: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7930: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 45  }.  }.}../*.** E
7940: 72 72 6f 72 20 63 68 65 63 6b 20 74 68 65 20 66  rror check the f
7950: 75 6e 63 74 69 6f 6e 73 20 69 6e 20 61 6e 20 65  unctions in an e
7960: 78 70 72 65 73 73 69 6f 6e 2e 20 20 4d 61 6b 65  xpression.  Make
7970: 20 73 75 72 65 20 61 6c 6c 0a 2a 2a 20 66 75 6e   sure all.** fun
7980: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 72 65 20  ction names are 
7990: 72 65 63 6f 67 6e 69 7a 65 64 20 61 6e 64 20 61  recognized and a
79a0: 6c 6c 20 66 75 6e 63 74 69 6f 6e 73 20 68 61 76  ll functions hav
79b0: 65 20 74 68 65 20 63 6f 72 72 65 63 74 0a 2a 2a  e the correct.**
79c0: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
79d0: 65 6e 74 73 2e 20 20 4c 65 61 76 65 20 61 6e 20  ents.  Leave an 
79e0: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e  error message in
79f0: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
7a00: 0a 2a 2a 20 69 66 20 61 6e 79 74 68 69 6e 67 20  .** if anything 
7a10: 69 73 20 61 6d 69 73 73 2e 20 20 52 65 74 75 72  is amiss.  Retur
7a20: 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  n the number of 
7a30: 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 69 66  errors..**.** if
7a40: 20 70 49 73 41 67 67 20 69 73 20 6e 6f 74 20 6e   pIsAgg is not n
7a50: 75 6c 6c 20 61 6e 64 20 74 68 69 73 20 65 78 70  ull and this exp
7a60: 72 65 73 73 69 6f 6e 20 69 73 20 61 6e 20 61 67  ression is an ag
7a70: 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e  gregate function
7a80: 0a 2a 2a 20 28 6c 69 6b 65 20 63 6f 75 6e 74 28  .** (like count(
7a90: 2a 29 20 6f 72 20 6d 61 78 28 76 61 6c 75 65 29  *) or max(value)
7aa0: 29 20 74 68 65 6e 20 77 72 69 74 65 20 61 20 31  ) then write a 1
7ab0: 20 69 6e 74 6f 20 2a 70 49 73 41 67 67 2e 0a 2a   into *pIsAgg..*
7ac0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
7ad0: 72 43 68 65 63 6b 28 50 61 72 73 65 20 2a 70 50  rCheck(Parse *pP
7ae0: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
7af0: 72 2c 20 69 6e 74 20 61 6c 6c 6f 77 41 67 67 2c  r, int allowAgg,
7b00: 20 69 6e 74 20 2a 70 49 73 41 67 67 29 7b 0a 20   int *pIsAgg){. 
7b10: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 20   int nErr = 0;. 
7b20: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
7b30: 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69 74  return 0;.  swit
7b40: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
7b50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f  .    case TK_GLO
7b60: 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  B:.    case TK_L
7b70: 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  IKE:.    case TK
7b80: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
7b90: 20 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72     int n = pExpr
7ba0: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
7bb0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
7bc0: 30 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66  0;  /* Number of
7bd0: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
7be0: 20 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f      int no_such_
7bf0: 66 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20  func = 0;       
7c00: 2f 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75  /* True if no su
7c10: 63 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73  ch function exis
7c20: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
7c30: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d  wrong_num_args =
7c40: 20 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20   0;     /* True 
7c50: 69 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20  if wrong number 
7c60: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a  of arguments */.
7c70: 20 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67        int is_agg
7c80: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
7c90: 20 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20    /* True if is 
7ca0: 61 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  an aggregate fun
7cb0: 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69  ction */.      i
7cc0: 6e 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20  nt i;.      int 
7cd0: 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20  nId;            
7ce0: 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65          /* Numbe
7cf0: 72 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20  r of characters 
7d00: 69 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  in function name
7d10: 20 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20   */.      const 
7d20: 63 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20  char *zId;      
7d30: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e        /* The fun
7d40: 63 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20  ction name. */. 
7d50: 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44       FuncDef *pD
7d60: 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 65 6e  ef;.      int en
7d70: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
7d80: 65 6e 63 3b 0a 0a 20 20 20 20 20 20 67 65 74 46  enc;..      getF
7d90: 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70  unctionName(pExp
7da0: 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a  r, &zId, &nId);.
7db0: 20 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c        pDef = sql
7dc0: 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e  ite3FindFunction
7dd0: 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64  (pParse->db, zId
7de0: 2c 20 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30  , nId, n, enc, 0
7df0: 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  );.      if( pDe
7e00: 66 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  f==0 ){.        
7e10: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
7e20: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
7e30: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
7e40: 20 2d 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20   -1, enc, 0);.  
7e50: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
7e60: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e  0 ){.          n
7e70: 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b  o_such_func = 1;
7e80: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
7e90: 20 20 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f            wrong_
7ea0: 6e 75 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20  num_args = 1;.  
7eb0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65        }.      }e
7ec0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f  lse{.        is_
7ed0: 61 67 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e  agg = pDef->xFun
7ee0: 63 3d 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  c==0;.      }.  
7ef0: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 26      if( is_agg &
7f00: 26 20 21 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20  & !allowAgg ){. 
7f10: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 72         sqlite3Er
7f20: 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22  rorMsg(pParse, "
7f30: 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72 65 67  misuse of aggreg
7f40: 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a  ate function %.*
7f50: 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  s()", nId, zId);
7f60: 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b 3b  .        nErr++;
7f70: 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67 20  .        is_agg 
7f80: 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  = 0;.      }else
7f90: 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75 6e   if( no_such_fun
7fa0: 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  c ){.        sql
7fb0: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7fc0: 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66 75  rse, "no such fu
7fd0: 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20 6e  nction: %.*s", n
7fe0: 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20  Id, zId);.      
7ff0: 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20    nErr++;.      
8000: 7d 65 6c 73 65 20 69 66 28 20 77 72 6f 6e 67 5f  }else if( wrong_
8010: 6e 75 6d 5f 61 72 67 73 20 29 7b 0a 20 20 20 20  num_args ){.    
8020: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8030: 4d 73 67 28 70 50 61 72 73 65 2c 22 77 72 6f 6e  Msg(pParse,"wron
8040: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
8050: 6d 65 6e 74 73 20 74 6f 20 66 75 6e 63 74 69 6f  ments to functio
8060: 6e 20 25 2e 2a 73 28 29 22 2c 0a 20 20 20 20 20  n %.*s()",.     
8070: 20 20 20 20 20 20 20 20 6e 49 64 2c 20 7a 49 64          nId, zId
8080: 29 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b  );.        nErr+
8090: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
80a0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
80b0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
80c0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
80d0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  ON;.        if( 
80e0: 70 49 73 41 67 67 20 29 20 2a 70 49 73 41 67 67  pIsAgg ) *pIsAgg
80f0: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
8100: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72      for(i=0; nEr
8110: 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b  r==0 && i<n; i++
8120: 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 20  ){.        nErr 
8130: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  = sqlite3ExprChe
8140: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ck(pParse, pExpr
8150: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
8160: 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20  xpr,.           
8170: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8180: 20 20 20 20 61 6c 6c 6f 77 41 67 67 20 26 26 20      allowAgg && 
8190: 21 69 73 5f 61 67 67 2c 20 70 49 73 41 67 67 29  !is_agg, pIsAgg)
81a0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
81b0: 2f 2a 20 46 49 58 20 4d 45 3a 20 20 43 6f 6d 70  /* FIX ME:  Comp
81c0: 75 74 65 20 70 45 78 70 72 2d 3e 61 66 66 69 6e  ute pExpr->affin
81d0: 69 74 79 20 62 61 73 65 64 20 6f 6e 20 74 68 65  ity based on the
81e0: 20 65 78 70 65 63 74 65 64 20 72 65 74 75 72 6e   expected return
81f0: 0a 20 20 20 20 20 20 2a 2a 20 74 79 70 65 20 6f  .      ** type o
8200: 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 0a  f the function .
8210: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 7d 0a 20        */.    }. 
8220: 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
8230: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
8240: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
8250: 6e 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78  nErr = sqlite3Ex
8260: 70 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20  prCheck(pParse, 
8270: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 6c  pExpr->pLeft, al
8280: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
8290: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
82a0: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
82b0: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
82c0: 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71         nErr = sq
82d0: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70  lite3ExprCheck(p
82e0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
82f0: 69 67 68 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20  ight, allowAgg, 
8300: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  pIsAgg);.      }
8310: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
8320: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
8330: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
8340: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
8350: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
8360: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
8370: 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d    for(i=0; nErr=
8380: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
8390: 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72 20  .          Expr 
83a0: 2a 70 45 32 20 3d 20 70 45 78 70 72 2d 3e 70 4c  *pE2 = pExpr->pL
83b0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 3b  ist->a[i].pExpr;
83c0: 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20  .          nErr 
83d0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  = sqlite3ExprChe
83e0: 63 6b 28 70 50 61 72 73 65 2c 20 70 45 32 2c 20  ck(pParse, pE2, 
83f0: 61 6c 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67  allowAgg, pIsAgg
8400: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8410: 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b     }.      break
8420: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8430: 74 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a  turn nErr;.}../*
8440: 0a 2a 2a 20 52 65 74 75 72 6e 20 6f 6e 65 20 6f  .** Return one o
8450: 66 20 74 68 65 20 53 51 4c 49 54 45 5f 41 46 46  f the SQLITE_AFF
8460: 5f 2a 20 61 66 66 69 6e 69 74 79 20 74 79 70 65  _* affinity type
8470: 73 20 74 68 61 74 20 69 6e 64 69 63 61 74 65 73  s that indicates
8480: 20 74 68 65 20 6c 69 6b 65 6c 79 0a 2a 2a 20 64   the likely.** d
8490: 61 74 61 20 74 79 70 65 20 6f 66 20 74 68 65 20  ata type of the 
84a0: 72 65 73 75 6c 74 20 6f 66 20 74 68 65 20 67 69  result of the gi
84b0: 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a  ven expression..
84c0: 2a 2a 0a 2a 2a 20 4e 6f 74 20 65 76 65 72 79 20  **.** Not every 
84d0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 61  expression has a
84e0: 20 66 69 78 65 64 20 74 79 70 65 2e 20 20 49 66   fixed type.  If
84f0: 20 74 68 65 20 74 79 70 65 20 63 61 6e 6e 6f 74   the type cannot
8500: 20 62 65 20 64 65 74 65 72 6d 69 6e 65 64 0a 2a   be determined.*
8510: 2a 20 61 74 20 63 6f 6d 70 69 6c 65 2d 74 69 6d  * at compile-tim
8520: 65 2c 20 74 68 65 6e 20 74 72 79 20 74 6f 20 72  e, then try to r
8530: 65 74 75 72 6e 20 74 68 65 20 74 79 70 65 20 61  eturn the type a
8540: 66 66 69 6e 69 74 79 20 69 66 20 74 68 65 20 65  ffinity if the e
8550: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
8560: 61 20 63 6f 6c 75 6d 6e 2e 20 20 4f 74 68 65 72  a column.  Other
8570: 77 69 73 65 20 6a 75 73 74 20 72 65 74 75 72 6e  wise just return
8580: 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45   SQLITE_AFF_NONE
8590: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 73 71 6c 69  ..**.** The sqli
85a0: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
85b0: 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 45  s() and sqlite3E
85c0: 78 70 72 43 68 65 63 6b 28 29 20 72 6f 75 74 69  xprCheck() routi
85d0: 6e 65 73 20 6d 75 73 74 20 68 61 76 65 0a 2a 2a  nes must have.**
85e0: 20 62 6f 74 68 20 62 65 65 6e 20 63 61 6c 6c 65   both been calle
85f0: 64 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73  d on the express
8600: 69 6f 6e 20 62 65 66 6f 72 65 20 69 74 20 69 73  ion before it is
8610: 20 70 61 73 73 65 64 20 74 6f 20 74 68 69 73 20   passed to this 
8620: 72 6f 75 74 69 6e 65 2e 0a 2a 2f 0a 69 6e 74 20  routine..*/.int 
8630: 73 71 6c 69 74 65 33 45 78 70 72 54 79 70 65 28  sqlite3ExprType(
8640: 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20  Expr *p){.  if( 
8650: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 53 51  p==0 ) return SQ
8660: 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20  LITE_AFF_NONE;. 
8670: 20 77 68 69 6c 65 28 20 70 20 29 20 73 77 69 74   while( p ) swit
8680: 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20  ch( p->op ){.   
8690: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
86a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52  .    case TK_STR
86b0: 49 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ING:.    case TK
86c0: 5f 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74  _BLOB:.      ret
86d0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 54  urn SQLITE_AFF_T
86e0: 45 58 54 3b 0a 0a 20 20 20 20 63 61 73 65 20 54  EXT;..    case T
86f0: 4b 5f 41 53 3a 0a 20 20 20 20 20 20 70 20 3d 20  K_AS:.      p = 
8700: 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  p->pLeft;.      
8710: 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
8720: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 0a 20 20   TK_VARIABLE:.  
8730: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
8740: 20 20 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c        return SQL
8750: 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 0a 20  ITE_AFF_NONE;.. 
8760: 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43     case TK_SELEC
8770: 54 3a 20 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45  T:   /*** FIX ME
8780: 20 2a 2a 2a 2a 2f 0a 20 20 20 20 63 61 73 65 20   ****/.    case 
8790: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 20 20 2f 2a 2a  TK_COLUMN:   /**
87a0: 2a 20 46 49 58 20 4d 45 20 2a 2a 2a 2a 2f 0a 20  * FIX ME ****/. 
87b0: 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a     case TK_CASE:
87c0: 20 20 20 20 20 2f 2a 2a 2a 20 46 49 58 20 4d 45       /*** FIX ME
87d0: 20 2a 2a 2a 2a 2f 0a 0a 20 20 20 20 64 65 66 61   ****/..    defa
87e0: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
87f0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  n SQLITE_AFF_NUM
8800: 45 52 49 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ERIC;.  }.  retu
8810: 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f  rn SQLITE_AFF_NO
8820: 4e 45 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  NE;.}../*.** Gen
8830: 65 72 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63  erate an instruc
8840: 74 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70  tion that will p
8850: 75 74 20 74 68 65 20 69 6e 74 65 67 65 72 20 64  ut the integer d
8860: 65 73 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65  escribe by.** te
8870: 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20  xt z[0..n-1] on 
8880: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74  the stack..*/.st
8890: 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e  atic void codeIn
88a0: 74 65 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63  teger(Vdbe *v, c
88b0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e  onst char *z, in
88c0: 74 20 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  t n){.  int i;. 
88d0: 20 69 66 28 20 73 71 6c 69 74 65 33 47 65 74 49   if( sqlite3GetI
88e0: 6e 74 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20  nt32(z, &i) ){. 
88f0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
8900: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
8910: 72 2c 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73  r, i, 0);.  }els
8920: 65 20 69 66 28 20 73 71 6c 69 74 65 33 46 69 74  e if( sqlite3Fit
8930: 73 49 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a  sIn64Bits(z) ){.
8940: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f      sqlite3VdbeO
8950: 70 33 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  p3(v, OP_Integer
8960: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
8970: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69   }else{.    sqli
8980: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
8990: 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20  _Real, 0, 0, z, 
89a0: 6e 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  n);.  }.}../*.**
89b0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69   Generate code i
89c0: 6e 74 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20  nto the current 
89d0: 56 64 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65  Vdbe to evaluate
89e0: 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78   the given.** ex
89f0: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61  pression and lea
8a00: 76 65 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e  ve the result on
8a10: 20 74 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63   the top of stac
8a20: 6b 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  k..*/.void sqlit
8a30: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
8a40: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
8a50: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
8a60: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
8a70: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
8a80: 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72  f( v==0 || pExpr
8a90: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
8aa0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
8ab0: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
8ac0: 5f 50 4c 55 53 3a 20 20 20 20 20 6f 70 20 3d 20  _PLUS:     op = 
8ad0: 4f 50 5f 41 64 64 3b 20 20 20 20 20 20 62 72 65  OP_Add;      bre
8ae0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8af0: 4d 49 4e 55 53 3a 20 20 20 20 6f 70 20 3d 20 4f  MINUS:    op = O
8b00: 50 5f 53 75 62 74 72 61 63 74 3b 20 62 72 65 61  P_Subtract; brea
8b10: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  k;.    case TK_S
8b20: 54 41 52 3a 20 20 20 20 20 6f 70 20 3d 20 4f 50  TAR:     op = OP
8b30: 5f 4d 75 6c 74 69 70 6c 79 3b 20 62 72 65 61 6b  _Multiply; break
8b40: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c  ;.    case TK_SL
8b50: 41 53 48 3a 20 20 20 20 6f 70 20 3d 20 4f 50 5f  ASH:    op = OP_
8b60: 44 69 76 69 64 65 3b 20 20 20 62 72 65 61 6b 3b  Divide;   break;
8b70: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
8b80: 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 41  :      op = OP_A
8b90: 6e 64 3b 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  nd;      break;.
8ba0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20      case TK_OR: 
8bb0: 20 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4f 72        op = OP_Or
8bc0: 3b 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;       break;. 
8bd0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
8be0: 20 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b       op = OP_Lt;
8bf0: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
8c00: 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
8c10: 20 20 20 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20      op = OP_Le; 
8c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
8c30: 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
8c40: 20 20 20 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20     op = OP_Gt;  
8c50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8c60: 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
8c70: 20 20 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20    op = OP_Ge;   
8c80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
8c90: 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
8ca0: 20 6f 70 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20   op = OP_Ne;    
8cb0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
8cc0: 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 20  se TK_EQ:       
8cd0: 6f 70 20 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20  op = OP_Eq;     
8ce0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
8cf0: 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f  e TK_ISNULL:   o
8d00: 70 20 3d 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20  p = OP_IsNull;  
8d10: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8d20: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70   TK_NOTNULL:  op
8d30: 20 3d 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20   = OP_NotNull;  
8d40: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
8d50: 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 20 6f 70 20  TK_NOT:      op 
8d60: 3d 20 4f 50 5f 4e 6f 74 3b 20 20 20 20 20 20 62  = OP_Not;      b
8d70: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8d80: 4b 5f 55 4d 49 4e 55 53 3a 20 20 20 6f 70 20 3d  K_UMINUS:   op =
8d90: 20 4f 50 5f 4e 65 67 61 74 69 76 65 3b 20 62 72   OP_Negative; br
8da0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8db0: 5f 42 49 54 41 4e 44 3a 20 20 20 6f 70 20 3d 20  _BITAND:   op = 
8dc0: 4f 50 5f 42 69 74 41 6e 64 3b 20 20 20 62 72 65  OP_BitAnd;   bre
8dd0: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8de0: 42 49 54 4f 52 3a 20 20 20 20 6f 70 20 3d 20 4f  BITOR:    op = O
8df0: 50 5f 42 69 74 4f 72 3b 20 20 20 20 62 72 65 61  P_BitOr;    brea
8e00: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42  k;.    case TK_B
8e10: 49 54 4e 4f 54 3a 20 20 20 6f 70 20 3d 20 4f 50  ITNOT:   op = OP
8e20: 5f 42 69 74 4e 6f 74 3b 20 20 20 62 72 65 61 6b  _BitNot;   break
8e30: 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 53  ;.    case TK_LS
8e40: 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50 5f  HIFT:   op = OP_
8e50: 53 68 69 66 74 4c 65 66 74 3b 20 20 62 72 65 61  ShiftLeft;  brea
8e60: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  k;.    case TK_R
8e70: 53 48 49 46 54 3a 20 20 20 6f 70 20 3d 20 4f 50  SHIFT:   op = OP
8e80: 5f 53 68 69 66 74 52 69 67 68 74 3b 20 62 72 65  _ShiftRight; bre
8e90: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
8ea0: 52 45 4d 3a 20 20 20 20 20 20 6f 70 20 3d 20 4f  REM:      op = O
8eb0: 50 5f 52 65 6d 61 69 6e 64 65 72 3b 20 20 62 72  P_Remainder;  br
8ec0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
8ed0: 5f 46 4c 4f 41 54 3a 20 20 20 20 6f 70 20 3d 20  _FLOAT:    op = 
8ee0: 4f 50 5f 52 65 61 6c 3b 20 20 20 20 20 20 20 62  OP_Real;       b
8ef0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
8f00: 4b 5f 53 54 52 49 4e 47 3a 20 20 20 6f 70 20 3d  K_STRING:   op =
8f10: 20 4f 50 5f 53 74 72 69 6e 67 38 3b 20 20 20 20   OP_String8;    
8f20: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
8f30: 20 54 4b 5f 42 4c 4f 42 3a 20 20 20 20 20 6f 70   TK_BLOB:     op
8f40: 20 3d 20 4f 50 5f 48 65 78 42 6c 6f 62 3b 20 20   = OP_HexBlob;  
8f50: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 64 65 66    break;.    def
8f60: 61 75 6c 74 3a 20 6f 70 20 3d 20 30 3b 20 62 72  ault: op = 0; br
8f70: 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  eak;.  }.  switc
8f80: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
8f90: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55      case TK_COLU
8fa0: 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  MN: {.      if( 
8fb0: 70 50 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29  pParse->useAgg )
8fc0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8fd0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
8fe0: 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70  _AggGet, 0, pExp
8ff0: 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20  r->iAgg);.      
9000: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
9010: 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20  >iColumn>=0 ){. 
9020: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
9030: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f  beAddOp(v, OP_Co
9040: 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61  lumn, pExpr->iTa
9050: 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  ble, pExpr->iCol
9060: 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  umn);.      }els
9070: 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
9080: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
9090: 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e  P_Recno, pExpr->
90a0: 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20  iTable, 0);.    
90b0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
90c0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
90d0: 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
90e0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
90f0: 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  v, pExpr->token.
9100: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
9110: 6e 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  n);.      break;
9120: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9130: 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61  TK_FLOAT:.    ca
9140: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
9150: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9160: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
9170: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
9180: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
9190: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
91a0: 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c  VdbeDequoteP3(v,
91b0: 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61   -1);.      brea
91c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
91d0: 65 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20  e TK_BLOB: {.   
91e0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
91f0: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
9200: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c  Expr->token.z+1,
9210: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d   pExpr->token.n-
9220: 31 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  1);.      sqlite
9230: 33 56 64 62 65 44 65 71 75 6f 74 65 50 33 28 76  3VdbeDequoteP3(v
9240: 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65  , -1);.      bre
9250: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
9260: 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20 20  se TK_NULL: {.  
9270: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9280: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
9290: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
92a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
92b0: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
92c0: 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  LE: {.      sqli
92d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
92e0: 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78  OP_Variable, pEx
92f0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a  pr->iTable, 0);.
9300: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9310: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
9320: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c  T:.    case TK_L
9330: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  E:.    case TK_G
9340: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47  T:.    case TK_G
9350: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  E:.    case TK_N
9360: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45  E:.    case TK_E
9370: 51 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 70  Q: {.      int p
9380: 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  1 = binaryCompar
9390: 65 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  eP1(pExpr->pLeft
93a0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  , pExpr->pRight,
93b0: 20 30 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53   0);.      CollS
93c0: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
93d0: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
93e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
93f0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
9400: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9410: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9420: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
9430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
9440: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
9450: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
9460: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9470: 4f 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20 30  Op3(v, op, p1, 0
9480: 2c 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33  , (void *)p3, P3
9490: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
94a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
94b0: 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20    case TK_AND:. 
94c0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20     case TK_OR:. 
94d0: 20 20 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a     case TK_PLUS:
94e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41  .    case TK_STA
94f0: 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  R:.    case TK_M
9500: 49 4e 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54  INUS:.    case T
9510: 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20  K_REM:.    case 
9520: 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63  TK_BITAND:.    c
9530: 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20  ase TK_BITOR:.  
9540: 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a    case TK_SLASH:
9550: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9560: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
9570: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
9580: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9590: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
95a0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
95b0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
95c0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30  ddOp(v, op, 0, 0
95d0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
95e0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
95f0: 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61  K_LSHIFT:.    ca
9600: 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 7b 0a  se TK_RSHIFT: {.
9610: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
9620: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
9630: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
9640: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
9650: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
9660: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
9670: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9680: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
9690: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
96a0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
96b0: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 73  ONCAT: {.      s
96c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
96d0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
96e0: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
96f0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
9700: 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
9710: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9720: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9730: 5f 43 6f 6e 63 61 74 2c 20 32 2c 20 30 29 3b 0a  _Concat, 2, 0);.
9740: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
9750: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55   }.    case TK_U
9760: 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45  MINUS: {.      E
9770: 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78  xpr *pLeft = pEx
9780: 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20  pr->pLeft;.     
9790: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 20 29   assert( pLeft )
97a0: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c 65 66  ;.      if( pLef
97b0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
97c0: 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  || pLeft->op==TK
97d0: 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20  _INTEGER ){.    
97e0: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26      Token *p = &
97f0: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
9800: 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20        char *z = 
9810: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d  sqliteMalloc( p-
9820: 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20  >n + 2 );.      
9830: 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25    sprintf(z, "-%
9840: 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a  .*s", p->n, p->z
9850: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
9860: 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f  Left->op==TK_FLO
9870: 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  AT ){.          
9880: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
9890: 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c  , OP_Real, 0, 0,
98a0: 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20   z, p->n+1);.   
98b0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
98c0: 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65        codeIntege
98d0: 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b  r(v, z, p->n+1);
98e0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
98f0: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
9900: 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b  ;.        break;
9910: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f  .      }.      /
9920: 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  * Fall through i
9930: 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20  nto TK_NOT */.  
9940: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
9950: 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65  BITNOT:.    case
9960: 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20   TK_NOT: {.     
9970: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
9980: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9990: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
99a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
99b0: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
99c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
99d0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55      case TK_ISNU
99e0: 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  LL:.    case TK_
99f0: 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20  NOTNULL: {.     
9a00: 20 69 6e 74 20 64 65 73 74 3b 0a 20 20 20 20 20   int dest;.     
9a10: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
9a20: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
9a30: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   1, 0);.      sq
9a40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
9a50: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
9a60: 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74 20  ft);.      dest 
9a70: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
9a80: 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32 3b  rentAddr(v) + 2;
9a90: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9aa0: 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31  beAddOp(v, op, 1
9ab0: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 73  , dest);.      s
9ac0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9ad0: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
9ae0: 2c 20 30 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  , 0);.    }.    
9af0: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
9b00: 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a  TK_AGG_FUNCTION:
9b10: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9b20: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9b30: 41 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72  AggGet, 0, pExpr
9b40: 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 62  ->iAgg);.      b
9b50: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9b60: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
9b70: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
9b80: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
9b90: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
9ba0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
9bb0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20  pExpr->pList;.  
9bc0: 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20 3d 20      int nExpr = 
9bd0: 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d 3e 6e  pList ? pList->n
9be0: 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20 20 20  Expr : 0;.      
9bf0: 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b 0a 20  FuncDef *pDef;. 
9c00: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a 20 20       int nId;.  
9c10: 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a      const char *
9c20: 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74 20 70  zId;.      int p
9c30: 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 6e 74  2 = 0;.      int
9c40: 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65 6e 63   i;.      u8 enc
9c50: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65   = pParse->db->e
9c60: 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53 65  nc;.      CollSe
9c70: 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20  q *pColl = 0;.  
9c80: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
9c90: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
9ca0: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
9cb0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
9cc0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
9cd0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
9ce0: 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b 0a 20  Expr, enc, 0);. 
9cf0: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 44 65       assert( pDe
9d00: 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 6e 45  f!=0 );.      nE
9d10: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
9d20: 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 70 50  rCodeExprList(pP
9d30: 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a 20 20  arse, pList);.  
9d40: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e      for(i=0; i<n
9d50: 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20 69 2b  Expr && i<32; i+
9d60: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
9d70: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
9d80: 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61 5b 69  stant(pList->a[i
9d90: 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  ].pExpr) ){.    
9da0: 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31 3c 3c        p2 |= (1<<
9db0: 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  i);.        }.  
9dc0: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e        if( pDef->
9dd0: 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26 20 21  needCollSeq && !
9de0: 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20  pColl ){.       
9df0: 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74     pColl = sqlit
9e00: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70 50  e3ExprCollSeq(pP
9e10: 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69  arse, pList->a[i
9e20: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
9e30: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
9e40: 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64    if( pDef->need
9e50: 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20 20 20  CollSeq ){.     
9e60: 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
9e70: 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65 2d 3e  pColl = pParse->
9e80: 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b 20 0a  db->pDfltColl; .
9e90: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9ea0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c  dbeOp3(v, OP_Col
9eb0: 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63 68 61  lSeq, 0, 0, (cha
9ec0: 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f 43 4f  r *)pColl, P3_CO
9ed0: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a  LLSEQ);.      }.
9ee0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
9ef0: 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e 63 74  eOp3(v, OP_Funct
9f00: 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32 2c 20  ion, nExpr, p2, 
9f10: 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50 33 5f  (char*)pDef, P3_
9f20: 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20 20 20  FUNCDEF);.      
9f30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
9f40: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
9f50: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
9f60: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9f70: 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e  MemLoad, pExpr->
9f80: 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20  iColumn, 0);.   
9f90: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
9fa0: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
9fb0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
9fc0: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 63 6f 6e  ;.      char con
9fd0: 73 74 20 2a 61 66 66 53 74 72 3b 0a 0a 20 20 20  st *affStr;..   
9fe0: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
9ff0: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
a000: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
a010: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
a020: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
a030: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
a040: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
a050: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
a060: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
a070: 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66  r.      ** P3 of
a080: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
a090: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
a0a0: 66 66 53 74 72 20 3d 20 73 71 6c 69 74 65 33 41  ffStr = sqlite3A
a0b0: 66 66 69 6e 69 74 79 53 74 72 69 6e 67 28 63 6f  ffinityString(co
a0c0: 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79  mparisonAffinity
a0d0: 28 70 45 78 70 72 29 29 3b 0a 0a 20 20 20 20 20  (pExpr));..     
a0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a0f0: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
a100: 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20 2f   1, 0);..      /
a110: 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70 72  * Code the <expr
a120: 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49  > from "<expr> I
a130: 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74 65  N (...)". The te
a140: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20 20  mporary table.  
a150: 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69 54      ** pExpr->iT
a160: 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74 68  able contains th
a170: 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61  e values that ma
a180: 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29 20  ke up the (...) 
a190: 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  set..      */.  
a1a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a1b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
a1c0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a1d0: 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56   addr = sqlite3V
a1e0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
a1f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
a200: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
a210: 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64 64  NotNull, -1, add
a220: 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20 20  r+4);           
a230: 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f 0a   /* addr + 0 */.
a240: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a250: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
a260: 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 2, 0);.      s
a270: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
a280: 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30  v, OP_String8, 0
a290: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
a2a0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a2b0: 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64 72  OP_Goto, 0, addr
a2c0: 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  +7);.      sqlit
a2d0: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a2e0: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
a2f0: 2c 20 61 66 66 53 74 72 2c 20 50 33 5f 53 54 41  , affStr, P3_STA
a300: 54 49 43 29 3b 20 2f 2a 20 61 64 64 72 20 2b 20  TIC); /* addr + 
a310: 34 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74  4 */.      sqlit
a320: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a330: 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e  P_Found, pExpr->
a340: 69 54 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b  iTable, addr+7);
a350: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a360: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64  beAddOp(v, OP_Ad
a370: 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20  dImm, -1, 0);   
a380: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
a390: 2a 20 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20  * addr + 6 */.. 
a3a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
a3b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
a3c0: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 69  TWEEN: {.      i
a3d0: 6e 74 20 70 31 3b 0a 20 20 20 20 20 20 43 6f 6c  nt p1;.      Col
a3e0: 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20 20 20 20  lSeq *p3;.      
a3f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a400: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a410: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
a420: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a430: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
a440: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
a450: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
a460: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d  xpr->pList->a[0]
a470: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70  .pExpr);.      p
a480: 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72  1 = binaryCompar
a490: 65 50 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  eP1(pExpr->pLeft
a4a0: 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  , pExpr->pList->
a4b0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 30 29 3b 0a  a[0].pExpr, 0);.
a4c0: 20 20 20 20 20 20 70 33 20 3d 20 62 69 6e 61 72        p3 = binar
a4d0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
a4e0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a4f0: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69  Left, pExpr->pLi
a500: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
a510: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
a520: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 65 2c 20  beOp3(v, OP_Ge, 
a530: 70 31 2c 20 30 2c 20 28 76 6f 69 64 20 2a 29 70  p1, 0, (void *)p
a540: 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a  3, P3_COLLSEQ);.
a550: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
a560: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
a570: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
a580: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a590: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a5a0: 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72  List->a[1].pExpr
a5b0: 29 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 62 69  );.      p1 = bi
a5c0: 6e 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45  naryCompareP1(pE
a5d0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70  xpr->pLeft, pExp
a5e0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
a5f0: 45 78 70 72 2c 20 30 29 3b 0a 20 20 20 20 20 20  Expr, 0);.      
a600: 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61  p3 = binaryCompa
a610: 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65  reCollSeq(pParse
a620: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
a630: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
a640: 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  1].pExpr);.     
a650: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
a660: 76 2c 20 4f 50 5f 4c 65 2c 20 70 31 2c 20 30 2c  v, OP_Le, p1, 0,
a670: 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f   (void *)p3, P3_
a680: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
a690: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a6a0: 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30 2c 20 30  (v, OP_And, 0, 0
a6b0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
a6c0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
a6d0: 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20 63 61 73  K_UPLUS:.    cas
a6e0: 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20 20 20 20  e TK_AS: {.     
a6f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
a700: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
a710: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 62 72  pLeft);.      br
a720: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
a730: 61 73 65 20 54 4b 5f 43 41 53 45 3a 20 7b 0a 20  ase TK_CASE: {. 
a740: 20 20 20 20 20 69 6e 74 20 65 78 70 72 5f 65 6e       int expr_en
a750: 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20 20 20 69  d_label;.      i
a760: 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a 20 20 20  nt jumpInst;.   
a770: 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20     int addr;.   
a780: 20 20 20 69 6e 74 20 6e 45 78 70 72 3b 0a 20 20     int nExpr;.  
a790: 20 20 20 20 69 6e 74 20 69 3b 0a 0a 20 20 20 20      int i;..    
a7a0: 20 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e    assert(pExpr->
a7b0: 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 61 73  pList);.      as
a7c0: 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70 4c 69  sert((pExpr->pLi
a7d0: 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29 20 3d  st->nExpr % 2) =
a7e0: 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65  = 0);.      asse
a7f0: 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  rt(pExpr->pList-
a800: 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20 20  >nExpr > 0);.   
a810: 20 20 20 6e 45 78 70 72 20 3d 20 70 45 78 70 72     nExpr = pExpr
a820: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a  ->pList->nExpr;.
a830: 20 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c        expr_end_l
a840: 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  abel = sqlite3Vd
a850: 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
a860: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
a870: 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20  >pLeft ){.      
a880: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
a890: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
a8a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d  >pLeft);.      }
a8b0: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a8c0: 69 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b  i<nExpr; i=i+2){
a8d0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a8e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
a8f0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
a900: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
a910: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
a920: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
a930: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
a940: 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72  yCompareP1(pExpr
a950: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
a960: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a970: 72 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  r, 1);.         
a980: 20 43 6f 6c 6c 53 65 71 20 2a 70 33 20 3d 20 62   CollSeq *p3 = b
a990: 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c  inaryCompareColl
a9a0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70  Seq(pParse, pExp
a9b0: 72 2d 3e 70 4c 65 66 74 2c 20 0a 20 20 20 20 20  r->pLeft, .     
a9c0: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
a9d0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
a9e0: 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  r);.          sq
a9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aa00: 2c 20 4f 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b  , OP_Dup, 1, 1);
aa10: 0a 20 20 20 20 20 20 20 20 20 20 6a 75 6d 70 49  .          jumpI
aa20: 6e 73 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62  nst = sqlite3Vdb
aa30: 65 4f 70 33 28 76 2c 20 4f 50 5f 4e 65 2c 20 70  eOp3(v, OP_Ne, p
aa40: 31 2c 20 30 2c 20 28 76 6f 69 64 20 2a 29 70 33  1, 0, (void *)p3
aa50: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
aa60: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
aa70: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
aa80: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
aa90: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
aaa0: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
aab0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
aac0: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
aad0: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
aae0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
aaf0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ab00: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
ab10: 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  +1].pExpr);.    
ab20: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ab30: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
ab40: 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62   0, expr_end_lab
ab50: 65 6c 29 3b 0a 20 20 20 20 20 20 20 20 61 64 64  el);.        add
ab60: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  r = sqlite3VdbeC
ab70: 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20  urrentAddr(v);. 
ab80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
ab90: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 6a 75  beChangeP2(v, ju
aba0: 6d 70 49 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20  mpInst, addr);. 
abb0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
abc0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
abd0: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
abe0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
abf0: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
ac00: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
ac10: 78 70 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20  xpr->pRight ){. 
ac20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
ac30: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
ac40: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
ac50: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
ac60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
ac80: 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20  g8, 0, 0);.     
ac90: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
aca0: 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c  VdbeResolveLabel
acb0: 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62  (v, expr_end_lab
acc0: 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  el);.      break
acd0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
ace0: 20 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20   TK_RAISE: {.   
acf0: 20 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e     if( !pParse->
ad00: 74 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20  trigStack ){.   
ad10: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
ad20: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
ad30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ad40: 20 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79      "RAISE() may
ad50: 20 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69   only be used wi
ad60: 74 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70  thin a trigger-p
ad70: 72 6f 67 72 61 6d 22 29 3b 0a 20 20 20 20 20 20  rogram");.      
ad80: 20 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 2b 2b    pParse->nErr++
ad90: 3b 0a 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20  ;..return;.     
ada0: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   }.      if( pEx
adb0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f  pr->iColumn == O
adc0: 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 09 20  E_Rollback ||.. 
add0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
ade0: 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 09  == OE_Abort ||..
adf0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
ae00: 20 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 7b 0a 09   == OE_Fail ){..
ae10: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ae20: 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20 53 51 4c  (v, OP_Halt, SQL
ae30: 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e 54 2c 20  ITE_CONSTRAINT, 
ae40: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a  pExpr->iColumn,.
ae50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ae60: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
ae70: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
ae80: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 09 20 20 73  ->token.n);..  s
ae90: 71 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74  qlite3VdbeDequot
aea0: 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20  eP3(v, -1);.    
aeb0: 20 20 7d 20 65 6c 73 65 20 7b 0a 09 20 20 61 73    } else {..  as
aec0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f  sert( pExpr->iCo
aed0: 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72  lumn == OE_Ignor
aee0: 65 20 29 3b 0a 09 20 20 73 71 6c 69 74 65 33 56  e );..  sqlite3V
aef0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47 6f 74  dbeOp3(v, OP_Got
af00: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
af10: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
af20: 75 6d 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20  ump,.           
af30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
af40: 22 28 49 47 4e 4f 52 45 20 6a 75 6d 70 29 22 2c  "(IGNORE jump)",
af50: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
af60: 20 7d 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20   }.    break;.  
af70: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
af80: 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 70 75  ate code that pu
af90: 73 68 65 73 20 74 68 65 20 76 61 6c 75 65 20 6f  shes the value o
afa0: 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e 74 20  f every element 
afb0: 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a 2a 20  of the given.** 
afc0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 20  expression list 
afd0: 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a  onto the stack..
afe0: 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  **.** Return the
aff0: 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65 6d 65   number of eleme
b000: 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74 6f 20  nts pushed onto 
b010: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 69 6e  the stack..*/.in
b020: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  t sqlite3ExprCod
b030: 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50 61 72  eExprList(.  Par
b040: 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20  se *pParse,     
b050: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
b060: 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74  xt */.  ExprList
b070: 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20 54 68   *pList    /* Th
b080: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
b090: 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20 2a 2f  t to be coded */
b0a0: 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45 78 70  .){.  struct Exp
b0b0: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  rList_item *pIte
b0c0: 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20  m;.  int i, n;. 
b0d0: 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66 28 20   Vdbe *v;.  if( 
b0e0: 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72  pList==0 ) retur
b0f0: 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c 69 74  n 0;.  v = sqlit
b100: 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65  e3GetVdbe(pParse
b110: 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e  );.  n = pList->
b120: 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70 49 74  nExpr;.  for(pIt
b130: 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
b140: 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49 74 65  ; i<n; i++, pIte
b150: 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  m++){.    sqlite
b160: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b170: 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b  , pItem->pExpr);
b180: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 3b  .  }.  return n;
b190: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
b1a0: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
b1b0: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
b1c0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
b1d0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
b1e0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
b1f0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
b200: 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74 20 65  on is true but e
b210: 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
b220: 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
b230: 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
b240: 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65 2e 0a  ssion is false..
b250: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
b260: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
b270: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
b280: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
b290: 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61 6b 65  e), then.** take
b2a0: 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74 68 65   the jump if the
b2b0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c 61 67   jumpIfNull flag
b2c0: 20 69 73 20 74 72 75 65 2e 0a 2a 2f 0a 76 6f 69   is true..*/.voi
b2d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54  d sqlite3ExprIfT
b2e0: 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  rue(Parse *pPars
b2f0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
b300: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
b310: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
b320: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
b330: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
b340: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
b350: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
b360: 75 72 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70  urn;.  switch( p
b370: 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  Expr->op ){.    
b380: 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20  case TK_LT:     
b390: 20 20 6f 70 20 3d 20 4f 50 5f 4c 74 3b 20 20 20    op = OP_Lt;   
b3a0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
b3b0: 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20  ase TK_LE:      
b3c0: 20 6f 70 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20   op = OP_Le;    
b3d0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
b3e0: 73 65 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20  se TK_GT:       
b3f0: 6f 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20  op = OP_Gt;     
b400: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
b410: 65 20 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f  e TK_GE:       o
b420: 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20 20  p = OP_Ge;      
b430: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
b440: 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70   TK_NE:       op
b450: 20 3d 20 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20   = OP_Ne;       
b460: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
b470: 54 4b 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20  TK_EQ:       op 
b480: 3d 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62  = OP_Eq;       b
b490: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
b4a0: 4b 5f 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d  K_ISNULL:   op =
b4b0: 20 4f 50 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72   OP_IsNull;   br
b4c0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
b4d0: 5f 4e 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20  _NOTNULL:  op = 
b4e0: 4f 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65  OP_NotNull;  bre
b4f0: 61 6b 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a  ak;.    default:
b500: 20 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73    break;.  }.  s
b510: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
b520: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
b530: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
b540: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
b550: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
b560: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b570: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
b580: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
b590: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
b5a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
b5b0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
b5c0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
b5d0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
b5e0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b5f0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
b600: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
b610: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b620: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
b630: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
b640: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
b650: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
b660: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
b670: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
b680: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
b690: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
b6a0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
b6b0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b6c0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
b6d0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
b6e0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
b6f0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b700: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
b710: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
b720: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b730: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
b740: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
b750: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
b760: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
b770: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
b780: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
b790: 20 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61     int p1 = bina
b7a0: 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70  ryCompareP1(pExp
b7b0: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
b7c0: 3e 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e  >pRight, jumpIfN
b7d0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  ull);.      Coll
b7e0: 53 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79  Seq *p3 = binary
b7f0: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70  CompareCollSeq(p
b800: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
b810: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  eft, pExpr->pRig
b820: 68 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ht);.      sqlit
b830: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b840: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b850: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b860: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b870: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
b880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b890: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20  eOp3(v, op, p1, 
b8a0: 64 65 73 74 2c 20 28 76 6f 69 64 20 2a 29 70 33  dest, (void *)p3
b8b0: 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20  , P3_COLLSEQ);. 
b8c0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b8d0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53  }.    case TK_IS
b8e0: 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54  NULL:.    case T
b8f0: 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20  K_NOTNULL: {.   
b900: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
b910: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
b920: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
b930: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b940: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
b950: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b960: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b970: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
b980: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
b990: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
b9a0: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
b9b0: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
b9c0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
b9d0: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
b9e0: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
b9f0: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
ba00: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
ba10: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
ba20: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
ba30: 20 20 69 6e 74 20 70 31 3b 0a 20 20 20 20 20 20    int p1;.      
ba40: 43 6f 6c 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20  CollSeq *p3;.   
ba50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ba60: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
ba70: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
ba80: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
ba90: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
baa0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bab0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bac0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61   pExpr->pList->a
bad0: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [0].pExpr);.    
bae0: 20 20 70 31 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p1 = binaryCom
baf0: 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e 70 4c  pareP1(pExpr->pL
bb00: 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73  eft, pExpr->pLis
bb10: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2c 20 21  t->a[0].pExpr, !
bb20: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
bb30: 20 20 20 70 33 20 3d 20 62 69 6e 61 72 79 43 6f     p3 = binaryCo
bb40: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
bb50: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
bb60: 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  t, pExpr->pList-
bb70: 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[0].pExpr);.  
bb80: 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74      addr = sqlit
bb90: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
bba0: 4c 74 2c 20 70 31 2c 20 30 2c 20 28 76 6f 69 64  Lt, p1, 0, (void
bbb0: 20 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45   *)p3, P3_COLLSE
bbc0: 51 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  Q);..      sqlit
bbd0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
bbe0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
bbf0: 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20  >a[1].pExpr);.  
bc00: 20 20 20 20 70 31 20 3d 20 62 69 6e 61 72 79 43      p1 = binaryC
bc10: 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72 2d 3e  ompareP1(pExpr->
bc20: 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c  pLeft, pExpr->pL
bc30: 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 2c  ist->a[1].pExpr,
bc40: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
bc50: 20 20 20 20 70 33 20 3d 20 62 69 6e 61 72 79 43      p3 = binaryC
bc60: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
bc70: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
bc80: 66 74 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  ft, pExpr->pList
bc90: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  ->a[1].pExpr);. 
bca0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bcb0: 4f 70 33 28 76 2c 20 4f 50 5f 4c 65 2c 20 70 31  Op3(v, OP_Le, p1
bcc0: 2c 20 64 65 73 74 2c 20 28 76 6f 69 64 20 2a 29  , dest, (void *)
bcd0: 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b  p3, P3_COLLSEQ);
bce0: 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ..      sqlite3V
bcf0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
bd00: 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20  nteger, 0, 0);. 
bd10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd20: 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72  ChangeP2(v, addr
bd30: 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  , sqlite3VdbeCur
bd40: 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20  rentAddr(v));.  
bd50: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
bd60: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
bd70: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
bd80: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
bd90: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
bda0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
bdb0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
bdc0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bdd0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20  AddOp(v, OP_If, 
bde0: 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74  jumpIfNull, dest
bdf0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
be00: 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a      }.  }.}../*.
be10: 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
be20: 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65   for a boolean e
be30: 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74  xpression such t
be40: 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61  hat a jump is ma
be50: 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62  de.** to the lab
be60: 65 6c 20 22 64 65 73 74 22 20 69 66 20 74 68 65  el "dest" if the
be70: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
be80: 61 6c 73 65 20 62 75 74 20 65 78 65 63 75 74 69  alse but executi
be90: 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20  on.** continues 
bea0: 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69 66  straight thru if
beb0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
bec0: 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49  is true..**.** I
bed0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
bee0: 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55   evaluates to NU
bef0: 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72 75 65  LL (neither true
bf00: 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e   nor false) then
bf10: 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70  .** jump if jump
bf20: 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f  IfNull is true o
bf30: 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69  r fall through i
bf40: 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
bf50: 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73  false..*/.void s
bf60: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
bf70: 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  e(Parse *pParse,
bf80: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e   Expr *pExpr, in
bf90: 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70  t dest, int jump
bfa0: 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20  IfNull){.  Vdbe 
bfb0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
bfc0: 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30  be;.  int op = 0
bfd0: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20  ;.  if( v==0 || 
bfe0: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
bff0: 6e 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  n;.  switch( pEx
c000: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
c010: 73 65 20 54 4b 5f 4c 54 3a 20 20 20 20 20 20 20  se TK_LT:       
c020: 6f 70 20 3d 20 4f 50 5f 47 65 3b 20 20 20 20 20  op = OP_Ge;     
c030: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
c040: 65 20 54 4b 5f 4c 45 3a 20 20 20 20 20 20 20 6f  e TK_LE:       o
c050: 70 20 3d 20 4f 50 5f 47 74 3b 20 20 20 20 20 20  p = OP_Gt;      
c060: 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
c070: 20 54 4b 5f 47 54 3a 20 20 20 20 20 20 20 6f 70   TK_GT:       op
c080: 20 3d 20 4f 50 5f 4c 65 3b 20 20 20 20 20 20 20   = OP_Le;       
c090: 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
c0a0: 54 4b 5f 47 45 3a 20 20 20 20 20 20 20 6f 70 20  TK_GE:       op 
c0b0: 3d 20 4f 50 5f 4c 74 3b 20 20 20 20 20 20 20 62  = OP_Lt;       b
c0c0: 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
c0d0: 4b 5f 4e 45 3a 20 20 20 20 20 20 20 6f 70 20 3d  K_NE:       op =
c0e0: 20 4f 50 5f 45 71 3b 20 20 20 20 20 20 20 62 72   OP_Eq;       br
c0f0: 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
c100: 5f 45 51 3a 20 20 20 20 20 20 20 6f 70 20 3d 20  _EQ:       op = 
c110: 4f 50 5f 4e 65 3b 20 20 20 20 20 20 20 62 72 65  OP_Ne;       bre
c120: 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
c130: 49 53 4e 55 4c 4c 3a 20 20 20 6f 70 20 3d 20 4f  ISNULL:   op = O
c140: 50 5f 4e 6f 74 4e 75 6c 6c 3b 20 20 62 72 65 61  P_NotNull;  brea
c150: 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  k;.    case TK_N
c160: 4f 54 4e 55 4c 4c 3a 20 20 6f 70 20 3d 20 4f 50  OTNULL:  op = OP
c170: 5f 49 73 4e 75 6c 6c 3b 20 20 20 62 72 65 61 6b  _IsNull;   break
c180: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 20  ;.    default:  
c190: 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 73 77 69  break;.  }.  swi
c1a0: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
c1b0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e  {.    case TK_AN
c1c0: 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  D: {.      sqlit
c1d0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
c1e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c1f0: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
c200: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
c210: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
c220: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c230: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
c240: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
c250: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
c260: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20   case TK_OR: {. 
c270: 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71       int d2 = sq
c280: 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62  lite3VdbeMakeLab
c290: 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c  el(v);.      sql
c2a0: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
c2b0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
c2c0: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
c2d0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
c2e0: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
c2f0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
c300: 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d  Right, dest, jum
c310: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
c320: 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c  sqlite3VdbeResol
c330: 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a  veLabel(v, d2);.
c340: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c350: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
c360: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
c370: 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
c380: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c390: 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ft, dest, jumpIf
c3a0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
c3b0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
c3c0: 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
c3d0: 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
c3e0: 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
c3f0: 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
c400: 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
c410: 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
c420: 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72    int p1 = binar
c430: 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78 70 72  yCompareP1(pExpr
c440: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
c450: 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75  pRight, jumpIfNu
c460: 6c 6c 29 3b 0a 20 20 20 20 20 20 43 6f 6c 6c 53  ll);.      CollS
c470: 65 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43  eq *p3 = binaryC
c480: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
c490: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c4a0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
c4b0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
c4c0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
c4d0: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
c4e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c4f0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c500: 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20  Expr->pRight);. 
c510: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c520: 4f 70 33 28 76 2c 20 6f 70 2c 20 70 31 2c 20 64  Op3(v, op, p1, d
c530: 65 73 74 2c 20 28 76 6f 69 64 20 2a 29 70 33 2c  est, (void *)p3,
c540: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
c550: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
c560: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
c570: 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  ULL:.    case TK
c580: 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20  _NOTNULL: {.    
c590: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c5a0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c5b0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c5c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c5d0: 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b  v, op, 1, dest);
c5e0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c5f0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c600: 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
c610: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
c620: 6f 6e 20 69 73 20 22 78 20 42 45 54 57 45 45 4e  on is "x BETWEEN
c630: 20 79 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73   y AND z". It is
c640: 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a   implemented as:
c650: 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20  .      **.      
c660: 2a 2a 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29  ** 1 IF (x >= y)
c670: 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a   GOTO 3.      **
c680: 20 32 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20   2 GOTO <dest>. 
c690: 20 20 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20       ** 3 IF (x 
c6a0: 3e 20 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e  > z) GOTO <dest>
c6b0: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
c6c0: 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20  int addr;.      
c6d0: 69 6e 74 20 70 31 3b 0a 20 20 20 20 20 20 43 6f  int p1;.      Co
c6e0: 6c 6c 53 65 71 20 2a 70 33 3b 0a 20 20 20 20 20  llSeq *p3;.     
c6f0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c700: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c710: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71  pLeft);.      sq
c720: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c730: 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b  , OP_Dup, 0, 0);
c740: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c750: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c760: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
c770: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
c780: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
c790: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
c7a0: 3b 0a 20 20 20 20 20 20 70 31 20 3d 20 62 69 6e  ;.      p1 = bin
c7b0: 61 72 79 43 6f 6d 70 61 72 65 50 31 28 70 45 78  aryCompareP1(pEx
c7c0: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
c7d0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45  ->pList->a[0].pE
c7e0: 78 70 72 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c  xpr, !jumpIfNull
c7f0: 29 3b 0a 20 20 20 20 20 20 70 33 20 3d 20 62 69  );.      p3 = bi
c800: 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53  naryCompareCollS
c810: 65 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  eq(pParse, pExpr
c820: 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
c830: 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  pList->a[0].pExp
c840: 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  r);.      sqlite
c850: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 47  3VdbeOp3(v, OP_G
c860: 65 2c 20 70 31 2c 20 61 64 64 72 2b 33 2c 20 28  e, p1, addr+3, (
c870: 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f 43 4f  void *)p3, P3_CO
c880: 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 73 71  LLSEQ);.      sq
c890: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c8a0: 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b  , OP_Pop, 1, 0);
c8b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c8c0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
c8d0: 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20  to, 0, dest);.  
c8e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c8f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c900: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
c910: 45 78 70 72 29 3b 0a 20 20 20 20 20 20 70 31 20  Expr);.      p1 
c920: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50  = binaryCompareP
c930: 31 28 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  1(pExpr->pLeft, 
c940: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
c950: 31 5d 2e 70 45 78 70 72 2c 20 6a 75 6d 70 49 66  1].pExpr, jumpIf
c960: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 70 33 20  Null);.      p3 
c970: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
c980: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
c990: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
c9a0: 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  pr->pList->a[1].
c9b0: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71  pExpr);.      sq
c9c0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c9d0: 4f 50 5f 47 74 2c 20 70 31 2c 20 64 65 73 74 2c  OP_Gt, p1, dest,
c9e0: 20 28 76 6f 69 64 20 2a 29 70 33 2c 20 50 33 5f   (void *)p3, P3_
c9f0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
ca00: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
ca10: 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20   default: {.    
ca20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
ca30: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  e(pParse, pExpr)
ca40: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
ca50: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49  dbeAddOp(v, OP_I
ca60: 66 4e 6f 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  fNot, jumpIfNull
ca70: 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20 62  , dest);.      b
ca80: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  reak;.    }.  }.
ca90: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65  }../*.** Do a de
caa0: 65 70 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66  ep comparison of
cab0: 20 74 77 6f 20 65 78 70 72 65 73 73 69 6f 6e 20   two expression 
cac0: 74 72 65 65 73 2e 20 20 52 65 74 75 72 6e 20 54  trees.  Return T
cad0: 52 55 45 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a  RUE (non-zero).*
cae0: 2a 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64  * if they are id
caf0: 65 6e 74 69 63 61 6c 20 61 6e 64 20 72 65 74 75  entical and retu
cb00: 72 6e 20 46 41 4c 53 45 20 69 66 20 74 68 65 79  rn FALSE if they
cb10: 20 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77   differ in any w
cb20: 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  ay..*/.int sqlit
cb30: 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78  e3ExprCompare(Ex
cb40: 70 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42  pr *pA, Expr *pB
cb50: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66  ){.  int i;.  if
cb60: 28 20 70 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ( pA==0 ){.    r
cb70: 65 74 75 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d  eturn pB==0;.  }
cb80: 65 6c 73 65 20 69 66 28 20 70 42 3d 3d 30 20 29  else if( pB==0 )
cb90: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  {.    return 0;.
cba0: 20 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70    }.  if( pA->op
cbb0: 21 3d 70 42 2d 3e 6f 70 20 29 20 72 65 74 75 72  !=pB->op ) retur
cbc0: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
cbd0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
cbe0: 41 2d 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c  A->pLeft, pB->pL
cbf0: 65 66 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b  eft) ) return 0;
cc00: 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45  .  if( !sqlite3E
cc10: 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70  xprCompare(pA->p
cc20: 52 69 67 68 74 2c 20 70 42 2d 3e 70 52 69 67 68  Right, pB->pRigh
cc30: 74 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  t) ) return 0;. 
cc40: 20 69 66 28 20 70 41 2d 3e 70 4c 69 73 74 20 29   if( pA->pList )
cc50: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 70 4c  {.    if( pB->pL
cc60: 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ist==0 ) return 
cc70: 30 3b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e 70  0;.    if( pA->p
cc80: 4c 69 73 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  List->nExpr!=pB-
cc90: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 20  >pList->nExpr ) 
cca0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f  return 0;.    fo
ccb0: 72 28 69 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69  r(i=0; i<pA->pLi
ccc0: 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  st->nExpr; i++){
ccd0: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
cce0: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
ccf0: 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  A->pList->a[i].p
cd00: 45 78 70 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d  Expr, pB->pList-
cd10: 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a  >a[i].pExpr) ){.
cd20: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
cd30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
cd40: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 2d 3e    }else if( pB->
cd50: 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 72 65 74  pList ){.    ret
cd60: 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28  urn 0;.  }.  if(
cd70: 20 70 41 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20   pA->pSelect || 
cd80: 70 42 2d 3e 70 53 65 6c 65 63 74 20 29 20 72 65  pB->pSelect ) re
cd90: 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41  turn 0;.  if( pA
cda0: 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54  ->iTable!=pB->iT
cdb0: 61 62 6c 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c  able || pA->iCol
cdc0: 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e  umn!=pB->iColumn
cdd0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
cde0: 66 28 20 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29  f( pA->token.z )
cdf0: 7b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  {.    if( pB->to
ce00: 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72  ken.z==0 ) retur
ce10: 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70 42 2d  n 0;.    if( pB-
ce20: 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f  >token.n!=pA->to
ce30: 6b 65 6e 2e 6e 20 29 20 72 65 74 75 72 6e 20 30  ken.n ) return 0
ce40: 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
ce50: 33 53 74 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f  3StrNICmp(pA->to
ce60: 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e  ken.z, pB->token
ce70: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29  .z, pB->token.n)
ce80: 21 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  !=0 ) return 0;.
ce90: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a    }.  return 1;.
cea0: 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e  }../*.** Add a n
ceb0: 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68  ew element to th
cec0: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
ced0: 20 61 72 72 61 79 20 61 6e 64 20 72 65 74 75 72   array and retur
cee0: 6e 20 69 74 73 20 69 6e 64 65 78 2e 0a 2a 2f 0a  n its index..*/.
cef0: 73 74 61 74 69 63 20 69 6e 74 20 61 70 70 65 6e  static int appen
cf00: 64 41 67 67 49 6e 66 6f 28 50 61 72 73 65 20 2a  dAggInfo(Parse *
cf10: 70 50 61 72 73 65 29 7b 0a 20 20 69 66 28 20 28  pParse){.  if( (
cf20: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 26 20 30  pParse->nAgg & 0
cf30: 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20 20 69 6e  x7)==0 ){.    in
cf40: 74 20 61 6d 74 20 3d 20 70 50 61 72 73 65 2d 3e  t amt = pParse->
cf50: 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20 20 41 67  nAgg + 8;.    Ag
cf60: 67 45 78 70 72 20 2a 61 41 67 67 20 3d 20 73 71  gExpr *aAgg = sq
cf70: 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70 50 61 72  liteRealloc(pPar
cf80: 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74 2a 73 69  se->aAgg, amt*si
cf90: 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61 41 67  zeof(pParse->aAg
cfa0: 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20  g[0]));.    if( 
cfb0: 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20 20 20 20  aAgg==0 ){.     
cfc0: 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20 20 20 20   return -1;.    
cfd0: 7d 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41  }.    pParse->aA
cfe0: 67 67 20 3d 20 61 41 67 67 3b 0a 20 20 7d 0a 20  gg = aAgg;.  }. 
cff0: 20 6d 65 6d 73 65 74 28 26 70 50 61 72 73 65 2d   memset(&pParse-
d000: 3e 61 41 67 67 5b 70 50 61 72 73 65 2d 3e 6e 41  >aAgg[pParse->nA
d010: 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 70  gg], 0, sizeof(p
d020: 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29  Parse->aAgg[0]))
d030: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
d040: 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a  e->nAgg++;.}../*
d050: 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20  .** Analyze the 
d060: 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e  given expression
d070: 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67   looking for agg
d080: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
d090: 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69   and.** for vari
d0a0: 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20  ables that need 
d0b0: 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74  to be added to t
d0c0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
d0d0: 5d 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65  ] array..** Make
d0e0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72   additional entr
d0f0: 69 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73  ies to the pPars
d100: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20  e->aAgg[] array 
d110: 61 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a  as necessary..**
d120: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
d130: 20 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20   should only be 
d140: 63 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65  called after the
d150: 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20   expression has 
d160: 62 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64  been.** analyzed
d170: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52   by sqlite3ExprR
d180: 65 73 6f 6c 76 65 49 64 73 28 29 20 61 6e 64 20  esolveIds() and 
d190: 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b  sqlite3ExprCheck
d1a0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72 72  ()..**.** If err
d1b0: 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c 65  ors are seen, le
d1c0: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
d1d0: 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67 20  sage in zErrMsg 
d1e0: 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74 68  and return.** th
d1f0: 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f  e number of erro
d200: 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  rs..*/.int sqlit
d210: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d220: 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a 70  regates(Parse *p
d230: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d240: 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  pr){.  int i;.  
d250: 41 67 67 45 78 70 72 20 2a 61 41 67 67 3b 0a 20  AggExpr *aAgg;. 
d260: 20 69 6e 74 20 6e 45 72 72 20 3d 20 30 3b 0a 0a   int nErr = 0;..
d270: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29    if( pExpr==0 )
d280: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 73 77 69   return 0;.  swi
d290: 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29  tch( pExpr->op )
d2a0: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  {.    case TK_CO
d2b0: 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41  LUMN: {.      aA
d2c0: 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67  gg = pParse->aAg
d2d0: 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30  g;.      for(i=0
d2e0: 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67  ; i<pParse->nAgg
d2f0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20  ; i++){.        
d300: 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41 67  if( aAgg[i].isAg
d310: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
d320: 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b 69        if( aAgg[i
d330: 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d  ].pExpr->iTable=
d340: 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a 20  =pExpr->iTable. 
d350: 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67 5b          && aAgg[
d360: 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  i].pExpr->iColum
d370: 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  n==pExpr->iColum
d380: 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62  n ){.          b
d390: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a  reak;.        }.
d3a0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
d3b0: 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67  ( i>=pParse->nAg
d3c0: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20 3d  g ){.        i =
d3d0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
d3e0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
d3f0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
d400: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
d410: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
d420: 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70  g = 0;.        p
d430: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
d440: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
d450: 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70      }.      pExp
d460: 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20  r->iAgg = i;.   
d470: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
d480: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
d490: 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20  FUNCTION: {.    
d4a0: 20 20 61 41 67 67 20 3d 20 70 50 61 72 73 65 2d    aAgg = pParse-
d4b0: 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 66 6f 72  >aAgg;.      for
d4c0: 28 69 3d 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e  (i=0; i<pParse->
d4d0: 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nAgg; i++){.    
d4e0: 20 20 20 20 69 66 28 20 21 61 41 67 67 5b 69 5d      if( !aAgg[i]
d4f0: 2e 69 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75  .isAgg ) continu
d500: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  e;.        if( s
d510: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
d520: 65 28 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2c  e(aAgg[i].pExpr,
d530: 20 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20   pExpr) ){.     
d540: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d550: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
d560: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
d570: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
d580: 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50 61 72     u8 enc = pPar
d590: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20  se->db->enc;.   
d5a0: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
d5b0: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
d5c0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
d5d0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
d5e0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
d5f0: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 31 3b 0a 20  [i].isAgg = 1;. 
d600: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
d610: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
d620: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 70 50  Expr;.        pP
d630: 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 46  arse->aAgg[i].pF
d640: 75 6e 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e  unc = sqlite3Fin
d650: 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65  dFunction(pParse
d660: 2d 3e 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20  ->db,.          
d670: 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e     pExpr->token.
d680: 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  z, pExpr->token.
d690: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
d6a0: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
d6b0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
d6c0: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
d6d0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70  .      }.      p
d6e0: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
d6f0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
d700: 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20   }.    default: 
d710: 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  {.      if( pExp
d720: 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20  r->pLeft ){.    
d730: 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74      nErr = sqlit
d740: 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67  e3ExprAnalyzeAgg
d750: 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20  regates(pParse, 
d760: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
d770: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
d780: 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45 78 70   nErr==0 && pExp
d790: 72 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20  r->pRight ){.   
d7a0: 20 20 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69       nErr = sqli
d7b0: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
d7c0: 67 72 65 67 61 74 65 73 28 70 50 61 72 73 65 2c  gregates(pParse,
d7d0: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b   pExpr->pRight);
d7e0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
d7f0: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
d800: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
d810: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
d820: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
d830: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
d840: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
d850: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
d860: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
d870: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
d880: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
d890: 65 67 61 74 65 73 28 70 50 61 72 73 65 2c 20 70  egates(pParse, p
d8a0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
d8b0: 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  ].pExpr);.      
d8c0: 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
d8d0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
d8e0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72 72   }.  return nErr
d8f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74  ;.}../*.** Locat
d900: 65 20 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f  e a user functio
d910: 6e 20 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20  n given a name, 
d920: 61 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  a number of argu
d930: 6d 65 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67  ments and a flag
d940: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77  .** indicating w
d950: 68 65 74 68 65 72 20 74 68 65 20 66 75 6e 63 74  hether the funct
d960: 69 6f 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d  ion prefers UTF-
d970: 31 36 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20  16 over UTF-8.  
d980: 52 65 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e  Return a.** poin
d990: 74 65 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44  ter to the FuncD
d9a0: 65 66 20 73 74 72 75 63 74 75 72 65 20 74 68 61  ef structure tha
d9b0: 74 20 64 65 66 69 6e 65 73 20 74 68 61 74 20 66  t defines that f
d9c0: 75 6e 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75  unction, or retu
d9d0: 72 6e 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68  rn.** NULL if th
d9e0: 65 20 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20  e function does 
d9f0: 6e 6f 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a  not exist..**.**
da00: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
da10: 61 67 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74  ag argument is t
da20: 72 75 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20  rue, then a new 
da30: 28 62 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a  (blank) FuncDef.
da40: 2a 2a 20 73 74 72 75 63 74 75 72 65 20 69 73 20  ** structure is 
da50: 63 72 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65  created and like
da60: 64 20 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20  d into the "db" 
da70: 73 74 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a  structure if a.*
da80: 2a 20 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75  * no matching fu
da90: 6e 63 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c  nction previousl
daa0: 79 20 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e  y existed.  When
dab0: 20 63 72 65 61 74 65 46 6c 61 67 20 69 73 20 74   createFlag is t
dac0: 72 75 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e  rue.** and the n
dad0: 41 72 67 20 70 61 72 61 6d 65 74 65 72 20 69 73  Arg parameter is
dae0: 20 2d 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61   -1, then only a
daf0: 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61   function that a
db00: 63 63 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75  ccepts.** any nu
db10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
db20: 73 20 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e  s will be return
db30: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65  ed..**.** If cre
db40: 61 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65  ateFlag is false
db50: 20 61 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c   and nArg is -1,
db60: 20 74 68 65 6e 20 74 68 65 20 66 69 72 73 74 20   then the first 
db70: 76 61 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f  valid.** functio
db80: 6e 20 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72  n found is retur
db90: 6e 65 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e  ned.  A function
dba0: 20 69 73 20 76 61 6c 69 64 20 69 66 20 65 69 74   is valid if eit
dbb0: 68 65 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20  her xFunc.** or 
dbc0: 78 53 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72  xStep is non-zer
dbd0: 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61  o..**.** If crea
dbe0: 74 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c  teFlag is false,
dbf0: 20 74 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e   then a function
dc00: 20 77 69 74 68 20 74 68 65 20 72 65 71 75 69 72   with the requir
dc10: 65 64 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e  ed name and.** n
dc20: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
dc30: 74 73 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e  ts may be return
dc40: 65 64 20 65 76 65 6e 20 69 66 20 74 68 65 20 65  ed even if the e
dc50: 54 65 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65  TextRep flag doe
dc60: 73 20 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74  s not.** match t
dc70: 68 61 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a  hat requested..*
dc80: 2f 0a 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74  /.FuncDef *sqlit
dc90: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a  e3FindFunction(.
dca0: 20 20 73 71 6c 69 74 65 20 2a 64 62 2c 20 20 20    sqlite *db,   
dcb0: 20 20 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20       /* An open 
dcc0: 64 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f  database */.  co
dcd0: 6e 73 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c  nst char *zName,
dce0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
dcf0: 66 75 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e  function.  Not n
dd00: 75 6c 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a  ull-terminated *
dd10: 2f 0a 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20  /.  int nName,  
dd20: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
dd30: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
dd40: 6e 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  n the name */.  
dd50: 69 6e 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20  int nArg,       
dd60: 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20     /* Number of 
dd70: 61 72 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d  arguments.  -1 m
dd80: 65 61 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20  eans any number 
dd90: 2a 2f 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20  */.  u8 enc,    
dda0: 20 20 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65          /* Prefe
ddb0: 72 72 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69  rred text encodi
ddc0: 6e 67 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61  ng */.  int crea
ddd0: 74 65 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72  teFlag     /* Cr
dde0: 65 61 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69  eate new entry i
ddf0: 66 20 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20  f true and does 
de00: 6e 6f 74 20 6f 74 68 65 72 77 69 73 65 20 65 78  not otherwise ex
de10: 69 73 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63  ist */.){.  Func
de20: 44 65 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20  Def *p;         
de30: 2f 2a 20 49 74 65 72 61 74 6f 72 20 76 61 72 69  /* Iterator vari
de40: 61 62 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65  able */.  FuncDe
de50: 66 20 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a  f *pFirst;    /*
de60: 20 46 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20   First function 
de70: 77 69 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a  with this name *
de80: 2f 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65  /.  FuncDef *pBe
de90: 73 74 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20  st = 0; /* Best 
dea0: 6d 61 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66  match found so f
deb0: 61 72 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74  ar */.  int best
dec0: 6d 61 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20  match = 0;  ... 
ded0: 20 61 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51   assert( enc==SQ
dee0: 4c 49 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63  LITE_UTF8 || enc
def0: 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45  ==SQLITE_UTF16LE
df00: 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
df10: 55 54 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28  UTF16BE );.  if(
df20: 20 6e 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20   nArg<-1 ) nArg 
df30: 3d 20 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20  = -1;..  pFirst 
df40: 3d 20 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69  = (FuncDef*)sqli
df50: 74 65 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d  te3HashFind(&db-
df60: 3e 61 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e  >aFunc, zName, n
df70: 4e 61 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70  Name);.  for(p=p
df80: 46 69 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70  First; p; p=p->p
df90: 4e 65 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75  Next){.    /* Du
dfa0: 72 69 6e 67 20 74 68 65 20 73 65 61 72 63 68 20  ring the search 
dfb0: 66 6f 72 20 74 68 65 20 62 65 73 74 20 66 75 6e  for the best fun
dfc0: 63 74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e  ction definition
dfd0: 2c 20 62 65 73 74 6d 61 74 63 68 20 69 73 20 73  , bestmatch is s
dfe0: 65 74 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c  et.    ** as fol
dff0: 6c 6f 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65  lows to indicate
e000: 20 74 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20   the quality of 
e010: 74 68 65 20 6d 61 74 63 68 20 77 69 74 68 20 74  the match with t
e020: 68 65 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20  he definition.  
e030: 20 20 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20    ** pointed to 
e040: 62 79 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a  by pBest:.    **
e050: 0a 20 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74  .    ** 0: pBest
e060: 20 69 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74   is NULL. No mat
e070: 63 68 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e  ch has been foun
e080: 64 2e 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76  d..    ** 1: A v
e090: 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
e0a0: 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
e0b0: 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77 68  prefers UTF-8 wh
e0c0: 65 6e 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20  en a UTF-16.    
e0d0: 2a 2a 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69  **    encoding i
e0e0: 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
e0f0: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
e100: 2a 2a 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 2: A variable
e110: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
e120: 69 6f 6e 20 74 68 61 74 20 75 73 65 73 20 55 54  ion that uses UT
e130: 46 2d 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d  F-16BE when UTF-
e140: 31 36 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20  16LE is.    **  
e150: 20 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20    requested, or 
e160: 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
e170: 2a 2a 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65  ** 3: A variable
e180: 20 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74   arguments funct
e190: 69 6f 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61  ion using the sa
e1a0: 6d 65 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  me text encoding
e1b0: 2e 0a 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75  ..    ** 4: A fu
e1c0: 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20  nction with the 
e1d0: 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20  exact number of 
e1e0: 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73  arguments reques
e1f0: 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ted that.    ** 
e200: 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d 38     prefers UTF-8
e210: 20 77 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65   when a UTF-16 e
e220: 6e 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65  ncoding is reque
e230: 73 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65  sted, or vice ve
e240: 72 73 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41  rsa..    ** 5: A
e250: 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74   function with t
e260: 68 65 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20  he exact number 
e270: 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71  of arguments req
e280: 75 65 73 74 65 64 20 74 68 61 74 0a 20 20 20 20  uested that.    
e290: 2a 2a 20 20 20 20 70 72 65 66 65 72 73 20 55 54  **    prefers UT
e2a0: 46 2d 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d  F-16LE when UTF-
e2b0: 31 36 42 45 20 69 73 20 72 65 71 75 65 73 74 65  16BE is requeste
e2c0: 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73 61  d, or vice versa
e2d0: 2e 0a 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65  ..    ** 6: An e
e2e0: 78 61 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20  xact match..    
e2f0: 2a 2a 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67  **.    ** A larg
e300: 65 72 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74  er value of 'mat
e310: 63 68 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65  chqual' indicate
e320: 73 20 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62  s a more desirab
e330: 6c 65 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f  le match..    */
e340: 0a 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67  .    if( p->nArg
e350: 3d 3d 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d  ==-1 || p->nArg=
e360: 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d  =nArg || nArg==-
e370: 31 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d  1 ){.      int m
e380: 61 74 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20  atch = 1;       
e390: 20 20 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66     /* Quality of
e3a0: 20 74 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20   this match */. 
e3b0: 20 20 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67       if( p->nArg
e3c0: 3d 3d 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d  ==nArg || nArg==
e3d0: 2d 31 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  -1 ){.        ma
e3e0: 74 63 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d  tch = 4;.      }
e3f0: 0a 20 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d  .      if( enc==
e400: 70 2d 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20  p->iPrefEnc ){. 
e410: 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20         match += 
e420: 32 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  2;.      }.     
e430: 20 65 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d   else if( (enc==
e440: 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26  SQLITE_UTF16LE &
e450: 26 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53  & p->iPrefEnc==S
e460: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c  QLITE_UTF16BE) |
e470: 7c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  |.              
e480: 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
e490: 46 31 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65  F16BE && p->iPre
e4a0: 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
e4b0: 31 36 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20  16LE) ){.       
e4c0: 20 6d 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20   match += 1;.   
e4d0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
e4e0: 6d 61 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20  match>bestmatch 
e4f0: 29 7b 0a 20 20 20 20 20 20 20 20 70 42 65 73 74  ){.        pBest
e500: 20 3d 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65   = p;.        be
e510: 73 74 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b  stmatch = match;
e520: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
e530: 20 7d 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20   }..  /* If the 
e540: 63 72 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d  createFlag param
e550: 65 74 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e  eter is true, an
e560: 64 20 74 68 65 20 73 65 61 63 68 20 64 69 64 20  d the seach did 
e570: 6e 6f 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20  not reveal an.  
e580: 2a 2a 20 65 78 61 63 74 20 6d 61 74 63 68 20 66  ** exact match f
e590: 6f 72 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d  or the name, num
e5a0: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
e5b0: 20 61 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74   and encoding, t
e5c0: 68 65 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e  hen add a.  ** n
e5d0: 65 77 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20  ew entry to the 
e5e0: 68 61 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72  hash table and r
e5f0: 65 74 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20  eturn it..  */. 
e600: 20 69 66 28 20 63 72 65 61 74 65 46 6c 61 67 20   if( createFlag 
e610: 26 26 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26  && bestmatch<6 &
e620: 26 20 0a 20 20 20 20 20 20 28 70 42 65 73 74 20  & .      (pBest 
e630: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73  = sqliteMalloc(s
e640: 69 7a 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e  izeof(*pBest)+nN
e650: 61 6d 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70  ame+1)) ){.    p
e660: 42 65 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72  Best->nArg = nAr
e670: 67 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e  g;.    pBest->pN
e680: 65 78 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20  ext = pFirst;.  
e690: 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d    pBest->zName =
e6a0: 20 28 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31   (char*)&pBest[1
e6b0: 5d 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50  ];.    pBest->iP
e6c0: 72 65 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20  refEnc = enc;.  
e6d0: 20 20 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e    memcpy(pBest->
e6e0: 7a 4e 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e  zName, zName, nN
e6f0: 61 6d 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d  ame);.    pBest-
e700: 3e 7a 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20  >zName[nName] = 
e710: 30 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 48 61  0;.    sqlite3Ha
e720: 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e 61 46  shInsert(&db->aF
e730: 75 6e 63 2c 20 70 42 65 73 74 2d 3e 7a 4e 61 6d  unc, pBest->zNam
e740: 65 2c 20 6e 4e 61 6d 65 2c 20 28 76 6f 69 64 2a  e, nName, (void*
e750: 29 70 42 65 73 74 29 3b 0a 20 20 7d 0a 0a 20 20  )pBest);.  }..  
e760: 69 66 28 20 70 42 65 73 74 20 26 26 20 28 70 42  if( pBest && (pB
e770: 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42  est->xStep || pB
e780: 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72  est->xFunc || cr
e790: 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20  eateFlag) ){.   
e7a0: 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20   return pBest;. 
e7b0: 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
e7c0: 0a                                               .