/ Hex Artifact Content
Login

Artifact 3a43e508a3dc213703808bbcbb17633b88b57d17:


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 36 37 20 32 30 30 34 2f 31 30 2f 33 31 20  .167 2004/10/31 
0220: 30 32 3a 32 32 3a 34 39 20 64 72 68 20 45 78 70  02:22:49 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 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68  ./*.** Return th
0270: 65 20 27 61 66 66 69 6e 69 74 79 27 20 6f 66 20  e 'affinity' of 
0280: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
0290: 45 78 70 72 20 69 66 20 61 6e 79 2e 0a 2a 2a 0a  Expr if any..**.
02a0: 2a 2a 20 49 66 20 70 45 78 70 72 20 69 73 20 61  ** If pExpr is a
02b0: 20 63 6f 6c 75 6d 6e 2c 20 61 20 72 65 66 65 72   column, a refer
02c0: 65 6e 63 65 20 74 6f 20 61 20 63 6f 6c 75 6d 6e  ence to a column
02d0: 20 76 69 61 20 61 6e 20 27 41 53 27 20 61 6c 69   via an 'AS' ali
02e0: 61 73 2c 0a 2a 2a 20 6f 72 20 61 20 73 75 62 2d  as,.** or a sub-
02f0: 73 65 6c 65 63 74 20 77 69 74 68 20 61 20 63 6f  select with a co
0300: 6c 75 6d 6e 20 61 73 20 74 68 65 20 72 65 74 75  lumn as the retu
0310: 72 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  rn value, then t
0320: 68 65 20 0a 2a 2a 20 61 66 66 69 6e 69 74 79 20  he .** affinity 
0330: 6f 66 20 74 68 61 74 20 63 6f 6c 75 6d 6e 20 69  of that column i
0340: 73 20 72 65 74 75 72 6e 65 64 2e 20 4f 74 68 65  s returned. Othe
0350: 72 77 69 73 65 2c 20 30 78 30 30 20 69 73 20 72  rwise, 0x00 is r
0360: 65 74 75 72 6e 65 64 2c 0a 2a 2a 20 69 6e 64 69  eturned,.** indi
0370: 63 61 74 69 6e 67 20 6e 6f 20 61 66 66 69 6e 69  cating no affini
0380: 74 79 20 66 6f 72 20 74 68 65 20 65 78 70 72 65  ty for the expre
0390: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 69 2e 65  ssion..**.** i.e
03a0: 2e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  . the WHERE clau
03b0: 73 65 20 65 78 70 72 65 73 73 73 69 6f 6e 73 20  se expresssions 
03c0: 69 6e 20 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  in the following
03d0: 20 73 74 61 74 65 6d 65 6e 74 73 20 61 6c 6c 0a   statements all.
03e0: 2a 2a 20 68 61 76 65 20 61 6e 20 61 66 66 69 6e  ** have an affin
03f0: 69 74 79 3a 0a 2a 2a 0a 2a 2a 20 43 52 45 41 54  ity:.**.** CREAT
0400: 45 20 54 41 42 4c 45 20 74 31 28 61 29 3b 0a 2a  E TABLE t1(a);.*
0410: 2a 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20  * SELECT * FROM 
0420: 74 31 20 57 48 45 52 45 20 61 3b 0a 2a 2a 20 53  t1 WHERE a;.** S
0430: 45 4c 45 43 54 20 61 20 41 53 20 62 20 46 52 4f  ELECT a AS b FRO
0440: 4d 20 74 31 20 57 48 45 52 45 20 62 3b 0a 2a 2a  M t1 WHERE b;.**
0450: 20 53 45 4c 45 43 54 20 2a 20 46 52 4f 4d 20 74   SELECT * FROM t
0460: 31 20 57 48 45 52 45 20 28 73 65 6c 65 63 74 20  1 WHERE (select 
0470: 61 20 66 72 6f 6d 20 74 31 29 3b 0a 2a 2f 0a 63  a from t1);.*/.c
0480: 68 61 72 20 73 71 6c 69 74 65 33 45 78 70 72 41  har sqlite3ExprA
0490: 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a 70 45  ffinity(Expr *pE
04a0: 78 70 72 29 7b 0a 20 20 69 66 28 20 70 45 78 70  xpr){.  if( pExp
04b0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29 7b 0a  r->op==TK_AS ){.
04c0: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
04d0: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
04e0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
04f0: 7d 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e 6f  }.  if( pExpr->o
0500: 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20 29 7b 0a  p==TK_SELECT ){.
0510: 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74      return sqlit
0520: 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28 70  e3ExprAffinity(p
0530: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 2d 3e 70  Expr->pSelect->p
0540: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
0550: 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  r);.  }.  return
0560: 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
0570: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72  ;.}../*.** Retur
0580: 6e 20 74 68 65 20 64 65 66 61 75 6c 74 20 63 6f  n the default co
0590: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
05a0: 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73 73   for the express
05b0: 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a 2a  ion pExpr. If.**
05c0: 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65 66   there is no def
05d0: 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20 74  ault collation t
05e0: 79 70 65 2c 20 72 65 74 75 72 6e 20 30 2e 0a 2a  ype, return 0..*
05f0: 2f 0a 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74  /.CollSeq *sqlit
0600: 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 50 61  e3ExprCollSeq(Pa
0610: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
0620: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 43 6f 6c  r *pExpr){.  Col
0630: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
0640: 0a 20 20 69 66 28 20 70 45 78 70 72 20 29 7b 0a  .  if( pExpr ){.
0650: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 70 45 78 70      pColl = pExp
0660: 72 2d 3e 70 43 6f 6c 6c 3b 0a 20 20 20 20 69 66  r->pColl;.    if
0670: 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ( pExpr->op==TK_
0680: 41 53 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a  AS && !pColl ){.
0690: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
06a0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
06b0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
06c0: 4c 65 66 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  Left);.    }.  }
06d0: 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 43 68  .  if( sqlite3Ch
06e0: 65 63 6b 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  eckCollSeq(pPars
06f0: 65 2c 20 70 43 6f 6c 6c 29 20 29 7b 20 0a 20 20  e, pColl) ){ .  
0700: 20 20 70 43 6f 6c 6c 20 3d 20 30 3b 0a 20 20 7d    pColl = 0;.  }
0710: 0a 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b  .  return pColl;
0720: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
0730: 69 73 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72  is the left oper
0740: 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69  and of a compari
0750: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61  son operator.  a
0760: 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79  ff2 is the.** ty
0770: 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  pe affinity of t
0780: 68 65 20 72 69 67 68 74 20 6f 70 65 72 61 6e 64  he right operand
0790: 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  .  This routine 
07a0: 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74  returns the.** t
07b0: 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61  ype affinity tha
07c0: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
07d0: 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69   for the compari
07e0: 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f  son operator..*/
07f0: 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d  .char sqlite3Com
0800: 70 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70  pareAffinity(Exp
0810: 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61  r *pExpr, char a
0820: 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ff2){.  char aff
0830: 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  1 = sqlite3ExprA
0840: 66 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a  ffinity(pExpr);.
0850: 20 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66    if( aff1 && af
0860: 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74  f2 ){.    /* Bot
0870: 68 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63  h sides of the c
0880: 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f  omparison are co
0890: 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61  lumns. If one ha
08a0: 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20 20 20  s numeric or.   
08b0: 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66 66 69   ** integer affi
08c0: 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74 2e 20  nity, use that. 
08d0: 4f 74 68 65 72 77 69 73 65 20 75 73 65 20 6e 6f  Otherwise use no
08e0: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 2a   affinity..    *
08f0: 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31 3d 3d  /.    if( aff1==
0900: 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47  SQLITE_AFF_INTEG
0910: 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51 4c 49  ER || aff2==SQLI
0920: 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 29  TE_AFF_INTEGER )
0930: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
0940: 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45  QLITE_AFF_INTEGE
0950: 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28  R;.    }else if(
0960: 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f 41 46   aff1==SQLITE_AF
0970: 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61 66 66  F_NUMERIC || aff
0980: 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  2==SQLITE_AFF_NU
0990: 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20 20 72  MERIC ){.      r
09a0: 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46  eturn SQLITE_AFF
09b0: 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20 7d 65  _NUMERIC;.    }e
09c0: 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74 75 72  lse{.      retur
09d0: 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e  n SQLITE_AFF_NON
09e0: 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65  E;.    }.  }else
09f0: 20 69 66 28 20 21 61 66 66 31 20 26 26 20 21 61   if( !aff1 && !a
0a00: 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 4e 65  ff2 ){.    /* Ne
0a10: 69 74 68 65 72 20 73 69 64 65 20 6f 66 20 74 68  ither side of th
0a20: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69 73 20  e comparison is 
0a30: 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d 70 61  a column.  Compa
0a40: 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20 72 65  re the.    ** re
0a50: 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79 2e 0a  sults directly..
0a60: 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20 72 65      */.    /* re
0a70: 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f  turn SQLITE_AFF_
0a80: 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54 69 63  NUMERIC;  // Tic
0a90: 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20 20 20  ket #805 */.    
0aa0: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0ab0: 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73 65 7b  F_NONE;.  }else{
0ac0: 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69 64 65  .    /* One side
0ad0: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68   is a column, th
0ae0: 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74 2e 20  e other is not. 
0af0: 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e 73 20  Use the columns 
0b00: 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20 20 20  affinity. */.   
0b10: 20 72 65 74 75 72 6e 20 28 61 66 66 31 20 2b 20   return (aff1 + 
0b20: 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  aff2);.  }.}../*
0b30: 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 63  .** pExpr is a c
0b40: 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74  omparison operat
0b50: 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  or.  Return the 
0b60: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74 68  type affinity th
0b70: 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62 65 20  at should.** be 
0b80: 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74 68 20  applied to both 
0b90: 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72 20 74  operands prior t
0ba0: 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f 6d 70  o doing the comp
0bb0: 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61 74 69  arison..*/.stati
0bc0: 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69 73 6f  c char compariso
0bd0: 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72 20 2a  nAffinity(Expr *
0be0: 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72 20 61  pExpr){.  char a
0bf0: 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45  ff;.  assert( pE
0c00: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51 20 7c  xpr->op==TK_EQ |
0c10: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
0c20: 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d  IN || pExpr->op=
0c30: 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20 20 20  =TK_LT ||.      
0c40: 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54      pExpr->op==T
0c50: 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_GT || pExpr->o
0c60: 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45 78 70  p==TK_GE || pExp
0c70: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c 7c 0a  r->op==TK_LE ||.
0c80: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
0c90: 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a 20 20  >op==TK_NE );.  
0ca0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0cb0: 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d 20  Left );.  aff = 
0cc0: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
0cd0: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
0ce0: 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  );.  if( pExpr->
0cf0: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61 66  pRight ){.    af
0d00: 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70 61  f = sqlite3Compa
0d10: 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  reAffinity(pExpr
0d20: 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b 0a  ->pRight, aff);.
0d30: 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 70    }.  else if( p
0d40: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
0d50: 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c 69 74  .    aff = sqlit
0d60: 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e 69 74  e3CompareAffinit
0d70: 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  y(pExpr->pSelect
0d80: 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ->pEList->a[0].p
0d90: 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20 7d 0a  Expr, aff);.  }.
0da0: 20 20 65 6c 73 65 20 69 66 28 20 21 61 66 66 20    else if( !aff 
0db0: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53 51 4c  ){.    aff = SQL
0dc0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b  ITE_AFF_NUMERIC;
0dd0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
0de0: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
0df0: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
0e00: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
0e10: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
0e20: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
0e30: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
0e40: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
0e50: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
0e60: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
0e70: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
0e80: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
0e90: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
0ea0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
0eb0: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
0ec0: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
0ed0: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
0ee0: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
0ef0: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
0f00: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
0f10: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
0f20: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
0f30: 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20 20 20  ;.  return .    
0f40: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0f50: 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20 28 61  _NONE) ||.    (a
0f60: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e  ff==SQLITE_AFF_N
0f70: 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f 61 66  UMERIC && idx_af
0f80: 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f 41  finity==SQLITE_A
0f90: 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c 0a 20  FF_INTEGER) ||. 
0fa0: 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f     (aff==SQLITE_
0fb0: 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26 20 69  AFF_INTEGER && i
0fc0: 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c  dx_affinity==SQL
0fd0: 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 29  ITE_AFF_NUMERIC)
0fe0: 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d 69 64   ||.    (aff==id
0ff0: 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d 0a 0a  x_affinity);.}..
1000: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65  /*.** Return the
1010: 20 50 31 20 76 61 6c 75 65 20 74 68 61 74 20 73   P1 value that s
1020: 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20 66 6f  hould be used fo
1030: 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d 70 61  r a binary compa
1040: 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20  rison.** opcode 
1050: 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20 65 74  (OP_Eq, OP_Ge et
1060: 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f 6d 70  c.) used to comp
1070: 61 72 65 20 70 45 78 70 72 31 20 61 6e 64 20 70  are pExpr1 and p
1080: 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a 75 6d  Expr2..** If jum
1090: 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65 2c  pIfNull is true,
10a0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 6c 6f   then set the lo
10b0: 77 20 62 79 74 65 20 6f 66 20 74 68 65 20 72 65  w byte of the re
10c0: 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76 61 6c  turned.** P1 val
10d0: 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65 20 6f  ue to tell the o
10e0: 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20 69 66  pcode to jump if
10f0: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1100: 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65 73 20  on.** evaluates 
1110: 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74 61 74  to NULL..*/.stat
1120: 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43 6f 6d  ic int binaryCom
1130: 70 61 72 65 50 31 28 45 78 70 72 20 2a 70 45 78  pareP1(Expr *pEx
1140: 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78 70 72  pr1, Expr *pExpr
1150: 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c  2, int jumpIfNul
1160: 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66 20 3d  l){.  char aff =
1170: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1180: 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a 20 20  nity(pExpr2);.  
1190: 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29 73 71  return (((int)sq
11a0: 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69  lite3CompareAffi
11b0: 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61 66 66  nity(pExpr1, aff
11c0: 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66 4e 75  ))<<8)+(jumpIfNu
11d0: 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  ll?1:0);.}../*.*
11e0: 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74  * Return a point
11f0: 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c 61 74  er to the collat
1200: 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74 68 61  ion sequence tha
1210: 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64  t should be used
1220: 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72 79 20   by.** a binary 
1230: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72 61  comparison opera
1240: 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20 70 4c  tor comparing pL
1250: 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 2e 0a  eft and pRight..
1260: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c 65 66  **.** If the lef
1270: 74 20 68 61 6e 64 20 65 78 70 72 65 73 73 69 6f  t hand expressio
1280: 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e  n has a collatin
1290: 67 20 73 65 71 75 65 6e 63 65 20 74 79 70 65 2c  g sequence type,
12a0: 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a 20 75   then it is.** u
12b0: 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65 20 74  sed. Otherwise t
12c0: 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65 71  he collation seq
12d0: 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20 72 69  uence for the ri
12e0: 67 68 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  ght hand express
12f0: 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64 2c 20  ion.** is used, 
1300: 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74 20 28  or the default (
1310: 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69 74 68  BINARY) if neith
1320: 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20 68 61  er expression ha
1330: 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a 2a 2a  s a collating.**
1340: 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74 69 63   type..*/.static
1350: 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61 72 79   CollSeq* binary
1360: 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 50  CompareCollSeq(P
1370: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
1380: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1390: 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f 6c 6c  *pRight){.  Coll
13a0: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73 71 6c  Seq *pColl = sql
13b0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
13c0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
13d0: 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 7b 0a    if( !pColl ){.
13e0: 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c 69      pColl = sqli
13f0: 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28 70  te3ExprCollSeq(p
1400: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
1410: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 43 6f    }.  return pCo
1420: 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  ll;.}../*.** Gen
1430: 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61  erate code for a
1440: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
1450: 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  ator..*/.static 
1460: 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  int codeCompare(
1470: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
1480: 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73  ,    /* The pars
1490: 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20 67 65  ing (and code ge
14a0: 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74 65 78  nerating) contex
14b0: 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 4c 65  t */.  Expr *pLe
14c0: 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ft,      /* The 
14d0: 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a  left operand */.
14e0: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 2c 20    Expr *pRight, 
14f0: 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67 68 74      /* The right
1500: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 69 6e   operand */.  in
1510: 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20 20 20  t opcode,       
1520: 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69 73 6f  /* The compariso
1530: 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 69 6e  n opcode */.  in
1540: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
1550: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
1560: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
1570: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
1580: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
1590: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
15a0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
15b0: 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61 72 79   int p1 = binary
15c0: 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66 74 2c  CompareP1(pLeft,
15d0: 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e   pRight, jumpIfN
15e0: 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65 71 20  ull);.  CollSeq 
15f0: 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70  *p3 = binaryComp
1600: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
1610: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
1620: 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71 6c 69  );.  return sqli
1630: 74 65 33 56 64 62 65 4f 70 33 28 70 50 61 72 73  te3VdbeOp3(pPars
1640: 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f 64 65  e->pVdbe, opcode
1650: 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76 6f 69  , p1, dest, (voi
1660: 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c 53 45  d*)p3, P3_COLLSE
1670: 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e  Q);.}../*.** Con
1680: 73 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70  struct a new exp
1690: 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61 6e 64  ression node and
16a0: 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e 74 65   return a pointe
16b0: 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f 72 79  r to it.  Memory
16c0: 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e 6f 64  .** for this nod
16d0: 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20 66 72  e is obtained fr
16e0: 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28  om sqliteMalloc(
16f0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
1700: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
1710: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
1720: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
1730: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
1740: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a 45 78  ets freed..*/.Ex
1750: 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 28  pr *sqlite3Expr(
1760: 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a 70 4c  int op, Expr *pL
1770: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
1780: 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e  t, Token *pToken
1790: 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b  ){.  Expr *pNew;
17a0: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
17b0: 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45  Malloc( sizeof(E
17c0: 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  xpr) );.  if( pN
17d0: 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20  ew==0 ){.    /* 
17e0: 57 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c  When malloc fail
17f0: 73 2c 20 77 65 20 6c 65 61 6b 20 6d 65 6d 6f 72  s, we leak memor
1800: 79 20 66 72 6f 6d 20 70 4c 65 66 74 20 61 6e 64  y from pLeft and
1810: 20 70 52 69 67 68 74 20 2a 2f 0a 20 20 20 20 72   pRight */.    r
1820: 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 70  eturn 0;.  }.  p
1830: 4e 65 77 2d 3e 6f 70 20 3d 20 6f 70 3b 0a 20 20  New->op = op;.  
1840: 70 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 70 4c  pNew->pLeft = pL
1850: 65 66 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 52 69  eft;.  pNew->pRi
1860: 67 68 74 20 3d 20 70 52 69 67 68 74 3b 0a 20 20  ght = pRight;.  
1870: 69 66 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20  if( pToken ){.  
1880: 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e    assert( pToken
1890: 2d 3e 64 79 6e 3d 3d 30 20 29 3b 0a 20 20 20 20  ->dyn==0 );.    
18a0: 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70 4e 65  pNew->span = pNe
18b0: 77 2d 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b  w->token = *pTok
18c0: 65 6e 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  en;.  }else if( 
18d0: 70 4c 65 66 74 20 26 26 20 70 52 69 67 68 74 20  pLeft && pRight 
18e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
18f0: 70 72 53 70 61 6e 28 70 4e 65 77 2c 20 26 70 4c  prSpan(pNew, &pL
1900: 65 66 74 2d 3e 73 70 61 6e 2c 20 26 70 52 69 67  eft->span, &pRig
1910: 68 74 2d 3e 73 70 61 6e 29 3b 0a 20 20 7d 0a 20  ht->span);.  }. 
1920: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
1930: 0a 2f 2a 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20  ./*.** Join two 
1940: 65 78 70 72 65 73 73 69 6f 6e 73 20 75 73 69 6e  expressions usin
1950: 67 20 61 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f  g an AND operato
1960: 72 2e 20 20 49 66 20 65 69 74 68 65 72 20 65 78  r.  If either ex
1970: 70 72 65 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e  pression is.** N
1980: 55 4c 4c 2c 20 74 68 65 6e 20 6a 75 73 74 20 72  ULL, then just r
1990: 65 74 75 72 6e 20 74 68 65 20 6f 74 68 65 72 20  eturn the other 
19a0: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45  expression..*/.E
19b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
19c0: 41 6e 64 28 45 78 70 72 20 2a 70 4c 65 66 74 2c  And(Expr *pLeft,
19d0: 20 45 78 70 72 20 2a 70 52 69 67 68 74 29 7b 0a   Expr *pRight){.
19e0: 20 20 69 66 28 20 70 4c 65 66 74 3d 3d 30 20 29    if( pLeft==0 )
19f0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 52 69  {.    return pRi
1a00: 67 68 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ght;.  }else if(
1a10: 20 70 52 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20   pRight==0 ){.  
1a20: 20 20 72 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a    return pLeft;.
1a30: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 72 65 74    }else{.    ret
1a40: 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 28  urn sqlite3Expr(
1a50: 54 4b 5f 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70  TK_AND, pLeft, p
1a60: 52 69 67 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d  Right, 0);.  }.}
1a70: 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20  ../*.** Set the 
1a80: 45 78 70 72 2e 73 70 61 6e 20 66 69 65 6c 64 20  Expr.span field 
1a90: 6f 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  of the given exp
1aa0: 72 65 73 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20  ression to span 
1ab0: 61 6c 6c 0a 2a 2a 20 74 65 78 74 20 62 65 74 77  all.** text betw
1ac0: 65 65 6e 20 74 68 65 20 74 77 6f 20 67 69 76 65  een the two give
1ad0: 6e 20 74 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69  n tokens..*/.voi
1ae0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61  d sqlite3ExprSpa
1af0: 6e 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 54  n(Expr *pExpr, T
1b00: 6f 6b 65 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b  oken *pLeft, Tok
1b10: 65 6e 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 61  en *pRight){.  a
1b20: 73 73 65 72 74 28 20 70 52 69 67 68 74 21 3d 30  ssert( pRight!=0
1b30: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
1b40: 65 66 74 21 3d 30 20 29 3b 0a 20 20 69 66 28 20  eft!=0 );.  if( 
1b50: 21 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f  !sqlite3_malloc_
1b60: 66 61 69 6c 65 64 20 26 26 20 70 52 69 67 68 74  failed && pRight
1b70: 2d 3e 7a 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20  ->z && pLeft->z 
1b80: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
1b90: 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20  Left->dyn==0 || 
1ba0: 70 4c 65 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e  pLeft->z[pLeft->
1bb0: 6e 5d 3d 3d 30 20 29 3b 0a 20 20 20 20 69 66 28  n]==0 );.    if(
1bc0: 20 70 4c 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26   pLeft->dyn==0 &
1bd0: 26 20 70 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30  & pRight->dyn==0
1be0: 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d   ){.      pExpr-
1bf0: 3e 73 70 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d  >span.z = pLeft-
1c00: 3e 7a 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d  >z;.      pExpr-
1c10: 3e 73 70 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74  >span.n = pRight
1c20: 2d 3e 6e 20 2b 20 41 64 64 72 28 70 52 69 67 68  ->n + Addr(pRigh
1c30: 74 2d 3e 7a 29 20 2d 20 41 64 64 72 28 70 4c 65  t->z) - Addr(pLe
1c40: 66 74 2d 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73  ft->z);.    }els
1c50: 65 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  e{.      pExpr->
1c60: 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20  span.z = 0;.    
1c70: 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  }.  }.}../*.** C
1c80: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1c90: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66  xpression node f
1ca0: 6f 72 20 61 20 66 75 6e 63 74 69 6f 6e 20 77 69  or a function wi
1cb0: 74 68 20 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61  th multiple.** a
1cc0: 72 67 75 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70  rguments..*/.Exp
1cd0: 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72 46 75  r *sqlite3ExprFu
1ce0: 6e 63 74 69 6f 6e 28 45 78 70 72 4c 69 73 74 20  nction(ExprList 
1cf0: 2a 70 4c 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70  *pList, Token *p
1d00: 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a  Token){.  Expr *
1d10: 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73  pNew;.  pNew = s
1d20: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a  qliteMalloc( siz
1d30: 65 6f 66 28 45 78 70 72 29 20 29 3b 0a 20 20 69  eof(Expr) );.  i
1d40: 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20  f( pNew==0 ){.  
1d50: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
1d60: 4c 69 73 74 44 65 6c 65 74 65 28 70 4c 69 73 74  ListDelete(pList
1d70: 29 3b 20 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74  ); // Leak pList
1d80: 20 77 68 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69   when malloc fai
1d90: 6c 73 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e  ls */.    return
1da0: 20 30 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e   0;.  }.  pNew->
1db0: 6f 70 20 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  op = TK_FUNCTION
1dc0: 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20  ;.  pNew->pList 
1dd0: 3d 20 70 4c 69 73 74 3b 0a 20 20 69 66 28 20 70  = pList;.  if( p
1de0: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  Token ){.    ass
1df0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
1e00: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ==0 );.    pNew-
1e10: 3e 74 6f 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e  >token = *pToken
1e20: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
1e30: 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30  New->token.z = 0
1e40: 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70  ;.  }.  pNew->sp
1e50: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
1e60: 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  ;.  return pNew;
1e70: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e  .}../*.** Assign
1e80: 20 61 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62   a variable numb
1e90: 65 72 20 74 6f 20 61 6e 20 65 78 70 72 65 73 73  er to an express
1ea0: 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f 64 65 73  ion that encodes
1eb0: 20 61 20 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69   a wildcard.** i
1ec0: 6e 20 74 68 65 20 6f 72 69 67 69 6e 61 6c 20 53  n the original S
1ed0: 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a  QL statement.  .
1ee0: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
1ef0: 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66 20 61 20  consisting of a 
1f00: 73 69 6e 67 6c 65 20 22 3f 22 20 61 72 65 20 61  single "?" are a
1f10: 73 73 69 67 6e 65 64 20 74 68 65 20 6e 65 78 74  ssigned the next
1f20: 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76   sequential.** v
1f30: 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a  ariable number..
1f40: 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20  **.** Wildcards 
1f50: 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e  of the form "?nn
1f60: 6e 22 20 61 72 65 20 61 73 73 69 67 6e 65 64 20  n" are assigned 
1f70: 74 68 65 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22  the number "nnn"
1f80: 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75  .  We make.** su
1f90: 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20  re "nnn" is not 
1fa0: 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f 69 64 20  too be to avoid 
1fb0: 61 20 64 65 6e 69 61 6c 20 6f 66 20 73 65 72 76  a denial of serv
1fc0: 69 63 65 20 61 74 74 61 63 6b 20 77 68 65 6e 0a  ice attack when.
1fd0: 2a 2a 20 74 68 65 20 53 51 4c 20 73 74 61 74 65  ** the SQL state
1fe0: 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20  ment comes from 
1ff0: 61 6e 20 65 78 74 65 72 6e 61 6c 20 73 6f 75 72  an external sour
2000: 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61  ce..**.** Wildca
2010: 72 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  rds of the form 
2020: 22 3a 61 61 61 22 20 6f 72 20 22 24 61 61 61 22  ":aaa" or "$aaa"
2030: 20 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68   are assigned th
2040: 65 20 73 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a  e same number.**
2050: 20 61 73 20 74 68 65 20 70 72 65 76 69 6f 75 73   as the previous
2060: 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
2070: 20 73 61 6d 65 20 77 69 6c 64 63 61 72 64 2e 20   same wildcard. 
2080: 20 4f 72 20 69 66 20 74 68 69 73 20 69 73 20 74   Or if this is t
2090: 68 65 20 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74  he first.** inst
20a0: 61 6e 63 65 20 6f 66 20 74 68 65 20 77 69 6c 64  ance of the wild
20b0: 63 61 72 64 2c 20 74 68 65 20 6e 65 78 74 20 73  card, the next s
20c0: 65 71 75 65 6e 69 61 6c 20 76 61 72 69 61 62 6c  equenial variabl
20d0: 65 20 6e 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61  e number is.** a
20e0: 73 73 69 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64  ssigned..*/.void
20f0: 20 73 71 6c 69 74 65 33 45 78 70 72 41 73 73 69   sqlite3ExprAssi
2100: 67 6e 56 61 72 4e 75 6d 62 65 72 28 50 61 72 73  gnVarNumber(Pars
2110: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
2120: 2a 70 45 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e  *pExpr){.  Token
2130: 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20   *pToken;.  if( 
2140: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
2150: 6e 3b 0a 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70  n;.  pToken = &p
2160: 45 78 70 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61  Expr->token;.  a
2170: 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e  ssert( pToken->n
2180: 3e 3d 31 20 29 3b 0a 20 20 61 73 73 65 72 74 28  >=1 );.  assert(
2190: 20 70 54 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b   pToken->z!=0 );
21a0: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
21b0: 6e 2d 3e 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20  n->z[0]!=0 );.  
21c0: 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31  if( pToken->n==1
21d0: 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63   ){.    /* Wildc
21e0: 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20  ard of the form 
21f0: 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68 65  "?".  Assign the
2200: 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20 6e   next variable n
2210: 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 70 45 78  umber */.    pEx
2220: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70  pr->iTable = ++p
2230: 50 61 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d  Parse->nVar;.  }
2240: 65 6c 73 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d  else if( pToken-
2250: 3e 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20  >z[0]=='?' ){.  
2260: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
2270: 20 74 68 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22   the form "?nnn"
2280: 2e 20 20 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22  .  Convert "nnn"
2290: 20 74 6f 20 61 6e 20 69 6e 74 65 67 65 72 20 61   to an integer a
22a0: 6e 64 0a 20 20 20 20 2a 2a 20 75 73 65 20 69 74  nd.    ** use it
22b0: 20 61 73 20 74 68 65 20 76 61 72 69 61 62 6c 65   as the variable
22c0: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69   number */.    i
22d0: 6e 74 20 69 3b 0a 20 20 20 20 70 45 78 70 72 2d  nt i;.    pExpr-
22e0: 3e 69 54 61 62 6c 65 20 3d 20 69 20 3d 20 61 74  >iTable = i = at
22f0: 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d  oi(&pToken->z[1]
2300: 29 3b 0a 20 20 20 20 69 66 28 20 69 3c 31 20 7c  );.    if( i<1 |
2310: 7c 20 69 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56  | i>SQLITE_MAX_V
2320: 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29  ARIABLE_NUMBER )
2330: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  {.      sqlite3E
2340: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
2350: 22 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72  "variable number
2360: 20 6d 75 73 74 20 62 65 20 62 65 74 77 65 65 6e   must be between
2370: 20 3f 31 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20   ?1 and ?%d",.  
2380: 20 20 20 20 20 20 20 20 53 51 4c 49 54 45 5f 4d          SQLITE_M
2390: 41 58 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42  AX_VARIABLE_NUMB
23a0: 45 52 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  ER);.    }.    i
23b0: 66 28 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61  f( i>pParse->nVa
23c0: 72 20 29 7b 0a 20 20 20 20 20 20 70 50 61 72 73  r ){.      pPars
23d0: 65 2d 3e 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20  e->nVar = i;.   
23e0: 20 7d 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20   }.  }else{.    
23f0: 2f 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66 20  /* Wildcards of 
2400: 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22 20  the form ":aaa" 
2410: 6f 72 20 22 24 61 61 61 22 2e 20 20 52 65 75 73  or "$aaa".  Reus
2420: 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69 61  e the same varia
2430: 62 6c 65 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65  ble.    ** numbe
2440: 72 20 61 73 20 74 68 65 20 70 72 69 6f 72 20 61  r as the prior a
2450: 70 70 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65  ppearance of the
2460: 20 73 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69   same name, or i
2470: 66 20 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a  f the name.    *
2480: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
2490: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
24a0: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
24b0: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
24c0: 2a 2f 0a 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b  */.    int i, n;
24d0: 0a 20 20 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d  .    n = pToken-
24e0: 3e 6e 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b  >n;.    for(i=0;
24f0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 56 61 72 45   i<pParse->nVarE
2500: 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  xpr; i++){.     
2510: 20 45 78 70 72 20 2a 70 45 3b 0a 20 20 20 20 20   Expr *pE;.     
2520: 20 69 66 28 20 28 70 45 20 3d 20 70 50 61 72 73   if( (pE = pPars
2530: 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 69 5d 29  e->apVarExpr[i])
2540: 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 26 26  !=0.          &&
2550: 20 70 45 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a   pE->token.n==n.
2560: 20 20 20 20 20 20 20 20 20 20 26 26 20 6d 65 6d            && mem
2570: 63 6d 70 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c  cmp(pE->token.z,
2580: 20 70 54 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d   pToken->z, n)==
2590: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
25a0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d  pr->iTable = pE-
25b0: 3e 69 54 61 62 6c 65 3b 0a 20 20 20 20 20 20 20  >iTable;.       
25c0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
25d0: 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e      }.    if( i>
25e0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
25f0: 72 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70 72  r ){.      pExpr
2600: 2d 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61  ->iTable = ++pPa
2610: 72 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20  rse->nVar;.     
2620: 20 69 66 28 20 70 50 61 72 73 65 2d 3e 6e 56 61   if( pParse->nVa
2630: 72 45 78 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e  rExpr>=pParse->n
2640: 56 61 72 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29  VarExprAlloc-1 )
2650: 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65  {.        pParse
2660: 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c 6f 63 20  ->nVarExprAlloc 
2670: 2b 3d 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45  += pParse->nVarE
2680: 78 70 72 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20  xprAlloc + 10;. 
2690: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
26a0: 70 56 61 72 45 78 70 72 20 3d 20 73 71 6c 69 74  pVarExpr = sqlit
26b0: 65 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d  eRealloc(pParse-
26c0: 3e 61 70 56 61 72 45 78 70 72 2c 0a 20 20 20 20  >apVarExpr,.    
26d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
26e0: 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45     pParse->nVarE
26f0: 78 70 72 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28  xprAlloc*sizeof(
2700: 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70  pParse->apVarExp
2710: 72 5b 30 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d  r[0]) );.      }
2720: 0a 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69  .      if( !sqli
2730: 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65  te3_malloc_faile
2740: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
2750: 65 72 74 28 20 70 50 61 72 73 65 2d 3e 61 70 56  ert( pParse->apV
2760: 61 72 45 78 70 72 21 3d 30 20 29 3b 0a 20 20 20  arExpr!=0 );.   
2770: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56       pParse->apV
2780: 61 72 45 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e  arExpr[pParse->n
2790: 56 61 72 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78  VarExpr++] = pEx
27a0: 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  pr;.      }.    
27b0: 7d 0a 20 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  }.  } .}../*.** 
27c0: 52 65 63 75 72 73 69 76 65 6c 79 20 64 65 6c 65  Recursively dele
27d0: 74 65 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  te an expression
27e0: 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   tree..*/.void s
27f0: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
2800: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 66 28  (Expr *p){.  if(
2810: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a   p==0 ) return;.
2820: 20 20 69 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79    if( p->span.dy
2830: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2840: 63 68 61 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29  char*)p->span.z)
2850: 3b 0a 20 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e  ;.  if( p->token
2860: 2e 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65  .dyn ) sqliteFre
2870: 65 28 28 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65  e((char*)p->toke
2880: 6e 2e 7a 29 3b 0a 20 20 73 71 6c 69 74 65 33 45  n.z);.  sqlite3E
2890: 78 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65  xprDelete(p->pLe
28a0: 66 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ft);.  sqlite3Ex
28b0: 70 72 44 65 6c 65 74 65 28 70 2d 3e 70 52 69 67  prDelete(p->pRig
28c0: 68 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ht);.  sqlite3Ex
28d0: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 70 2d 3e  prListDelete(p->
28e0: 70 4c 69 73 74 29 3b 0a 20 20 73 71 6c 69 74 65  pList);.  sqlite
28f0: 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 70 2d  3SelectDelete(p-
2900: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c  >pSelect);.  sql
2910: 69 74 65 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a  iteFree(p);.}...
2920: 2f 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77  /*.** The follow
2930: 69 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75  ing group of rou
2940: 74 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20  tines make deep 
2950: 63 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73  copies of expres
2960: 73 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73  sions,.** expres
2970: 73 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c  sion lists, ID l
2980: 69 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74  ists, and select
2990: 20 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68   statements.  Th
29a0: 65 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20  e copies can.** 
29b0: 62 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62  be deleted (by b
29c0: 65 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74  eing passed to t
29d0: 68 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20  heir respective 
29e0: 2e 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74  ...Delete() rout
29f0: 69 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74  ines).** without
2a00: 20 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f   effecting the o
2a10: 72 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20  riginals..**.** 
2a20: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
2a30: 69 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75  ist, ID, and sou
2a40: 72 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e  rce lists return
2a50: 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c   by sqlite3ExprL
2a60: 69 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c  istDup(),.** sql
2a70: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c  ite3IdListDup(),
2a80: 20 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c   and sqlite3SrcL
2a90: 69 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74  istDup() can not
2aa0: 20 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61   be further expa
2ab0: 6e 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73  nded .** by subs
2ac0: 65 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20  equent calls to 
2ad0: 73 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e  sqlite*ListAppen
2ae0: 64 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a  d() routines..**
2af0: 0a 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74  .** Any tables t
2b00: 68 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20  hat the SrcList 
2b10: 6d 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61  might point to a
2b20: 72 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65  re not duplicate
2b30: 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  d..*/.Expr *sqli
2b40: 74 65 33 45 78 70 72 44 75 70 28 45 78 70 72 20  te3ExprDup(Expr 
2b50: 2a 70 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  *p){.  Expr *pNe
2b60: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
2b70: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
2b80: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
2b90: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  aw( sizeof(*p) )
2ba0: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
2bb0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65  ) return 0;.  me
2bc0: 6d 63 70 79 28 70 4e 65 77 2c 20 70 2c 20 73 69  mcpy(pNew, p, si
2bd0: 7a 65 6f 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20  zeof(*pNew));.  
2be0: 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d  if( p->token.z!=
2bf0: 30 20 29 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  0 ){.    pNew->t
2c00: 6f 6b 65 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53  oken.z = sqliteS
2c10: 74 72 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a  trDup(p->token.z
2c20: 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b  );.    pNew->tok
2c30: 65 6e 2e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  en.dyn = 1;.  }e
2c40: 6c 73 65 7b 0a 20 20 20 20 61 73 73 65 72 74 28  lse{.    assert(
2c50: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d   pNew->token.z==
2c60: 30 20 29 3b 0a 20 20 7d 0a 20 20 70 4e 65 77 2d  0 );.  }.  pNew-
2c70: 3e 73 70 61 6e 2e 7a 20 3d 20 30 3b 0a 20 20 70  >span.z = 0;.  p
2c80: 4e 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c  New->pLeft = sql
2c90: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
2ca0: 4c 65 66 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  Left);.  pNew->p
2cb0: 52 69 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45  Right = sqlite3E
2cc0: 78 70 72 44 75 70 28 70 2d 3e 70 52 69 67 68 74  xprDup(p->pRight
2cd0: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 69 73 74  );.  pNew->pList
2ce0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69   = sqlite3ExprLi
2cf0: 73 74 44 75 70 28 70 2d 3e 70 4c 69 73 74 29 3b  stDup(p->pList);
2d00: 0a 20 20 70 4e 65 77 2d 3e 70 53 65 6c 65 63 74  .  pNew->pSelect
2d10: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
2d20: 44 75 70 28 70 2d 3e 70 53 65 6c 65 63 74 29 3b  Dup(p->pSelect);
2d30: 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a  .  return pNew;.
2d40: 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 54 6f  }.void sqlite3To
2d50: 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20 2a 70  kenCopy(Token *p
2d60: 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72 6f 6d  To, Token *pFrom
2d70: 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e 64 79  ){.  if( pTo->dy
2d80: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2d90: 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b 0a 20  char*)pTo->z);. 
2da0: 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20 29 7b   if( pFrom->z ){
2db0: 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20 70 46  .    pTo->n = pF
2dc0: 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54 6f 2d  rom->n;.    pTo-
2dd0: 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44  >z = sqliteStrND
2de0: 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70 46 72  up(pFrom->z, pFr
2df0: 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54 6f 2d  om->n);.    pTo-
2e00: 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65 6c 73  >dyn = 1;.  }els
2e10: 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20 3d 20  e{.    pTo->z = 
2e20: 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c 69 73  0;.  }.}.ExprLis
2e30: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
2e40: 73 74 44 75 70 28 45 78 70 72 4c 69 73 74 20 2a  stDup(ExprList *
2e50: 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a  p){.  ExprList *
2e60: 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74 20 45  pNew;.  struct E
2e70: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
2e80: 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d 3b 0a  tem, *pOldItem;.
2e90: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
2ea0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
2eb0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
2ec0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 2a 70  alloc( sizeof(*p
2ed0: 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e  New) );.  if( pN
2ee0: 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  ew==0 ) return 0
2ef0: 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70 72 20  ;.  pNew->nExpr 
2f00: 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d  = pNew->nAlloc =
2f10: 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70 4e 65   p->nExpr;.  pNe
2f20: 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d 20 73  w->a = pItem = s
2f30: 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e  qliteMalloc( p->
2f40: 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70 2d 3e  nExpr*sizeof(p->
2f50: 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70  a[0]) );.  if( p
2f60: 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20 20 73  Item==0 ){.    s
2f70: 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77 29 3b  qliteFree(pNew);
2f80: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
2f90: 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d 20 3d   } .  pOldItem =
2fa0: 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69 3d 30   p->a;.  for(i=0
2fb0: 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b  ; i<p->nExpr; i+
2fc0: 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f 6c 64  +, pItem++, pOld
2fd0: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45 78 70  Item++){.    Exp
2fe0: 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a 70 4f  r *pNewExpr, *pO
2ff0: 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65  ldExpr;.    pIte
3000: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65 77 45  m->pExpr = pNewE
3010: 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  xpr = sqlite3Exp
3020: 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20 3d 20  rDup(pOldExpr = 
3030: 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72 29  pOldItem->pExpr)
3040: 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64 45 78  ;.    if( pOldEx
3050: 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20 26 26  pr->span.z!=0 &&
3060: 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20 20 20   pNewExpr ){.   
3070: 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d 61 6b     /* Always mak
3080: 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  e a copy of the 
3090: 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c 65 76  span for top-lev
30a0: 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 69  el expressions i
30b0: 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65  n the.      ** e
30c0: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20  xpression list. 
30d0: 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20 53 45   The logic in SE
30e0: 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e 67 20  LECT processing 
30f0: 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65 73 0a  that determines.
3100: 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e 61 6d        ** the nam
3110: 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  es of columns in
3120: 20 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20   the result set 
3130: 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66 6f 72  needs this infor
3140: 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20  mation */.      
3150: 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79  sqlite3TokenCopy
3160: 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70 61 6e  (&pNewExpr->span
3170: 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61  , &pOldExpr->spa
3180: 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73  n);.    }.    as
3190: 73 65 72 74 28 20 70 4e 65 77 45 78 70 72 3d 3d  sert( pNewExpr==
31a0: 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d 3e 73  0 || pNewExpr->s
31b0: 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20 20 20  pan.z!=0 .      
31c0: 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45 78 70        || pOldExp
31d0: 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c 7c 20  r->span.z==0 || 
31e0: 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66  sqlite3_malloc_f
31f0: 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70 49 74  ailed );.    pIt
3200: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
3210: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3220: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
3230: 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 20  Item->sortOrder 
3240: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72 74  = pOldItem->sort
3250: 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65 6d  Order;.    pItem
3260: 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64 49 74  ->isAgg = pOldIt
3270: 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20 20 70  em->isAgg;.    p
3280: 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a  Item->done = 0;.
3290: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65    }.  return pNe
32a0: 77 3b 0a 7d 0a 53 72 63 4c 69 73 74 20 2a 73 71  w;.}.SrcList *sq
32b0: 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28  lite3SrcListDup(
32c0: 53 72 63 4c 69 73 74 20 2a 70 29 7b 0a 20 20 53  SrcList *p){.  S
32d0: 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20  rcList *pNew;.  
32e0: 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20 6e 42 79  int i;.  int nBy
32f0: 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  te;.  if( p==0 )
3300: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 6e 42 79   return 0;.  nBy
3310: 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a 70 29 20  te = sizeof(*p) 
3320: 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20 3f 20 73  + (p->nSrc>0 ? s
3330: 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 2a  izeof(p->a[0]) *
3340: 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20 3a 20 30   (p->nSrc-1) : 0
3350: 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  );.  pNew = sqli
3360: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 6e 42 79  teMallocRaw( nBy
3370: 74 65 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  te );.  if( pNew
3380: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3390: 20 20 70 4e 65 77 2d 3e 6e 53 72 63 20 3d 20 70    pNew->nSrc = p
33a0: 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d  New->nAlloc = p-
33b0: 3e 6e 53 72 63 3b 0a 20 20 66 6f 72 28 69 3d 30  >nSrc;.  for(i=0
33c0: 3b 20 69 3c 70 2d 3e 6e 53 72 63 3b 20 69 2b 2b  ; i<p->nSrc; i++
33d0: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 53 72  ){.    struct Sr
33e0: 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  cList_item *pNew
33f0: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3400: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 53  i];.    struct S
3410: 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c  rcList_item *pOl
3420: 64 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d  dItem = &p->a[i]
3430: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3440: 7a 44 61 74 61 62 61 73 65 20 3d 20 73 71 6c 69  zDatabase = sqli
3450: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
3460: 6d 2d 3e 7a 44 61 74 61 62 61 73 65 29 3b 0a 20  m->zDatabase);. 
3470: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61     pNewItem->zNa
3480: 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75  me = sqliteStrDu
3490: 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d  p(pOldItem->zNam
34a0: 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  e);.    pNewItem
34b0: 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71 6c 69 74  ->zAlias = sqlit
34c0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
34d0: 2d 3e 7a 41 6c 69 61 73 29 3b 0a 20 20 20 20 70  ->zAlias);.    p
34e0: 4e 65 77 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  NewItem->jointyp
34f0: 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6a 6f  e = pOldItem->jo
3500: 69 6e 74 79 70 65 3b 0a 20 20 20 20 70 4e 65 77  intype;.    pNew
3510: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 20 3d 20  Item->iCursor = 
3520: 70 4f 6c 64 49 74 65 6d 2d 3e 69 43 75 72 73 6f  pOldItem->iCurso
3530: 72 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  r;.    pNewItem-
3540: 3e 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 70  >pTab = 0;.    p
3550: 4e 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  NewItem->pSelect
3560: 20 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74   = sqlite3Select
3570: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  Dup(pOldItem->pS
3580: 65 6c 65 63 74 29 3b 0a 20 20 20 20 70 4e 65 77  elect);.    pNew
3590: 49 74 65 6d 2d 3e 70 4f 6e 20 3d 20 73 71 6c 69  Item->pOn = sqli
35a0: 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64 49  te3ExprDup(pOldI
35b0: 74 65 6d 2d 3e 70 4f 6e 29 3b 0a 20 20 20 20 70  tem->pOn);.    p
35c0: 4e 65 77 49 74 65 6d 2d 3e 70 55 73 69 6e 67 20  NewItem->pUsing 
35d0: 3d 20 73 71 6c 69 74 65 33 49 64 4c 69 73 74 44  = sqlite3IdListD
35e0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70 55 73  up(pOldItem->pUs
35f0: 69 6e 67 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ing);.  }.  retu
3600: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49 64 4c 69 73  rn pNew;.}.IdLis
3610: 74 20 2a 73 71 6c 69 74 65 33 49 64 4c 69 73 74  t *sqlite3IdList
3620: 44 75 70 28 49 64 4c 69 73 74 20 2a 70 29 7b 0a  Dup(IdList *p){.
3630: 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b 0a    IdList *pNew;.
3640: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
3650: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3660: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
3670: 61 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66  allocRaw( sizeof
3680: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
3690: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
36a0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 49 64  n 0;.  pNew->nId
36b0: 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63 20   = pNew->nAlloc 
36c0: 3d 20 70 2d 3e 6e 49 64 3b 0a 20 20 70 4e 65 77  = p->nId;.  pNew
36d0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ->a = sqliteMall
36e0: 6f 63 52 61 77 28 20 70 2d 3e 6e 49 64 2a 73 69  ocRaw( p->nId*si
36f0: 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b  zeof(p->a[0]) );
3700: 0a 20 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d  .  if( pNew->a==
3710: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
3720: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 49  for(i=0; i<p->nI
3730: 64 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  d; i++){.    str
3740: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
3750: 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e 65  *pNewItem = &pNe
3760: 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74 72  w->a[i];.    str
3770: 75 63 74 20 49 64 4c 69 73 74 5f 69 74 65 6d 20  uct IdList_item 
3780: 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70 2d 3e  *pOldItem = &p->
3790: 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77 49 74  a[i];.    pNewIt
37a0: 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69  em->zName = sqli
37b0: 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65  teStrDup(pOldIte
37c0: 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70  m->zName);.    p
37d0: 4e 65 77 49 74 65 6d 2d 3e 69 64 78 20 3d 20 70  NewItem->idx = p
37e0: 4f 6c 64 49 74 65 6d 2d 3e 69 64 78 3b 0a 20 20  OldItem->idx;.  
37f0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b  }.  return pNew;
3800: 0a 7d 0a 53 65 6c 65 63 74 20 2a 73 71 6c 69 74  .}.Select *sqlit
3810: 65 33 53 65 6c 65 63 74 44 75 70 28 53 65 6c 65  e3SelectDup(Sele
3820: 63 74 20 2a 70 29 7b 0a 20 20 53 65 6c 65 63 74  ct *p){.  Select
3830: 20 2a 70 4e 65 77 3b 0a 20 20 69 66 28 20 70 3d   *pNew;.  if( p=
3840: 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  =0 ) return 0;. 
3850: 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61   pNew = sqliteMa
3860: 6c 6c 6f 63 52 61 77 28 20 73 69 7a 65 6f 66 28  llocRaw( sizeof(
3870: 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  *p) );.  if( pNe
3880: 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  w==0 ) return 0;
3890: 0a 20 20 70 4e 65 77 2d 3e 69 73 44 69 73 74 69  .  pNew->isDisti
38a0: 6e 63 74 20 3d 20 70 2d 3e 69 73 44 69 73 74 69  nct = p->isDisti
38b0: 6e 63 74 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c  nct;.  pNew->pEL
38c0: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
38d0: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 45 4c 69  rListDup(p->pELi
38e0: 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 53 72  st);.  pNew->pSr
38f0: 63 20 3d 20 73 71 6c 69 74 65 33 53 72 63 4c 69  c = sqlite3SrcLi
3900: 73 74 44 75 70 28 70 2d 3e 70 53 72 63 29 3b 0a  stDup(p->pSrc);.
3910: 20 20 70 4e 65 77 2d 3e 70 57 68 65 72 65 20 3d    pNew->pWhere =
3920: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
3930: 70 2d 3e 70 57 68 65 72 65 29 3b 0a 20 20 70 4e  p->pWhere);.  pN
3940: 65 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73  ew->pGroupBy = s
3950: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75  qlite3ExprListDu
3960: 70 28 70 2d 3e 70 47 72 6f 75 70 42 79 29 3b 0a  p(p->pGroupBy);.
3970: 20 20 70 4e 65 77 2d 3e 70 48 61 76 69 6e 67 20    pNew->pHaving 
3980: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3990: 28 70 2d 3e 70 48 61 76 69 6e 67 29 3b 0a 20 20  (p->pHaving);.  
39a0: 70 4e 65 77 2d 3e 70 4f 72 64 65 72 42 79 20 3d  pNew->pOrderBy =
39b0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
39c0: 44 75 70 28 70 2d 3e 70 4f 72 64 65 72 42 79 29  Dup(p->pOrderBy)
39d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
39e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
39f0: 72 69 6f 72 20 3d 20 73 71 6c 69 74 65 33 53 65  rior = sqlite3Se
3a00: 6c 65 63 74 44 75 70 28 70 2d 3e 70 50 72 69 6f  lectDup(p->pPrio
3a10: 72 29 3b 0a 20 20 70 4e 65 77 2d 3e 6e 4c 69 6d  r);.  pNew->nLim
3a20: 69 74 20 3d 20 70 2d 3e 6e 4c 69 6d 69 74 3b 0a  it = p->nLimit;.
3a30: 20 20 70 4e 65 77 2d 3e 6e 4f 66 66 73 65 74 20    pNew->nOffset 
3a40: 3d 20 70 2d 3e 6e 4f 66 66 73 65 74 3b 0a 20 20  = p->nOffset;.  
3a50: 70 4e 65 77 2d 3e 7a 53 65 6c 65 63 74 20 3d 20  pNew->zSelect = 
3a60: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  0;.  pNew->iLimi
3a70: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
3a80: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
3a90: 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  pNew->ppOpenTemp
3aa0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
3ab0: 4e 65 77 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 41  New;.}.../*.** A
3ac0: 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74  dd a new element
3ad0: 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66 20 61   to the end of a
3ae0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  n expression lis
3af0: 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69 73 0a  t.  If pList is.
3b00: 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e 55 4c  ** initially NUL
3b10: 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65 20 61  L, then create a
3b20: 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20   new expression 
3b30: 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73  list..*/.ExprLis
3b40: 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72 4c 69  t *sqlite3ExprLi
3b50: 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c 69 73  stAppend(ExprLis
3b60: 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72 20 2a  t *pList, Expr *
3b70: 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e  pExpr, Token *pN
3b80: 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c 69 73  ame){.  if( pLis
3b90: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c 69 73  t==0 ){.    pLis
3ba0: 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  t = sqliteMalloc
3bb0: 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c 69 73  ( sizeof(ExprLis
3bc0: 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  t) );.    if( pL
3bd0: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ist==0 ){.      
3be0: 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65  /* sqlite3ExprDe
3bf0: 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20  lete(pExpr); // 
3c00: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d  Leak memory if m
3c10: 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20  alloc fails */. 
3c20: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
3c30: 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72 74 28     }.    assert(
3c40: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
3c50: 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70  0 );.  }.  if( p
3c60: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c  List->nAlloc<=pL
3c70: 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a 20 20  ist->nExpr ){.  
3c80: 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20    pList->nAlloc 
3c90: 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  = pList->nAlloc*
3ca0: 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69 73 74  2 + 4;.    pList
3cb0: 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  ->a = sqliteReal
3cc0: 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20 70 4c  loc(pList->a, pL
3cd0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65  ist->nAlloc*size
3ce0: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
3cf0: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
3d00: 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f  >a==0 ){.      /
3d10: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c  * sqlite3ExprDel
3d20: 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c  ete(pExpr); // L
3d30: 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61  eak memory if ma
3d40: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
3d50: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72      pList->nExpr
3d60: 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63   = pList->nAlloc
3d70: 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75   = 0;.      retu
3d80: 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20 7d 0a  rn pList;.    }.
3d90: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 4c    }.  assert( pL
3da0: 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20 20 69  ist->a!=0 );.  i
3db0: 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e 61 6d  f( pExpr || pNam
3dc0: 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20  e ){.    struct 
3dd0: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
3de0: 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61  Item = &pList->a
3df0: 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d  [pList->nExpr++]
3e00: 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74  ;.    memset(pIt
3e10: 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70  em, 0, sizeof(*p
3e20: 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65  Item));.    pIte
3e30: 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72  m->pExpr = pExpr
3e40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61  ;.    pItem->zNa
3e50: 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  me = sqlite3Name
3e60: 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d 65 29  FromToken(pName)
3e70: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3e80: 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44  List;.}../*.** D
3e90: 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72 65 20  elete an entire 
3ea0: 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e  expression list.
3eb0: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
3ec0: 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28 45  ExprListDelete(E
3ed0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
3ee0: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
3ef0: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
3f00: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20 70   *pItem;.  if( p
3f10: 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75 72 6e  List==0 ) return
3f20: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
3f30: 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c 69 73  t->a!=0 || (pLis
3f40: 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26 20 70  t->nExpr==0 && p
3f50: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29  List->nAlloc==0)
3f60: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c   );.  assert( pL
3f70: 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c 69 73  ist->nExpr<=pLis
3f80: 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20 20 66  t->nAlloc );.  f
3f90: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
3fa0: 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d  a, i=0; i<pList-
3fb0: 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74  >nExpr; i++, pIt
3fc0: 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69 74  em++){.    sqlit
3fd0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 49 74  e3ExprDelete(pIt
3fe0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 20 20  em->pExpr);.    
3ff0: 73 71 6c 69 74 65 46 72 65 65 28 70 49 74 65 6d  sqliteFree(pItem
4000: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a 20 20  ->zName);.  }.  
4010: 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69 73 74  sqliteFree(pList
4020: 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 46 72  ->a);.  sqliteFr
4030: 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a  ee(pList);.}../*
4040: 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72  .** Walk an expr
4050: 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65  ession tree.  Re
4060: 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65 78  turn 1 if the ex
4070: 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73  pression is cons
4080: 74 61 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66  tant.** and 0 if
4090: 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72   it involves var
40a0: 69 61 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f  iables..**.** Fo
40b0: 72 20 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f  r the purposes o
40c0: 66 20 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c  f this function,
40d0: 20 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64   a double-quoted
40e0: 20 73 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62   string (ex: "ab
40f0: 63 22 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64  c").** is consid
4100: 65 72 65 64 20 61 20 76 61 72 69 61 62 6c 65 20  ered a variable 
4110: 62 75 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f  but a single-quo
4120: 74 65 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20  ted string (ex: 
4130: 27 61 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63  'abc') is.** a c
4140: 6f 6e 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20  onstant..*/.int 
4150: 73 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e  sqlite3ExprIsCon
4160: 73 74 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a  stant(Expr *p){.
4170: 20 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20    switch( p->op 
4180: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
4190: 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  D:.    case TK_C
41a0: 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73 65 20  OLUMN:.    case 
41b0: 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61 73 65  TK_DOT:.    case
41c0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20   TK_FUNCTION:.  
41d0: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
41e0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 0a    case TK_NULL:.
41f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49      case TK_STRI
4200: 4e 47 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  NG:.    case TK_
4210: 42 4c 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54  BLOB:.    case T
4220: 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20 20 63  K_INTEGER:.    c
4230: 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20  ase TK_FLOAT:.  
4240: 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41 42    case TK_VARIAB
4250: 4c 45 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e  LE:.      return
4260: 20 31 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a   1;.    default:
4270: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d 3e   {.      if( p->
4280: 70 4c 65 66 74 20 26 26 20 21 73 71 6c 69 74 65  pLeft && !sqlite
4290: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
42a0: 70 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75  p->pLeft) ) retu
42b0: 72 6e 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20  rn 0;.      if( 
42c0: 70 2d 3e 70 52 69 67 68 74 20 26 26 20 21 73 71  p->pRight && !sq
42d0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
42e0: 61 6e 74 28 70 2d 3e 70 52 69 67 68 74 29 20 29  ant(p->pRight) )
42f0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20   return 0;.     
4300: 20 69 66 28 20 70 2d 3e 70 4c 69 73 74 20 29 7b   if( p->pList ){
4310: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
4320: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
4330: 20 69 3c 70 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78   i<p->pList->nEx
4340: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
4350: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
4360: 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
4370: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
4380: 78 70 72 29 20 29 20 72 65 74 75 72 6e 20 30 3b  xpr) ) return 0;
4390: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
43a0: 20 7d 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   }.      return 
43b0: 70 2d 3e 70 4c 65 66 74 21 3d 30 20 7c 7c 20 70  p->pLeft!=0 || p
43c0: 2d 3e 70 52 69 67 68 74 21 3d 30 20 7c 7c 20 28  ->pRight!=0 || (
43d0: 70 2d 3e 70 4c 69 73 74 20 26 26 20 70 2d 3e 70  p->pList && p->p
43e0: 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30 29 3b 0a  List->nExpr>0);.
43f0: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
4400: 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49  rn 0;.}../*.** I
4410: 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  f the given expr
4420: 65 73 73 69 6f 6e 20 63 6f 64 65 73 20 61 20 63  ession codes a c
4430: 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72 20  onstant integer 
4440: 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65 6e  that is small en
4450: 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20 69  ough.** to fit i
4460: 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65 67  n a 32-bit integ
4470: 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e 64  er, return 1 and
4480: 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20 6f   put the value o
4490: 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a 2a  f the integer.**
44a0: 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49 66   in *pValue.  If
44b0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
44c0: 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67 65  is not an intege
44d0: 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74 6f  r or if it is to
44e0: 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74 20  o big.** to fit 
44f0: 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d 62  in a signed 32-b
4500: 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75  it integer, retu
4510: 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20 2a  rn 0 and leave *
4520: 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65 64  pValue unchanged
4530: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
4540: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45 78  ExprIsInteger(Ex
4550: 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61 6c  pr *p, int *pVal
4560: 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70  ue){.  switch( p
4570: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
4580: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20   TK_INTEGER: {. 
4590: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
45a0: 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b 65  GetInt32(p->toke
45b0: 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b 0a  n.z, pValue) ){.
45c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
45d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
45e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
45f0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
4600: 20 7b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75   {.      const u
4610: 38 20 2a 7a 20 3d 20 28 75 38 2a 29 70 2d 3e 74  8 *z = (u8*)p->t
4620: 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 69 6e  oken.z;.      in
4630: 74 20 6e 20 3d 20 70 2d 3e 74 6f 6b 65 6e 2e 6e  t n = p->token.n
4640: 3b 0a 20 20 20 20 20 20 69 66 28 20 6e 3e 30 20  ;.      if( n>0 
4650: 26 26 20 7a 5b 30 5d 3d 3d 27 2d 27 20 29 7b 20  && z[0]=='-' ){ 
4660: 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d 0a 20 20 20 20  z++; n--; }.    
4670: 20 20 77 68 69 6c 65 28 20 6e 3e 30 20 26 26 20    while( n>0 && 
4680: 2a 7a 20 26 26 20 69 73 64 69 67 69 74 28 2a 7a  *z && isdigit(*z
4690: 29 20 29 7b 20 7a 2b 2b 3b 20 6e 2d 2d 3b 20 7d  ) ){ z++; n--; }
46a0: 0a 20 20 20 20 20 20 69 66 28 20 6e 3d 3d 30 20  .      if( n==0 
46b0: 26 26 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  && sqlite3GetInt
46c0: 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  32(p->token.z, p
46d0: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
46e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
46f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
4700: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4710: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
4720: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
4730: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
4740: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
4750: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
4760: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
4770: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
4780: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
4790: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
47a0: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
47b0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
47c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
47d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
47e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
47f0: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
4800: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
4810: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
4820: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
4830: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
4840: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
4850: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
4860: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
4870: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
4880: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
4890: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
48a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
48b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
48c0: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
48d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
48e0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
48f0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
4900: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
4910: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
4920: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
4930: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
4940: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
4950: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
4960: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
4970: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
4980: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
4990: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
49a0: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
49b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
49c0: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
49d0: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
49e0: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
49f0: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
4a00: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
4a10: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
4a20: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
4a30: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
4a40: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
4a50: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
4a60: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
4a70: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
4a80: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
4a90: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
4aa0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
4ab0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
4ac0: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
4ad0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
4ae0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
4af0: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
4b00: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
4b10: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
4b20: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
4b30: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
4b40: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
4b50: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
4b60: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
4b70: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
4b80: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
4b90: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
4ba0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
4bb0: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
4bc0: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
4bd0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
4be0: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
4bf0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
4c00: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
4c10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
4c20: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
4c30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
4c40: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
4c50: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
4c60: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
4c70: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
4c80: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
4c90: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
4ca0: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
4cb0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
4cc0: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
4cd0: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
4ce0: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
4cf0: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
4d00: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
4d10: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
4d20: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
4d30: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
4d40: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
4d50: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
4d60: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
4d70: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
4d80: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
4d90: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
4da0: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
4db0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
4dc0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
4dd0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
4de0: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
4df0: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
4e00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
4e10: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
4e20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
4e30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
4e40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
4e50: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
4e60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
4e70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
4e80: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
4e90: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
4ea0: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
4eb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
4ec0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
4ed0: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
4ee0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
4ef0: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
4f00: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
4f10: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
4f20: 69 73 74 2c 20 20 20 2f 2a 20 4c 69 73 74 20 6f  ist,   /* List o
4f30: 66 20 74 61 62 6c 65 73 20 75 73 65 64 20 74 6f  f tables used to
4f40: 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20   resolve column 
4f50: 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70 72 4c  names */.  ExprL
4f60: 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20 20 20  ist *pEList,    
4f70: 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  /* List of expre
4f80: 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72  ssions used to r
4f90: 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20  esolve "AS" */. 
4fa0: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
4fb0: 20 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68        /* Make th
4fc0: 69 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69  is EXPR node poi
4fd0: 6e 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74  nt to the select
4fe0: 65 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a  ed column */.){.
4ff0: 20 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b    char *zDb = 0;
5000: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f         /* Name o
5010: 66 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20  f the database. 
5020: 20 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e   The "X" in X.Y.
5030: 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61  Z */.  char *zTa
5040: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
5050: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5060: 2e 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e  .  The "Y" in X.
5070: 59 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20  Y.Z or Y.Z */.  
5080: 63 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20  char *zCol = 0; 
5090: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20       /* Name of 
50a0: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65  the column.  The
50b0: 20 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c   "Z" */.  int i,
50c0: 20 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f   j;            /
50d0: 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20  * Loop counters 
50e0: 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30  */.  int cnt = 0
50f0: 3b 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d  ;         /* Num
5100: 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20  ber of matching 
5110: 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a  column names */.
5120: 20 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30    int cntTab = 0
5130: 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72  ;      /* Number
5140: 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62   of matching tab
5150: 6c 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71  le names */.  sq
5160: 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72  lite3 *db = pPar
5170: 73 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20  se->db;  /* The 
5180: 64 61 74 61 62 61 73 65 20 2a 2f 0a 0a 20 20 61  database */..  a
5190: 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f  ssert( pColumnTo
51a0: 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ken && pColumnTo
51b0: 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65  ken->z ); /* The
51c0: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
51d0: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
51e0: 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  zDb = sqlite3Nam
51f0: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f  eFromToken(pDbTo
5200: 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73  ken);.  zTab = s
5210: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5220: 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29  ken(pTableToken)
5230: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
5240: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5250: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
5260: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
5270: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
5280: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
5290: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
52a0: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
52b0: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
52c0: 7d 0a 20 20 61 73 73 65 72 74 28 20 7a 54 61 62  }.  assert( zTab
52d0: 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30  ==0 || pEList==0
52e0: 20 29 3b 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54   );..  pExpr->iT
52f0: 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 66 6f 72  able = -1;.  for
5300: 28 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74  (i=0; i<pSrcList
5310: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
5320: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
5330: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20 26  _item *pItem = &
5340: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 3b 0a  pSrcList->a[i];.
5350: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
5360: 3d 20 70 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20  = pItem->pTab;. 
5370: 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b     Column *pCol;
5380: 0a 0a 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d  ..    if( pTab==
5390: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
53a0: 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d 3e    assert( pTab->
53b0: 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20 20 69 66  nCol>0 );.    if
53c0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
53d0: 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61  if( pItem->zAlia
53e0: 73 20 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61  s ){.        cha
53f0: 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49  r *zTabName = pI
5400: 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20  tem->zAlias;.   
5410: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
5420: 53 74 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65  StrICmp(zTabName
5430: 2c 20 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e  , zTab)!=0 ) con
5440: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d 65 6c  tinue;.      }el
5450: 73 65 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72  se{.        char
5460: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61   *zTabName = pTa
5470: 62 2d 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20  b->zName;.      
5480: 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d    if( zTabName==
5490: 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49  0 || sqlite3StrI
54a0: 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54  Cmp(zTabName, zT
54b0: 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75  ab)!=0 ) continu
54c0: 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a  e;.        if( z
54d0: 44 62 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33  Db!=0 && sqlite3
54e0: 53 74 72 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b  StrICmp(db->aDb[
54f0: 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65  pTab->iDb].zName
5500: 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a 20 20 20  , zDb)!=0 ){.   
5510: 20 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b         continue;
5520: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
5530: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28   }.    }.    if(
5540: 20 30 3d 3d 28 63 6e 74 54 61 62 2b 2b 29 20 29   0==(cntTab++) )
5550: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
5560: 54 61 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69  Table = pItem->i
5570: 43 75 72 73 6f 72 3b 0a 20 20 20 20 20 20 70 45  Cursor;.      pE
5580: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
5590: 3e 69 44 62 3b 0a 20 20 20 20 7d 0a 20 20 20 20  >iDb;.    }.    
55a0: 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70 54  for(j=0, pCol=pT
55b0: 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61 62  ab->aCol; j<pTab
55c0: 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f  ->nCol; j++, pCo
55d0: 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  l++){.      if( 
55e0: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70  sqlite3StrICmp(p
55f0: 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c  Col->zName, zCol
5600: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  )==0 ){.        
5610: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 70  cnt++;.        p
5620: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
5630: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
5640: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
5650: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
5660: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74 69         /* Substi
5670: 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20 28  tute the rowid (
5680: 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20 74  column -1) for t
5690: 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  he INTEGER PRIMA
56a0: 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20 20  RY KEY */.      
56b0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
56c0: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
56d0: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
56e0: 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
56f0: 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  ity = pTab->aCol
5700: 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20  [j].affinity;.  
5710: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
5720: 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
5730: 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].pColl;.      
5740: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d    break;.      }
5750: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 23 69 66 6e  .    }.  }..#ifn
5760: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
5770: 54 52 49 47 47 45 52 0a 20 20 2f 2a 20 49 66 20  TRIGGER.  /* If 
5780: 77 65 20 68 61 76 65 20 6e 6f 74 20 61 6c 72 65  we have not alre
5790: 61 64 79 20 72 65 73 6f 6c 76 65 64 20 74 68 65  ady resolved the
57a0: 20 6e 61 6d 65 2c 20 74 68 65 6e 20 6d 61 79 62   name, then mayb
57b0: 65 20 0a 20 20 2a 2a 20 69 74 20 69 73 20 61 20  e .  ** it is a 
57c0: 6e 65 77 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74  new.* or old.* t
57d0: 72 69 67 67 65 72 20 61 72 67 75 6d 65 6e 74 20  rigger argument 
57e0: 72 65 66 65 72 65 6e 63 65 0a 20 20 2a 2f 0a 20  reference.  */. 
57f0: 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a   if( zDb==0 && z
5800: 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30  Tab!=0 && cnt==0
5810: 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67   && pParse->trig
5820: 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20  Stack!=0 ){.    
5830: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54  TriggerStack *pT
5840: 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50  riggerStack = pP
5850: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
5860: 0a 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62  .    Table *pTab
5870: 20 3d 20 30 3b 0a 20 20 20 20 69 66 28 20 70 54   = 0;.    if( pT
5880: 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77  riggerStack->new
5890: 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c  Idx != -1 && sql
58a0: 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65 77  ite3StrICmp("new
58b0: 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29 7b  ", zTab) == 0 ){
58c0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
58d0: 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53  able = pTriggerS
58e0: 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b 0a 20 20  tack->newIdx;.  
58f0: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
5900: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
5910: 29 3b 0a 20 20 20 20 20 20 70 54 61 62 20 3d 20  );.      pTab = 
5920: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70  pTriggerStack->p
5930: 54 61 62 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  Tab;.    }else i
5940: 66 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b  f( pTriggerStack
5950: 2d 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26  ->oldIdx != -1 &
5960: 26 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70  & sqlite3StrICmp
5970: 28 22 6f 6c 64 22 2c 20 7a 54 61 62 29 20 3d 3d  ("old", zTab) ==
5980: 20 30 20 29 7b 0a 20 20 20 20 20 20 70 45 78 70   0 ){.      pExp
5990: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69  r->iTable = pTri
59a0: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
59b0: 78 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  x;.      assert(
59c0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
59d0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 70 54  pTab );.      pT
59e0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
59f0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 7d 0a  ck->pTab;.    }.
5a00: 0a 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b  .    if( pTab ){
5a10: 20 0a 20 20 20 20 20 20 69 6e 74 20 6a 3b 0a 20   .      int j;. 
5a20: 20 20 20 20 20 43 6f 6c 75 6d 6e 20 2a 70 43 6f       Column *pCo
5a30: 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 3b 0a  l = pTab->aCol;.
5a40: 20 20 20 20 20 20 0a 20 20 20 20 20 20 70 45 78        .      pEx
5a50: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
5a60: 69 44 62 3b 0a 20 20 20 20 20 20 63 6e 74 54 61  iDb;.      cntTa
5a70: 62 2b 2b 3b 0a 20 20 20 20 20 20 66 6f 72 28 6a  b++;.      for(j
5a80: 3d 30 3b 20 6a 20 3c 20 70 54 61 62 2d 3e 6e 43  =0; j < pTab->nC
5a90: 6f 6c 3b 20 6a 2b 2b 2c 20 70 43 6f 6c 2b 2b 29  ol; j++, pCol++)
5aa0: 20 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 73   {.        if( s
5ab0: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 70 43  qlite3StrICmp(pC
5ac0: 6f 6c 2d 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29  ol->zName, zCol)
5ad0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
5ae0: 20 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20   cnt++;.        
5af0: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5b00: 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65   = j==pTab->iPKe
5b10: 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20  y ? -1 : j;.    
5b20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
5b30: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
5b40: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
5b50: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
5b60: 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61  >pColl = pTab->a
5b70: 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20  Col[j].pColl;.  
5b80: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
5b90: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
5ba0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69  .    }.  }.#endi
5bb0: 66 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51  f /* !defined(SQ
5bc0: 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45  LITE_OMIT_TRIGGE
5bd0: 52 29 20 2a 2f 0a 0a 20 20 2f 2a 0a 20 20 2a 2a  R) */..  /*.  **
5be0: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
5bf0: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
5c00: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
5c10: 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20  */.  if( cnt==0 
5c20: 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26 20  && cntTab==1 && 
5c30: 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28 7a  sqlite3IsRowid(z
5c40: 43 6f 6c 29 20 29 7b 0a 20 20 20 20 63 6e 74 20  Col) ){.    cnt 
5c50: 3d 20 31 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e  = 1;.    pExpr->
5c60: 69 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  iColumn = -1;.  
5c70: 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74    pExpr->affinit
5c80: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  y = SQLITE_AFF_I
5c90: 4e 54 45 47 45 52 3b 0a 20 20 7d 0a 0a 20 20 2f  NTEGER;.  }..  /
5ca0: 2a 0a 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e  *.  ** If the in
5cb0: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
5cc0: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
5cd0: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
5ce0: 20 6e 61 6d 65 20 5a 0a 20 20 2a 2a 20 6d 69 67   name Z.  ** mig
5cf0: 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72  ht refer to an r
5d00: 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e  esult-set alias.
5d10: 20 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20    This happens, 
5d20: 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65  for example, whe
5d30: 6e 0a 20 20 2a 2a 20 77 65 20 61 72 65 20 72 65  n.  ** we are re
5d40: 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69 6e  solving names in
5d50: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
5d60: 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77 69  e of the followi
5d70: 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 2a 2a  ng command:.  **
5d80: 0a 20 20 2a 2a 20 20 20 20 20 53 45 4c 45 43 54  .  **     SELECT
5d90: 20 61 2b 62 20 41 53 20 78 20 46 52 4f 4d 20 74   a+b AS x FROM t
5da0: 61 62 6c 65 20 57 48 45 52 45 20 78 3c 31 30 3b  able WHERE x<10;
5db0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 49 6e 20 63 61  .  **.  ** In ca
5dc0: 73 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72  ses like this, r
5dd0: 65 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74  eplace pExpr wit
5de0: 68 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20  h a copy of the 
5df0: 65 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a  expression that.
5e00: 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72    ** forms the r
5e10: 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20  esult set entry 
5e20: 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78  ("a+b" in the ex
5e30: 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72  ample) and retur
5e40: 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20  n immediately.. 
5e50: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
5e60: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
5e70: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
5e80: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
5e90: 64 79 20 62 65 65 6e 0a 20 20 2a 2a 20 72 65 73  dy been.  ** res
5ea0: 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d  olved by the tim
5eb0: 65 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  e the WHERE clau
5ec0: 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a  se is resolved..
5ed0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d    */.  if( cnt==
5ee0: 30 20 26 26 20 70 45 4c 69 73 74 21 3d 30 20 29  0 && pEList!=0 )
5ef0: 7b 0a 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a  {.    for(j=0; j
5f00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
5f10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 63 68 61 72  j++){.      char
5f20: 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74 2d 3e   *zAs = pEList->
5f30: 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20 20 20  a[j].zName;.    
5f40: 20 20 69 66 28 20 7a 41 73 21 3d 30 20 26 26 20    if( zAs!=0 && 
5f50: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
5f60: 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  As, zCol)==0 ){.
5f70: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
5f80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3d 3d 30 20  pExpr->pLeft==0 
5f90: 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  && pExpr->pRight
5fa0: 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  ==0 );.        p
5fb0: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53  Expr->op = TK_AS
5fc0: 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  ;.        pExpr-
5fd0: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
5fe0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65        pExpr->pLe
5ff0: 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  ft = sqlite3Expr
6000: 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d  Dup(pEList->a[j]
6010: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
6020: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c   sqliteFree(zCol
6030: 29 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  );.        asser
6040: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
6050: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
6060: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
6070: 7d 0a 20 20 20 20 7d 20 0a 20 20 7d 0a 0a 20 20  }.    } .  }..  
6080: 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e 64  /*.  ** If X and
6090: 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e 20   Y are NULL (in 
60a0: 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20 6f  other words if o
60b0: 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 6e  nly the column n
60c0: 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73 75  ame Z is.  ** su
60d0: 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65 20  pplied) and the 
60e0: 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65 6e  value of Z is en
60f0: 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c 65  closed in double
6100: 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20 20  -quotes, then.  
6110: 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e 67  ** Z is a string
6120: 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20 64   literal if it d
6130: 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e 79  oesn't match any
6140: 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20 20   column names.  
6150: 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61 73  In that.  ** cas
6160: 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65  e, we need to re
6170: 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79 20  turn right away 
6180: 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e 79  and not make any
6190: 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a 2a   changes to.  **
61a0: 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20 69   pExpr..  */.  i
61b0: 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54 61  f( cnt==0 && zTa
61c0: 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e 54  b==0 && pColumnT
61d0: 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27 20  oken->z[0]=='"' 
61e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65  ){.    sqliteFre
61f0: 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65 74  e(zCol);.    ret
6200: 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f 2a  urn 0;.  }..  /*
6210: 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65 61  .  ** cnt==0 mea
6220: 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f 74  ns there was not
6230: 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20 6d   match.  cnt>1 m
6240: 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65 20  eans there were 
6250: 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72 65  two or.  ** more
6260: 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68 65   matches.  Eithe
6270: 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20 61  r way, we have a
6280: 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20 20  n error..  */.  
6290: 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20 20  if( cnt!=1 ){.  
62a0: 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a 20    char *z = 0;. 
62b0: 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a 20     char *zErr;. 
62c0: 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d 30     zErr = cnt==0
62d0: 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c 75   ? "no such colu
62e0: 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69 67  mn: %s" : "ambig
62f0: 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  uous column name
6300: 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20 7a  : %s";.    if( z
6310: 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  Db ){.      sqli
6320: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
6330: 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62 2c   zDb, ".", zTab,
6340: 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a   ".", zCol, 0);.
6350: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a 54      }else if( zT
6360: 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ab ){.      sqli
6370: 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a 2c  te3SetString(&z,
6380: 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c   zTab, ".", zCol
6390: 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b  , 0);.    }else{
63a0: 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69 74  .      z = sqlit
63b0: 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a 20  eStrDup(zCol);. 
63c0: 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33     }.    sqlite3
63d0: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
63e0: 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20 73   zErr, z);.    s
63f0: 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20 20  qliteFree(z);.  
6400: 7d 0a 0a 20 20 2f 2a 20 43 6c 65 61 6e 20 75 70  }..  /* Clean up
6410: 20 61 6e 64 20 72 65 74 75 72 6e 0a 20 20 2a 2f   and return.  */
6420: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 44  .  sqliteFree(zD
6430: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
6440: 28 7a 54 61 62 29 3b 0a 20 20 73 71 6c 69 74 65  (zTab);.  sqlite
6450: 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 73 71  Free(zCol);.  sq
6460: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
6470: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
6480: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d 20   pExpr->pLeft = 
6490: 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  0;.  sqlite3Expr
64a0: 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 52  Delete(pExpr->pR
64b0: 69 67 68 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e  ight);.  pExpr->
64c0: 70 52 69 67 68 74 20 3d 20 30 3b 0a 20 20 70 45  pRight = 0;.  pE
64d0: 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c  xpr->op = TK_COL
64e0: 55 4d 4e 3b 0a 20 20 73 71 6c 69 74 65 33 41 75  UMN;.  sqlite3Au
64f0: 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20 70  thRead(pParse, p
6500: 45 78 70 72 2c 20 70 53 72 63 4c 69 73 74 29 3b  Expr, pSrcList);
6510: 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d 31  .  return cnt!=1
6520: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  ;.}../*.** This 
6530: 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20 61 6e  routine walks an
6540: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
6550: 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20 72 65   and resolves re
6560: 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a 20 74  ferences to.** t
6570: 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20 20 4e  able columns.  N
6580: 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f 72 6d  odes of the form
6590: 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72 65 73   ID.ID or ID res
65a0: 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a 2a 20  olve into an.** 
65b0: 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74 61 62  index to the tab
65c0: 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c 65 20  le in the table 
65d0: 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c 75 6d  list and a colum
65e0: 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65 20 0a  n offset.  The .
65f0: 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65 20 66  ** Expr.opcode f
6600: 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20 69 73  or such nodes is
6610: 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b 5f 43   changed to TK_C
6620: 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78 70 72  OLUMN.  The Expr
6630: 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c 75 65  .iTable.** value
6640: 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 74   is changed to t
6650: 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 65 20  he index of the 
6660: 72 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65  referenced table
6670: 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a 2a 20   in pTabList.** 
6680: 70 6c 75 73 20 74 68 65 20 22 62 61 73 65 22 20  plus the "base" 
6690: 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61 73 65  value.  The base
66a0: 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c 74 69   value will ulti
66b0: 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20 74 68  mately become th
66c0: 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73 6f 72  e.** VDBE cursor
66d0: 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20 63 75   number for a cu
66e0: 72 73 6f 72 20 74 68 61 74 20 69 73 20 70 6f 69  rsor that is poi
66f0: 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65 20 72  nting into the r
6700: 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74 61 62  eferenced.** tab
6710: 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e 69 43  le.  The Expr.iC
6720: 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73 20 63  olumn value is c
6730: 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e  hanged to the in
6740: 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d  dex of the colum
6750: 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72 65 66  n .** of the ref
6760: 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e 20 20  erenced table.  
6770: 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e  The Expr.iColumn
6780: 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65 20 73   value for the s
6790: 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49 44 20  pecial.** ROWID 
67a0: 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20 20 41  column is -1.  A
67b0: 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49 4d 41  ny INTEGER PRIMA
67c0: 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20 69 73  RY KEY column is
67d0: 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a 2a 20   tried as an.** 
67e0: 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49 44 2e  alias for ROWID.
67f0: 0a 2a 2a 0a 2a 2a 20 57 65 20 61 6c 73 6f 20 63  .**.** We also c
6800: 68 65 63 6b 20 66 6f 72 20 69 6e 73 74 61 6e 63  heck for instanc
6810: 65 73 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  es of the IN ope
6820: 72 61 74 6f 72 2e 20 20 49 4e 20 63 6f 6d 65 73  rator.  IN comes
6830: 20 69 6e 20 74 77 6f 0a 2a 2a 20 66 6f 72 6d 73   in two.** forms
6840: 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20  :.**.**         
6850: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
6860: 69 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20  ist).** and.**  
6870: 20 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e           expr IN
6880: 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a   (SELECT ...).**
6890: 0a 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f  .** The first fo
68a0: 72 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79  rm is handled by
68b0: 20 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20   creating a set 
68c0: 68 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74  holding the list
68d0: 0a 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76  .** of allowed v
68e0: 61 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f  alues.  The seco
68f0: 6e 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74  nd form causes t
6900: 68 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e  he SELECT to gen
6910: 65 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70  erate .** a temp
6920: 6f 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a  orary table..**.
6930: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
6940: 61 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73  also looks for s
6950: 63 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68  calar SELECTs th
6960: 61 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61  at are part of a
6970: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a  n expression..**
6980: 20 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79   If it finds any
6990: 2c 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63  , it generates c
69a0: 6f 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65  ode to write the
69b0: 20 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73   value of that s
69c0: 65 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20  elect.** into a 
69d0: 6d 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a  memory cell..**.
69e0: 2a 2a 20 55 6e 6b 6e 6f 77 6e 20 63 6f 6c 75 6d  ** Unknown colum
69f0: 6e 73 20 6f 72 20 74 61 62 6c 65 73 20 70 72 6f  ns or tables pro
6a00: 76 6f 6b 65 20 61 6e 20 65 72 72 6f 72 2e 20 20  voke an error.  
6a10: 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 72 65 74  The function ret
6a20: 75 72 6e 73 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  urns.** the numb
6a30: 65 72 20 6f 66 20 65 72 72 6f 72 73 20 73 65 65  er of errors see
6a40: 6e 20 61 6e 64 20 6c 65 61 76 65 73 20 61 6e 20  n and leaves an 
6a50: 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 6f 6e  error message on
6a60: 20 70 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67   pParse->zErrMsg
6a70: 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33  ..*/.int sqlite3
6a80: 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 0a  ExprResolveIds(.
6a90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
6aa0: 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73       /* The pars
6ab0: 65 72 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  er context */.  
6ac0: 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69 73  SrcList *pSrcLis
6ad0: 74 2c 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61  t, /* List of ta
6ae0: 62 6c 65 73 20 75 73 65 64 20 74 6f 20 72 65 73  bles used to res
6af0: 6f 6c 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  olve column name
6b00: 73 20 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20  s */.  ExprList 
6b10: 2a 70 45 4c 69 73 74 2c 20 20 2f 2a 20 4c 69 73  *pEList,  /* Lis
6b20: 74 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73  t of expressions
6b30: 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76 65   used to resolve
6b40: 20 22 41 53 22 20 2a 2f 0a 20 20 45 78 70 72 20   "AS" */.  Expr 
6b50: 2a 70 45 78 70 72 20 20 20 20 20 20 20 20 2f 2a  *pExpr        /*
6b60: 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
6b70: 74 6f 20 62 65 20 61 6e 61 6c 79 7a 65 64 2e 20  to be analyzed. 
6b80: 2a 2f 0a 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 0a  */.){.  int i;..
6b90: 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 7c    if( pExpr==0 |
6ba0: 7c 20 70 53 72 63 4c 69 73 74 3d 3d 30 20 29 20  | pSrcList==0 ) 
6bb0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28  return 0;.  for(
6bc0: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
6bd0: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
6be0: 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69 73   assert( pSrcLis
6bf0: 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3e  t->a[i].iCursor>
6c00: 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d 3e  =0 && pSrcList->
6c10: 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50 61  a[i].iCursor<pPa
6c20: 72 73 65 2d 3e 6e 54 61 62 20 29 3b 0a 20 20 7d  rse->nTab );.  }
6c30: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
6c40: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44  ->op ){.    /* D
6c50: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
6c60: 69 6e 67 73 20 28 65 78 3a 20 22 61 62 63 22 29  ings (ex: "abc")
6c70: 20 61 72 65 20 75 73 65 64 20 61 73 20 69 64 65   are used as ide
6c80: 6e 74 69 66 69 65 72 73 20 69 66 0a 20 20 20 20  ntifiers if.    
6c90: 2a 2a 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74  ** possible.  Ot
6ca0: 68 65 72 77 69 73 65 20 74 68 65 79 20 72 65 6d  herwise they rem
6cb0: 61 69 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20  ain as strings. 
6cc0: 20 53 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20   Single-quoted. 
6cd0: 20 20 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65     ** strings (e
6ce0: 78 3a 20 27 61 62 63 27 29 20 61 72 65 20 61 6c  x: 'abc') are al
6cf0: 77 61 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65  ways string lite
6d00: 72 61 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  rals..    */.   
6d10: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
6d20: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
6d30: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d  pr->token.z[0]==
6d40: 27 5c 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20  '\'' ) break;.  
6d50: 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75      /* Fall thru
6d60: 20 69 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20   into the TK_ID 
6d70: 63 61 73 65 20 69 66 20 74 68 69 73 20 69 73 20  case if this is 
6d80: 61 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20  a double-quoted 
6d90: 73 74 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a  string */.    }.
6da0: 20 20 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64      /* A lone id
6db0: 65 6e 74 69 66 69 65 72 20 69 73 20 74 68 65 20  entifier is the 
6dc0: 6e 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e  name of a column
6dd0: 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  d..    */.    ca
6de0: 73 65 20 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20  se TK_ID: {.    
6df0: 20 20 69 66 28 20 6c 6f 6f 6b 75 70 4e 61 6d 65    if( lookupName
6e00: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
6e10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 53  pExpr->token, pS
6e20: 72 63 4c 69 73 74 2c 20 70 45 4c 69 73 74 2c 20  rcList, pEList, 
6e30: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
6e40: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
6e50: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
6e60: 20 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20 2f   .    }.  .    /
6e70: 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20 61  * A table name a
6e80: 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a 20  nd column name: 
6e90: 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a 2a      ID.ID.    **
6ea0: 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c 20   Or a database, 
6eb0: 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d 6e  table and column
6ec0: 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20 20  :  ID.ID.ID.    
6ed0: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44  */.    case TK_D
6ee0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b 65  OT: {.      Toke
6ef0: 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20  n *pColumn;.    
6f00: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 3b    Token *pTable;
6f10: 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 44  .      Token *pD
6f20: 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  b;.      Expr *p
6f30: 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 70 52  Right;..      pR
6f40: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 52  ight = pExpr->pR
6f50: 69 67 68 74 3b 0a 20 20 20 20 20 20 69 66 28 20  ight;.      if( 
6f60: 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 49  pRight->op==TK_I
6f70: 44 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 62  D ){.        pDb
6f80: 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 70 54   = 0;.        pT
6f90: 61 62 6c 65 20 3d 20 26 70 45 78 70 72 2d 3e 70  able = &pExpr->p
6fa0: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
6fb0: 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20 26       pColumn = &
6fc0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
6fd0: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6fe0: 20 20 20 20 61 73 73 65 72 74 28 20 70 52 69 67      assert( pRig
6ff0: 68 74 2d 3e 6f 70 3d 3d 54 4b 5f 44 4f 54 20 29  ht->op==TK_DOT )
7000: 3b 0a 20 20 20 20 20 20 20 20 70 44 62 20 3d 20  ;.        pDb = 
7010: 26 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74  &pExpr->pLeft->t
7020: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 54  oken;.        pT
7030: 61 62 6c 65 20 3d 20 26 70 52 69 67 68 74 2d 3e  able = &pRight->
7040: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
7050: 20 20 20 20 20 20 70 43 6f 6c 75 6d 6e 20 3d 20        pColumn = 
7060: 26 70 52 69 67 68 74 2d 3e 70 52 69 67 68 74 2d  &pRight->pRight-
7070: 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 0a  >token;.      }.
7080: 20 20 20 20 20 20 69 66 28 20 6c 6f 6f 6b 75 70        if( lookup
7090: 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70 44 62  Name(pParse, pDb
70a0: 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c 75 6d  , pTable, pColum
70b0: 6e 2c 20 70 53 72 63 4c 69 73 74 2c 20 30 2c 20  n, pSrcList, 0, 
70c0: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
70d0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
70e0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
70f0: 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65  .    }..    case
7100: 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20   TK_IN: {.      
7110: 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a 20  char affinity;. 
7120: 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20 73       Vdbe *v = s
7130: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
7140: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65 79  arse);.      Key
7150: 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20 20  Info keyInfo;.  
7160: 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20 20      int addr;   
7170: 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73 20       /* Address 
7180: 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20 69  of OP_OpenTemp i
7190: 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20  nstruction */.. 
71a0: 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29 20       if( v==0 ) 
71b0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20  return 1;.      
71c0: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
71d0: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
71e0: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
71f0: 73 74 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  st, pExpr->pLeft
7200: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74  ) ){.        ret
7210: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20  urn 1;.      }. 
7220: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
7230: 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e  sqlite3ExprAffin
7240: 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66 74  ity(pExpr->pLeft
7250: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68 65  );..      /* Whe
7260: 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e 20  ther this is an 
7270: 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e 29  'x IN(SELECT...)
7280: 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c 65  ' or an 'x IN(<e
7290: 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20 20  xprlist>)'.     
72a0: 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 69   ** expression i
72b0: 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68 65  t is handled the
72c0: 20 73 61 6d 65 20 77 61 79 2e 20 41 20 74 65 6d   same way. A tem
72d0: 70 6f 72 61 72 79 20 74 61 62 6c 65 20 69 73 20  porary table is 
72e0: 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c 6c 65 64  .      ** filled
72f0: 20 77 69 74 68 20 73 69 6e 67 6c 65 2d 66 69 65   with single-fie
7300: 6c 64 20 69 6e 64 65 78 20 6b 65 79 73 20 72 65  ld index keys re
7310: 70 72 65 73 65 6e 74 69 6e 67 20 74 68 65 20 72  presenting the r
7320: 65 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20  esults.      ** 
7330: 66 72 6f 6d 20 74 68 65 20 53 45 4c 45 43 54 20  from the SELECT 
7340: 6f 72 20 74 68 65 20 3c 65 78 70 72 6c 69 73 74  or the <exprlist
7350: 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20  >..      **.    
7360: 20 20 2a 2a 20 49 66 20 74 68 65 20 27 78 27 20    ** If the 'x' 
7370: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 61 20  expression is a 
7380: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 6f 72  column value, or
7390: 20 74 68 65 20 53 45 4c 45 43 54 2e 2e 2e 0a 20   the SELECT.... 
73a0: 20 20 20 20 20 2a 2a 20 73 74 61 74 65 6d 65 6e       ** statemen
73b0: 74 20 72 65 74 75 72 6e 73 20 61 20 63 6f 6c 75  t returns a colu
73c0: 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65 6e 20 74  mn value, then t
73d0: 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74  he affinity of t
73e0: 68 61 74 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6c  hat.      ** col
73f0: 75 6d 6e 20 69 73 20 75 73 65 64 20 74 6f 20 62  umn is used to b
7400: 75 69 6c 64 20 74 68 65 20 69 6e 64 65 78 20 6b  uild the index k
7410: 65 79 73 2e 20 49 66 20 62 6f 74 68 20 27 78 27  eys. If both 'x'
7420: 20 61 6e 64 20 74 68 65 0a 20 20 20 20 20 20 2a   and the.      *
7430: 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74  * SELECT... stat
7440: 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e  ement are column
7450: 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20  s, then numeric 
7460: 61 66 66 69 6e 69 74 79 20 69 73 20 75 73 65 64  affinity is used
7470: 0a 20 20 20 20 20 20 2a 2a 20 69 66 20 65 69 74  .      ** if eit
7480: 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61 73 20 4e  her column has N
7490: 55 4d 45 52 49 43 20 6f 72 20 49 4e 54 45 47 45  UMERIC or INTEGE
74a0: 52 20 61 66 66 69 6e 69 74 79 2e 20 49 66 20 6e  R affinity. If n
74b0: 65 69 74 68 65 72 0a 20 20 20 20 20 20 2a 2a 20  either.      ** 
74c0: 27 78 27 20 6e 6f 72 20 74 68 65 20 53 45 4c 45  'x' nor the SELE
74d0: 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e 74 20  CT... statement 
74e0: 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74 68 65  are columns, the
74f0: 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  n numeric affini
7500: 74 79 0a 20 20 20 20 20 20 2a 2a 20 69 73 20 75  ty.      ** is u
7510: 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20  sed..      */.  
7520: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
7530: 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 54 61 62  e = pParse->nTab
7540: 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d  ++;.      addr =
7550: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7560: 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54 65 6d 70  p(v, OP_OpenTemp
7570: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
7580: 20 30 29 3b 0a 20 20 20 20 20 20 6d 65 6d 73 65   0);.      memse
7590: 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30 2c 20 73  t(&keyInfo, 0, s
75a0: 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f 29 29 3b  izeof(keyInfo));
75b0: 0a 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 6e  .      keyInfo.n
75c0: 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20 20 20 20  Field = 1;.     
75d0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
75e0: 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75 6d 43 6f  p(v, OP_SetNumCo
75f0: 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d 3e 69 54  lumns, pExpr->iT
7600: 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20 20 20 20  able, 1);..     
7610: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
7620: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  ect ){.        /
7630: 2a 20 43 61 73 65 20 31 3a 20 20 20 20 20 65 78  * Case 1:     ex
7640: 70 72 20 49 4e 20 28 53 45 4c 45 43 54 20 2e 2e  pr IN (SELECT ..
7650: 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 20 20  .).        **.  
7660: 20 20 20 20 20 20 2a 2a 20 47 65 6e 65 72 61 74        ** Generat
7670: 65 20 63 6f 64 65 20 74 6f 20 77 72 69 74 65 20  e code to write 
7680: 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20 74  the results of t
7690: 68 65 20 73 65 6c 65 63 74 20 69 6e 74 6f 20 74  he select into t
76a0: 68 65 20 74 65 6d 70 6f 72 61 72 79 0a 20 20 20  he temporary.   
76b0: 20 20 20 20 20 2a 2a 20 74 61 62 6c 65 20 61 6c       ** table al
76c0: 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f 70 65 6e  located and open
76d0: 65 64 20 61 62 6f 76 65 2e 0a 20 20 20 20 20 20  ed above..      
76e0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
76f0: 20 69 50 61 72 6d 20 3d 20 70 45 78 70 72 2d 3e   iParm = pExpr->
7700: 69 54 61 62 6c 65 20 2b 20 20 28 28 28 69 6e 74  iTable +  (((int
7710: 29 61 66 66 69 6e 69 74 79 29 3c 3c 31 36 29 3b  )affinity)<<16);
7720: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
7730: 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t *pEList;.     
7740: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
7750: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
7760: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
7770: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
7780: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50  sqlite3Select(pP
7790: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65  arse, pExpr->pSe
77a0: 6c 65 63 74 2c 20 53 52 54 5f 53 65 74 2c 20 69  lect, SRT_Set, i
77b0: 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30 2c 20 30  Parm, 0, 0, 0, 0
77c0: 29 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73  );.        pELis
77d0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  t = pExpr->pSele
77e0: 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20  ct->pEList;.    
77f0: 20 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26      if( pEList &
7800: 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e  & pEList->nExpr>
7810: 30 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20  0 ){ .          
7820: 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d  keyInfo.aColl[0]
7830: 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65   = binaryCompare
7840: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
7850: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20  pExpr->pLeft,.  
7860: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69              pELi
7870: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b  st->a[0].pExpr);
7880: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
7890: 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72   }else if( pExpr
78a0: 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ->pList ){.     
78b0: 20 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20     /* Case 2:   
78c0: 20 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c    expr IN (exprl
78d0: 69 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a  ist).        **.
78e0: 09 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70  .** For each exp
78f0: 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61  ression, build a
7900: 6e 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d  n index key from
7910: 20 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20   the evaluation 
7920: 61 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73  and.        ** s
7930: 74 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74  tore it in the t
7940: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20  emporary table. 
7950: 49 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63  If <expr> is a c
7960: 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a  olumn, then use.
7970: 20 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20          ** that 
7980: 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79  columns affinity
7990: 20 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69   when building i
79a0: 6e 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65  ndex keys. If <e
79b0: 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20  xpr> is not.    
79c0: 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c      ** a column,
79d0: 20 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66   use numeric aff
79e0: 69 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a  inity..        *
79f0: 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b  /.        int i;
7a00: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66  .        if( !af
7a10: 66 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20  finity ){.      
7a20: 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53      affinity = S
7a30: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
7a40: 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  C;.        }.   
7a50: 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f       keyInfo.aCo
7a60: 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70  ll[0] = pExpr->p
7a70: 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20  Left->pColl;..  
7a80: 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68        /* Loop th
7a90: 72 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65  rough each expre
7aa0: 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69  ssion in <exprli
7ab0: 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  st>. */.        
7ac0: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72  for(i=0; i<pExpr
7ad0: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  ->pList->nExpr; 
7ae0: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20  i++){.          
7af0: 45 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70  Expr *pE2 = pExp
7b00: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70  r->pList->a[i].p
7b10: 45 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20  Expr;..         
7b20: 20 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74   /* Check that t
7b30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
7b40: 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61   constant and va
7b50: 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20  lid. */.        
7b60: 20 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78    if( !sqlite3Ex
7b70: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
7b80: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
7b90: 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67   sqlite3ErrorMsg
7ba0: 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20  (pParse,.       
7bb0: 20 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61         "right-ha
7bc0: 6e 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70  nd side of IN op
7bd0: 65 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63  erator must be c
7be0: 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20  onstant");.     
7bf0: 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b         return 1;
7c00: 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
7c10: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
7c20: 65 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72  e3ExprCheck(pPar
7c30: 73 65 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29  se, pE2, 0, 0) )
7c40: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65  {.            re
7c50: 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20  turn 1;.        
7c60: 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f    }..          /
7c70: 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65  * Evaluate the e
7c80: 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e  xpression and in
7c90: 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65  sert it into the
7ca0: 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20   temp table */. 
7cb0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
7cc0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
7cd0: 20 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20   pE2);.         
7ce0: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
7cf0: 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64  v, OP_MakeRecord
7d00: 2c 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74  , 1, 0, &affinit
7d10: 79 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20  y, 1);.         
7d20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
7d30: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
7d40: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   0, 0);.        
7d50: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
7d60: 4f 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b  Op(v, OP_PutStrK
7d70: 65 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  ey, pExpr->iTabl
7d80: 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d  e, 0);.        }
7d90: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73  .      }.      s
7da0: 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
7db0: 50 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P3(v, addr, (voi
7dc0: 64 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33  d *)&keyInfo, P3
7dd0: 5f 4b 45 59 49 4e 46 4f 29 3b 0a 0a 20 20 20 20  _KEYINFO);..    
7de0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
7df0: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
7e00: 43 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54  CT: {.      /* T
7e10: 68 69 73 20 68 61 73 20 74 6f 20 62 65 20 61 20  his has to be a 
7e20: 73 63 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20  scalar SELECT.  
7e30: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
7e40: 20 70 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a   put the.      *
7e50: 2a 20 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20  * value of this 
7e60: 73 65 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f  select in a memo
7e70: 72 79 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f  ry cell and reco
7e80: 72 64 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20  rd the number.  
7e90: 20 20 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65      ** of the me
7ea0: 6d 6f 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f  mory cell in iCo
7eb0: 6c 75 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  lumn..      */. 
7ec0: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
7ed0: 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  umn = pParse->nM
7ee0: 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 69 66 28 73  em++;.      if(s
7ef0: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
7f00: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c  rse, pExpr->pSel
7f10: 65 63 74 2c 20 53 52 54 5f 4d 65 6d 2c 70 45 78  ect, SRT_Mem,pEx
7f20: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 30 2c 30 2c  pr->iColumn,0,0,
7f30: 30 2c 30 29 29 7b 0a 20 20 20 20 20 20 20 20 72  0,0)){.        r
7f40: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
7f50: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7f60: 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 46 6f 72 20    }..    /* For 
7f70: 61 6c 6c 20 65 6c 73 65 2c 20 6a 75 73 74 20 72  all else, just r
7f80: 65 63 75 72 73 69 76 65 6c 79 20 77 61 6c 6b 20  ecursively walk 
7f90: 74 68 65 20 74 72 65 65 20 2a 2f 0a 20 20 20 20  the tree */.    
7fa0: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
7fb0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66   if( pExpr->pLef
7fc0: 74 0a 20 20 20 20 20 20 26 26 20 73 71 6c 69 74  t.      && sqlit
7fd0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
7fe0: 28 70 50 61 72 73 65 2c 20 70 53 72 63 4c 69 73  (pParse, pSrcLis
7ff0: 74 2c 20 70 45 4c 69 73 74 2c 20 70 45 78 70 72  t, pEList, pExpr
8000: 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20 20 20  ->pLeft) ){.    
8010: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
8020: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8030: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 0a 20  pExpr->pRight . 
8040: 20 20 20 20 20 26 26 20 73 71 6c 69 74 65 33 45       && sqlite3E
8050: 78 70 72 52 65 73 6f 6c 76 65 49 64 73 28 70 50  xprResolveIds(pP
8060: 61 72 73 65 2c 20 70 53 72 63 4c 69 73 74 2c 20  arse, pSrcList, 
8070: 70 45 4c 69 73 74 2c 20 70 45 78 70 72 2d 3e 70  pEList, pExpr->p
8080: 52 69 67 68 74 29 20 29 7b 0a 20 20 20 20 20 20  Right) ){.      
8090: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
80a0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
80b0: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
80c0: 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20        int i;.   
80d0: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
80e0: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
80f0: 69 73 74 3b 0a 20 20 20 20 20 20 20 20 66 6f 72  ist;.        for
8100: 28 69 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e  (i=0; i<pList->n
8110: 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  Expr; i++){.    
8120: 20 20 20 20 20 20 45 78 70 72 20 2a 70 41 72 67        Expr *pArg
8130: 20 3d 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70   = pList->a[i].p
8140: 45 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20  Expr;.          
8150: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 52  if( sqlite3ExprR
8160: 65 73 6f 6c 76 65 49 64 73 28 70 50 61 72 73 65  esolveIds(pParse
8170: 2c 20 70 53 72 63 4c 69 73 74 2c 20 70 45 4c 69  , pSrcList, pELi
8180: 73 74 2c 20 70 41 72 67 29 20 29 7b 0a 20 20 20  st, pArg) ){.   
8190: 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20           return 
81a0: 31 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  1;.          }. 
81b0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
81c0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
81d0: 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn 0;.}../*.** 
81e0: 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64 65 20  pExpr is a node 
81f0: 74 68 61 74 20 64 65 66 69 6e 65 73 20 61 20 66  that defines a f
8200: 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d 65 20  unction of some 
8210: 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68 74 0a  kind.  It might.
8220: 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63 74 69  ** be a syntacti
8230: 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b 65 20  c function like 
8240: 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20 69 74  "count(x)" or it
8250: 20 6d 69 67 68 74 20 62 65 20 61 20 66 75 6e 63   might be a func
8260: 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69 6d 70  tion.** that imp
8270: 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65 72 61  lements an opera
8280: 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c 49 4b  tor, like "a LIK
8290: 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68  E b".  .**.** Th
82a0: 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b 65 73  is routine makes
82b0: 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74 20 74   *pzName point t
82c0: 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68  o the name of th
82d0: 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64 20 0a  e function and .
82e0: 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c 64 20  ** *pnName hold 
82f0: 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 63 68  the number of ch
8300: 61 72 61 63 74 65 72 73 20 69 6e 20 74 68 65 20  aracters in the 
8310: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a  function name..*
8320: 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20 67 65  /.static void ge
8330: 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 45 78  tFunctionName(Ex
8340: 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e 73 74  pr *pExpr, const
8350: 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20   char **pzName, 
8360: 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20  int *pnName){.  
8370: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
8380: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
8390: 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20  _FUNCTION: {.   
83a0: 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70 45 78     *pzName = pEx
83b0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20  pr->token.z;.   
83c0: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70 45 78     *pnName = pEx
83d0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20  pr->token.n;.   
83e0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
83f0: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
8400: 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d  : {.      *pzNam
8410: 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20 20 20  e = "like";.    
8420: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20    *pnName = 4;. 
8430: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
8440: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  }.    case TK_GL
8450: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  OB: {.      *pzN
8460: 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a 20 20  ame = "glob";.  
8470: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
8480: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
8490: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
84a0: 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65   {.      *pzName
84b0: 20 3d 20 22 63 61 6e 27 74 20 68 61 70 70 65 6e   = "can't happen
84c0: 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65  ";.      *pnName
84d0: 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65   = 12;.      bre
84e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  ak;.    }.  }.}.
84f0: 0a 2f 2a 0a 2a 2a 20 45 72 72 6f 72 20 63 68 65  ./*.** Error che
8500: 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 73  ck the functions
8510: 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f   in an expressio
8520: 6e 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c  n.  Make sure al
8530: 6c 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e 61  l.** function na
8540: 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e 69 7a  mes are recogniz
8550: 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e 63 74  ed and all funct
8560: 69 6f 6e 73 20 68 61 76 65 20 74 68 65 20 63 6f  ions have the co
8570: 72 72 65 63 74 0a 2a 2a 20 6e 75 6d 62 65 72 20  rrect.** number 
8580: 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20 20 4c  of arguments.  L
8590: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
85a0: 73 73 61 67 65 20 69 6e 20 70 50 61 72 73 65 2d  ssage in pParse-
85b0: 3e 7a 45 72 72 4d 73 67 0a 2a 2a 20 69 66 20 61  >zErrMsg.** if a
85c0: 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69 73 73  nything is amiss
85d0: 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  .  Return the nu
85e0: 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a  mber of errors..
85f0: 2a 2a 0a 2a 2a 20 69 66 20 70 49 73 41 67 67 20  **.** if pIsAgg 
8600: 69 73 20 6e 6f 74 20 6e 75 6c 6c 20 61 6e 64 20  is not null and 
8610: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
8620: 69 73 20 61 6e 20 61 67 67 72 65 67 61 74 65 20  is an aggregate 
8630: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 28 6c 69 6b  function.** (lik
8640: 65 20 63 6f 75 6e 74 28 2a 29 20 6f 72 20 6d 61  e count(*) or ma
8650: 78 28 76 61 6c 75 65 29 29 20 74 68 65 6e 20 77  x(value)) then w
8660: 72 69 74 65 20 61 20 31 20 69 6e 74 6f 20 2a 70  rite a 1 into *p
8670: 49 73 41 67 67 2e 0a 2a 2f 0a 69 6e 74 20 73 71  IsAgg..*/.int sq
8680: 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 50  lite3ExprCheck(P
8690: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
86a0: 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 61  pr *pExpr, int a
86b0: 6c 6c 6f 77 41 67 67 2c 20 69 6e 74 20 2a 70 49  llowAgg, int *pI
86c0: 73 41 67 67 29 7b 0a 20 20 69 6e 74 20 6e 45 72  sAgg){.  int nEr
86d0: 72 20 3d 20 30 3b 0a 20 20 69 66 28 20 70 45 78  r = 0;.  if( pEx
86e0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  pr==0 ) return 0
86f0: 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ;.  switch( pExp
8700: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
8710: 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63  e TK_GLOB:.    c
8720: 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20  ase TK_LIKE:.   
8730: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
8740: 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 6e  N: {.      int n
8750: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 20   = pExpr->pList 
8760: 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e  ? pExpr->pList->
8770: 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20 4e  nExpr : 0;  /* N
8780: 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e  umber of argumen
8790: 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20  ts */.      int 
87a0: 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20 30  no_such_func = 0
87b0: 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20  ;       /* True 
87c0: 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63 74  if no such funct
87d0: 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20 20  ion exists */.  
87e0: 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e 75      int wrong_nu
87f0: 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20 20  m_args = 0;     
8800: 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e 67  /* True if wrong
8810: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
8820: 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ents */.      in
8830: 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20 20  t is_agg = 0;   
8840: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75            /* Tru
8850: 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72 65  e if is an aggre
8860: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f  gate function */
8870: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
8880: 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20 20      int nId;    
8890: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
88a0: 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61  /* Number of cha
88b0: 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63 74  racters in funct
88c0: 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20 20  ion name */.    
88d0: 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49    const char *zI
88e0: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d;            /*
88f0: 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   The function na
8900: 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e  me. */.      Fun
8910: 63 44 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20  cDef *pDef;.    
8920: 20 20 69 6e 74 20 65 6e 63 20 3d 20 70 50 61 72    int enc = pPar
8930: 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 0a 20 20  se->db->enc;..  
8940: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
8950: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
8960: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
8970: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
8980: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
8990: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
89a0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
89b0: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
89c0: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
89d0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
89e0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
89f0: 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63  Id, nId, -1, enc
8a00: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
8a10: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
8a20: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
8a30: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
8a40: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8a50: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
8a60: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8a70: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8a80: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
8a90: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
8aa0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8ab0: 69 73 5f 61 67 67 20 26 26 20 21 61 6c 6c 6f 77  is_agg && !allow
8ac0: 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Agg ){.        s
8ad0: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8ae0: 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20 6f  Parse, "misuse o
8af0: 66 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  f aggregate func
8b00: 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c 20 6e 49  tion %.*s()", nI
8b10: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
8b20: 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20   nErr++;.       
8b30: 20 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20   is_agg = 0;.   
8b40: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f     }else if( no_
8b50: 73 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20  such_func ){.   
8b60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
8b70: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f  rMsg(pParse, "no
8b80: 20 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20   such function: 
8b90: 25 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29  %.*s", nId, zId)
8ba0: 3b 0a 20 20 20 20 20 20 20 20 6e 45 72 72 2b 2b  ;.        nErr++
8bb0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
8bc0: 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73  ( wrong_num_args
8bd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
8be0: 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
8bf0: 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72  se,"wrong number
8c00: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f   of arguments to
8c10: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
8c20: 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ",.             
8c30: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
8c40: 20 20 20 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20     nErr++;.     
8c50: 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 73 5f   }.      if( is_
8c60: 61 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 70  agg ){.        p
8c70: 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 47  Expr->op = TK_AG
8c80: 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 20 20  G_FUNCTION;.    
8c90: 20 20 20 20 69 66 28 20 70 49 73 41 67 67 20 29      if( pIsAgg )
8ca0: 20 2a 70 49 73 41 67 67 20 3d 20 31 3b 0a 20 20   *pIsAgg = 1;.  
8cb0: 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72 28      }.      for(
8cc0: 69 3d 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20  i=0; nErr==0 && 
8cd0: 69 3c 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  i<n; i++){.     
8ce0: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
8cf0: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
8d00: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  e, pExpr->pList-
8d10: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 0a 20 20 20  >a[i].pExpr,.   
8d20: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8d30: 20 20 20 20 20 20 20 20 20 20 20 20 61 6c 6c 6f              allo
8d40: 77 41 67 67 20 26 26 20 21 69 73 5f 61 67 67 2c  wAgg && !is_agg,
8d50: 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20   pIsAgg);.      
8d60: 7d 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20 4d  }.      /* FIX M
8d70: 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78 70  E:  Compute pExp
8d80: 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73 65  r->affinity base
8d90: 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74 65  d on the expecte
8da0: 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20 2a  d return.      *
8db0: 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66 75  * type of the fu
8dc0: 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a 2f  nction .      */
8dd0: 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75  .    }.    defau
8de0: 6c 74 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  lt: {.      if( 
8df0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
8e00: 20 20 20 20 20 20 20 20 6e 45 72 72 20 3d 20 73          nErr = s
8e10: 71 6c 69 74 65 33 45 78 70 72 43 68 65 63 6b 28  qlite3ExprCheck(
8e20: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
8e30: 4c 65 66 74 2c 20 61 6c 6c 6f 77 41 67 67 2c 20  Left, allowAgg, 
8e40: 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20 20 7d  pIsAgg);.      }
8e50: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
8e60: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69  =0 && pExpr->pRi
8e70: 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e  ght ){.        n
8e80: 45 72 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Err = sqlite3Exp
8e90: 72 43 68 65 63 6b 28 70 50 61 72 73 65 2c 20 70  rCheck(pParse, p
8ea0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 6c  Expr->pRight, al
8eb0: 6c 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b  lowAgg, pIsAgg);
8ec0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
8ed0: 66 28 20 6e 45 72 72 3d 3d 30 20 26 26 20 70 45  f( nErr==0 && pE
8ee0: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
8ef0: 20 20 20 20 20 20 69 6e 74 20 6e 20 3d 20 70 45        int n = pE
8f00: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
8f10: 72 3b 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69  r;.        int i
8f20: 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d  ;.        for(i=
8f30: 30 3b 20 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c  0; nErr==0 && i<
8f40: 6e 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  n; i++){.       
8f50: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
8f60: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
8f70: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
8f80: 20 20 20 6e 45 72 72 20 3d 20 73 71 6c 69 74 65     nErr = sqlite
8f90: 33 45 78 70 72 43 68 65 63 6b 28 70 50 61 72 73  3ExprCheck(pPars
8fa0: 65 2c 20 70 45 32 2c 20 61 6c 6c 6f 77 41 67 67  e, pE2, allowAgg
8fb0: 2c 20 70 49 73 41 67 67 29 3b 0a 20 20 20 20 20  , pIsAgg);.     
8fc0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
8fd0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
8fe0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6e 45 72    }.  return nEr
8ff0: 72 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  r;.}../*.** Call
9000: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
9010: 6c 76 65 49 64 73 28 29 20 66 6f 6c 6c 6f 77 65  lveIds() followe
9020: 64 20 62 79 20 73 71 6c 69 74 65 33 45 78 70 72  d by sqlite3Expr
9030: 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a 2a 20 54  Check()..**.** T
9040: 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 70  his routine is p
9050: 72 6f 76 69 64 65 64 20 61 73 20 61 20 63 6f 6e  rovided as a con
9060: 76 65 6e 69 65 6e 63 65 20 73 69 6e 63 65 20 69  venience since i
9070: 74 20 69 73 20 76 65 72 79 20 63 6f 6d 6d 6f 6e  t is very common
9080: 0a 2a 2a 20 74 6f 20 63 61 6c 6c 20 52 65 73 6f  .** to call Reso
9090: 6c 76 65 49 64 73 28 29 20 61 6e 64 20 43 68 65  lveIds() and Che
90a0: 63 6b 28 29 20 62 61 63 6b 20 74 6f 20 62 61 63  ck() back to bac
90b0: 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  k..*/.int sqlite
90c0: 33 45 78 70 72 52 65 73 6f 6c 76 65 41 6e 64 43  3ExprResolveAndC
90d0: 68 65 63 6b 28 0a 20 20 50 61 72 73 65 20 2a 70  heck(.  Parse *p
90e0: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 54 68  Parse,     /* Th
90f0: 65 20 70 61 72 73 65 72 20 63 6f 6e 74 65 78 74  e parser context
9100: 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74 20 2a 70   */.  SrcList *p
9110: 53 72 63 4c 69 73 74 2c 20 2f 2a 20 4c 69 73 74  SrcList, /* List
9120: 20 6f 66 20 74 61 62 6c 65 73 20 75 73 65 64 20   of tables used 
9130: 74 6f 20 72 65 73 6f 6c 76 65 20 63 6f 6c 75 6d  to resolve colum
9140: 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 45 78 70  n names */.  Exp
9150: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 2c 20 20  rList *pEList,  
9160: 2f 2a 20 4c 69 73 74 20 6f 66 20 65 78 70 72 65  /* List of expre
9170: 73 73 69 6f 6e 73 20 75 73 65 64 20 74 6f 20 72  ssions used to r
9180: 65 73 6f 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20  esolve "AS" */. 
9190: 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20   Expr *pExpr,   
91a0: 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
91b0: 73 73 69 6f 6e 20 74 6f 20 62 65 20 61 6e 61 6c  ssion to be anal
91c0: 79 7a 65 64 2e 20 2a 2f 0a 20 20 69 6e 74 20 61  yzed. */.  int a
91d0: 6c 6c 6f 77 41 67 67 2c 20 20 20 20 20 20 2f 2a  llowAgg,      /*
91e0: 20 54 72 75 65 20 74 6f 20 61 6c 6c 6f 77 20 61   True to allow a
91f0: 67 67 72 65 67 61 74 65 20 65 78 70 72 65 73 73  ggregate express
9200: 69 6f 6e 73 20 2a 2f 0a 20 20 69 6e 74 20 2a 70  ions */.  int *p
9210: 49 73 41 67 67 20 20 20 20 20 20 20 20 2f 2a 20  IsAgg        /* 
9220: 53 65 74 20 74 6f 20 54 52 55 45 20 69 66 20 61  Set to TRUE if a
9230: 67 67 72 65 67 61 74 65 73 20 61 72 65 20 66 6f  ggregates are fo
9240: 75 6e 64 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20  und */.){.  if( 
9250: 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72  pExpr==0 ) retur
9260: 6e 20 30 3b 0a 20 20 69 66 28 20 73 71 6c 69 74  n 0;.  if( sqlit
9270: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64 73  e3ExprResolveIds
9280: 28 70 50 61 72 73 65 2c 70 53 72 63 4c 69 73 74  (pParse,pSrcList
9290: 2c 70 45 4c 69 73 74 2c 70 45 78 70 72 29 20 29  ,pEList,pExpr) )
92a0: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a  {.    return 1;.
92b0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 73 71 6c    }.  return sql
92c0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 28 70 50  ite3ExprCheck(pP
92d0: 61 72 73 65 2c 20 70 45 78 70 72 2c 20 61 6c 6c  arse, pExpr, all
92e0: 6f 77 41 67 67 2c 20 70 49 73 41 67 67 29 3b 0a  owAgg, pIsAgg);.
92f0: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
9300: 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e  e an instruction
9310: 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74   that will put t
9320: 68 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72  he integer descr
9330: 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a  ibe by.** text z
9340: 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20  [0..n-1] on the 
9350: 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63  stack..*/.static
9360: 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65   void codeIntege
9370: 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74  r(Vdbe *v, const
9380: 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29   char *z, int n)
9390: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  {.  int i;.  if(
93a0: 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32   sqlite3GetInt32
93b0: 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73  (z, &i) ){.    s
93c0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
93d0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69  v, OP_Integer, i
93e0: 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66  , 0);.  }else if
93f0: 28 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36  ( sqlite3FitsIn6
9400: 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20  4Bits(z) ){.    
9410: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
9420: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c  , OP_Integer, 0,
9430: 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c   0, z, n);.  }el
9440: 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  se{.    sqlite3V
9450: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61  dbeOp3(v, OP_Rea
9460: 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a  l, 0, 0, z, n);.
9470: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
9480: 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20  erate code into 
9490: 74 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65  the current Vdbe
94a0: 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65   to evaluate the
94b0: 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73   given.** expres
94c0: 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74  sion and leave t
94d0: 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65  he result on the
94e0: 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a   top of stack..*
94f0: 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64  *.** This code d
9500: 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61  epends on the fa
9510: 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20  ct that certain 
9520: 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78  token values (ex
9530: 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20  : TK_EQ).** are 
9540: 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f  the same as opco
9550: 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f  de values (ex: O
9560: 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65  P_Eq) that imple
9570: 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70  ment the corresp
9580: 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74  onding.** operat
9590: 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f  ion.  Special co
95a0: 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63  mments in vdbe.c
95b0: 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64   and the mkopcod
95c0: 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e  eh.awk script in
95d0: 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f  .** the make pro
95e0: 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65  cess cause these
95f0: 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e   values to align
9600: 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20  .  Assert()s in 
9610: 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f  the code.** belo
9620: 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68  w verify that th
9630: 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c  e numbers are al
9640: 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e  igned correctly.
9650: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
9660: 45 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a  ExprCode(Parse *
9670: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
9680: 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20  xpr){.  Vdbe *v 
9690: 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b  = pParse->pVdbe;
96a0: 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28  .  int op;.  if(
96b0: 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d   v==0 || pExpr==
96c0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70  0 ) return;.  op
96d0: 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20   = pExpr->op;.  
96e0: 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
96f0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
9700: 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 50  : {.      if( pP
9710: 61 72 73 65 2d 3e 75 73 65 41 67 67 20 29 7b 0a  arse->useAgg ){.
9720: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
9730: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41  dbeAddOp(v, OP_A
9740: 67 67 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d  ggGet, 0, pExpr-
9750: 3e 69 41 67 67 29 3b 0a 20 20 20 20 20 20 7d 65  >iAgg);.      }e
9760: 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d 3e 69  lse if( pExpr->i
9770: 43 6f 6c 75 6d 6e 3e 3d 30 20 29 7b 0a 20 20 20  Column>=0 ){.   
9780: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9790: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6c 75  AddOp(v, OP_Colu
97a0: 6d 6e 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  mn, pExpr->iTabl
97b0: 65 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  e, pExpr->iColum
97c0: 6e 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  n);.#ifndef NDEB
97d0: 55 47 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  UG.        if( p
97e0: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 20 26 26 20  Expr->span.z && 
97f0: 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e 3e 30 20  pExpr->span.n>0 
9800: 26 26 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 6e  && pExpr->span.n
9810: 3c 31 30 30 20 29 7b 0a 20 20 20 20 20 20 20 20  <100 ){.        
9820: 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
9830: 2c 20 22 23 20 25 54 22 2c 20 26 70 45 78 70 72  , "# %T", &pExpr
9840: 2d 3e 73 70 61 6e 29 29 3b 0a 20 20 20 20 20 20  ->span));.      
9850: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 20    }.#endif.     
9860: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
9870: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9880: 28 76 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45  (v, OP_Recno, pE
9890: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
98a0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
98b0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
98c0: 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
98d0: 20 7b 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74   {.      codeInt
98e0: 65 67 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74  eger(v, pExpr->t
98f0: 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74  oken.z, pExpr->t
9900: 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62  oken.n);.      b
9910: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
9920: 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20  case TK_FLOAT:. 
9930: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e     case TK_STRIN
9940: 47 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  G: {.      asser
9950: 74 28 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f  t( TK_FLOAT==OP_
9960: 52 65 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73  Real );.      as
9970: 73 65 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d  sert( TK_STRING=
9980: 3d 4f 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20  =OP_String8 );. 
9990: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
99a0: 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c  Op3(v, op, 0, 0,
99b0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
99c0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
99d0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
99e0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
99f0: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
9a00: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
9a10: 20 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20   TK_BLOB: {.    
9a20: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f    assert( TK_BLO
9a30: 42 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b  B==OP_HexBlob );
9a40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
9a50: 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20  beOp3(v, op, 0, 
9a60: 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  0, pExpr->token.
9a70: 7a 2b 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  z+1, pExpr->toke
9a80: 6e 2e 6e 2d 31 29 3b 0a 20 20 20 20 20 20 73 71  n.n-1);.      sq
9a90: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
9aa0: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
9ab0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
9ac0: 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
9ad0: 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
9ae0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
9af0: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20  tring8, 0, 0);. 
9b00: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
9b10: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56 41  }.    case TK_VA
9b20: 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20  RIABLE: {.      
9b30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
9b40: 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c  (v, OP_Variable,
9b50: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
9b60: 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  0);.      if( pE
9b70: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29  xpr->token.n>1 )
9b80: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
9b90: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
9ba0: 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65   -1, pExpr->toke
9bb0: 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65  n.z, pExpr->toke
9bc0: 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  n.n);.      }.  
9bd0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
9be0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
9bf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
9c00: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
9c10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
9c20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
9c30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
9c40: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
9c50: 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29 3b   TK_LT==OP_Lt );
9c60: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
9c70: 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20  K_LE==OP_Le );. 
9c80: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
9c90: 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 20  GT==OP_Gt );.   
9ca0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47 45     assert( TK_GE
9cb0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20 20  ==OP_Ge );.     
9cc0: 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d 3d   assert( TK_EQ==
9cd0: 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20 61  OP_Eq );.      a
9ce0: 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f 50  ssert( TK_NE==OP
9cf0: 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  _Ne );.      sql
9d00: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
9d10: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
9d20: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
9d30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
9d40: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
9d50: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
9d60: 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  are(pParse, pExp
9d70: 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d  r->pLeft, pExpr-
9d80: 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c 20  >pRight, op, 0, 
9d90: 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  0);.      break;
9da0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
9db0: 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73 65  TK_AND:.    case
9dc0: 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65   TK_OR:.    case
9dd0: 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61   TK_PLUS:.    ca
9de0: 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20  se TK_STAR:.    
9df0: 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20  case TK_MINUS:. 
9e00: 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a     case TK_REM:.
9e10: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 41      case TK_BITA
9e20: 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ND:.    case TK_
9e30: 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65 20  BITOR:.    case 
9e40: 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63 61  TK_SLASH:.    ca
9e50: 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20  se TK_LSHIFT:.  
9e60: 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54    case TK_RSHIFT
9e70: 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  : .    case TK_C
9e80: 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20 61  ONCAT: {.      a
9e90: 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f  ssert( TK_AND==O
9ea0: 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20 61  P_And );.      a
9eb0: 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
9ec0: 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Or );.      ass
9ed0: 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f 50  ert( TK_PLUS==OP
9ee0: 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61 73  _Add );.      as
9ef0: 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d 3d  sert( TK_MINUS==
9f00: 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a 20  OP_Subtract );. 
9f10: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
9f20: 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64 65  REM==OP_Remainde
9f30: 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  r );.      asser
9f40: 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f 50  t( TK_BITAND==OP
9f50: 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20 20  _BitAnd );.     
9f60: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4f   assert( TK_BITO
9f70: 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a 20  R==OP_BitOr );. 
9f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
9f90: 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64 65  SLASH==OP_Divide
9fa0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
9fb0: 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50 5f  ( TK_LSHIFT==OP_
9fc0: 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20 20  ShiftLeft );.   
9fd0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
9fe0: 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
9ff0: 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ght );.      ass
a000: 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d  ert( TK_CONCAT==
a010: 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20 20  OP_Concat );.   
a020: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a030: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
a040: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
a050: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
a060: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
a070: 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73 71  Right);.      sq
a080: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
a090: 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  , op, 0, 0);.   
a0a0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a0b0: 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e      case TK_UMIN
a0c0: 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72  US: {.      Expr
a0d0: 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d   *pLeft = pExpr-
a0e0: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61 73  >pLeft;.      as
a0f0: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
a100: 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d 3e       if( pLeft->
a110: 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c 20  op==TK_FLOAT || 
a120: 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pLeft->op==TK_IN
a130: 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20 20  TEGER ){.       
a140: 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c 65   Token *p = &pLe
a150: 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20 20  ft->token;.     
a160: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71 6c     char *z = sql
a170: 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e 20  iteMalloc( p->n 
a180: 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  + 2 );.        s
a190: 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a 73  printf(z, "-%.*s
a1a0: 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b 0a  ", p->n, p->z);.
a1b0: 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65 66          if( pLef
a1c0: 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20  t->op==TK_FLOAT 
a1d0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
a1e0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f  ite3VdbeOp3(v, O
a1f0: 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c  P_Real, 0, 0, z,
a200: 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20   p->n+1);.      
a210: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
a220: 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76     codeInteger(v
a230: 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20  , z, p->n+1);.  
a240: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
a250: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
a260: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
a270: 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20 46      }.      /* F
a280: 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74 6f  all through into
a290: 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20 7d   TK_NOT */.    }
a2a0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
a2b0: 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  NOT:.    case TK
a2c0: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61 73  _NOT: {.      as
a2d0: 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54 3d  sert( TK_BITNOT=
a2e0: 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20 20  =OP_BitNot );.  
a2f0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
a300: 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20 20  OT==OP_Not );.  
a310: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a320: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
a330: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
a340: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a350: 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a  p(v, op, 0, 0);.
a360: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
a370: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49   }.    case TK_I
a380: 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65 20  SNULL:.    case 
a390: 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20  TK_NOTNULL: {.  
a3a0: 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20 20      int dest;.  
a3b0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 49      assert( TK_I
a3c0: 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c  SNULL==OP_IsNull
a3d0: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
a3e0: 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f 50  ( TK_NOTNULL==OP
a3f0: 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20 20  _NotNull );.    
a400: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
a410: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
a420: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 1, 0);.      s
a430: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
a440: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
a450: 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73 74  eft);.      dest
a460: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
a470: 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20 32  rrentAddr(v) + 2
a480: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
a490: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
a4a0: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
a4b0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a4c0: 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d  (v, OP_AddImm, -
a4d0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  1, 0);.      bre
a4e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
a4f0: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
a500: 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ON: {.      sqli
a510: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a520: 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70 45  OP_AggGet, 0, pE
a530: 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20 20  xpr->iAgg);.    
a540: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
a550: 20 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a     case TK_GLOB:
a560: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b  .    case TK_LIK
a570: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46  E:.    case TK_F
a580: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
a590: 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74   ExprList *pList
a5a0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b   = pExpr->pList;
a5b0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72  .      int nExpr
a5c0: 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74   = pList ? pList
a5d0: 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20  ->nExpr : 0;.   
a5e0: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
a5f0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b  ;.      int nId;
a600: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61  .      const cha
a610: 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e  r *zId;.      in
a620: 74 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20  t p2 = 0;.      
a630: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20  int i;.      u8 
a640: 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62  enc = pParse->db
a650: 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c  ->enc;.      Col
a660: 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b  lSeq *pColl = 0;
a670: 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69  .      getFuncti
a680: 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a  onName(pExpr, &z
a690: 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20  Id, &nId);.     
a6a0: 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46   pDef = sqlite3F
a6b0: 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72  indFunction(pPar
a6c0: 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64  se->db, zId, nId
a6d0: 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29  , nExpr, enc, 0)
a6e0: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
a6f0: 70 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20  pDef!=0 );.     
a700: 20 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33   nExpr = sqlite3
a710: 45 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74  ExprCodeExprList
a720: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b  (pParse, pList);
a730: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  .      for(i=0; 
a740: 69 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b  i<nExpr && i<32;
a750: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
a760: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  f( sqlite3ExprIs
a770: 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e  Constant(pList->
a780: 61 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20  a[i].pExpr) ){. 
a790: 20 20 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28           p2 |= (
a7a0: 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  1<<i);.        }
a7b0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65  .        if( pDe
a7c0: 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26  f->needCollSeq &
a7d0: 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20  & !pColl ){.    
a7e0: 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71        pColl = sq
a7f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
a800: 28 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e  (pParse, pList->
a810: 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[i].pExpr);.   
a820: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
a830: 20 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e       if( pDef->n
a840: 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20  eedCollSeq ){.  
a850: 20 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c        if( !pColl
a860: 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73   ) pColl = pPars
a870: 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c  e->db->pDfltColl
a880: 3b 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ; .        sqlit
a890: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a8a0: 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28  CollSeq, 0, 0, (
a8b0: 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33  char *)pColl, P3
a8c0: 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20  _COLLSEQ);.     
a8d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a8e0: 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75  VdbeOp3(v, OP_Fu
a8f0: 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70  nction, nExpr, p
a900: 32 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20  2, (char*)pDef, 
a910: 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20  P3_FUNCDEF);.   
a920: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
a930: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
a940: 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
a950: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a960: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
a970: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a  r->iColumn, 0);.
a980: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
a990: 74 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75  t((v, "# load su
a9a0: 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29  bquery result"))
a9b0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a9c0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
a9d0: 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  _IN: {.      int
a9e0: 20 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61   addr;.      cha
a9f0: 72 20 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20  r affinity;..   
aa00: 20 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74     /* Figure out
aa10: 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f   the affinity to
aa20: 20 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61   use to create a
aa30: 20 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65   key from the re
aa40: 73 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f  sults.      ** o
aa50: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
aa60: 2e 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74  . affinityStr st
aa70: 6f 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74  ores a static st
aa80: 72 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f  ring suitable fo
aa90: 72 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66  r.      ** P3 of
aaa0: 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a   OP_MakeRecord..
aab0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61        */.      a
aac0: 66 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72  ffinity = compar
aad0: 69 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78  isonAffinity(pEx
aae0: 70 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69  pr);..      sqli
aaf0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ab00: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
ab10: 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64  );..      /* Cod
ab20: 65 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f  e the <expr> fro
ab30: 6d 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e  m "<expr> IN (..
ab40: 2e 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61  .)". The tempora
ab50: 72 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a  ry table.      *
ab60: 2a 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20  * pExpr->iTable 
ab70: 63 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c  contains the val
ab80: 75 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70  ues that make up
ab90: 20 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a   the (...) set..
aba0: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73        */.      s
abb0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
abc0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
abd0: 65 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  eft);.      addr
abe0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
abf0: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
ac00: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
ac10: 64 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75  ddOp(v, OP_NotNu
ac20: 6c 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b  ll, -1, addr+4);
ac30: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61              /* a
ac40: 64 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20  ddr + 0 */.     
ac50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ac60: 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20  p(v, OP_Pop, 2, 
ac70: 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  0);.      sqlite
ac80: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
ac90: 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b  _String8, 0, 0);
aca0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
acb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
acc0: 74 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a  to, 0, addr+7);.
acd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ace0: 65 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52  eOp3(v, OP_MakeR
acf0: 65 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66  ecord, 1, 0, &af
ad00: 66 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a  finity, 1);   /*
ad10: 20 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20   addr + 4 */.   
ad20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ad30: 64 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c  dOp(v, OP_Found,
ad40: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
ad50: 61 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73  addr+7);.      s
ad60: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
ad70: 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31  v, OP_AddImm, -1
ad80: 2c 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20  , 0);           
ad90: 20 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b         /* addr +
ada0: 20 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65   6 */..      bre
adb0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
adc0: 73 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b  se TK_BETWEEN: {
add0: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65  .      Expr *pLe
ade0: 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  ft = pExpr->pLef
adf0: 74 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  t;.      struct 
ae00: 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70  ExprList_item *p
ae10: 4c 49 74 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70  LItem = pExpr->p
ae20: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45  List->a;.      E
ae30: 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70 4c  xpr *pRight = pL
ae40: 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20  Item->pExpr;.   
ae50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ae60: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
ae70: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
ae80: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
ae90: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
aea0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
aeb0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
aec0: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
aed0: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
aee0: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47  ft, pRight, OP_G
aef0: 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  e, 0, 0);.      
af00: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
af10: 28 76 2c 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20  (v, OP_Pull, 1, 
af20: 30 29 3b 0a 20 20 20 20 20 20 70 4c 49 74 65 6d  0);.      pLItem
af30: 2b 2b 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  ++;.      pRight
af40: 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72   = pLItem->pExpr
af50: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
af60: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
af70: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
af80: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
af90: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
afa0: 2c 20 4f 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Le, 0, 0);.
afb0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
afc0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64  eAddOp(v, OP_And
afd0: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
afe0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
aff0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20  case TK_UPLUS:. 
b000: 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b     case TK_AS: {
b010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b020: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b030: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
b040: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b050: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53  .    case TK_CAS
b060: 45 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 65  E: {.      int e
b070: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20  xpr_end_label;. 
b080: 20 20 20 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73       int jumpIns
b090: 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  t;.      int add
b0a0: 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45 78  r;.      int nEx
b0b0: 70 72 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b  pr;.      int i;
b0c0: 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20  .      ExprList 
b0d0: 2a 70 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 73  *pEList;.      s
b0e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
b0f0: 74 65 6d 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a  tem *aListelem;.
b100: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
b110: 78 70 72 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20  xpr->pList);.   
b120: 20 20 20 61 73 73 65 72 74 28 28 70 45 78 70 72     assert((pExpr
b130: 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25  ->pList->nExpr %
b140: 20 32 29 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20   2) == 0);.     
b150: 20 61 73 73 65 72 74 28 70 45 78 70 72 2d 3e 70   assert(pExpr->p
b160: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29  List->nExpr > 0)
b170: 3b 0a 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d  ;.      pEList =
b180: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20   pExpr->pList;. 
b190: 20 20 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d       aListelem =
b1a0: 20 70 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20   pEList->a;.    
b1b0: 20 20 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74    nExpr = pEList
b1c0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65  ->nExpr;.      e
b1d0: 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20  xpr_end_label = 
b1e0: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
b1f0: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 69  abel(v);.      i
b200: 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20  f( pExpr->pLeft 
b210: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b220: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b230: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
b240: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
b250: 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72  for(i=0; i<nExpr
b260: 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20  ; i=i+2){.      
b270: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b280: 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
b290: 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20  lem[i].pExpr);. 
b2a0: 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
b2b0: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
b2c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2d0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
b2e0: 20 31 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   1, 1);.        
b2f0: 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64    jumpInst = cod
b300: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
b310: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61   pExpr->pLeft, a
b320: 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70  Listelem[i].pExp
b330: 72 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  r,.             
b340: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b350: 20 20 20 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29      OP_Ne, 0, 1)
b360: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
b370: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
b380: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
b390: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
b3a0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
b3b0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
b3c0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c  dOp(v, OP_IfNot,
b3d0: 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20   1, 0);.        
b3e0: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b3f0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b400: 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d  , aListelem[i+1]
b410: 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20  .pExpr);.       
b420: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b430: 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c  p(v, OP_Goto, 0,
b440: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
b450: 3b 0a 20 20 20 20 20 20 20 20 61 64 64 72 20 3d  ;.        addr =
b460: 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72   sqlite3VdbeCurr
b470: 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20 20  entAddr(v);.    
b480: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43      sqlite3VdbeC
b490: 68 61 6e 67 65 50 32 28 76 2c 20 6a 75 6d 70 49  hangeP2(v, jumpI
b4a0: 6e 73 74 2c 20 61 64 64 72 29 3b 0a 20 20 20 20  nst, addr);.    
b4b0: 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 45    }.      if( pE
b4c0: 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20  xpr->pLeft ){.  
b4d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b4e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
b4f0: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  , 1, 0);.      }
b500: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
b510: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
b520: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b530: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b540: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
b550: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
b560: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b570: 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c  p(v, OP_String8,
b580: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a   0, 0);.      }.
b590: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b5a0: 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c  eResolveLabel(v,
b5b0: 20 65 78 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29   expr_end_label)
b5c0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b5d0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b5e0: 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20 20  _RAISE: {.      
b5f0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74 72 69  if( !pParse->tri
b600: 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20 20 20  gStack ){.      
b610: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
b620: 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
b630: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b640: 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
b650: 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
b660: 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
b670: 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e 3b 0a  ram");..return;.
b680: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
b690: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
b6a0: 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  !=OE_Ignore ){. 
b6b0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
b6c0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d  pExpr->iColumn==
b6d0: 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c 0a 20  OE_Rollback ||. 
b6e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
b6f0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
b700: 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a 20 20  = OE_Abort ||.  
b710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
b720: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d  Expr->iColumn ==
b730: 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20 20 20   OE_Fail );.    
b740: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b750: 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74 2c 20  Op3(v, OP_Halt, 
b760: 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41 49 4e  SQLITE_CONSTRAIN
b770: 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  T, pExpr->iColum
b780: 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n,.             
b790: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
b7a0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
b7b0: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
b7c0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b7d0: 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29  DequoteP3(v, -1)
b7e0: 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65 20 7b  ;.      } else {
b7f0: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
b800: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
b810: 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20 29 3b   == OE_Ignore );
b820: 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  .         sqlite
b830: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
b840: 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20  _ContextPop, 0, 
b850: 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c  0);.         sql
b860: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b870: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70 50 61   OP_Goto, 0, pPa
b880: 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 2d 3e  rse->trigStack->
b890: 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20 20 20  ignoreJump);.   
b8a0: 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e        VdbeCommen
b8b0: 74 28 28 76 2c 20 22 23 20 72 61 69 73 65 28 49  t((v, "# raise(I
b8c0: 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20 20 20  GNORE)"));.     
b8d0: 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 62 72 65   }.    }.    bre
b8e0: 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a  ak;.  }.}../*.**
b8f0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
b900: 68 61 74 20 70 75 73 68 65 73 20 74 68 65 20 76  hat pushes the v
b910: 61 6c 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c  alue of every el
b920: 65 6d 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76  ement of the giv
b930: 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e  en.** expression
b940: 20 6c 69 73 74 20 6f 6e 74 6f 20 74 68 65 20 73   list onto the s
b950: 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  tack..**.** Retu
b960: 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
b970: 20 65 6c 65 6d 65 6e 74 73 20 70 75 73 68 65 64   elements pushed
b980: 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b 2e   onto the stack.
b990: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
b9a0: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
b9b0: 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65  .  Parse *pParse
b9c0: 2c 20 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67  ,     /* Parsing
b9d0: 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78   context */.  Ex
b9e0: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 20 20  prList *pList   
b9f0: 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73 69   /* The expressi
ba00: 6f 6e 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f  on list to be co
ba10: 64 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75  ded */.){.  stru
ba20: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
ba30: 20 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69   *pItem;.  int i
ba40: 2c 20 6e 3b 0a 20 20 56 64 62 65 20 2a 76 3b 0a  , n;.  Vdbe *v;.
ba50: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
ba60: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 76 20 3d   return 0;.  v =
ba70: 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28   sqlite3GetVdbe(
ba80: 70 50 61 72 73 65 29 3b 0a 20 20 6e 20 3d 20 70  pParse);.  n = p
ba90: 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 66  List->nExpr;.  f
baa0: 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74 2d 3e  or(pItem=pList->
bab0: 61 2c 20 69 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b  a, i=0; i<n; i++
bac0: 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  , pItem++){.    
bad0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
bae0: 70 50 61 72 73 65 2c 20 70 49 74 65 6d 2d 3e 70  pParse, pItem->p
baf0: 45 78 70 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74  Expr);.  }.  ret
bb00: 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  urn n;.}../*.** 
bb10: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f  Generate code fo
bb20: 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70 72  r a boolean expr
bb30: 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61 74  ession such that
bb40: 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65 0a   a jump is made.
bb50: 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c 20  ** to the label 
bb60: 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65 78  "dest" if the ex
bb70: 70 72 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65  pression is true
bb80: 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e 0a 2a   but execution.*
bb90: 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74 72 61  * continues stra
bba0: 69 67 68 74 20 74 68 72 75 20 69 66 20 74 68 65  ight thru if the
bbb0: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66   expression is f
bbc0: 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74  alse..**.** If t
bbd0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65 76  he expression ev
bbe0: 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c 20  aluates to NULL 
bbf0: 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e 6f  (neither true no
bc00: 72 20 66 61 6c 73 65 29 2c 20 74 68 65 6e 0a 2a  r false), then.*
bc10: 2a 20 74 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * take the jump 
bc20: 69 66 20 74 68 65 20 6a 75 6d 70 49 66 4e 75 6c  if the jumpIfNul
bc30: 6c 20 66 6c 61 67 20 69 73 20 74 72 75 65 2e 0a  l flag is true..
bc40: 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20  **.** This code 
bc50: 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66  depends on the f
bc60: 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69 6e  act that certain
bc70: 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65   token values (e
bc80: 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65  x: TK_EQ).** are
bc90: 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63   the same as opc
bca0: 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ode values (ex: 
bcb0: 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c  OP_Eq) that impl
bcc0: 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73  ement the corres
bcd0: 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61  ponding.** opera
bce0: 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63  tion.  Special c
bcf0: 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e  omments in vdbe.
bd00: 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f  c and the mkopco
bd10: 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69  deh.awk script i
bd20: 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72  n.** the make pr
bd30: 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65 73  ocess cause thes
bd40: 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67  e values to alig
bd50: 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69 6e  n.  Assert()s in
bd60: 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c   the code.** bel
bd70: 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20 74  ow verify that t
bd80: 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61  he numbers are a
bd90: 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79  ligned correctly
bda0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
bdb0: 33 45 78 70 72 49 66 54 72 75 65 28 50 61 72 73  3ExprIfTrue(Pars
bdc0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20  e *pParse, Expr 
bdd0: 2a 70 45 78 70 72 2c 20 69 6e 74 20 64 65 73 74  *pExpr, int dest
bde0: 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c  , int jumpIfNull
bdf0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
be00: 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
be10: 69 6e 74 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66  int op = 0;.  if
be20: 28 20 76 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d  ( v==0 || pExpr=
be30: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 6f  =0 ) return;.  o
be40: 70 20 3d 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20  p = pExpr->op;. 
be50: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
be60: 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a 20     case TK_AND: 
be70: 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d  {.      int d2 =
be80: 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65   sqlite3VdbeMake
be90: 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20  Label(v);.      
bea0: 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c  sqlite3ExprIfFal
beb0: 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  se(pParse, pExpr
bec0: 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75  ->pLeft, d2, !ju
bed0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
bee0: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72   sqlite3ExprIfTr
bef0: 75 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ue(pParse, pExpr
bf00: 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20  ->pRight, dest, 
bf10: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20  jumpIfNull);.   
bf20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
bf30: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32  solveLabel(v, d2
bf40: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
bf50: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
bf60: 4b 5f 4f 52 3a 20 7b 0a 20 20 20 20 20 20 73 71  K_OR: {.      sq
bf70: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
bf80: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
bf90: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
bfa0: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
bfb0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
bfc0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
bfd0: 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75  pRight, dest, ju
bfe0: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  mpIfNull);.     
bff0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c000: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b    case TK_NOT: {
c010: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c020: 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73 65  prIfFalse(pParse
c030: 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
c040: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
c050: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
c060: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
c070: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
c080: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
c090: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
c0a0: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
c0b0: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
c0c0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
c0d0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
c0e0: 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
c0f0: 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
c100: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
c110: 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
c120: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
c130: 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
c140: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
c150: 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
c160: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
c170: 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
c180: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
c190: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
c1a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
c1b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c1c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
c1d0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
c1e0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
c1f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
c200: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
c210: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
c220: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
c230: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
c240: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
c250: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
c260: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
c270: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
c280: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
c290: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
c2a0: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
c2b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c2c0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c2d0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
c2e0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
c2f0: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
c300: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
c310: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c320: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
c330: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
c340: 72 65 73 73 69 6f 6e 20 22 78 20 42 45 54 57 45  ression "x BETWE
c350: 45 4e 20 79 20 41 4e 44 20 7a 22 20 69 73 20 69  EN y AND z" is i
c360: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
c370: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
c380: 20 31 20 49 46 20 28 78 20 3c 20 79 29 20 47 4f   1 IF (x < y) GO
c390: 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32 20  TO 3.      ** 2 
c3a0: 49 46 20 28 78 20 3c 3d 20 7a 29 20 47 4f 54 4f  IF (x <= z) GOTO
c3b0: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
c3c0: 20 33 20 2e 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a   3 ....      */.
c3d0: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c3e0: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
c3f0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
c400: 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52  ;.      Expr *pR
c410: 69 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  ight = pExpr->pL
c420: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b  ist->a[0].pExpr;
c430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
c440: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
c450: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
c460: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c470: 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a   OP_Dup, 0, 0);.
c480: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
c490: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52  rCode(pParse, pR
c4a0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64  ight);.      add
c4b0: 72 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28  r = codeCompare(
c4c0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
c4d0: 52 69 67 68 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c  Right, OP_Lt, 0,
c4e0: 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a   !jumpIfNull);..
c4f0: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
c500: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31  Expr->pList->a[1
c510: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
c520: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c530: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
c540: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
c550: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
c560: 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20   pRight, OP_Le, 
c570: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
c580: 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74 65  );..      sqlite
c590: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c5a0: 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30 29 3b  _Integer, 0, 0);
c5b0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c5c0: 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20 61 64  beChangeP2(v, ad
c5d0: 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62 65 43  dr, sqlite3VdbeC
c5e0: 75 72 72 65 6e 74 41 64 64 72 28 76 29 29 3b 0a  urrentAddr(v));.
c5f0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c600: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70  eAddOp(v, OP_Pop
c610: 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 1, 0);.      b
c620: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
c630: 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20  default: {.     
c640: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c650: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
c660: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c670: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66  beAddOp(v, OP_If
c680: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64 65  , jumpIfNull, de
c690: 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  st);.      break
c6a0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f  ;.    }.  }.}../
c6b0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
c6c0: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
c6d0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
c6e0: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
c6f0: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
c700: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
c710: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
c720: 20 66 61 6c 73 65 20 62 75 74 20 65 78 65 63 75   false but execu
c730: 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65  tion.** continue
c740: 73 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20  s straight thru 
c750: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
c760: 6e 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a  n is true..**.**
c770: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
c780: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
c790: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
c7a0: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 20 74 68  ue nor false) th
c7b0: 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69 66 20 6a 75  en.** jump if ju
c7c0: 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75 65  mpIfNull is true
c7d0: 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67 68   or fall through
c7e0: 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69   if jumpIfNull i
c7f0: 73 20 66 61 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64  s false..*/.void
c800: 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
c810: 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
c820: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
c830: 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
c840: 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
c850: 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
c860: 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
c870: 20 30 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c   0;.  if( v==0 |
c880: 7c 20 70 45 78 70 72 3d 3d 30 20 29 20 72 65 74  | pExpr==0 ) ret
c890: 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54 68 65 20 76  urn;..  /* The v
c8a0: 61 6c 75 65 20 6f 66 20 70 45 78 70 72 2d 3e 6f  alue of pExpr->o
c8b0: 70 20 61 6e 64 20 6f 70 20 61 72 65 20 72 65 6c  p and op are rel
c8c0: 61 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73 3a  ated as follows:
c8d0: 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20 20 20 20  .  **.  **      
c8e0: 20 70 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20   pExpr->op      
c8f0: 20 20 20 20 20 20 6f 70 0a 20 20 2a 2a 20 20 20        op.  **   
c900: 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20      ---------   
c910: 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d         ---------
c920: 2d 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f  -.  **       TK_
c930: 49 53 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 20  ISNULL          
c940: 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20  OP_NotNull.  ** 
c950: 20 20 20 20 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c        TK_NOTNULL
c960: 20 20 20 20 20 20 20 20 20 4f 50 5f 49 73 4e 75           OP_IsNu
c970: 6c 6c 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  ll.  **       TK
c980: 5f 4e 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _NE             
c990: 20 4f 50 5f 45 71 0a 20 20 2a 2a 20 20 20 20 20   OP_Eq.  **     
c9a0: 20 20 54 4b 5f 45 51 20 20 20 20 20 20 20 20 20    TK_EQ         
c9b0: 20 20 20 20 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20       OP_Ne.  ** 
c9c0: 20 20 20 20 20 20 54 4b 5f 47 54 20 20 20 20 20        TK_GT     
c9d0: 20 20 20 20 20 20 20 20 20 4f 50 5f 4c 65 0a 20           OP_Le. 
c9e0: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4c 45 20   **       TK_LE 
c9f0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
ca00: 47 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Gt.  **       TK
ca10: 5f 47 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _GE             
ca20: 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Lt.  **     
ca30: 20 20 54 4b 5f 4c 54 20 20 20 20 20 20 20 20 20    TK_LT         
ca40: 20 20 20 20 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a       OP_Ge.  **.
ca50: 20 20 2a 2a 20 46 6f 72 20 6f 74 68 65 72 20 76    ** For other v
ca60: 61 6c 75 65 73 20 6f 66 20 70 45 78 70 72 2d 3e  alues of pExpr->
ca70: 6f 70 2c 20 6f 70 20 69 73 20 75 6e 64 65 66 69  op, op is undefi
ca80: 6e 65 64 20 61 6e 64 20 75 6e 75 73 65 64 2e 0a  ned and unused..
ca90: 20 20 2a 2a 20 54 68 65 20 76 61 6c 75 65 20 6f    ** The value o
caa0: 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63 6f  f TK_ and OP_ co
cab0: 6e 73 74 61 6e 74 73 20 61 72 65 20 61 72 72 61  nstants are arra
cac0: 6e 67 65 64 20 73 75 63 68 20 74 68 61 74 20 77  nged such that w
cad0: 65 0a 20 20 2a 2a 20 63 61 6e 20 63 6f 6d 70 75  e.  ** can compu
cae0: 74 65 20 74 68 65 20 6d 61 70 70 69 6e 67 20 61  te the mapping a
caf0: 62 6f 76 65 20 75 73 69 6e 67 20 74 68 65 20 66  bove using the f
cb00: 6f 6c 6c 6f 77 69 6e 67 20 65 78 70 72 65 73 73  ollowing express
cb10: 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73 73 65 72 74  ion..  ** Assert
cb20: 28 29 73 20 76 65 72 69 66 79 20 74 68 61 74 20  ()s verify that 
cb30: 74 68 65 20 63 6f 6d 70 75 74 61 74 69 6f 6e 20  the computation 
cb40: 69 73 20 63 6f 72 72 65 63 74 2e 0a 20 20 2a 2f  is correct..  */
cb50: 0a 20 20 6f 70 20 3d 20 28 28 70 45 78 70 72 2d  .  op = ((pExpr-
cb60: 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55 4c 4c 26 31  >op+(TK_ISNULL&1
cb70: 29 29 5e 31 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c  ))^1)-(TK_ISNULL
cb80: 26 31 29 3b 0a 0a 20 20 2f 2a 20 56 65 72 69 66  &1);..  /* Verif
cb90: 79 20 63 6f 72 72 65 63 74 20 61 6c 69 67 6e 6d  y correct alignm
cba0: 65 6e 74 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  ent of TK_ and O
cbb0: 50 5f 20 63 6f 6e 73 74 61 6e 74 73 0a 20 20 2a  P_ constants.  *
cbc0: 2f 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  /.  assert( pExp
cbd0: 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c  r->op!=TK_ISNULL
cbe0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75   || op==OP_NotNu
cbf0: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
cc00: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f  pExpr->op!=TK_NO
cc10: 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TNULL || op==OP_
cc20: 49 73 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  IsNull );.  asse
cc30: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
cc40: 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45  K_NE || op==OP_E
cc50: 71 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  q );.  assert( p
cc60: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20  Expr->op!=TK_EQ 
cc70: 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a  || op==OP_Ne );.
cc80: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
cc90: 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70  >op!=TK_LT || op
cca0: 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 61 73 73  ==OP_Ge );.  ass
ccb0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
ccc0: 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_LE || op==OP_
ccd0: 47 74 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Gt );.  assert( 
cce0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54  pExpr->op!=TK_GT
ccf0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b   || op==OP_Le );
cd00: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
cd10: 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f  ->op!=TK_GE || o
cd20: 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 0a 20 20 73  p==OP_Lt );..  s
cd30: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
cd40: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
cd50: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  AND: {.      sql
cd60: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
cd70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
cd80: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
cd90: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
cda0: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
cdb0: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
cdc0: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
cdd0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
cde0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
cdf0: 20 20 20 63 61 73 65 20 54 4b 5f 4f 52 3a 20 7b     case TK_OR: {
ce00: 0a 20 20 20 20 20 20 69 6e 74 20 64 32 20 3d 20  .      int d2 = 
ce10: 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c  sqlite3VdbeMakeL
ce20: 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20 20 73  abel(v);.      s
ce30: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
ce40: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ce50: 70 4c 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70  pLeft, d2, !jump
ce60: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
ce70: 71 6c 69 74 65 33 45 78 70 72 49 66 46 61 6c 73  qlite3ExprIfFals
ce80: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
ce90: 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
cea0: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ceb0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
cec0: 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 32 29  olveLabel(v, d2)
ced0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
cee0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
cef0: 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71  _NOT: {.      sq
cf00: 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28  lite3ExprIfTrue(
cf10: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
cf20: 4c 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  Left, dest, jump
cf30: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62  IfNull);.      b
cf40: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
cf50: 63 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20  case TK_LT:.    
cf60: 63 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20  case TK_LE:.    
cf70: 63 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20  case TK_GT:.    
cf80: 63 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20  case TK_GE:.    
cf90: 63 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20  case TK_NE:.    
cfa0: 63 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20  case TK_EQ: {.  
cfb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
cfc0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
cfd0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
cfe0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
cff0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
d000: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
d010: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
d020: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
d030: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
d040: 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  op, dest, jumpIf
d050: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
d060: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d070: 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20  se TK_ISNULL:.  
d080: 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c    case TK_NOTNUL
d090: 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  L: {.      sqlit
d0a0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
d0b0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29  e, pExpr->pLeft)
d0c0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d0d0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
d0e0: 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  1, dest);.      
d0f0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
d100: 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
d110: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 65  : {.      /* The
d120: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 22   expression is "
d130: 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20  x BETWEEN y AND 
d140: 7a 22 2e 20 49 74 20 69 73 20 69 6d 70 6c 65 6d  z". It is implem
d150: 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20 20  ented as:.      
d160: 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49 46  **.      ** 1 IF
d170: 20 28 78 20 3e 3d 20 79 29 20 47 4f 54 4f 20 33   (x >= y) GOTO 3
d180: 0a 20 20 20 20 20 20 2a 2a 20 32 20 47 4f 54 4f  .      ** 2 GOTO
d190: 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2a   <dest>.      **
d1a0: 20 33 20 49 46 20 28 78 20 3e 20 7a 29 20 47 4f   3 IF (x > z) GO
d1b0: 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20 20 20 20  TO <dest>.      
d1c0: 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64  */.      int add
d1d0: 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  r;.      Expr *p
d1e0: 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
d1f0: 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20  eft;.      Expr 
d200: 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d  *pRight = pExpr-
d210: 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  >pList->a[0].pEx
d220: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
d230: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d240: 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  , pLeft);.      
d250: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d260: 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30  (v, OP_Dup, 0, 0
d270: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
d280: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
d290: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20   pRight);.      
d2a0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
d2b0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
d2c0: 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70  ;.      codeComp
d2d0: 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66  are(pParse, pLef
d2e0: 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65  t, pRight, OP_Ge
d2f0: 2c 20 61 64 64 72 2b 33 2c 20 21 6a 75 6d 70 49  , addr+3, !jumpI
d300: 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
d310: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d320: 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29  v, OP_Pop, 1, 0)
d330: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
d340: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47  dbeAddOp(v, OP_G
d350: 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20  oto, 0, dest);. 
d360: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
d370: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d  xpr->pList->a[1]
d380: 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  .pExpr;.      sq
d390: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d3a0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
d3b0: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
d3c0: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
d3d0: 70 52 69 67 68 74 2c 20 4f 50 5f 47 74 2c 20 64  pRight, OP_Gt, d
d3e0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
d3f0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
d400: 20 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74     }.    default
d410: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d420: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
d430: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
d440: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
d450: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75  (v, OP_IfNot, ju
d460: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
d470: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
d480: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
d490: 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d 70 61   Do a deep compa
d4a0: 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65 78 70  rison of two exp
d4b0: 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e 20 20  ression trees.  
d4c0: 52 65 74 75 72 6e 20 54 52 55 45 20 28 6e 6f 6e  Return TRUE (non
d4d0: 2d 7a 65 72 6f 29 0a 2a 2a 20 69 66 20 74 68 65  -zero).** if the
d4e0: 79 20 61 72 65 20 69 64 65 6e 74 69 63 61 6c 20  y are identical 
d4f0: 61 6e 64 20 72 65 74 75 72 6e 20 46 41 4c 53 45  and return FALSE
d500: 20 69 66 20 74 68 65 79 20 64 69 66 66 65 72 20   if they differ 
d510: 69 6e 20 61 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69  in any way..*/.i
d520: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
d530: 6d 70 61 72 65 28 45 78 70 72 20 2a 70 41 2c 20  mpare(Expr *pA, 
d540: 45 78 70 72 20 2a 70 42 29 7b 0a 20 20 69 6e 74  Expr *pB){.  int
d550: 20 69 3b 0a 20 20 69 66 28 20 70 41 3d 3d 30 20   i;.  if( pA==0 
d560: 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 42  ){.    return pB
d570: 3d 3d 30 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  ==0;.  }else if(
d580: 20 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65   pB==0 ){.    re
d590: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 69 66  turn 0;.  }.  if
d5a0: 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
d5b0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69   ) return 0;.  i
d5c0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
d5d0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74  ompare(pA->pLeft
d5e0: 2c 20 70 42 2d 3e 70 4c 65 66 74 29 20 29 20 72  , pB->pLeft) ) r
d5f0: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
d600: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
d610: 72 65 28 70 41 2d 3e 70 52 69 67 68 74 2c 20 70  re(pA->pRight, p
d620: 42 2d 3e 70 52 69 67 68 74 29 20 29 20 72 65 74  B->pRight) ) ret
d630: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d  urn 0;.  if( pA-
d640: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 69 66  >pList ){.    if
d650: 28 20 70 42 2d 3e 70 4c 69 73 74 3d 3d 30 20 29  ( pB->pList==0 )
d660: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69   return 0;.    i
d670: 66 28 20 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45  f( pA->pList->nE
d680: 78 70 72 21 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e  xpr!=pB->pList->
d690: 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20 30  nExpr ) return 0
d6a0: 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
d6b0: 3c 70 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  <pA->pList->nExp
d6c0: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69  r; i++){.      i
d6d0: 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72 43  f( !sqlite3ExprC
d6e0: 6f 6d 70 61 72 65 28 70 41 2d 3e 70 4c 69 73 74  ompare(pA->pList
d6f0: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 70 42  ->a[i].pExpr, pB
d700: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
d710: 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
d720: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20  return 0;.      
d730: 7d 0a 20 20 20 20 7d 0a 20 20 7d 65 6c 73 65 20  }.    }.  }else 
d740: 69 66 28 20 70 42 2d 3e 70 4c 69 73 74 20 29 7b  if( pB->pList ){
d750: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20  .    return 0;. 
d760: 20 7d 0a 20 20 69 66 28 20 70 41 2d 3e 70 53 65   }.  if( pA->pSe
d770: 6c 65 63 74 20 7c 7c 20 70 42 2d 3e 70 53 65 6c  lect || pB->pSel
d780: 65 63 74 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ect ) return 0;.
d790: 20 20 69 66 28 20 70 41 2d 3e 69 54 61 62 6c 65    if( pA->iTable
d7a0: 21 3d 70 42 2d 3e 69 54 61 62 6c 65 20 7c 7c 20  !=pB->iTable || 
d7b0: 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d  pA->iColumn!=pB-
d7c0: 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74 75 72  >iColumn ) retur
d7d0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 74  n 0;.  if( pA->t
d7e0: 6f 6b 65 6e 2e 7a 20 29 7b 0a 20 20 20 20 69 66  oken.z ){.    if
d7f0: 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30  ( pB->token.z==0
d800: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20   ) return 0;.   
d810: 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e   if( pB->token.n
d820: 21 3d 70 41 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20  !=pA->token.n ) 
d830: 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66  return 0;.    if
d840: 28 20 73 71 6c 69 74 65 33 53 74 72 4e 49 43 6d  ( sqlite3StrNICm
d850: 70 28 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  p(pA->token.z, p
d860: 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e  B->token.z, pB->
d870: 74 6f 6b 65 6e 2e 6e 29 21 3d 30 20 29 20 72 65  token.n)!=0 ) re
d880: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20 20 72 65  turn 0;.  }.  re
d890: 74 75 72 6e 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 1;.}../*.**
d8a0: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
d8b0: 6e 74 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  nt to the pParse
d8c0: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
d8d0: 6e 64 20 72 65 74 75 72 6e 20 69 74 73 20 69 6e  nd return its in
d8e0: 64 65 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69  dex..*/.static i
d8f0: 6e 74 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f  nt appendAggInfo
d900: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b  (Parse *pParse){
d910: 0a 20 20 69 66 28 20 28 70 50 61 72 73 65 2d 3e  .  if( (pParse->
d920: 6e 41 67 67 20 26 20 30 78 37 29 3d 3d 30 20 29  nAgg & 0x7)==0 )
d930: 7b 0a 20 20 20 20 69 6e 74 20 61 6d 74 20 3d 20  {.    int amt = 
d940: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 2b 20 38  pParse->nAgg + 8
d950: 3b 0a 20 20 20 20 41 67 67 45 78 70 72 20 2a 61  ;.    AggExpr *a
d960: 41 67 67 20 3d 20 73 71 6c 69 74 65 52 65 61 6c  Agg = sqliteReal
d970: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 41 67 67  loc(pParse->aAgg
d980: 2c 20 61 6d 74 2a 73 69 7a 65 6f 66 28 70 50 61  , amt*sizeof(pPa
d990: 72 73 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a  rse->aAgg[0]));.
d9a0: 20 20 20 20 69 66 28 20 61 41 67 67 3d 3d 30 20      if( aAgg==0 
d9b0: 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  ){.      return 
d9c0: 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 50  -1;.    }.    pP
d9d0: 61 72 73 65 2d 3e 61 41 67 67 20 3d 20 61 41 67  arse->aAgg = aAg
d9e0: 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d 73 65 74 28  g;.  }.  memset(
d9f0: 26 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 70 50  &pParse->aAgg[pP
da00: 61 72 73 65 2d 3e 6e 41 67 67 5d 2c 20 30 2c 20  arse->nAgg], 0, 
da10: 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e 61  sizeof(pParse->a
da20: 41 67 67 5b 30 5d 29 29 3b 0a 20 20 72 65 74 75  Agg[0]));.  retu
da30: 72 6e 20 70 50 61 72 73 65 2d 3e 6e 41 67 67 2b  rn pParse->nAgg+
da40: 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c  +;.}../*.** Anal
da50: 79 7a 65 20 74 68 65 20 67 69 76 65 6e 20 65 78  yze the given ex
da60: 70 72 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67  pression looking
da70: 20 66 6f 72 20 61 67 67 72 65 67 61 74 65 20 66   for aggregate f
da80: 75 6e 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20  unctions and.** 
da90: 66 6f 72 20 76 61 72 69 61 62 6c 65 73 20 74 68  for variables th
daa0: 61 74 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64  at need to be ad
dab0: 64 65 64 20 74 6f 20 74 68 65 20 70 50 61 72 73  ded to the pPars
dac0: 65 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e  e->aAgg[] array.
dad0: 0a 2a 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f  .** Make additio
dae0: 6e 61 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74  nal entries to t
daf0: 68 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b  he pParse->aAgg[
db00: 5d 20 61 72 72 61 79 20 61 73 20 6e 65 63 65 73  ] array as neces
db10: 73 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73  sary..**.** This
db20: 20 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20   routine should 
db30: 6f 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61  only be called a
db40: 66 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73  fter the express
db50: 69 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20  ion has been.** 
db60: 61 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69  analyzed by sqli
db70: 74 65 33 45 78 70 72 52 65 73 6f 6c 76 65 49 64  te3ExprResolveId
db80: 73 28 29 20 61 6e 64 20 73 71 6c 69 74 65 33 45  s() and sqlite3E
db90: 78 70 72 43 68 65 63 6b 28 29 2e 0a 2a 2a 0a 2a  xprCheck()..**.*
dba0: 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72 65 20  * If errors are 
dbb0: 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e 20 65  seen, leave an e
dbc0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 20  rror message in 
dbd0: 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65 74 75  zErrMsg and retu
dbe0: 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62 65 72  rn.** the number
dbf0: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f 0a 69   of errors..*/.i
dc00: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e  nt sqlite3ExprAn
dc10: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
dc20: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
dc30: 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
dc40: 6e 74 20 69 3b 0a 20 20 41 67 67 45 78 70 72 20  nt i;.  AggExpr 
dc50: 2a 61 41 67 67 3b 0a 20 20 69 6e 74 20 6e 45 72  *aAgg;.  int nEr
dc60: 72 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20 70 45  r = 0;..  if( pE
dc70: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
dc80: 30 3b 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  0;.  switch( pEx
dc90: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
dca0: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
dcb0: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
dcc0: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
dcd0: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
dce0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
dcf0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
dd00: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
dd10: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
dd20: 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  ( aAgg[i].pExpr-
dd30: 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
dd40: 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
dd50: 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  && aAgg[i].pExpr
dd60: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
dd70: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
dd80: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
dd90: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
dda0: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
ddb0: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
ddc0: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
ddd0: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
dde0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
ddf0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
de00: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
de10: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20  [i].isAgg = 0;. 
de20: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
de30: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
de40: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
de50: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
de60: 3d 20 69 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  = i;.      break
de70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
de80: 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e   TK_AGG_FUNCTION
de90: 3a 20 7b 0a 20 20 20 20 20 20 61 41 67 67 20 3d  : {.      aAgg =
dea0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20   pParse->aAgg;. 
deb0: 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c       for(i=0; i<
dec0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b 20 69 2b  pParse->nAgg; i+
ded0: 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20  +){.        if( 
dee0: 21 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29  !aAgg[i].isAgg )
def0: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
df00: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
df10: 70 72 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69  prCompare(aAgg[i
df20: 5d 2e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ].pExpr, pExpr) 
df30: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 62 72 65  ){.          bre
df40: 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  ak;.        }.  
df50: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
df60: 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  i>=pParse->nAgg 
df70: 29 7b 0a 20 20 20 20 20 20 20 20 75 38 20 65 6e  ){.        u8 en
df80: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
df90: 65 6e 63 3b 0a 20 20 20 20 20 20 20 20 69 20 3d  enc;.        i =
dfa0: 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70   appendAggInfo(p
dfb0: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
dfc0: 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e  if( i<0 ) return
dfd0: 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72   1;.        pPar
dfe0: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
dff0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 70  g = 1;.        p
e000: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 70  Parse->aAgg[i].p
e010: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
e020: 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41        pParse->aA
e030: 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d 20 73 71  gg[i].pFunc = sq
e040: 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69 6f  lite3FindFunctio
e050: 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 0a 20 20  n(pParse->db,.  
e060: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
e070: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
e080: 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20  ->token.n,.     
e090: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
e0a0: 4c 69 73 74 20 3f 20 70 45 78 70 72 2d 3e 70 4c  List ? pExpr->pL
e0b0: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 2c 20  ist->nExpr : 0, 
e0c0: 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d  enc, 0);.      }
e0d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 41  .      pExpr->iA
e0e0: 67 67 20 3d 20 69 3b 0a 20 20 20 20 20 20 62 72  gg = i;.      br
e0f0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64  eak;.    }.    d
e100: 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20  efault: {.      
e110: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
e120: 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72 72   ){.        nErr
e130: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e   = sqlite3ExprAn
e140: 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28  alyzeAggregates(
e150: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e160: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Left);.      }. 
e170: 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d 3d 30       if( nErr==0
e180: 20 26 26 20 70 45 78 70 72 2d 3e 70 52 69 67 68   && pExpr->pRigh
e190: 74 20 29 7b 0a 20 20 20 20 20 20 20 20 6e 45 72  t ){.        nEr
e1a0: 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  r = sqlite3ExprA
e1b0: 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
e1c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
e1d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
e1e0: 0a 20 20 20 20 20 20 69 66 28 20 6e 45 72 72 3d  .      if( nErr=
e1f0: 3d 30 20 26 26 20 70 45 78 70 72 2d 3e 70 4c 69  =0 && pExpr->pLi
e200: 73 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69 6e  st ){.        in
e210: 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  t n = pExpr->pLi
e220: 73 74 2d 3e 6e 45 78 70 72 3b 0a 20 20 20 20 20  st->nExpr;.     
e230: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
e240: 20 20 66 6f 72 28 69 3d 30 3b 20 6e 45 72 72 3d    for(i=0; nErr=
e250: 3d 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b  =0 && i<n; i++){
e260: 0a 20 20 20 20 20 20 20 20 20 20 6e 45 72 72 20  .          nErr 
e270: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61  = sqlite3ExprAna
e280: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 70  lyzeAggregates(p
e290: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
e2a0: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
e2b0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
e2c0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
e2d0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
e2e0: 75 72 6e 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  urn nErr;.}../*.
e2f0: 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72  ** Locate a user
e300: 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20   function given 
e310: 61 20 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72  a name, a number
e320: 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e   of arguments an
e330: 64 20 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69  d a flag.** indi
e340: 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 74  cating whether t
e350: 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66  he function pref
e360: 65 72 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20  ers UTF-16 over 
e370: 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61  UTF-8.  Return a
e380: 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
e390: 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  he FuncDef struc
e3a0: 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
e3b0: 73 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c  s that function,
e3c0: 20 6f 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55   or return.** NU
e3d0: 4c 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  LL if the functi
e3e0: 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
e3f0: 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
e400: 63 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d  createFlag argum
e410: 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
e420: 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20  n a new (blank) 
e430: 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
e440: 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
e450: 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74  and liked into t
e460: 68 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72  he "db" structur
e470: 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74  e if a.** no mat
e480: 63 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70  ching function p
e490: 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
e4a0: 64 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46  d.  When createF
e4b0: 6c 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61  lag is true.** a
e4c0: 6e 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61  nd the nArg para
e4d0: 6d 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65  meter is -1, the
e4e0: 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f  n only a functio
e4f0: 6e 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a  n that accepts.*
e500: 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  * any number of 
e510: 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62  arguments will b
e520: 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  e returned..**.*
e530: 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20  * If createFlag 
e540: 69 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72  is false and nAr
e550: 67 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68  g is -1, then th
e560: 65 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a  e first valid.**
e570: 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
e580: 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
e590: 66 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69  function is vali
e5a0: 64 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e  d if either xFun
e5b0: 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73  c.** or xStep is
e5c0: 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
e5d0: 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
e5e0: 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20  s false, then a 
e5f0: 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
e600: 65 20 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20  e required name 
e610: 61 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  and.** number of
e620: 20 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62   arguments may b
e630: 65 20 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20  e returned even 
e640: 69 66 20 74 68 65 20 65 54 65 78 74 52 65 70 20  if the eTextRep 
e650: 66 6c 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  flag does not.**
e660: 20 6d 61 74 63 68 20 74 68 61 74 20 72 65 71 75   match that requ
e670: 65 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65  ested..*/.FuncDe
e680: 66 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f *sqlite3FindFu
e690: 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
e6a0: 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
e6b0: 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  An open database
e6c0: 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
e6d0: 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65   *zName, /* Name
e6e0: 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
e6f0: 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d  .  Not null-term
e700: 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  inated */.  int 
e710: 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f  nName,         /
e720: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
e730: 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
e740: 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  me */.  int nArg
e750: 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
e760: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
e770: 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79  s.  -1 means any
e780: 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
e790: 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  enc,            
e7a0: 2f 2a 20 50 72 65 66 65 72 72 65 64 20 74 65 78  /* Preferred tex
e7b0: 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  t encoding */.  
e7c0: 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20 20  int createFlag  
e7d0: 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77     /* Create new
e7e0: 20 65 6e 74 72 79 20 69 66 20 74 72 75 65 20 61   entry if true a
e7f0: 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65  nd does not othe
e800: 72 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29  rwise exist */.)
e810: 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20  {.  FuncDef *p; 
e820: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
e830: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
e840: 20 20 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73    FuncDef *pFirs
e850: 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66  t;    /* First f
e860: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69  unction with thi
e870: 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63  s name */.  Func
e880: 44 65 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  Def *pBest = 0; 
e890: 2f 2a 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f  /* Best match fo
e8a0: 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
e8b0: 69 6e 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20  int bestmatch = 
e8c0: 30 3b 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28  0;  ...  assert(
e8d0: 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
e8e0: 38 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45  8 || enc==SQLITE
e8f0: 5f 55 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d  _UTF16LE || enc=
e900: 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
e910: 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31  );.  if( nArg<-1
e920: 20 29 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20   ) nArg = -1;.. 
e930: 20 70 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44   pFirst = (FuncD
e940: 65 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  ef*)sqlite3HashF
e950: 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ind(&db->aFunc, 
e960: 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
e970: 20 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70   for(p=pFirst; p
e980: 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
e990: 20 20 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65     /* During the
e9a0: 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
e9b0: 62 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65  best function de
e9c0: 66 69 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61  finition, bestma
e9d0: 74 63 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a  tch is set.    *
e9e0: 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20  * as follows to 
e9f0: 69 6e 64 69 63 61 74 65 20 74 68 65 20 71 75 61  indicate the qua
ea00: 6c 69 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63  lity of the matc
ea10: 68 20 77 69 74 68 20 74 68 65 20 64 65 66 69 6e  h with the defin
ea20: 69 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69  ition.    ** poi
ea30: 6e 74 65 64 20 74 6f 20 62 79 20 70 42 65 73 74  nted to by pBest
ea40: 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
ea50: 30 3a 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c  0: pBest is NULL
ea60: 2e 20 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62  . No match has b
ea70: 65 65 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  een found..    *
ea80: 2a 20 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20  * 1: A variable 
ea90: 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69  arguments functi
eaa0: 6f 6e 20 74 68 61 74 20 70 72 65 66 65 72 73 20  on that prefers 
eab0: 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46  UTF-8 when a UTF
eac0: 2d 31 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e  -16.    **    en
ead0: 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73  coding is reques
eae0: 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
eaf0: 73 61 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20  sa..    ** 2: A 
eb00: 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e  variable argumen
eb10: 74 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ts function that
eb20: 20 75 73 65 73 20 55 54 46 2d 31 36 42 45 20 77   uses UTF-16BE w
eb30: 68 65 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a  hen UTF-16LE is.
eb40: 20 20 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73      **    reques
eb50: 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
eb60: 73 61 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20  sa..    ** 3: A 
eb70: 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e  variable argumen
eb80: 74 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  ts function usin
eb90: 67 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20  g the same text 
eba0: 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a  encoding..    **
ebb0: 20 34 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77   4: A function w
ebc0: 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75  ith the exact nu
ebd0: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
ebe0: 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74  s requested that
ebf0: 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65  .    **    prefe
ec00: 72 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20  rs UTF-8 when a 
ec10: 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20  UTF-16 encoding 
ec20: 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72  is requested, or
ec30: 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20   vice versa..   
ec40: 20 2a 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f   ** 5: A functio
ec50: 6e 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74  n with the exact
ec60: 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
ec70: 65 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74  ents requested t
ec80: 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72  hat.    **    pr
ec90: 65 66 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77  efers UTF-16LE w
eca0: 68 65 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20  hen UTF-16BE is 
ecb0: 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
ecc0: 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
ecd0: 20 36 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74   6: An exact mat
ece0: 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ch..    **.    *
ecf0: 2a 20 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65  * A larger value
ed00: 20 6f 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20   of 'matchqual' 
ed10: 69 6e 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65  indicates a more
ed20: 20 64 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68   desirable match
ed30: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
ed40: 20 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20   p->nArg==-1 || 
ed50: 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c  p->nArg==nArg ||
ed60: 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20   nArg==-1 ){.   
ed70: 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31     int match = 1
ed80: 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  ;          /* Qu
ed90: 61 6c 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61  ality of this ma
eda0: 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tch */.      if(
edb0: 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c   p->nArg==nArg |
edc0: 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20  | nArg==-1 ){.  
edd0: 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b        match = 4;
ede0: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
edf0: 66 28 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66  f( enc==p->iPref
ee00: 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Enc ){.        m
ee10: 61 74 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20  atch += 2;.     
ee20: 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
ee30: 28 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  ( (enc==SQLITE_U
ee40: 54 46 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72  TF16LE && p->iPr
ee50: 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  efEnc==SQLITE_UT
ee60: 46 31 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20  F16BE) ||.      
ee70: 20 20 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53           (enc==S
ee80: 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 26 26  QLITE_UTF16BE &&
ee90: 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51   p->iPrefEnc==SQ
eea0: 4c 49 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b  LITE_UTF16LE) ){
eeb0: 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b  .        match +
eec0: 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
eed0: 20 20 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65      if( match>be
eee0: 73 74 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  stmatch ){.     
eef0: 20 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20     pBest = p;.  
ef00: 20 20 20 20 20 20 62 65 73 74 6d 61 74 63 68 20        bestmatch 
ef10: 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d  = match;.      }
ef20: 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
ef30: 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
ef40: 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
ef50: 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65  true, and the se
ef60: 61 63 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65  ach did not reve
ef70: 61 6c 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74  al an.  ** exact
ef80: 20 6d 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e   match for the n
ef90: 61 6d 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61  ame, number of a
efa0: 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63  rguments and enc
efb0: 6f 64 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20  oding, then add 
efc0: 61 0a 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79  a.  ** new entry
efd0: 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
efe0: 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  le and return it
eff0: 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65  ..  */.  if( cre
f000: 61 74 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d  ateFlag && bestm
f010: 61 74 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20  atch<6 && .     
f020: 20 28 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65   (pBest = sqlite
f030: 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  Malloc(sizeof(*p
f040: 42 65 73 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20  Best)+nName+1)) 
f050: 29 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41  ){.    pBest->nA
f060: 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70  rg = nArg;.    p
f070: 42 65 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46  Best->pNext = pF
f080: 69 72 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d  irst;.    pBest-
f090: 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
f0a0: 26 70 42 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70  &pBest[1];.    p
f0b0: 42 65 73 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d  Best->iPrefEnc =
f0c0: 20 65 6e 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79   enc;.    memcpy
f0d0: 28 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pBest->zName, z
f0e0: 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
f0f0: 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e    pBest->zName[n
f100: 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 73  Name] = 0;.    s
f110: 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72 74  qlite3HashInsert
f120: 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 70 42 65  (&db->aFunc, pBe
f130: 73 74 2d 3e 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65  st->zName, nName
f140: 2c 20 28 76 6f 69 64 2a 29 70 42 65 73 74 29 3b  , (void*)pBest);
f150: 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73  .  }..  if( pBes
f160: 74 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74  t && (pBest->xSt
f170: 65 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75  ep || pBest->xFu
f180: 6e 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67  nc || createFlag
f190: 29 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20  ) ){.    return 
f1a0: 70 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74  pBest;.  }.  ret
f1b0: 75 72 6e 20 30 3b 0a 7d 0a                       urn 0;.}.