/ Hex Artifact Content
Login

Artifact 8901081a1207ce7fc038bdc1d97ec4f102a7bfd9:


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 39 35 20 32 30 30 35 2f 30 33 2f 30 39 20  .195 2005/03/09 
0220: 31 32 3a 32 36 3a 35 31 20 64 61 6e 69 65 6c 6b  12:26:51 danielk
0230: 31 39 37 37 20 45 78 70 20 24 0a 2a 2f 0a 23 69  1977 Exp $.*/.#i
0240: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0250: 74 2e 68 22 0a 23 69 6e 63 6c 75 64 65 20 3c 63  t.h".#include <c
0260: 74 79 70 65 2e 68 3e 0a 0a 2f 2a 0a 2a 2a 20 52  type.h>../*.** R
0270: 65 74 75 72 6e 20 74 68 65 20 27 61 66 66 69 6e  eturn the 'affin
0280: 69 74 79 27 20 6f 66 20 74 68 65 20 65 78 70 72  ity' of the expr
0290: 65 73 73 69 6f 6e 20 70 45 78 70 72 20 69 66 20  ession pExpr if 
02a0: 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45  any..**.** If pE
02b0: 78 70 72 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c  xpr is a column,
02c0: 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
02d0: 61 20 63 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20  a column via an 
02e0: 27 41 53 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f  'AS' alias,.** o
02f0: 72 20 61 20 73 75 62 2d 73 65 6c 65 63 74 20 77  r a sub-select w
0300: 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20  ith a column as 
0310: 74 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65  the return value
0320: 2c 20 74 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61  , then the .** a
0330: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 20  ffinity of that 
0340: 63 6f 6c 75 6d 6e 20 69 73 20 72 65 74 75 72 6e  column is return
0350: 65 64 2e 20 4f 74 68 65 72 77 69 73 65 2c 20 30  ed. Otherwise, 0
0360: 78 30 30 20 69 73 20 72 65 74 75 72 6e 65 64 2c  x00 is returned,
0370: 0a 2a 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 6e  .** indicating n
0380: 6f 20 61 66 66 69 6e 69 74 79 20 66 6f 72 20 74  o affinity for t
0390: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a  he expression..*
03a0: 2a 0a 2a 2a 20 69 2e 65 2e 20 74 68 65 20 57 48  *.** i.e. the WH
03b0: 45 52 45 20 63 6c 61 75 73 65 20 65 78 70 72 65  ERE clause expre
03c0: 73 73 73 69 6f 6e 73 20 69 6e 20 74 68 65 20 66  sssions in the f
03d0: 6f 6c 6c 6f 77 69 6e 67 20 73 74 61 74 65 6d 65  ollowing stateme
03e0: 6e 74 73 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20  nts all.** have 
03f0: 61 6e 20 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a  an affinity:.**.
0400: 2a 2a 20 43 52 45 41 54 45 20 54 41 42 4c 45 20  ** CREATE TABLE 
0410: 74 31 28 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54  t1(a);.** SELECT
0420: 20 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45   * FROM t1 WHERE
0430: 20 61 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20   a;.** SELECT a 
0440: 41 53 20 62 20 46 52 4f 4d 20 74 31 20 57 48 45  AS b FROM t1 WHE
0450: 52 45 20 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20  RE b;.** SELECT 
0460: 2a 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  * FROM t1 WHERE 
0470: 28 73 65 6c 65 63 74 20 61 20 66 72 6f 6d 20 74  (select a from t
0480: 31 29 3b 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69  1);.*/.char sqli
0490: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
04a0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
04b0: 69 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  if( pExpr->op==T
04c0: 4b 5f 41 53 20 29 7b 0a 20 20 20 20 72 65 74 75  K_AS ){.    retu
04d0: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
04e0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
04f0: 65 66 74 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20  eft);.  }.  if( 
0500: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
0510: 4c 45 43 54 20 29 7b 0a 20 20 20 20 72 65 74 75  LECT ){.    retu
0520: 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72 41 66  rn sqlite3ExprAf
0530: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 53  finity(pExpr->pS
0540: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61  elect->pEList->a
0550: 5b 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  [0].pExpr);.  }.
0560: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0570: 61 66 66 69 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a  affinity;.}../*.
0580: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 64 65  ** Return the de
0590: 66 61 75 6c 74 20 63 6f 6c 6c 61 74 69 6f 6e 20  fault collation 
05a0: 73 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65  sequence for the
05b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 45 78 70   expression pExp
05c0: 72 2e 20 49 66 0a 2a 2a 20 74 68 65 72 65 20 69  r. If.** there i
05d0: 73 20 6e 6f 20 64 65 66 61 75 6c 74 20 63 6f 6c  s no default col
05e0: 6c 61 74 69 6f 6e 20 74 79 70 65 2c 20 72 65 74  lation type, ret
05f0: 75 72 6e 20 30 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65  urn 0..*/.CollSe
0600: 71 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f  q *sqlite3ExprCo
0610: 6c 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61  llSeq(Parse *pPa
0620: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
0630: 29 7b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43  ){.  CollSeq *pC
0640: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 69 66 28 20 70  oll = 0;.  if( p
0650: 45 78 70 72 20 29 7b 0a 20 20 20 20 70 43 6f 6c  Expr ){.    pCol
0660: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c  l = pExpr->pColl
0670: 3b 0a 20 20 20 20 69 66 28 20 70 45 78 70 72 2d  ;.    if( pExpr-
0680: 3e 6f 70 3d 3d 54 4b 5f 41 53 20 26 26 20 21 70  >op==TK_AS && !p
0690: 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20 20 72 65  Coll ){.      re
06a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
06b0: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
06c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
06d0: 20 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73     }.  }.  if( s
06e0: 71 6c 69 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53  qlite3CheckCollS
06f0: 65 71 28 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c  eq(pParse, pColl
0700: 29 20 29 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20  ) ){ .    pColl 
0710: 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  = 0;.  }.  retur
0720: 6e 20 70 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a  n pColl;.}../*.*
0730: 2a 20 70 45 78 70 72 20 69 73 20 61 6e 20 6f 70  * pExpr is an op
0740: 65 72 61 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61  erand of a compa
0750: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20  rison operator. 
0760: 20 61 66 66 32 20 69 73 20 74 68 65 0a 2a 2a 20   aff2 is the.** 
0770: 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 6f 66  type affinity of
0780: 20 74 68 65 20 6f 74 68 65 72 20 6f 70 65 72 61   the other opera
0790: 6e 64 2e 20 20 54 68 69 73 20 72 6f 75 74 69 6e  nd.  This routin
07a0: 65 20 72 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a  e returns the.**
07b0: 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20 74   type affinity t
07c0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
07d0: 65 64 20 66 6f 72 20 74 68 65 20 63 6f 6d 70 61  ed for the compa
07e0: 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a  rison operator..
07f0: 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33 43  */.char sqlite3C
0800: 6f 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 45  ompareAffinity(E
0810: 78 70 72 20 2a 70 45 78 70 72 2c 20 63 68 61 72  xpr *pExpr, char
0820: 20 61 66 66 32 29 7b 0a 20 20 63 68 61 72 20 61   aff2){.  char a
0830: 66 66 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ff1 = sqlite3Exp
0840: 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  rAffinity(pExpr)
0850: 3b 0a 20 20 69 66 28 20 61 66 66 31 20 26 26 20  ;.  if( aff1 && 
0860: 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42  aff2 ){.    /* B
0870: 6f 74 68 20 73 69 64 65 73 20 6f 66 20 74 68 65  oth sides of the
0880: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 61 72 65 20   comparison are 
0890: 63 6f 6c 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20  columns. If one 
08a0: 68 61 73 20 6e 75 6d 65 72 69 63 20 6f 72 0a 20  has numeric or. 
08b0: 20 20 20 2a 2a 20 69 6e 74 65 67 65 72 20 61 66     ** integer af
08c0: 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68 61 74  finity, use that
08d0: 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73 65 20  . Otherwise use 
08e0: 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20  no affinity..   
08f0: 20 2a 2f 0a 20 20 20 20 69 66 28 20 61 66 66 31   */.    if( aff1
0900: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54  ==SQLITE_AFF_INT
0910: 45 47 45 52 20 7c 7c 20 61 66 66 32 3d 3d 53 51  EGER || aff2==SQ
0920: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
0930: 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
0940: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
0950: 47 45 52 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69  GER;.    }else i
0960: 66 28 20 61 66 66 31 3d 3d 53 51 4c 49 54 45 5f  f( aff1==SQLITE_
0970: 41 46 46 5f 4e 55 4d 45 52 49 43 20 7c 7c 20 61  AFF_NUMERIC || a
0980: 66 66 32 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f  ff2==SQLITE_AFF_
0990: 4e 55 4d 45 52 49 43 20 29 7b 0a 20 20 20 20 20  NUMERIC ){.     
09a0: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
09b0: 46 46 5f 4e 55 4d 45 52 49 43 3b 0a 20 20 20 20  FF_NUMERIC;.    
09c0: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 72 65 74  }else{.      ret
09d0: 75 72 6e 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  urn SQLITE_AFF_N
09e0: 4f 4e 45 3b 0a 20 20 20 20 7d 0a 20 20 7d 65 6c  ONE;.    }.  }el
09f0: 73 65 20 69 66 28 20 21 61 66 66 31 20 26 26 20  se if( !aff1 && 
0a00: 21 61 66 66 32 20 29 7b 0a 20 20 20 20 2f 2a 20  !aff2 ){.    /* 
0a10: 4e 65 69 74 68 65 72 20 73 69 64 65 20 6f 66 20  Neither side of 
0a20: 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 69  the comparison i
0a30: 73 20 61 20 63 6f 6c 75 6d 6e 2e 20 20 43 6f 6d  s a column.  Com
0a40: 70 61 72 65 20 74 68 65 0a 20 20 20 20 2a 2a 20  pare the.    ** 
0a50: 72 65 73 75 6c 74 73 20 64 69 72 65 63 74 6c 79  results directly
0a60: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 2f 2a 20  ..    */.    /* 
0a70: 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41 46  return SQLITE_AF
0a80: 46 5f 4e 55 4d 45 52 49 43 3b 20 20 2f 2f 20 54  F_NUMERIC;  // T
0a90: 69 63 6b 65 74 20 23 38 30 35 20 2a 2f 0a 20 20  icket #805 */.  
0aa0: 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f    return SQLITE_
0ab0: 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65 6c 73  AFF_NONE;.  }els
0ac0: 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20 73 69  e{.    /* One si
0ad0: 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20  de is a column, 
0ae0: 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e 6f 74  the other is not
0af0: 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75 6d 6e  . Use the column
0b00: 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f 0a 20  s affinity. */. 
0b10: 20 20 20 72 65 74 75 72 6e 20 28 61 66 66 31 20     return (aff1 
0b20: 2b 20 61 66 66 32 29 3b 0a 20 20 7d 0a 7d 0a 0a  + aff2);.  }.}..
0b30: 2f 2a 0a 2a 2a 20 70 45 78 70 72 20 69 73 20 61  /*.** pExpr is a
0b40: 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65 72   comparison oper
0b50: 61 74 6f 72 2e 20 20 52 65 74 75 72 6e 20 74 68  ator.  Return th
0b60: 65 20 74 79 70 65 20 61 66 66 69 6e 69 74 79 20  e type affinity 
0b70: 74 68 61 74 20 73 68 6f 75 6c 64 0a 2a 2a 20 62  that should.** b
0b80: 65 20 61 70 70 6c 69 65 64 20 74 6f 20 62 6f 74  e applied to bot
0b90: 68 20 6f 70 65 72 61 6e 64 73 20 70 72 69 6f 72  h operands prior
0ba0: 20 74 6f 20 64 6f 69 6e 67 20 74 68 65 20 63 6f   to doing the co
0bb0: 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f 0a 73 74 61  mparison..*/.sta
0bc0: 74 69 63 20 63 68 61 72 20 63 6f 6d 70 61 72 69  tic char compari
0bd0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 45 78 70 72  sonAffinity(Expr
0be0: 20 2a 70 45 78 70 72 29 7b 0a 20 20 63 68 61 72   *pExpr){.  char
0bf0: 20 61 66 66 3b 0a 20 20 61 73 73 65 72 74 28 20   aff;.  assert( 
0c00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 51  pExpr->op==TK_EQ
0c10: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
0c20: 4b 5f 49 4e 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IN || pExpr->o
0c30: 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a 20 20 20 20  p==TK_LT ||.    
0c40: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 3d        pExpr->op=
0c50: 3d 54 4b 5f 47 54 20 7c 7c 20 70 45 78 70 72 2d  =TK_GT || pExpr-
0c60: 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c 7c 20 70 45  >op==TK_GE || pE
0c70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 45 20 7c  xpr->op==TK_LE |
0c80: 7c 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  |.          pExp
0c90: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45 20 29 3b 0a  r->op==TK_NE );.
0ca0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
0cb0: 3e 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20  >pLeft );.  aff 
0cc0: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66  = sqlite3ExprAff
0cd0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65  inity(pExpr->pLe
0ce0: 66 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72  ft);.  if( pExpr
0cf0: 2d 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ->pRight ){.    
0d00: 61 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d  aff = sqlite3Com
0d10: 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78  pareAffinity(pEx
0d20: 70 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29  pr->pRight, aff)
0d30: 3b 0a 20 20 7d 0a 20 20 65 6c 73 65 20 69 66 28  ;.  }.  else if(
0d40: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
0d50: 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73 71 6c  ){.    aff = sql
0d60: 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66 69 6e  ite3CompareAffin
0d70: 69 74 79 28 70 45 78 70 72 2d 3e 70 53 65 6c 65  ity(pExpr->pSele
0d80: 63 74 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30 5d  ct->pEList->a[0]
0d90: 2e 70 45 78 70 72 2c 20 61 66 66 29 3b 0a 20 20  .pExpr, aff);.  
0da0: 7d 0a 20 20 65 6c 73 65 20 69 66 28 20 21 61 66  }.  else if( !af
0db0: 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 53  f ){.    aff = S
0dc0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0dd0: 43 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  C;.  }.  return 
0de0: 61 66 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45  aff;.}../*.** pE
0df0: 78 70 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69  xpr is a compari
0e00: 73 6f 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20  son expression, 
0e10: 65 67 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e  eg. '=', '<', IN
0e20: 28 2e 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64  (...) etc..** id
0e30: 78 5f 61 66 66 69 6e 69 74 79 20 69 73 20 74 68  x_affinity is th
0e40: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e  e affinity of an
0e50: 20 69 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e   indexed column.
0e60: 20 52 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20   Return true.** 
0e70: 69 66 20 74 68 65 20 69 6e 64 65 78 20 77 69 74  if the index wit
0e80: 68 20 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61  h affinity idx_a
0e90: 66 66 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75  ffinity may be u
0ea0: 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74  sed to implement
0eb0: 0a 2a 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73  .** the comparis
0ec0: 6f 6e 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a  on in pExpr..*/.
0ed0: 69 6e 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78  int sqlite3Index
0ee0: 41 66 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20  AffinityOk(Expr 
0ef0: 2a 70 45 78 70 72 2c 20 63 68 61 72 20 69 64 78  *pExpr, char idx
0f00: 5f 61 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68  _affinity){.  ch
0f10: 61 72 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69  ar aff = compari
0f20: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
0f30: 72 29 3b 0a 20 20 72 65 74 75 72 6e 20 0a 20 20  r);.  return .  
0f40: 20 20 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41    (aff==SQLITE_A
0f50: 46 46 5f 4e 4f 4e 45 29 20 7c 7c 0a 20 20 20 20  FF_NONE) ||.    
0f60: 28 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46  (aff==SQLITE_AFF
0f70: 5f 4e 55 4d 45 52 49 43 20 26 26 20 69 64 78 5f  _NUMERIC && idx_
0f80: 61 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45  affinity==SQLITE
0f90: 5f 41 46 46 5f 49 4e 54 45 47 45 52 29 20 7c 7c  _AFF_INTEGER) ||
0fa0: 0a 20 20 20 20 28 61 66 66 3d 3d 53 51 4c 49 54  .    (aff==SQLIT
0fb0: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 20 26 26  E_AFF_INTEGER &&
0fc0: 20 69 64 78 5f 61 66 66 69 6e 69 74 79 3d 3d 53   idx_affinity==S
0fd0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
0fe0: 43 29 20 7c 7c 0a 20 20 20 20 28 61 66 66 3d 3d  C) ||.    (aff==
0ff0: 69 64 78 5f 61 66 66 69 6e 69 74 79 29 3b 0a 7d  idx_affinity);.}
1000: 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
1010: 68 65 20 50 31 20 76 61 6c 75 65 20 74 68 61 74  he P1 value that
1020: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1030: 66 6f 72 20 61 20 62 69 6e 61 72 79 20 63 6f 6d  for a binary com
1040: 70 61 72 69 73 6f 6e 0a 2a 2a 20 6f 70 63 6f 64  parison.** opcod
1050: 65 20 28 4f 50 5f 45 71 2c 20 4f 50 5f 47 65 20  e (OP_Eq, OP_Ge 
1060: 65 74 63 2e 29 20 75 73 65 64 20 74 6f 20 63 6f  etc.) used to co
1070: 6d 70 61 72 65 20 70 45 78 70 72 31 20 61 6e 64  mpare pExpr1 and
1080: 20 70 45 78 70 72 32 2e 0a 2a 2a 20 49 66 20 6a   pExpr2..** If j
1090: 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 74 72 75  umpIfNull is tru
10a0: 65 2c 20 74 68 65 6e 20 73 65 74 20 74 68 65 20  e, then set the 
10b0: 6c 6f 77 20 62 79 74 65 20 6f 66 20 74 68 65 20  low byte of the 
10c0: 72 65 74 75 72 6e 65 64 0a 2a 2a 20 50 31 20 76  returned.** P1 v
10d0: 61 6c 75 65 20 74 6f 20 74 65 6c 6c 20 74 68 65  alue to tell the
10e0: 20 6f 70 63 6f 64 65 20 74 6f 20 6a 75 6d 70 20   opcode to jump 
10f0: 69 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73  if either expres
1100: 73 69 6f 6e 0a 2a 2a 20 65 76 61 6c 75 61 74 65  sion.** evaluate
1110: 73 20 74 6f 20 4e 55 4c 4c 2e 0a 2a 2f 0a 73 74  s to NULL..*/.st
1120: 61 74 69 63 20 69 6e 74 20 62 69 6e 61 72 79 43  atic int binaryC
1130: 6f 6d 70 61 72 65 50 31 28 45 78 70 72 20 2a 70  ompareP1(Expr *p
1140: 45 78 70 72 31 2c 20 45 78 70 72 20 2a 70 45 78  Expr1, Expr *pEx
1150: 70 72 32 2c 20 69 6e 74 20 6a 75 6d 70 49 66 4e  pr2, int jumpIfN
1160: 75 6c 6c 29 7b 0a 20 20 63 68 61 72 20 61 66 66  ull){.  char aff
1170: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
1180: 66 69 6e 69 74 79 28 70 45 78 70 72 32 29 3b 0a  finity(pExpr2);.
1190: 20 20 72 65 74 75 72 6e 20 28 28 28 69 6e 74 29    return (((int)
11a0: 73 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66  sqlite3CompareAf
11b0: 66 69 6e 69 74 79 28 70 45 78 70 72 31 2c 20 61  finity(pExpr1, a
11c0: 66 66 29 29 3c 3c 38 29 2b 28 6a 75 6d 70 49 66  ff))<<8)+(jumpIf
11d0: 4e 75 6c 6c 3f 31 3a 30 29 3b 0a 7d 0a 0a 2f 2a  Null?1:0);.}../*
11e0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
11f0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1200: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1210: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1220: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1230: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1240: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1250: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1260: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1270: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1280: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1290: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
12a0: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
12b0: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
12c0: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
12d0: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
12e0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
12f0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1300: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1310: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1320: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1330: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1340: 2a 2a 20 74 79 70 65 2e 0a 2a 2f 0a 73 74 61 74  ** type..*/.stat
1350: 69 63 20 43 6f 6c 6c 53 65 71 2a 20 62 69 6e 61  ic CollSeq* bina
1360: 72 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71  ryCompareCollSeq
1370: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
1380: 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70  Expr *pLeft, Exp
1390: 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 43 6f  r *pRight){.  Co
13a0: 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 73  llSeq *pColl = s
13b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
13c0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
13d0: 3b 0a 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29  ;.  if( !pColl )
13e0: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
13f0: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
1400: 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74 29  (pParse, pRight)
1410: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
1420: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  Coll;.}../*.** G
1430: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66 6f 72  enerate code for
1440: 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70   a comparison op
1450: 65 72 61 74 6f 72 2e 0a 2a 2f 0a 73 74 61 74 69  erator..*/.stati
1460: 63 20 69 6e 74 20 63 6f 64 65 43 6f 6d 70 61 72  c int codeCompar
1470: 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72  e(.  Parse *pPar
1480: 73 65 2c 20 20 20 20 2f 2a 20 54 68 65 20 70 61  se,    /* The pa
1490: 72 73 69 6e 67 20 28 61 6e 64 20 63 6f 64 65 20  rsing (and code 
14a0: 67 65 6e 65 72 61 74 69 6e 67 29 20 63 6f 6e 74  generating) cont
14b0: 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
14c0: 4c 65 66 74 2c 20 20 20 20 20 20 2f 2a 20 54 68  Left,      /* Th
14d0: 65 20 6c 65 66 74 20 6f 70 65 72 61 6e 64 20 2a  e left operand *
14e0: 2f 0a 20 20 45 78 70 72 20 2a 70 52 69 67 68 74  /.  Expr *pRight
14f0: 2c 20 20 20 20 20 2f 2a 20 54 68 65 20 72 69 67  ,     /* The rig
1500: 68 74 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20  ht operand */.  
1510: 69 6e 74 20 6f 70 63 6f 64 65 2c 20 20 20 20 20  int opcode,     
1520: 20 20 2f 2a 20 54 68 65 20 63 6f 6d 70 61 72 69    /* The compari
1530: 73 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20  son opcode */.  
1540: 69 6e 74 20 64 65 73 74 2c 20 20 20 20 20 20 20  int dest,       
1550: 20 20 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69    /* Jump here i
1560: 66 20 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e  f true.  */.  in
1570: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20  t jumpIfNull    
1580: 2f 2a 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70  /* If true, jump
1590: 20 69 66 20 65 69 74 68 65 72 20 6f 70 65 72 61   if either opera
15a0: 6e 64 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b  nd is NULL */.){
15b0: 0a 20 20 69 6e 74 20 70 31 20 3d 20 62 69 6e 61  .  int p1 = bina
15c0: 72 79 43 6f 6d 70 61 72 65 50 31 28 70 4c 65 66  ryCompareP1(pLef
15d0: 74 2c 20 70 52 69 67 68 74 2c 20 6a 75 6d 70 49  t, pRight, jumpI
15e0: 66 4e 75 6c 6c 29 3b 0a 20 20 43 6f 6c 6c 53 65  fNull);.  CollSe
15f0: 71 20 2a 70 33 20 3d 20 62 69 6e 61 72 79 43 6f  q *p3 = binaryCo
1600: 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61  mpareCollSeq(pPa
1610: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
1620: 68 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 73 71  ht);.  return sq
1630: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 70 50 61  lite3VdbeOp3(pPa
1640: 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63 6f  rse->pVdbe, opco
1650: 64 65 2c 20 70 31 2c 20 64 65 73 74 2c 20 28 76  de, p1, dest, (v
1660: 6f 69 64 2a 29 70 33 2c 20 50 33 5f 43 4f 4c 4c  oid*)p3, P3_COLL
1670: 53 45 51 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43  SEQ);.}../*.** C
1680: 6f 6e 73 74 72 75 63 74 20 61 20 6e 65 77 20 65  onstruct a new e
1690: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 61  xpression node a
16a0: 6e 64 20 72 65 74 75 72 6e 20 61 20 70 6f 69 6e  nd return a poin
16b0: 74 65 72 20 74 6f 20 69 74 2e 20 20 4d 65 6d 6f  ter to it.  Memo
16c0: 72 79 0a 2a 2a 20 66 6f 72 20 74 68 69 73 20 6e  ry.** for this n
16d0: 6f 64 65 20 69 73 20 6f 62 74 61 69 6e 65 64 20  ode is obtained 
16e0: 66 72 6f 6d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f  from sqliteMallo
16f0: 63 28 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  c().  The callin
1700: 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73  g function.** is
1710: 20 72 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72   responsible for
1720: 20 6d 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65   making sure the
1730: 20 6e 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79   node eventually
1740: 20 67 65 74 73 20 66 72 65 65 64 2e 0a 2a 2f 0a   gets freed..*/.
1750: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
1760: 72 28 69 6e 74 20 6f 70 2c 20 45 78 70 72 20 2a  r(int op, Expr *
1770: 70 4c 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69  pLeft, Expr *pRi
1780: 67 68 74 2c 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  ght, const Token
1790: 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78 70   *pToken){.  Exp
17a0: 72 20 2a 70 4e 65 77 3b 0a 20 20 70 4e 65 77 20  r *pNew;.  pNew 
17b0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
17c0: 73 69 7a 65 6f 66 28 45 78 70 72 29 20 29 3b 0a  sizeof(Expr) );.
17d0: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 7b    if( pNew==0 ){
17e0: 0a 20 20 20 20 2f 2a 20 57 68 65 6e 20 6d 61 6c  .    /* When mal
17f0: 6c 6f 63 20 66 61 69 6c 73 2c 20 77 65 20 6c 65  loc fails, we le
1800: 61 6b 20 6d 65 6d 6f 72 79 20 66 72 6f 6d 20 70  ak memory from p
1810: 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74 20  Left and pRight 
1820: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
1830: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
1840: 3d 20 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c  = op;.  pNew->pL
1850: 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20 20 70  eft = pLeft;.  p
1860: 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 70 52  New->pRight = pR
1870: 69 67 68 74 3b 0a 20 20 70 4e 65 77 2d 3e 69 41  ight;.  pNew->iA
1880: 67 67 20 3d 20 2d 31 3b 0a 20 20 69 66 28 20 70  gg = -1;.  if( p
1890: 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 61 73 73  Token ){.    ass
18a0: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e  ert( pToken->dyn
18b0: 3d 3d 30 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d  ==0 );.    pNew-
18c0: 3e 73 70 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f  >span = pNew->to
18d0: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
18e0: 20 7d 65 6c 73 65 20 69 66 28 20 70 4c 65 66 74   }else if( pLeft
18f0: 20 26 26 20 70 52 69 67 68 74 20 29 7b 0a 20 20   && pRight ){.  
1900: 20 20 73 71 6c 69 74 65 33 45 78 70 72 53 70 61    sqlite3ExprSpa
1910: 6e 28 70 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e  n(pNew, &pLeft->
1920: 73 70 61 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73  span, &pRight->s
1930: 70 61 6e 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  pan);.  }.  retu
1940: 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn pNew;.}../*.*
1950: 2a 20 57 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e  * When doing a n
1960: 65 73 74 65 64 20 70 61 72 73 65 2c 20 79 6f 75  ested parse, you
1970: 20 63 61 6e 20 69 6e 63 6c 75 64 65 20 74 65 72   can include ter
1980: 6d 73 20 69 6e 20 61 6e 20 65 78 70 72 65 73 73  ms in an express
1990: 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b  ion.** that look
19a0: 20 6c 69 6b 65 20 74 68 69 73 3a 20 20 20 23 30   like this:   #0
19b0: 20 23 31 20 23 32 20 2e 2e 2e 20 20 54 68 65 73   #1 #2 ...  Thes
19c0: 65 20 74 65 72 6d 73 20 72 65 66 65 72 20 74 6f  e terms refer to
19d0: 20 65 6c 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20   elements.** on 
19e0: 74 68 65 20 73 74 61 63 6b 2e 20 20 22 23 30 22  the stack.  "#0"
19f0: 20 28 6f 72 20 6a 75 73 74 20 22 23 22 29 20 6d   (or just "#") m
1a00: 65 61 6e 73 20 74 68 65 20 74 6f 70 20 6f 66 20  eans the top of 
1a10: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23  the stack..** "#
1a20: 31 22 20 6d 65 61 6e 73 20 74 68 65 20 6e 65 78  1" means the nex
1a30: 74 20 64 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74  t down on the st
1a40: 61 63 6b 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72  ack.  And so for
1a50: 74 68 2e 20 20 23 2d 31 20 6d 65 61 6e 73 0a 2a  th.  #-1 means.*
1a60: 2a 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  * memory locatio
1a70: 6e 20 30 2e 20 20 23 2d 32 20 6d 65 61 6e 73 20  n 0.  #-2 means 
1a80: 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20  memory location 
1a90: 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68  1.  And so forth
1aa0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
1ab0: 74 69 6e 65 20 69 73 20 63 61 6c 6c 65 64 20 62  tine is called b
1ac0: 79 20 74 68 65 20 70 61 72 73 65 72 20 74 6f 20  y the parser to 
1ad0: 64 65 61 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20  deal with on of 
1ae0: 74 68 6f 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20  those terms..** 
1af0: 49 74 20 69 6d 6d 65 64 69 61 74 65 6c 79 20 67  It immediately g
1b00: 65 6e 65 72 61 74 65 73 20 63 6f 64 65 20 74 6f  enerates code to
1b10: 20 73 74 6f 72 65 20 74 68 65 20 76 61 6c 75 65   store the value
1b20: 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63   in a memory loc
1b30: 61 74 69 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65  ation..** The re
1b40: 74 75 72 6e 73 20 61 6e 20 65 78 70 72 65 73 73  turns an express
1b50: 69 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 63 6f  ion that will co
1b60: 64 65 20 74 6f 20 65 78 74 72 61 63 74 20 74 68  de to extract th
1b70: 65 20 76 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20  e value from.** 
1b80: 74 68 61 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61  that memory loca
1b90: 74 69 6f 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a  tion as needed..
1ba0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
1bb0: 52 65 67 69 73 74 65 72 45 78 70 72 28 50 61 72  RegisterExpr(Par
1bc0: 73 65 20 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65  se *pParse, Toke
1bd0: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64  n *pToken){.  Vd
1be0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1bf0: 70 56 64 62 65 3b 0a 20 20 45 78 70 72 20 2a 70  pVdbe;.  Expr *p
1c00: 3b 0a 20 20 69 6e 74 20 64 65 70 74 68 3b 0a 20  ;.  int depth;. 
1c10: 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75   if( v==0 ) retu
1c20: 72 6e 20 30 3b 0a 20 20 69 66 28 20 70 50 61 72  rn 0;.  if( pPar
1c30: 73 65 2d 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b  se->nested==0 ){
1c40: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f  .    sqlite3Erro
1c50: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 65  rMsg(pParse, "ne
1c60: 61 72 20 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61  ar \"%T\": synta
1c70: 78 20 65 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e  x error", pToken
1c80: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
1c90: 0a 20 20 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74  .  }.  p = sqlit
1ca0: 65 33 45 78 70 72 28 54 4b 5f 52 45 47 49 53 54  e3Expr(TK_REGIST
1cb0: 45 52 2c 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e  ER, 0, 0, pToken
1cc0: 29 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 7b  );.  if( p==0 ){
1cd0: 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 20 20  .    return 0;  
1ce0: 2f 2a 20 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64  /* Malloc failed
1cf0: 20 2a 2f 0a 20 20 7d 0a 20 20 64 65 70 74 68 20   */.  }.  depth 
1d00: 3d 20 61 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e  = atoi(&pToken->
1d10: 7a 5b 31 5d 29 3b 0a 20 20 69 66 28 20 64 65 70  z[1]);.  if( dep
1d20: 74 68 3e 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e  th>=0 ){.    p->
1d30: 69 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d  iTable = pParse-
1d40: 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c  >nMem++;.    sql
1d50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
1d60: 20 4f 50 5f 44 75 70 2c 20 64 65 70 74 68 2c 20   OP_Dup, depth, 
1d70: 30 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  0);.    sqlite3V
1d80: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
1d90: 65 6d 53 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62  emStore, p->iTab
1da0: 6c 65 2c 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b  le, 1);.  }else{
1db0: 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d  .    p->iTable =
1dc0: 20 2d 31 2d 64 65 70 74 68 3b 0a 20 20 7d 0a 20   -1-depth;.  }. 
1dd0: 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a   return p;.}../*
1de0: 0a 2a 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70  .** Join two exp
1df0: 72 65 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61  ressions using a
1e00: 6e 20 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20  n AND operator. 
1e10: 20 49 66 20 65 69 74 68 65 72 20 65 78 70 72 65   If either expre
1e20: 73 73 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c  ssion is.** NULL
1e30: 2c 20 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75  , then just retu
1e40: 72 6e 20 74 68 65 20 6f 74 68 65 72 20 65 78 70  rn the other exp
1e50: 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72  ression..*/.Expr
1e60: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6e 64   *sqlite3ExprAnd
1e70: 28 45 78 70 72 20 2a 70 4c 65 66 74 2c 20 45 78  (Expr *pLeft, Ex
1e80: 70 72 20 2a 70 52 69 67 68 74 29 7b 0a 20 20 69  pr *pRight){.  i
1e90: 66 28 20 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20  f( pLeft==0 ){. 
1ea0: 20 20 20 72 65 74 75 72 6e 20 70 52 69 67 68 74     return pRight
1eb0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52  ;.  }else if( pR
1ec0: 69 67 68 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72  ight==0 ){.    r
1ed0: 65 74 75 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d  eturn pLeft;.  }
1ee0: 65 6c 73 65 7b 0a 20 20 20 20 72 65 74 75 72 6e  else{.    return
1ef0: 20 73 71 6c 69 74 65 33 45 78 70 72 28 54 4b 5f   sqlite3Expr(TK_
1f00: 41 4e 44 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  AND, pLeft, pRig
1f10: 68 74 2c 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  ht, 0);.  }.}../
1f20: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
1f30: 72 2e 73 70 61 6e 20 66 69 65 6c 64 20 6f 66 20  r.span field of 
1f40: 74 68 65 20 67 69 76 65 6e 20 65 78 70 72 65 73  the given expres
1f50: 73 69 6f 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c  sion to span all
1f60: 0a 2a 2a 20 74 65 78 74 20 62 65 74 77 65 65 6e  .** text between
1f70: 20 74 68 65 20 74 77 6f 20 67 69 76 65 6e 20 74   the two given t
1f80: 6f 6b 65 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73  okens..*/.void s
1f90: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 45  qlite3ExprSpan(E
1fa0: 78 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65  xpr *pExpr, Toke
1fb0: 6e 20 2a 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20  n *pLeft, Token 
1fc0: 2a 70 52 69 67 68 74 29 7b 0a 20 20 61 73 73 65  *pRight){.  asse
1fd0: 72 74 28 20 70 52 69 67 68 74 21 3d 30 20 29 3b  rt( pRight!=0 );
1fe0: 0a 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74  .  assert( pLeft
1ff0: 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 21 73 71  !=0 );.  if( !sq
2000: 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69  lite3_malloc_fai
2010: 6c 65 64 20 26 26 20 70 52 69 67 68 74 2d 3e 7a  led && pRight->z
2020: 20 26 26 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a   && pLeft->z ){.
2030: 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66      assert( pLef
2040: 74 2d 3e 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65  t->dyn==0 || pLe
2050: 66 74 2d 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d  ft->z[pLeft->n]=
2060: 3d 30 20 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  =0 );.    if( pL
2070: 65 66 74 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70  eft->dyn==0 && p
2080: 52 69 67 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b  Right->dyn==0 ){
2090: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
20a0: 61 6e 2e 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b  an.z = pLeft->z;
20b0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70  .      pExpr->sp
20c0: 61 6e 2e 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e  an.n = pRight->n
20d0: 20 2b 20 41 64 64 72 28 70 52 69 67 68 74 2d 3e   + Addr(pRight->
20e0: 7a 29 20 2d 20 41 64 64 72 28 70 4c 65 66 74 2d  z) - Addr(pLeft-
20f0: 3e 7a 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  >z);.    }else{.
2100: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61        pExpr->spa
2110: 6e 2e 7a 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  n.z = 0;.    }. 
2120: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73   }.}../*.** Cons
2130: 74 72 75 63 74 20 61 20 6e 65 77 20 65 78 70 72  truct a new expr
2140: 65 73 73 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20  ession node for 
2150: 61 20 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20  a function with 
2160: 6d 75 6c 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75  multiple.** argu
2170: 6d 65 6e 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a  ments..*/.Expr *
2180: 73 71 6c 69 74 65 33 45 78 70 72 46 75 6e 63 74  sqlite3ExprFunct
2190: 69 6f 6e 28 45 78 70 72 4c 69 73 74 20 2a 70 4c  ion(ExprList *pL
21a0: 69 73 74 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ist, Token *pTok
21b0: 65 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65  en){.  Expr *pNe
21c0: 77 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69  w;.  pNew = sqli
21d0: 74 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66  teMalloc( sizeof
21e0: 28 45 78 70 72 29 20 29 3b 0a 20 20 69 66 28 20  (Expr) );.  if( 
21f0: 70 4e 65 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f  pNew==0 ){.    /
2200: 2a 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  * sqlite3ExprLis
2210: 74 44 65 6c 65 74 65 28 70 4c 69 73 74 29 3b 20  tDelete(pList); 
2220: 2f 2f 20 4c 65 61 6b 20 70 4c 69 73 74 20 77 68  // Leak pList wh
2230: 65 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  en malloc fails 
2240: 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  */.    return 0;
2250: 0a 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20  .  }.  pNew->op 
2260: 3d 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  = TK_FUNCTION;. 
2270: 20 70 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70   pNew->pList = p
2280: 4c 69 73 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b  List;.  if( pTok
2290: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
22a0: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
22b0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f   );.    pNew->to
22c0: 6b 65 6e 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20  ken = *pToken;. 
22d0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77   }else{.    pNew
22e0: 2d 3e 74 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20  ->token.z = 0;. 
22f0: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20   }.  pNew->span 
2300: 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20  = pNew->token;. 
2310: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
2320: 0a 2f 2a 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20  ./*.** Assign a 
2330: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
2340: 74 6f 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  to an expression
2350: 20 74 68 61 74 20 65 6e 63 6f 64 65 73 20 61 20   that encodes a 
2360: 77 69 6c 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74  wildcard.** in t
2370: 68 65 20 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20  he original SQL 
2380: 73 74 61 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a  statement.  .**.
2390: 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 63 6f 6e  ** Wildcards con
23a0: 73 69 73 74 69 6e 67 20 6f 66 20 61 20 73 69 6e  sisting of a sin
23b0: 67 6c 65 20 22 3f 22 20 61 72 65 20 61 73 73 69  gle "?" are assi
23c0: 67 6e 65 64 20 74 68 65 20 6e 65 78 74 20 73 65  gned the next se
23d0: 71 75 65 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69  quential.** vari
23e0: 61 62 6c 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a  able number..**.
23f0: 2a 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 3f 6e 6e 6e 22 20  the form "?nnn" 
2410: 61 72 65 20 61 73 73 69 67 6e 65 64 20 74 68 65  are assigned the
2420: 20 6e 75 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20   number "nnn".  
2430: 57 65 20 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20  We make.** sure 
2440: 22 6e 6e 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f  "nnn" is not too
2450: 20 62 65 20 74 6f 20 61 76 6f 69 64 20 61 20 64   be to avoid a d
2460: 65 6e 69 61 6c 20 6f 66 20 73 65 72 76 69 63 65  enial of service
2470: 20 61 74 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20   attack when.** 
2480: 74 68 65 20 53 51 4c 20 73 74 61 74 65 6d 65 6e  the SQL statemen
2490: 74 20 63 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20  t comes from an 
24a0: 65 78 74 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e  external source.
24b0: 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73  .**.** Wildcards
24c0: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3a 61   of the form ":a
24d0: 61 61 22 20 6f 72 20 22 24 61 61 61 22 20 61 72  aa" or "$aaa" ar
24e0: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73  e assigned the s
24f0: 61 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73  ame number.** as
2500: 20 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e   the previous in
2510: 73 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  stance of the sa
2520: 6d 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72  me wildcard.  Or
2530: 20 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20   if this is the 
2540: 66 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63  first.** instanc
2550: 65 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72  e of the wildcar
2560: 64 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75  d, the next sequ
2570: 65 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e  enial variable n
2580: 75 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69  umber is.** assi
2590: 67 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  gned..*/.void sq
25a0: 6c 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56  lite3ExprAssignV
25b0: 61 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a  arNumber(Parse *
25c0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
25d0: 78 70 72 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70  xpr){.  Token *p
25e0: 54 6f 6b 65 6e 3b 0a 20 20 69 66 28 20 70 45 78  Token;.  if( pEx
25f0: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a  pr==0 ) return;.
2600: 20 20 70 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70    pToken = &pExp
2610: 72 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65  r->token;.  asse
2620: 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31  rt( pToken->n>=1
2630: 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54   );.  assert( pT
2640: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20  oken->z!=0 );.  
2650: 61 73 73 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e  assert( pToken->
2660: 7a 5b 30 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28  z[0]!=0 );.  if(
2670: 20 70 54 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b   pToken->n==1 ){
2680: 0a 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72 64  .    /* Wildcard
2690: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f 22   of the form "?"
26a0: 2e 20 20 41 73 73 69 67 6e 20 74 68 65 20 6e 65  .  Assign the ne
26b0: 78 74 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  xt variable numb
26c0: 65 72 20 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d  er */.    pExpr-
26d0: 3e 69 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72  >iTable = ++pPar
26e0: 73 65 2d 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73  se->nVar;.  }els
26f0: 65 20 69 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b  e if( pToken->z[
2700: 30 5d 3d 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f  0]=='?' ){.    /
2710: 2a 20 57 69 6c 64 63 61 72 64 20 6f 66 20 74 68  * Wildcard of th
2720: 65 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20  e form "?nnn".  
2730: 43 6f 6e 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f  Convert "nnn" to
2740: 20 61 6e 20 69 6e 74 65 67 65 72 20 61 6e 64 0a   an integer and.
2750: 20 20 20 20 2a 2a 20 75 73 65 20 69 74 20 61 73      ** use it as
2760: 20 74 68 65 20 76 61 72 69 61 62 6c 65 20 6e 75   the variable nu
2770: 6d 62 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20  mber */.    int 
2780: 69 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  i;.    pExpr->iT
2790: 61 62 6c 65 20 3d 20 69 20 3d 20 61 74 6f 69 28  able = i = atoi(
27a0: 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a  &pToken->z[1]);.
27b0: 20 20 20 20 69 66 28 20 69 3c 31 20 7c 7c 20 69      if( i<1 || i
27c0: 3e 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49  >SQLITE_MAX_VARI
27d0: 41 42 4c 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20  ABLE_NUMBER ){. 
27e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
27f0: 72 4d 73 67 28 70 50 61 72 73 65 2c 20 22 76 61  rMsg(pParse, "va
2800: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75  riable number mu
2810: 73 74 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31  st be between ?1
2820: 20 61 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20   and ?%d",.     
2830: 20 20 20 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f       SQLITE_MAX_
2840: 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29  VARIABLE_NUMBER)
2850: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69 66 28 20  ;.    }.    if( 
2860: 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20 29  i>pParse->nVar )
2870: 7b 0a 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e  {.      pParse->
2880: 6e 56 61 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a  nVar = i;.    }.
2890: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20    }else{.    /* 
28a0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
28b0: 20 66 6f 72 6d 20 22 3a 61 61 61 22 20 6f 72 20   form ":aaa" or 
28c0: 22 24 61 61 61 22 2e 20 20 52 65 75 73 65 20 74  "$aaa".  Reuse t
28d0: 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65  he same variable
28e0: 0a 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61  .    ** number a
28f0: 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70 65  s the prior appe
2900: 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61  arance of the sa
2910: 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74  me name, or if t
2920: 68 65 20 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68  he name.    ** h
2930: 61 73 20 6e 65 76 65 72 20 61 70 70 65 61 72 65  as never appeare
2940: 64 20 62 65 66 6f 72 65 2c 20 72 65 75 73 65 20  d before, reuse 
2950: 74 68 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c  the same variabl
2960: 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a  e number.    */.
2970: 20 20 20 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20      int i, n;.  
2980: 20 20 6e 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b    n = pToken->n;
2990: 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  .    for(i=0; i<
29a0: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
29b0: 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78  ; i++){.      Ex
29c0: 70 72 20 2a 70 45 3b 0a 20 20 20 20 20 20 69 66  pr *pE;.      if
29d0: 28 20 28 70 45 20 3d 20 70 50 61 72 73 65 2d 3e  ( (pE = pParse->
29e0: 61 70 56 61 72 45 78 70 72 5b 69 5d 29 21 3d 30  apVarExpr[i])!=0
29f0: 0a 20 20 20 20 20 20 20 20 20 20 26 26 20 70 45  .          && pE
2a00: 2d 3e 74 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20  ->token.n==n.   
2a10: 20 20 20 20 20 20 20 26 26 20 6d 65 6d 63 6d 70         && memcmp
2a20: 28 70 45 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54  (pE->token.z, pT
2a30: 6f 6b 65 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29  oken->z, n)==0 )
2a40: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
2a50: 3e 69 54 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54  >iTable = pE->iT
2a60: 61 62 6c 65 3b 0a 20 20 20 20 20 20 20 20 62 72  able;.        br
2a70: 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  eak;.      }.   
2a80: 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 3d 70 50   }.    if( i>=pP
2a90: 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 20 29  arse->nVarExpr )
2aa0: 7b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  {.      pExpr->i
2ab0: 54 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65  Table = ++pParse
2ac0: 2d 3e 6e 56 61 72 3b 0a 20 20 20 20 20 20 69 66  ->nVar;.      if
2ad0: 28 20 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78  ( pParse->nVarEx
2ae0: 70 72 3e 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72  pr>=pParse->nVar
2af0: 45 78 70 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20  ExprAlloc-1 ){. 
2b00: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e         pParse->n
2b10: 56 61 72 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20  VarExprAlloc += 
2b20: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2b30: 41 6c 6c 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20  Alloc + 10;.    
2b40: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61      pParse->apVa
2b50: 72 45 78 70 72 20 3d 20 73 71 6c 69 74 65 52 65  rExpr = sqliteRe
2b60: 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e 61 70  alloc(pParse->ap
2b70: 56 61 72 45 78 70 72 2c 0a 20 20 20 20 20 20 20  VarExpr,.       
2b80: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
2b90: 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72  pParse->nVarExpr
2ba0: 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61  Alloc*sizeof(pPa
2bb0: 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72 5b 30  rse->apVarExpr[0
2bc0: 5d 29 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ]) );.      }.  
2bd0: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
2be0: 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29  _malloc_failed )
2bf0: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
2c00: 28 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45  ( pParse->apVarE
2c10: 78 70 72 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  xpr!=0 );.      
2c20: 20 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45    pParse->apVarE
2c30: 78 70 72 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72  xpr[pParse->nVar
2c40: 45 78 70 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b  Expr++] = pExpr;
2c50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20  .      }.    }. 
2c60: 20 7d 20 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63   } .}../*.** Rec
2c70: 75 72 73 69 76 65 6c 79 20 64 65 6c 65 74 65 20  ursively delete 
2c80: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
2c90: 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ee..*/.void sqli
2ca0: 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 45 78  te3ExprDelete(Ex
2cb0: 70 72 20 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d  pr *p){.  if( p=
2cc0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 69  =0 ) return;.  i
2cd0: 66 28 20 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29  f( p->span.dyn )
2ce0: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2cf0: 72 2a 29 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20  r*)p->span.z);. 
2d00: 20 69 66 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79   if( p->token.dy
2d10: 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65 28 28  n ) sqliteFree((
2d20: 63 68 61 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a  char*)p->token.z
2d30: 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72  );.  sqlite3Expr
2d40: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 65 66 74 29  Delete(p->pLeft)
2d50: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
2d60: 65 6c 65 74 65 28 70 2d 3e 70 52 69 67 68 74 29  elete(p->pRight)
2d70: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c  ;.  sqlite3ExprL
2d80: 69 73 74 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69  istDelete(p->pLi
2d90: 73 74 29 3b 0a 20 20 73 71 6c 69 74 65 33 53 65  st);.  sqlite3Se
2da0: 6c 65 63 74 44 65 6c 65 74 65 28 70 2d 3e 70 53  lectDelete(p->pS
2db0: 65 6c 65 63 74 29 3b 0a 20 20 73 71 6c 69 74 65  elect);.  sqlite
2dc0: 46 72 65 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a  Free(p);.}.../*.
2dd0: 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67  ** The following
2de0: 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e   group of routin
2df0: 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63 6f 70  es make deep cop
2e00: 69 65 73 20 6f 66 20 65 78 70 72 65 73 73 69 6f  ies of expressio
2e10: 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f  ns,.** expressio
2e20: 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69 73 74  n lists, ID list
2e30: 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20 73 74  s, and select st
2e40: 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65 20 63  atements.  The c
2e50: 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20  opies can.** be 
2e60: 64 65 6c 65 74 65 64 20 28 62 79 20 62 65 69 6e  deleted (by bein
2e70: 67 20 70 61 73 73 65 64 20 74 6f 20 74 68 65 69  g passed to thei
2e80: 72 20 72 65 73 70 65 63 74 69 76 65 20 2e 2e 2e  r respective ...
2e90: 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69 6e 65  Delete() routine
2ea0: 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20 65 66  s).** without ef
2eb0: 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72 69 67  fecting the orig
2ec0: 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  inals..**.** The
2ed0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
2ee0: 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72 63 65  , ID, and source
2ef0: 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20 62 79   lists return by
2f00: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2f10: 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65  Dup(),.** sqlite
2f20: 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20 61 6e  3IdListDup(), an
2f30: 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69 73 74  d sqlite3SrcList
2f40: 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20 62 65  Dup() can not be
2f50: 20 66 75 72 74 68 65 72 20 65 78 70 61 6e 64 65   further expande
2f60: 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65 71 75  d .** by subsequ
2f70: 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c  ent calls to sql
2f80: 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64 28 29  ite*ListAppend()
2f90: 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a   routines..**.**
2fa0: 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68 61 74   Any tables that
2fb0: 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d 69 67   the SrcList mig
2fc0: 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72 65 20  ht point to are 
2fd0: 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64 2e 0a  not duplicated..
2fe0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
2ff0: 45 78 70 72 44 75 70 28 45 78 70 72 20 2a 70 29  ExprDup(Expr *p)
3000: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
3010: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3020: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3030: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28  sqliteMallocRaw(
3040: 20 73 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20   sizeof(*p) );. 
3050: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3060: 65 74 75 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70  eturn 0;.  memcp
3070: 79 28 70 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f  y(pNew, p, sizeo
3080: 66 28 2a 70 4e 65 77 29 29 3b 0a 20 20 69 66 28  f(*pNew));.  if(
3090: 20 70 2d 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29   p->token.z!=0 )
30a0: 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65  {.    pNew->toke
30b0: 6e 2e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72 4e  n.z = sqliteStrN
30c0: 44 75 70 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20  Dup(p->token.z, 
30d0: 70 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20  p->token.n);.   
30e0: 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e   pNew->token.dyn
30f0: 20 3d 20 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20   = 1;.  }else{. 
3100: 20 20 20 61 73 73 65 72 74 28 20 70 4e 65 77 2d     assert( pNew-
3110: 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20  >token.z==0 );. 
3120: 20 7d 0a 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e   }.  pNew->span.
3130: 7a 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  z = 0;.  pNew->p
3140: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
3150: 70 72 44 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b  prDup(p->pLeft);
3160: 0a 20 20 70 4e 65 77 2d 3e 70 52 69 67 68 74 20  .  pNew->pRight 
3170: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70  = sqlite3ExprDup
3180: 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  (p->pRight);.  p
3190: 4e 65 77 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c  New->pList = sql
31a0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
31b0: 70 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65  p->pList);.  pNe
31c0: 77 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  w->pSelect = sql
31d0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
31e0: 3e 70 53 65 6c 65 63 74 29 3b 0a 20 20 70 4e 65  >pSelect);.  pNe
31f0: 77 2d 3e 70 54 61 62 20 3d 20 70 2d 3e 70 54 61  w->pTab = p->pTa
3200: 62 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65 77  b;.  return pNew
3210: 3b 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  ;.}.void sqlite3
3220: 54 6f 6b 65 6e 43 6f 70 79 28 54 6f 6b 65 6e 20  TokenCopy(Token 
3230: 2a 70 54 6f 2c 20 54 6f 6b 65 6e 20 2a 70 46 72  *pTo, Token *pFr
3240: 6f 6d 29 7b 0a 20 20 69 66 28 20 70 54 6f 2d 3e  om){.  if( pTo->
3250: 64 79 6e 20 29 20 73 71 6c 69 74 65 46 72 65 65  dyn ) sqliteFree
3260: 28 28 63 68 61 72 2a 29 70 54 6f 2d 3e 7a 29 3b  ((char*)pTo->z);
3270: 0a 20 20 69 66 28 20 70 46 72 6f 6d 2d 3e 7a 20  .  if( pFrom->z 
3280: 29 7b 0a 20 20 20 20 70 54 6f 2d 3e 6e 20 3d 20  ){.    pTo->n = 
3290: 70 46 72 6f 6d 2d 3e 6e 3b 0a 20 20 20 20 70 54  pFrom->n;.    pT
32a0: 6f 2d 3e 7a 20 3d 20 73 71 6c 69 74 65 53 74 72  o->z = sqliteStr
32b0: 4e 44 75 70 28 70 46 72 6f 6d 2d 3e 7a 2c 20 70  NDup(pFrom->z, p
32c0: 46 72 6f 6d 2d 3e 6e 29 3b 0a 20 20 20 20 70 54  From->n);.    pT
32d0: 6f 2d 3e 64 79 6e 20 3d 20 31 3b 0a 20 20 7d 65  o->dyn = 1;.  }e
32e0: 6c 73 65 7b 0a 20 20 20 20 70 54 6f 2d 3e 7a 20  lse{.    pTo->z 
32f0: 3d 20 30 3b 0a 20 20 7d 0a 7d 0a 45 78 70 72 4c  = 0;.  }.}.ExprL
3300: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
3310: 4c 69 73 74 44 75 70 28 45 78 70 72 4c 69 73 74  ListDup(ExprList
3320: 20 2a 70 29 7b 0a 20 20 45 78 70 72 4c 69 73 74   *p){.  ExprList
3330: 20 2a 70 4e 65 77 3b 0a 20 20 73 74 72 75 63 74   *pNew;.  struct
3340: 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a   ExprList_item *
3350: 70 49 74 65 6d 2c 20 2a 70 4f 6c 64 49 74 65 6d  pItem, *pOldItem
3360: 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28  ;.  int i;.  if(
3370: 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30   p==0 ) return 0
3380: 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74  ;.  pNew = sqlit
3390: 65 4d 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28  eMalloc( sizeof(
33a0: 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28 20  *pNew) );.  if( 
33b0: 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e  pNew==0 ) return
33c0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78 70   0;.  pNew->nExp
33d0: 72 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f 63  r = pNew->nAlloc
33e0: 20 3d 20 70 2d 3e 6e 45 78 70 72 3b 0a 20 20 70   = p->nExpr;.  p
33f0: 4e 65 77 2d 3e 61 20 3d 20 70 49 74 65 6d 20 3d  New->a = pItem =
3400: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70   sqliteMalloc( p
3410: 2d 3e 6e 45 78 70 72 2a 73 69 7a 65 6f 66 28 70  ->nExpr*sizeof(p
3420: 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66 28  ->a[0]) );.  if(
3430: 20 70 49 74 65 6d 3d 3d 30 20 29 7b 0a 20 20 20   pItem==0 ){.   
3440: 20 73 71 6c 69 74 65 46 72 65 65 28 70 4e 65 77   sqliteFree(pNew
3450: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b  );.    return 0;
3460: 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65 6d  .  } .  pOldItem
3470: 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28 69   = p->a;.  for(i
3480: 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b 20  =0; i<p->nExpr; 
3490: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70 4f  i++, pItem++, pO
34a0: 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 45  ldItem++){.    E
34b0: 78 70 72 20 2a 70 4e 65 77 45 78 70 72 2c 20 2a  xpr *pNewExpr, *
34c0: 70 4f 6c 64 45 78 70 72 3b 0a 20 20 20 20 70 49  pOldExpr;.    pI
34d0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 4e 65  tem->pExpr = pNe
34e0: 77 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  wExpr = sqlite3E
34f0: 78 70 72 44 75 70 28 70 4f 6c 64 45 78 70 72 20  xprDup(pOldExpr 
3500: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70  = pOldItem->pExp
3510: 72 29 3b 0a 20 20 20 20 69 66 28 20 70 4f 6c 64  r);.    if( pOld
3520: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
3530: 26 26 20 70 4e 65 77 45 78 70 72 20 29 7b 0a 20  && pNewExpr ){. 
3540: 20 20 20 20 20 2f 2a 20 41 6c 77 61 79 73 20 6d       /* Always m
3550: 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74 68  ake a copy of th
3560: 65 20 73 70 61 6e 20 66 6f 72 20 74 6f 70 2d 6c  e span for top-l
3570: 65 76 65 6c 20 65 78 70 72 65 73 73 69 6f 6e 73  evel expressions
3580: 20 69 6e 20 74 68 65 0a 20 20 20 20 20 20 2a 2a   in the.      **
3590: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
35a0: 2e 20 20 54 68 65 20 6c 6f 67 69 63 20 69 6e 20  .  The logic in 
35b0: 53 45 4c 45 43 54 20 70 72 6f 63 65 73 73 69 6e  SELECT processin
35c0: 67 20 74 68 61 74 20 64 65 74 65 72 6d 69 6e 65  g that determine
35d0: 73 0a 20 20 20 20 20 20 2a 2a 20 74 68 65 20 6e  s.      ** the n
35e0: 61 6d 65 73 20 6f 66 20 63 6f 6c 75 6d 6e 73 20  ames of columns 
35f0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
3600: 74 20 6e 65 65 64 73 20 74 68 69 73 20 69 6e 66  t needs this inf
3610: 6f 72 6d 61 74 69 6f 6e 20 2a 2f 0a 20 20 20 20  ormation */.    
3620: 20 20 73 71 6c 69 74 65 33 54 6f 6b 65 6e 43 6f    sqlite3TokenCo
3630: 70 79 28 26 70 4e 65 77 45 78 70 72 2d 3e 73 70  py(&pNewExpr->sp
3640: 61 6e 2c 20 26 70 4f 6c 64 45 78 70 72 2d 3e 73  an, &pOldExpr->s
3650: 70 61 6e 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  pan);.    }.    
3660: 61 73 73 65 72 74 28 20 70 4e 65 77 45 78 70 72  assert( pNewExpr
3670: 3d 3d 30 20 7c 7c 20 70 4e 65 77 45 78 70 72 2d  ==0 || pNewExpr-
3680: 3e 73 70 61 6e 2e 7a 21 3d 30 20 0a 20 20 20 20  >span.z!=0 .    
3690: 20 20 20 20 20 20 20 20 7c 7c 20 70 4f 6c 64 45          || pOldE
36a0: 78 70 72 2d 3e 73 70 61 6e 2e 7a 3d 3d 30 20 7c  xpr->span.z==0 |
36b0: 7c 20 73 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63  | sqlite3_malloc
36c0: 5f 66 61 69 6c 65 64 20 29 3b 0a 20 20 20 20 70  _failed );.    p
36d0: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71  Item->zName = sq
36e0: 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c 64 49  liteStrDup(pOldI
36f0: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
3700: 20 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65   pItem->sortOrde
3710: 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f  r = pOldItem->so
3720: 72 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74  rtOrder;.    pIt
3730: 65 6d 2d 3e 69 73 41 67 67 20 3d 20 70 4f 6c 64  em->isAgg = pOld
3740: 49 74 65 6d 2d 3e 69 73 41 67 67 3b 0a 20 20 20  Item->isAgg;.   
3750: 20 70 49 74 65 6d 2d 3e 64 6f 6e 65 20 3d 20 30   pItem->done = 0
3760: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
3770: 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66  New;.}../*.** If
3780: 20 63 75 72 73 6f 72 73 2c 20 74 72 69 67 67 65   cursors, trigge
3790: 72 73 2c 20 76 69 65 77 73 20 61 6e 64 20 73 75  rs, views and su
37a0: 62 71 75 65 72 69 65 73 20 61 72 65 20 61 6c 6c  bqueries are all
37b0: 20 6f 6d 69 74 74 65 64 20 66 72 6f 6d 0a 2a 2a   omitted from.**
37c0: 20 74 68 65 20 62 75 69 6c 64 2c 20 74 68 65 6e   the build, then
37d0: 20 6e 6f 6e 65 20 6f 66 20 74 68 65 20 66 6f 6c   none of the fol
37e0: 6c 6f 77 69 6e 67 20 72 6f 75 74 69 6e 65 73 2c  lowing routines,
37f0: 20 65 78 63 65 70 74 20 66 6f 72 20 0a 2a 2a 20   except for .** 
3800: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
3810: 28 29 2c 20 63 61 6e 20 62 65 20 63 61 6c 6c 65  (), can be calle
3820: 64 2e 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74  d. sqlite3Select
3830: 44 75 70 28 29 20 69 73 20 73 6f 6d 65 74 69 6d  Dup() is sometim
3840: 65 73 0a 2a 2a 20 63 61 6c 6c 65 64 20 77 69 74  es.** called wit
3850: 68 20 61 20 4e 55 4c 4c 20 61 72 67 75 6d 65 6e  h a NULL argumen
3860: 74 2e 0a 2a 2f 0a 23 69 66 20 21 64 65 66 69 6e  t..*/.#if !defin
3870: 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ed(SQLITE_OMIT_V
3880: 49 45 57 29 20 7c 7c 20 21 64 65 66 69 6e 65 64  IEW) || !defined
3890: 28 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52 49  (SQLITE_OMIT_TRI
38a0: 47 47 45 52 29 20 5c 0a 20 7c 7c 20 21 64 65 66  GGER) \. || !def
38b0: 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49 54  ined(SQLITE_OMIT
38c0: 5f 53 55 42 51 55 45 52 59 29 0a 53 72 63 4c 69  _SUBQUERY).SrcLi
38d0: 73 74 20 2a 73 71 6c 69 74 65 33 53 72 63 4c 69  st *sqlite3SrcLi
38e0: 73 74 44 75 70 28 53 72 63 4c 69 73 74 20 2a 70  stDup(SrcList *p
38f0: 29 7b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 4e  ){.  SrcList *pN
3900: 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  ew;.  int i;.  i
3910: 6e 74 20 6e 42 79 74 65 3b 0a 20 20 69 66 28 20  nt nByte;.  if( 
3920: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
3930: 0a 20 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  .  nByte = sizeo
3940: 66 28 2a 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63  f(*p) + (p->nSrc
3950: 3e 30 20 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61  >0 ? sizeof(p->a
3960: 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d  [0]) * (p->nSrc-
3970: 31 29 20 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20  1) : 0);.  pNew 
3980: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61  = sqliteMallocRa
3990: 77 28 20 6e 42 79 74 65 20 29 3b 0a 20 20 69 66  w( nByte );.  if
39a0: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
39b0: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 53  rn 0;.  pNew->nS
39c0: 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41 6c 6c 6f  rc = pNew->nAllo
39d0: 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a 20 20 66  c = p->nSrc;.  f
39e0: 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 53 72  or(i=0; i<p->nSr
39f0: 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 73 74 72  c; i++){.    str
3a00: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
3a10: 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20 26 70 4e   *pNewItem = &pN
3a20: 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 73 74  ew->a[i];.    st
3a30: 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65  ruct SrcList_ite
3a40: 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20 26 70  m *pOldItem = &p
3a50: 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e 65 77  ->a[i];.    pNew
3a60: 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20  Item->zDatabase 
3a70: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3a80: 4f 6c 64 49 74 65 6d 2d 3e 7a 44 61 74 61 62 61  OldItem->zDataba
3a90: 73 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  se);.    pNewIte
3aa0: 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74  m->zName = sqlit
3ab0: 65 53 74 72 44 75 70 28 70 4f 6c 64 49 74 65 6d  eStrDup(pOldItem
3ac0: 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e  ->zName);.    pN
3ad0: 65 77 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d  ewItem->zAlias =
3ae0: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
3af0: 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 29 3b  ldItem->zAlias);
3b00: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 6a  .    pNewItem->j
3b10: 6f 69 6e 74 79 70 65 20 3d 20 70 4f 6c 64 49 74  ointype = pOldIt
3b20: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 3b 0a 20 20  em->jointype;.  
3b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 43 75 72    pNewItem->iCur
3b40: 73 6f 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e  sor = pOldItem->
3b50: 69 43 75 72 73 6f 72 3b 0a 20 20 20 20 70 4e 65  iCursor;.    pNe
3b60: 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20 70 4f  wItem->pTab = pO
3b70: 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a 20 20  ldItem->pTab;.  
3b80: 20 20 69 66 28 20 70 4e 65 77 49 74 65 6d 2d 3e    if( pNewItem->
3b90: 70 54 61 62 20 29 7b 0a 20 20 20 20 20 20 70 4e  pTab ){.      pN
3ba0: 65 77 49 74 65 6d 2d 3e 70 54 61 62 2d 3e 69 73  ewItem->pTab->is
3bb0: 54 72 61 6e 73 69 65 6e 74 20 3d 20 30 3b 0a 20  Transient = 0;. 
3bc0: 20 20 20 7d 0a 20 20 20 20 70 4e 65 77 49 74 65     }.    pNewIte
3bd0: 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71 6c  m->pSelect = sql
3be0: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 4f  ite3SelectDup(pO
3bf0: 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 29  ldItem->pSelect)
3c00: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
3c10: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
3c20: 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 70  rDup(pOldItem->p
3c30: 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  On);.    pNewIte
3c40: 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c 69  m->pUsing = sqli
3c50: 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f 6c  te3IdListDup(pOl
3c60: 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a  dItem->pUsing);.
3c70: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f      pNewItem->co
3c80: 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d  lUsed = pOldItem
3c90: 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20  ->colUsed;.  }. 
3ca0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
3cb0: 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49  IdList *sqlite3I
3cc0: 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74 20  dListDup(IdList 
3cd0: 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a 70  *p){.  IdList *p
3ce0: 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  New;.  int i;.  
3cf0: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3d00: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
3d10: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
3d20: 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a  izeof(*pNew) );.
3d30: 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20    if( pNew==0 ) 
3d40: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3d50: 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e 41  ->nId = pNew->nA
3d60: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a 20  lloc = p->nId;. 
3d70: 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69 74   pNew->a = sqlit
3d80: 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e 6e  eMallocRaw( p->n
3d90: 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30  Id*sizeof(p->a[0
3da0: 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  ]) );.  if( pNew
3db0: 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ->a==0 ) return 
3dc0: 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  0;.  for(i=0; i<
3dd0: 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20  p->nId; i++){.  
3de0: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
3df0: 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d  item *pNewItem =
3e00: 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20   &pNew->a[i];.  
3e10: 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f    struct IdList_
3e20: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
3e30: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70   &p->a[i];.    p
3e40: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
3e50: 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f   sqliteStrDup(pO
3e60: 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a  ldItem->zName);.
3e70: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 64      pNewItem->id
3e80: 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 64  x = pOldItem->id
3e90: 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  x;.  }.  return 
3ea0: 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20 2a  pNew;.}.Select *
3eb0: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
3ec0: 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 53  (Select *p){.  S
3ed0: 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20 69  elect *pNew;.  i
3ee0: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3ef0: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3f00: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
3f10: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3f20: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3f30: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73  rn 0;.  pNew->is
3f40: 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69 73  Distinct = p->is
3f50: 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65 77  Distinct;.  pNew
3f60: 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74  ->pEList = sqlit
3f70: 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d  e3ExprListDup(p-
3f80: 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77  >pEList);.  pNew
3f90: 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65 33  ->pSrc = sqlite3
3fa0: 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70 53  SrcListDup(p->pS
3fb0: 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68  rc);.  pNew->pWh
3fc0: 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ere = sqlite3Exp
3fd0: 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29 3b  rDup(p->pWhere);
3fe0: 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70 42  .  pNew->pGroupB
3ff0: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  y = sqlite3ExprL
4000: 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75 70  istDup(p->pGroup
4010: 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48 61  By);.  pNew->pHa
4020: 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45 78  ving = sqlite3Ex
4030: 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e 67  prDup(p->pHaving
4040: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
4050: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
4060: 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72 64  rListDup(p->pOrd
4070: 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 6f  erBy);.  pNew->o
4080: 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e 65  p = p->op;.  pNe
4090: 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c 69  w->pPrior = sqli
40a0: 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e  te3SelectDup(p->
40b0: 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77 2d  pPrior);.  pNew-
40c0: 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74 65  >pLimit = sqlite
40d0: 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69 6d  3ExprDup(p->pLim
40e0: 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 66  it);.  pNew->pOf
40f0: 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45 78  fset = sqlite3Ex
4100: 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65 74  prDup(p->pOffset
4110: 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69  );.  pNew->iLimi
4120: 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e  t = -1;.  pNew->
4130: 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20 20  iOffset = -1;.  
4140: 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65 6d 70  pNew->ppOpenTemp
4150: 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 46   = 0;.  pNew->pF
4160: 65 74 63 68 20 3d 20 30 3b 0a 20 20 70 4e 65 77  etch = 0;.  pNew
4170: 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20 70  ->isResolved = p
4180: 2d 3e 69 73 52 65 73 6f 6c 76 65 64 3b 0a 20 20  ->isResolved;.  
4190: 70 4e 65 77 2d 3e 69 73 41 67 67 20 3d 20 70 2d  pNew->isAgg = p-
41a0: 3e 69 73 41 67 67 3b 0a 20 20 72 65 74 75 72 6e  >isAgg;.  return
41b0: 20 70 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53   pNew;.}.#else.S
41c0: 65 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65  elect *sqlite3Se
41d0: 6c 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a  lectDup(Select *
41e0: 70 29 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d  p){.  assert( p=
41f0: 3d 30 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30  =0 );.  return 0
4200: 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a  ;.}.#endif.../*.
4210: 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
4220: 6d 65 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20  ment to the end 
4230: 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  of an expression
4240: 20 6c 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74   list.  If pList
4250: 20 69 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79   is.** initially
4260: 20 4e 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61   NULL, then crea
4270: 74 65 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  te a new express
4280: 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70  ion list..*/.Exp
4290: 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78  rList *sqlite3Ex
42a0: 70 72 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70  prListAppend(Exp
42b0: 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78  rList *pList, Ex
42c0: 70 72 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e  pr *pExpr, Token
42d0: 20 2a 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20   *pName){.  if( 
42e0: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
42f0: 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61  pList = sqliteMa
4300: 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70  lloc( sizeof(Exp
4310: 72 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66  rList) );.    if
4320: 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20  ( pList==0 ){.  
4330: 20 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78      /* sqlite3Ex
4340: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b  prDelete(pExpr);
4350: 20 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20   // Leak memory 
4360: 69 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20  if malloc fails 
4370: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
4380: 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  0;.    }.    ass
4390: 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  ert( pList->nAll
43a0: 6f 63 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69  oc==0 );.  }.  i
43b0: 66 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  f( pList->nAlloc
43c0: 3c 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29  <=pList->nExpr )
43d0: 7b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c  {.    pList->nAl
43e0: 6c 6f 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c  loc = pList->nAl
43f0: 6c 6f 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70  loc*2 + 4;.    p
4400: 4c 69 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65  List->a = sqlite
4410: 52 65 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61  Realloc(pList->a
4420: 2c 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a  , pList->nAlloc*
4430: 73 69 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b  sizeof(pList->a[
4440: 30 5d 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c  0]));.    if( pL
4450: 69 73 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20  ist->a==0 ){.   
4460: 20 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70     /* sqlite3Exp
4470: 72 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20  rDelete(pExpr); 
4480: 2f 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69  // Leak memory i
4490: 66 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  f malloc fails *
44a0: 2f 0a 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e  /.      pList->n
44b0: 45 78 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41  Expr = pList->nA
44c0: 6c 6c 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20  lloc = 0;.      
44d0: 72 65 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20  return pList;.  
44e0: 20 20 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74    }.  }.  assert
44f0: 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b  ( pList->a!=0 );
4500: 0a 20 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20  .  if( pExpr || 
4510: 70 4e 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72  pName ){.    str
4520: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4530: 6d 20 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73  m *pItem = &pLis
4540: 74 2d 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70  t->a[pList->nExp
4550: 72 2b 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74  r++];.    memset
4560: 28 70 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f  (pItem, 0, sizeo
4570: 66 28 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20  f(*pItem));.    
4580: 70 49 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70  pItem->pExpr = p
4590: 45 78 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d  Expr;.    pItem-
45a0: 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33  >zName = sqlite3
45b0: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e  NameFromToken(pN
45c0: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ame);.  }.  retu
45d0: 72 6e 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a  rn pList;.}../*.
45e0: 2a 2a 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74  ** Delete an ent
45f0: 69 72 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  ire expression l
4600: 69 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ist..*/.void sql
4610: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
4620: 74 65 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  te(ExprList *pLi
4630: 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20  st){.  int i;.  
4640: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
4650: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
4660: 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65  f( pList==0 ) re
4670: 74 75 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20  turn;.  assert( 
4680: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28  pList->a!=0 || (
4690: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20  pList->nExpr==0 
46a0: 26 26 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  && pList->nAlloc
46b0: 3d 3d 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74  ==0) );.  assert
46c0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d  ( pList->nExpr<=
46d0: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b  pList->nAlloc );
46e0: 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69  .  for(pItem=pLi
46f0: 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c  st->a, i=0; i<pL
4700: 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c  ist->nExpr; i++,
4710: 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73   pItem++){.    s
4720: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4730: 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a  (pItem->pExpr);.
4740: 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 70      sqliteFree(p
4750: 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20  Item->zName);.  
4760: 7d 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  }.  sqliteFree(p
4770: 4c 69 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69  List->a);.  sqli
4780: 74 65 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d  teFree(pList);.}
4790: 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20  ../*.** Walk an 
47a0: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
47b0: 20 20 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72    Call xFunc for
47c0: 20 65 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74   each node visit
47d0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65  ed..**.** The re
47e0: 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20  turn value from 
47f0: 78 46 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73  xFunc determines
4800: 20 77 68 65 74 68 65 72 20 74 68 65 20 74 72 65   whether the tre
4810: 65 20 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73  e walk continues
4820: 2e 0a 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e  ..** 0 means con
4830: 74 69 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68  tinue walking th
4840: 65 20 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73  e tree.  1 means
4850: 20 64 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69   do not walk chi
4860: 6c 64 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20  ldren.** of the 
4870: 63 75 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74  current node but
4880: 20 63 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73   continue with s
4890: 69 62 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e  iblings.  2 mean
48a0: 73 20 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65  s abandon.** the
48b0: 20 74 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c   tree walk compl
48c0: 65 74 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65  etely..**.** The
48d0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72   return value fr
48e0: 6f 6d 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  om this routine 
48f0: 69 73 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20  is 1 to abandon 
4900: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a  the tree walk.**
4910: 20 61 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e   and 0 to contin
4920: 75 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e  ue..*/.static in
4930: 74 20 77 61 6c 6b 45 78 70 72 4c 69 73 74 28 45  t walkExprList(E
4940: 78 70 72 4c 69 73 74 20 2a 2c 20 69 6e 74 20 28  xprList *, int (
4950: 2a 29 28 76 6f 69 64 20 2a 2c 20 45 78 70 72 2a  *)(void *, Expr*
4960: 29 2c 20 76 6f 69 64 20 2a 29 3b 0a 73 74 61 74  ), void *);.stat
4970: 69 63 20 69 6e 74 20 77 61 6c 6b 45 78 70 72 54  ic int walkExprT
4980: 72 65 65 28 45 78 70 72 20 2a 70 45 78 70 72 2c  ree(Expr *pExpr,
4990: 20 69 6e 74 20 28 2a 78 46 75 6e 63 29 28 76 6f   int (*xFunc)(vo
49a0: 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76 6f 69 64  id*,Expr*), void
49b0: 20 2a 70 41 72 67 29 7b 0a 20 20 69 6e 74 20 72   *pArg){.  int r
49c0: 63 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  c;.  if( pExpr==
49d0: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
49e0: 72 63 20 3d 20 28 2a 78 46 75 6e 63 29 28 70 41  rc = (*xFunc)(pA
49f0: 72 67 2c 20 70 45 78 70 72 29 3b 0a 20 20 69 66  rg, pExpr);.  if
4a00: 28 20 72 63 3d 3d 30 20 29 7b 0a 20 20 20 20 69  ( rc==0 ){.    i
4a10: 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  f( walkExprTree(
4a20: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 78 46  pExpr->pLeft, xF
4a30: 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72 65 74  unc, pArg) ) ret
4a40: 75 72 6e 20 31 3b 0a 20 20 20 20 69 66 28 20 77  urn 1;.    if( w
4a50: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4a60: 72 2d 3e 70 52 69 67 68 74 2c 20 78 46 75 6e 63  r->pRight, xFunc
4a70: 2c 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e  , pArg) ) return
4a80: 20 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b   1;.    if( walk
4a90: 45 78 70 72 4c 69 73 74 28 70 45 78 70 72 2d 3e  ExprList(pExpr->
4aa0: 70 4c 69 73 74 2c 20 78 46 75 6e 63 2c 20 70 41  pList, xFunc, pA
4ab0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
4ac0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63 3e    }.  return rc>
4ad0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 61 6c 6c  1;.}../*.** Call
4ae0: 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28 29 20   walkExprTree() 
4af0: 66 6f 72 20 65 76 65 72 79 20 65 78 70 72 65 73  for every expres
4b00: 73 69 6f 6e 20 69 6e 20 6c 69 73 74 20 70 2e 0a  sion in list p..
4b10: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77 61  */.static int wa
4b20: 6c 6b 45 78 70 72 4c 69 73 74 28 45 78 70 72 4c  lkExprList(ExprL
4b30: 69 73 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78 46  ist *p, int (*xF
4b40: 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78 70  unc)(void *, Exp
4b50: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
4b60: 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72  {.  int i;.  str
4b70: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
4b80: 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28 20  m *pItem;.  if( 
4b90: 21 70 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  !p ) return 0;. 
4ba0: 20 66 6f 72 28 69 3d 70 2d 3e 6e 45 78 70 72 2c   for(i=p->nExpr,
4bb0: 20 70 49 74 65 6d 3d 70 2d 3e 61 3b 20 69 3e 30   pItem=p->a; i>0
4bc0: 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i--, pItem++){
4bd0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4be0: 72 54 72 65 65 28 70 49 74 65 6d 2d 3e 70 45 78  rTree(pItem->pEx
4bf0: 70 72 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  pr, xFunc, pArg)
4c00: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d   ) return 1;.  }
4c10: 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a  .  return 0;.}..
4c20: 2f 2a 0a 2a 2a 20 43 61 6c 6c 20 77 61 6c 6b 45  /*.** Call walkE
4c30: 78 70 72 54 72 65 65 28 29 20 66 6f 72 20 65 76  xprTree() for ev
4c40: 65 72 79 20 65 78 70 72 65 73 73 69 6f 6e 20 69  ery expression i
4c50: 6e 20 53 65 6c 65 63 74 20 70 2c 20 6e 6f 74 20  n Select p, not 
4c60: 69 6e 63 6c 75 64 69 6e 67 0a 2a 2a 20 65 78 70  including.** exp
4c70: 72 65 73 73 69 6f 6e 73 20 74 68 61 74 20 61 72  ressions that ar
4c80: 65 20 70 61 72 74 20 6f 66 20 73 75 62 2d 73 65  e part of sub-se
4c90: 6c 65 63 74 73 20 69 6e 20 61 6e 79 20 46 52 4f  lects in any FRO
4ca0: 4d 20 63 6c 61 75 73 65 20 6f 72 20 74 68 65 20  M clause or the 
4cb0: 4c 49 4d 49 54 0a 2a 2a 20 6f 72 20 4f 46 46 53  LIMIT.** or OFFS
4cc0: 45 54 20 65 78 70 72 65 73 73 69 6f 6e 73 2e 2e  ET expressions..
4cd0: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 77  .*/.static int w
4ce0: 61 6c 6b 53 65 6c 65 63 74 45 78 70 72 28 53 65  alkSelectExpr(Se
4cf0: 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20 28 2a 78  lect *p, int (*x
4d00: 46 75 6e 63 29 28 76 6f 69 64 20 2a 2c 20 45 78  Func)(void *, Ex
4d10: 70 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67  pr*), void *pArg
4d20: 29 7b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  ){.  walkExprLis
4d30: 74 28 70 2d 3e 70 45 4c 69 73 74 2c 20 78 46 75  t(p->pEList, xFu
4d40: 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77 61 6c  nc, pArg);.  wal
4d50: 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70 57 68  kExprTree(p->pWh
4d60: 65 72 65 2c 20 78 46 75 6e 63 2c 20 70 41 72 67  ere, xFunc, pArg
4d70: 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72 4c 69 73  );.  walkExprLis
4d80: 74 28 70 2d 3e 70 47 72 6f 75 70 42 79 2c 20 78  t(p->pGroupBy, x
4d90: 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a 20 20 77  Func, pArg);.  w
4da0: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2d 3e 70  alkExprTree(p->p
4db0: 48 61 76 69 6e 67 2c 20 78 46 75 6e 63 2c 20 70  Having, xFunc, p
4dc0: 41 72 67 29 3b 0a 20 20 77 61 6c 6b 45 78 70 72  Arg);.  walkExpr
4dd0: 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72 42 79  List(p->pOrderBy
4de0: 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29 3b 0a  , xFunc, pArg);.
4df0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 0a    return 0;.}...
4e00: 2f 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  /*.** This routi
4e10: 6e 65 20 69 73 20 64 65 73 69 67 6e 65 64 20 61  ne is designed a
4e20: 73 20 61 6e 20 78 46 75 6e 63 20 66 6f 72 20 77  s an xFunc for w
4e30: 61 6c 6b 45 78 70 72 54 72 65 65 28 29 2e 0a 2a  alkExprTree()..*
4e40: 2a 0a 2a 2a 20 70 41 72 67 20 69 73 20 72 65 61  *.** pArg is rea
4e50: 6c 6c 79 20 61 20 70 6f 69 6e 74 65 72 20 74 6f  lly a pointer to
4e60: 20 61 6e 20 69 6e 74 65 67 65 72 2e 20 20 49 66   an integer.  If
4e70: 20 77 65 20 63 61 6e 20 74 65 6c 6c 20 62 79 20   we can tell by 
4e80: 6c 6f 6f 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45  looking.** at pE
4e90: 78 70 72 20 74 68 61 74 20 74 68 65 20 65 78 70  xpr that the exp
4ea0: 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e  ression that con
4eb0: 74 61 69 6e 73 20 70 45 78 70 72 20 69 73 20 6e  tains pExpr is n
4ec0: 6f 74 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a  ot a constant.**
4ed0: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 74 68 65   expression, the
4ee0: 6e 20 73 65 74 20 2a 70 41 72 67 20 74 6f 20 30  n set *pArg to 0
4ef0: 20 61 6e 64 20 72 65 74 75 72 6e 20 32 20 74 6f   and return 2 to
4f00: 20 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65   abandon the tre
4f10: 65 20 77 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45  e walk..** If pE
4f20: 78 70 72 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f  xpr does does no
4f30: 74 20 64 69 73 71 75 61 6c 69 66 79 20 74 68 65  t disqualify the
4f40: 20 65 78 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d   expression from
4f50: 20 62 65 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e   being a constan
4f60: 74 0a 2a 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74  t.** then do not
4f70: 68 69 6e 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65  hing..**.** Afte
4f80: 72 20 77 61 6c 6b 69 6e 67 20 74 68 65 20 77 68  r walking the wh
4f90: 6f 6c 65 20 74 72 65 65 2c 20 69 66 20 6e 6f 20  ole tree, if no 
4fa0: 6e 6f 64 65 73 20 61 72 65 20 66 6f 75 6e 64 20  nodes are found 
4fb0: 74 68 61 74 20 64 69 73 71 75 61 6c 69 66 79 0a  that disqualify.
4fc0: 2a 2a 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  ** the expressio
4fd0: 6e 20 61 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74  n as constant, t
4fe0: 68 65 6e 20 77 65 20 61 73 73 75 6d 65 20 74 68  hen we assume th
4ff0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
5000: 6f 6e 0a 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e  on.** is constan
5010: 74 2e 20 20 53 65 65 20 73 71 6c 69 74 65 33 45  t.  See sqlite3E
5020: 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 29 20  xprIsConstant() 
5030: 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69  for additional i
5040: 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73  nformation..*/.s
5050: 74 61 74 69 63 20 69 6e 74 20 65 78 70 72 4e 6f  tatic int exprNo
5060: 64 65 49 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69  deIsConstant(voi
5070: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
5080: 45 78 70 72 29 7b 0a 20 20 73 77 69 74 63 68 28  Expr){.  switch(
5090: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
50a0: 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20    case TK_ID:.  
50b0: 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e    case TK_COLUMN
50c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 44 4f  :.    case TK_DO
50d0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  T:.    case TK_A
50e0: 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20  GG_FUNCTION:.   
50f0: 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f   case TK_FUNCTIO
5100: 4e 3a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54  N:.#ifndef SQLIT
5110: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
5120: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
5130: 43 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  CT:.    case TK_
5140: 45 58 49 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20  EXISTS:.#endif. 
5150: 20 20 20 20 20 2a 28 28 69 6e 74 2a 29 70 41 72       *((int*)pAr
5160: 67 29 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  g) = 0;.      re
5170: 74 75 72 6e 20 32 3b 0a 20 20 20 20 64 65 66 61  turn 2;.    defa
5180: 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74 75 72  ult:.      retur
5190: 6e 20 30 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  n 0;.  }.}../*.*
51a0: 2a 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73  * Walk an expres
51b0: 73 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75  sion tree.  Retu
51c0: 72 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72  rn 1 if the expr
51d0: 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61  ession is consta
51e0: 6e 74 0a 2a 2a 20 61 6e 64 20 30 20 69 66 20 69  nt.** and 0 if i
51f0: 74 20 69 6e 76 6f 6c 76 65 73 20 76 61 72 69 61  t involves varia
5200: 62 6c 65 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20  bles..**.** For 
5210: 74 68 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20  the purposes of 
5220: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61  this function, a
5230: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73   double-quoted s
5240: 74 72 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22  tring (ex: "abc"
5250: 29 0a 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72  ).** is consider
5260: 65 64 20 61 20 76 61 72 69 61 62 6c 65 20 62 75  ed a variable bu
5270: 74 20 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65  t a single-quote
5280: 64 20 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61  d string (ex: 'a
5290: 62 63 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e  bc') is.** a con
52a0: 73 74 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71  stant..*/.int sq
52b0: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
52c0: 61 6e 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ant(Expr *p){.  
52d0: 69 6e 74 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b  int isConst = 1;
52e0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
52f0: 70 2c 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e  p, exprNodeIsCon
5300: 73 74 61 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29  stant, &isConst)
5310: 3b 0a 20 20 72 65 74 75 72 6e 20 69 73 43 6f 6e  ;.  return isCon
5320: 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20  st;.}../*.** If 
5330: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 70  the expression p
5340: 20 63 6f 64 65 73 20 61 20 63 6f 6e 73 74 61 6e   codes a constan
5350: 74 20 69 6e 74 65 67 65 72 20 74 68 61 74 20 69  t integer that i
5360: 73 20 73 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a  s small enough.*
5370: 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 33 32  * to fit in a 32
5380: 2d 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65  -bit integer, re
5390: 74 75 72 6e 20 31 20 61 6e 64 20 70 75 74 20 74  turn 1 and put t
53a0: 68 65 20 76 61 6c 75 65 20 6f 66 20 74 68 65 20  he value of the 
53b0: 69 6e 74 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70  integer.** in *p
53c0: 56 61 6c 75 65 2e 20 20 49 66 20 74 68 65 20 65  Value.  If the e
53d0: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74  xpression is not
53e0: 20 61 6e 20 69 6e 74 65 67 65 72 20 6f 72 20 69   an integer or i
53f0: 66 20 69 74 20 69 73 20 74 6f 6f 20 62 69 67 0a  f it is too big.
5400: 2a 2a 20 74 6f 20 66 69 74 20 69 6e 20 61 20 73  ** to fit in a s
5410: 69 67 6e 65 64 20 33 32 2d 62 69 74 20 69 6e 74  igned 32-bit int
5420: 65 67 65 72 2c 20 72 65 74 75 72 6e 20 30 20 61  eger, return 0 a
5430: 6e 64 20 6c 65 61 76 65 20 2a 70 56 61 6c 75 65  nd leave *pValue
5440: 20 75 6e 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69   unchanged..*/.i
5450: 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 49 73  nt sqlite3ExprIs
5460: 49 6e 74 65 67 65 72 28 45 78 70 72 20 2a 70 2c  Integer(Expr *p,
5470: 20 69 6e 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20   int *pValue){. 
5480: 20 73 77 69 74 63 68 28 20 70 2d 3e 6f 70 20 29   switch( p->op )
5490: 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  {.    case TK_IN
54a0: 54 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 69  TEGER: {.      i
54b0: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
54c0: 33 32 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  32(p->token.z, p
54d0: 56 61 6c 75 65 29 20 29 7b 0a 20 20 20 20 20 20  Value) ){.      
54e0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
54f0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
5500: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5510: 54 4b 5f 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20  TK_UPLUS: {.    
5520: 20 20 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33    return sqlite3
5530: 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70 2d  ExprIsInteger(p-
5540: 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75 65 29 3b  >pLeft, pValue);
5550: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
5560: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
5570: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
5580: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
5590: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
55a0: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
55b0: 20 20 2a 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a    *pValue = -v;.
55c0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 31          return 1
55d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
55e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
55f0: 20 64 65 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b   default: break;
5600: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
5610: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
5620: 20 54 52 55 45 20 69 66 20 74 68 65 20 67 69 76   TRUE if the giv
5630: 65 6e 20 73 74 72 69 6e 67 20 69 73 20 61 20 72  en string is a r
5640: 6f 77 2d 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d  ow-id column nam
5650: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
5660: 33 49 73 52 6f 77 69 64 28 63 6f 6e 73 74 20 63  3IsRowid(const c
5670: 68 61 72 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73  har *z){.  if( s
5680: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c  qlite3StrICmp(z,
5690: 20 22 5f 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29   "_ROWID_")==0 )
56a0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
56b0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
56c0: 7a 2c 20 22 52 4f 57 49 44 22 29 3d 3d 30 20 29  z, "ROWID")==0 )
56d0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66 28   return 1;.  if(
56e0: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
56f0: 7a 2c 20 22 4f 49 44 22 29 3d 3d 30 20 29 20 72  z, "OID")==0 ) r
5700: 65 74 75 72 6e 20 31 3b 0a 20 20 72 65 74 75 72  eturn 1;.  retur
5710: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69  n 0;.}../*.** Gi
5720: 76 65 6e 20 74 68 65 20 6e 61 6d 65 20 6f 66 20  ven the name of 
5730: 61 20 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20  a column of the 
5740: 66 6f 72 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e  form X.Y.Z or Y.
5750: 5a 20 6f 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f  Z or just Z, loo
5760: 6b 20 75 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d  k up.** that nam
5770: 65 20 69 6e 20 74 68 65 20 73 65 74 20 6f 66 20  e in the set of 
5780: 73 6f 75 72 63 65 20 74 61 62 6c 65 73 20 69 6e  source tables in
5790: 20 70 53 72 63 4c 69 73 74 20 61 6e 64 20 6d 61   pSrcList and ma
57a0: 6b 65 20 74 68 65 20 70 45 78 70 72 20 0a 2a 2a  ke the pExpr .**
57b0: 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65   expression node
57c0: 20 72 65 66 65 72 20 62 61 63 6b 20 74 6f 20 74   refer back to t
57d0: 68 61 74 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d  hat source colum
57e0: 6e 2e 20 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e  n.  The followin
57f0: 67 20 63 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65  g changes.** are
5800: 20 6d 61 64 65 20 74 6f 20 70 45 78 70 72 3a 0a   made to pExpr:.
5810: 2a 2a 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  **.**    pExpr->
5820: 69 44 62 20 20 20 20 20 20 20 20 20 20 20 53 65  iDb           Se
5830: 74 20 74 68 65 20 69 6e 64 65 78 20 69 6e 20 64  t the index in d
5840: 62 2d 3e 61 44 62 5b 5d 20 6f 66 20 74 68 65 20  b->aDb[] of the 
5850: 64 61 74 61 62 61 73 65 20 68 6f 6c 64 69 6e 67  database holding
5860: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20  .**             
5870: 20 20 20 20 20 20 20 20 20 20 20 20 74 68 65 20              the 
5880: 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78  table..**    pEx
5890: 70 72 2d 3e 69 54 61 62 6c 65 20 20 20 20 20 20  pr->iTable      
58a0: 20 20 53 65 74 20 74 6f 20 74 68 65 20 63 75 72    Set to the cur
58b0: 73 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 74  sor number for t
58c0: 68 65 20 74 61 62 6c 65 20 6f 62 74 61 69 6e 65  he table obtaine
58d0: 64 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20  d.**            
58e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 66 72 6f               fro
58f0: 6d 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20  m pSrcList..**  
5900: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
5910: 20 20 20 20 20 20 20 53 65 74 20 74 6f 20 74 68         Set to th
5920: 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20  e column number 
5930: 77 69 74 68 69 6e 20 74 68 65 20 74 61 62 6c 65  within the table
5940: 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f  ..**    pExpr->o
5950: 70 20 20 20 20 20 20 20 20 20 20 20 20 53 65 74  p            Set
5960: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a   to TK_COLUMN..*
5970: 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66  *    pExpr->pLef
5980: 74 20 20 20 20 20 20 20 20 20 41 6e 79 20 65 78  t         Any ex
5990: 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70 6f  pression this po
59a0: 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65 74  ints to is delet
59b0: 65 64 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  ed.**    pExpr->
59c0: 70 52 69 67 68 74 20 20 20 20 20 20 20 20 41 6e  pRight        An
59d0: 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68 69  y expression thi
59e0: 73 20 70 6f 69 6e 74 73 20 74 6f 20 69 73 20 64  s points to is d
59f0: 65 6c 65 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68  eleted..**.** Th
5a00: 65 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 74 68  e pDbToken is th
5a10: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  e name of the da
5a20: 74 61 62 61 73 65 20 28 74 68 65 20 22 58 22 29  tabase (the "X")
5a30: 2e 20 20 54 68 69 73 20 76 61 6c 75 65 20 6d 61  .  This value ma
5a40: 79 20 62 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61  y be.** NULL mea
5a50: 6e 69 6e 67 20 74 68 61 74 20 6e 61 6d 65 20 69  ning that name i
5a60: 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 59 2e  s of the form Y.
5a70: 5a 20 6f 72 20 5a 2e 20 20 41 6e 79 20 61 76 61  Z or Z.  Any ava
5a80: 69 6c 61 62 6c 65 20 64 61 74 61 62 61 73 65 0a  ilable database.
5a90: 2a 2a 20 63 61 6e 20 62 65 20 75 73 65 64 2e 20  ** can be used. 
5aa0: 20 54 68 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e   The pTableToken
5ab0: 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   is the name of 
5ac0: 74 68 65 20 74 61 62 6c 65 20 28 74 68 65 20 22  the table (the "
5ad0: 59 22 29 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61  Y").  This.** va
5ae0: 6c 75 65 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20  lue can be NULL 
5af0: 69 66 20 70 44 62 54 6f 6b 65 6e 20 69 73 20 61  if pDbToken is a
5b00: 6c 73 6f 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54  lso NULL.  If pT
5b10: 61 62 6c 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c  ableToken is NUL
5b20: 4c 20 69 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68  L it.** means th
5b30: 61 74 20 74 68 65 20 66 6f 72 6d 20 6f 66 20 74  at the form of t
5b40: 68 65 20 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64  he name is Z and
5b50: 20 74 68 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72   that columns fr
5b60: 6f 6d 20 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20  om any table.** 
5b70: 63 61 6e 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a  can be used..**.
5b80: 2a 2a 20 49 66 20 74 68 65 20 6e 61 6d 65 20 63  ** If the name c
5b90: 61 6e 6e 6f 74 20 62 65 20 72 65 73 6f 6c 76 65  annot be resolve
5ba0: 64 20 75 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c  d unambiguously,
5bb0: 20 6c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   leave an error 
5bc0: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
5bd0: 61 72 73 65 20 61 6e 64 20 72 65 74 75 72 6e 20  arse and return 
5be0: 6e 6f 6e 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72  non-zero.  Retur
5bf0: 6e 20 7a 65 72 6f 20 6f 6e 20 73 75 63 63 65 73  n zero on succes
5c00: 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  s..*/.static int
5c10: 20 6c 6f 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50   lookupName(.  P
5c20: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
5c30: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
5c40: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54  g context */.  T
5c50: 6f 6b 65 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20  oken *pDbToken, 
5c60: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5c70: 68 65 20 64 61 74 61 62 61 73 65 20 63 6f 6e 74  he database cont
5c80: 61 69 6e 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72  aining table, or
5c90: 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e   NULL */.  Token
5ca0: 20 2a 70 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20   *pTableToken,  
5cb0: 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65  /* Name of table
5cc0: 20 63 6f 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75   containing colu
5cd0: 6d 6e 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20  mn, or NULL */. 
5ce0: 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54   Token *pColumnT
5cf0: 6f 6b 65 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66  oken, /* Name of
5d00: 20 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a   the column. */.
5d10: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
5d20: 4e 43 2c 20 20 20 20 2f 2a 20 54 68 65 20 6e 61  NC,    /* The na
5d30: 6d 65 20 63 6f 6e 74 65 78 74 20 75 73 65 64 20  me context used 
5d40: 74 6f 20 72 65 73 6f 6c 76 65 20 74 68 65 20 6e  to resolve the n
5d50: 61 6d 65 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ame */.  Expr *p
5d60: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f 2a  Expr          /*
5d70: 20 4d 61 6b 65 20 74 68 69 73 20 45 58 50 52 20   Make this EXPR 
5d80: 6e 6f 64 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  node point to th
5d90: 65 20 73 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d  e selected colum
5da0: 6e 20 2a 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a  n */.){.  char *
5db0: 7a 44 62 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  zDb = 0;       /
5dc0: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 64 61  * Name of the da
5dd0: 74 61 62 61 73 65 2e 20 20 54 68 65 20 22 58 22  tabase.  The "X"
5de0: 20 69 6e 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63   in X.Y.Z */.  c
5df0: 68 61 72 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20  har *zTab = 0;  
5e00: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5e10: 68 65 20 74 61 62 6c 65 2e 20 20 54 68 65 20 22  he table.  The "
5e20: 59 22 20 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59  Y" in X.Y.Z or Y
5e30: 2e 5a 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43  .Z */.  char *zC
5e40: 6f 6c 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20  ol = 0;      /* 
5e50: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
5e60: 6d 6e 2e 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a  mn.  The "Z" */.
5e70: 20 20 69 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20    int i, j;     
5e80: 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63         /* Loop c
5e90: 6f 75 6e 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74  ounters */.  int
5ea0: 20 63 6e 74 20 3d 20 30 3b 20 20 20 20 20 20 20   cnt = 0;       
5eb0: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d    /* Number of m
5ec0: 61 74 63 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e  atching column n
5ed0: 61 6d 65 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ames */.  int cn
5ee0: 74 54 61 62 20 3d 20 30 3b 20 20 20 20 20 20 2f  tTab = 0;      /
5ef0: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
5f00: 68 69 6e 67 20 74 61 62 6c 65 20 6e 61 6d 65 73  hing table names
5f10: 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 20 2a 64   */.  sqlite3 *d
5f20: 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 20  b = pParse->db; 
5f30: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
5f40: 20 2a 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63   */.  struct Src
5f50: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
5f60: 3b 20 20 20 20 20 20 20 2f 2a 20 55 73 65 20 66  ;       /* Use f
5f70: 6f 72 20 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20  or looping over 
5f80: 70 53 72 63 4c 69 73 74 20 69 74 65 6d 73 20 2a  pSrcList items *
5f90: 2f 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69  /.  struct SrcLi
5fa0: 73 74 5f 69 74 65 6d 20 2a 70 4d 61 74 63 68 20  st_item *pMatch 
5fb0: 3d 20 30 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74  = 0;  /* The mat
5fc0: 63 68 69 6e 67 20 70 53 72 63 4c 69 73 74 20 69  ching pSrcList i
5fd0: 74 65 6d 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  tem */.  NameCon
5fe0: 74 65 78 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70  text *pTopNC = p
5ff0: 4e 43 3b 20 20 20 20 20 20 20 20 2f 2a 20 46 69  NC;        /* Fi
6000: 72 73 74 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20  rst namecontext 
6010: 69 6e 20 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a  in the list */..
6020: 20 20 61 73 73 65 72 74 28 20 70 43 6f 6c 75 6d    assert( pColum
6030: 6e 54 6f 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d  nToken && pColum
6040: 6e 54 6f 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20  nToken->z ); /* 
6050: 54 68 65 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63  The Z in X.Y.Z c
6060: 61 6e 6e 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f  annot be NULL */
6070: 0a 20 20 7a 44 62 20 3d 20 73 71 6c 69 74 65 33  .  zDb = sqlite3
6080: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44  NameFromToken(pD
6090: 62 54 6f 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20  bToken);.  zTab 
60a0: 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f  = sqlite3NameFro
60b0: 6d 54 6f 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b  mToken(pTableTok
60c0: 65 6e 29 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71  en);.  zCol = sq
60d0: 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b  lite3NameFromTok
60e0: 65 6e 28 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29  en(pColumnToken)
60f0: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 5f  ;.  if( sqlite3_
6100: 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b  malloc_failed ){
6110: 0a 20 20 20 20 72 65 74 75 72 6e 20 31 3b 20 20  .    return 1;  
6120: 2f 2a 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28  /* Leak memory (
6130: 7a 44 62 20 61 6e 64 20 7a 54 61 62 29 20 69 66  zDb and zTab) if
6140: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
6150: 0a 20 20 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69  .  }..  pExpr->i
6160: 54 61 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68  Table = -1;.  wh
6170: 69 6c 65 28 20 70 4e 43 20 26 26 20 63 6e 74 3d  ile( pNC && cnt=
6180: 3d 30 20 29 7b 0a 20 20 20 20 53 72 63 4c 69 73  =0 ){.    SrcLis
6190: 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
61a0: 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 20  C->pSrcList;.   
61b0: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
61c0: 74 20 3d 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b  t = pNC->pEList;
61d0: 0a 0a 20 20 20 20 70 4e 43 2d 3e 6e 52 65 66 2b  ..    pNC->nRef+
61e0: 2b 3b 0a 20 20 20 20 2f 2a 20 61 73 73 65 72 74  +;.    /* assert
61f0: 28 20 7a 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c  ( zTab==0 || pEL
6200: 69 73 74 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20  ist==0 ); */.   
6210: 20 69 66 28 20 70 53 72 63 4c 69 73 74 20 29 7b   if( pSrcList ){
6220: 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 2c 20  .      for(i=0, 
6230: 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e  pItem=pSrcList->
6240: 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e  a; i<pSrcList->n
6250: 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  Src; i++, pItem+
6260: 2b 29 7b 0a 20 20 20 20 20 20 20 20 54 61 62 6c  +){.        Tabl
6270: 65 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d  e *pTab = pItem-
6280: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 20 20 43  >pTab;.        C
6290: 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a  olumn *pCol;.  .
62a0: 20 20 20 20 20 20 20 20 69 66 28 20 70 54 61 62          if( pTab
62b0: 3d 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a  ==0 ) continue;.
62c0: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
62d0: 70 54 61 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a  pTab->nCol>0 );.
62e0: 20 20 20 20 20 20 20 20 69 66 28 20 7a 54 61 62          if( zTab
62f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 69 66   ){.          if
6300: 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20  ( pItem->zAlias 
6310: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 63  ){.            c
6320: 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20  har *zTabName = 
6330: 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20  pItem->zAlias;. 
6340: 20 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73             if( s
6350: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54  qlite3StrICmp(zT
6360: 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30  abName, zTab)!=0
6370: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
6380: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
6390: 20 20 20 20 20 20 20 20 20 20 63 68 61 72 20 2a            char *
63a0: 7a 54 61 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d  zTabName = pTab-
63b0: 3e 7a 4e 61 6d 65 3b 0a 20 20 20 20 20 20 20 20  >zName;.        
63c0: 20 20 20 20 69 66 28 20 7a 54 61 62 4e 61 6d 65      if( zTabName
63d0: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 53 74  ==0 || sqlite3St
63e0: 72 49 43 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20  rICmp(zTabName, 
63f0: 7a 54 61 62 29 21 3d 30 20 29 20 63 6f 6e 74 69  zTab)!=0 ) conti
6400: 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  nue;.           
6410: 20 69 66 28 20 7a 44 62 21 3d 30 20 26 26 20 73   if( zDb!=0 && s
6420: 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 64 62  qlite3StrICmp(db
6430: 2d 3e 61 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d  ->aDb[pTab->iDb]
6440: 2e 7a 4e 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20  .zName, zDb)!=0 
6450: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  ){.             
6460: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20   continue;.     
6470: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6480: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20     }.        }. 
6490: 20 20 20 20 20 20 20 69 66 28 20 30 3d 3d 28 63         if( 0==(c
64a0: 6e 74 54 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20  ntTab++) ){.    
64b0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
64c0: 62 6c 65 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75  ble = pItem->iCu
64d0: 72 73 6f 72 3b 0a 20 20 20 20 20 20 20 20 20 20  rsor;.          
64e0: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
64f0: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
6500: 20 20 70 4d 61 74 63 68 20 3d 20 70 49 74 65 6d    pMatch = pItem
6510: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6520: 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f      for(j=0, pCo
6530: 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c  l=pTab->aCol; j<
6540: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
6550: 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20   pCol++){.      
6560: 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53      if( sqlite3S
6570: 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61  trICmp(pCol->zNa
6580: 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a  me, zCol)==0 ){.
6590: 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b              cnt+
65a0: 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  +;.            p
65b0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70  Expr->iTable = p
65c0: 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20  Item->iCursor;. 
65d0: 20 20 20 20 20 20 20 20 20 20 20 70 4d 61 74 63             pMatc
65e0: 68 20 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20  h = pItem;.     
65f0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 44         pExpr->iD
6600: 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20  b = pTab->iDb;. 
6610: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53 75             /* Su
6620: 62 73 74 69 74 75 74 65 20 74 68 65 20 72 6f 77  bstitute the row
6630: 69 64 20 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66  id (column -1) f
6640: 6f 72 20 74 68 65 20 49 4e 54 45 47 45 52 20 50  or the INTEGER P
6650: 52 49 4d 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20  RIMARY KEY */.  
6660: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6670: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54  >iColumn = j==pT
6680: 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a  ab->iPKey ? -1 :
6690: 20 6a 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   j;.            
66a0: 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20  pExpr->affinity 
66b0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
66c0: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
66d0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43 6f        pExpr->pCo
66e0: 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ll = pTab->aCol[
66f0: 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20  j].pColl;.      
6700: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
6710: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
6720: 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d   }.      }.    }
6730: 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  ..#ifndef SQLITE
6740: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
6750: 20 20 2f 2a 20 49 66 20 77 65 20 68 61 76 65 20    /* If we have 
6760: 6e 6f 74 20 61 6c 72 65 61 64 79 20 72 65 73 6f  not already reso
6770: 6c 76 65 64 20 74 68 65 20 6e 61 6d 65 2c 20 74  lved the name, t
6780: 68 65 6e 20 6d 61 79 62 65 20 0a 20 20 20 20 2a  hen maybe .    *
6790: 2a 20 69 74 20 69 73 20 61 20 6e 65 77 2e 2a 20  * it is a new.* 
67a0: 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72  or old.* trigger
67b0: 20 61 72 67 75 6d 65 6e 74 20 72 65 66 65 72 65   argument refere
67c0: 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69  nce.    */.    i
67d0: 66 28 20 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61  f( zDb==0 && zTa
67e0: 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d 30 20 26  b!=0 && cnt==0 &
67f0: 26 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74  & pParse->trigSt
6800: 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  ack!=0 ){.      
6810: 54 72 69 67 67 65 72 53 74 61 63 6b 20 2a 70 54  TriggerStack *pT
6820: 72 69 67 67 65 72 53 74 61 63 6b 20 3d 20 70 50  riggerStack = pP
6830: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b  arse->trigStack;
6840: 0a 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54  .      Table *pT
6850: 61 62 20 3d 20 30 3b 0a 20 20 20 20 20 20 69 66  ab = 0;.      if
6860: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6870: 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31 20 26 26  >newIdx != -1 &&
6880: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6890: 22 6e 65 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20  "new", zTab) == 
68a0: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78  0 ){.        pEx
68b0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72  pr->iTable = pTr
68c0: 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49  iggerStack->newI
68d0: 64 78 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65  dx;.        asse
68e0: 72 74 28 20 70 54 72 69 67 67 65 72 53 74 61 63  rt( pTriggerStac
68f0: 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20  k->pTab );.     
6900: 20 20 20 70 54 61 62 20 3d 20 70 54 72 69 67 67     pTab = pTrigg
6910: 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20  erStack->pTab;. 
6920: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
6930: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c  TriggerStack->ol
6940: 64 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  dIdx != -1 && sq
6950: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6f 6c  lite3StrICmp("ol
6960: 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a  d", zTab)==0 ){.
6970: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
6980: 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67 65 72  Table = pTrigger
6990: 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20  Stack->oldIdx;. 
69a0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
69b0: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54  TriggerStack->pT
69c0: 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20 70 54  ab );.        pT
69d0: 61 62 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  ab = pTriggerSta
69e0: 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20 20 20  ck->pTab;.      
69f0: 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 70 54 61  }..      if( pTa
6a00: 62 20 29 7b 20 0a 20 20 20 20 20 20 20 20 69 6e  b ){ .        in
6a10: 74 20 6a 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c  t j;.        Col
6a20: 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62  umn *pCol = pTab
6a30: 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20  ->aCol;..       
6a40: 20 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54   pExpr->iDb = pT
6a50: 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20  ab->iDb;.       
6a60: 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20   cntTab++;.     
6a70: 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20     for(j=0; j < 
6a80: 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c  pTab->nCol; j++,
6a90: 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20   pCol++) {.     
6aa0: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6ab0: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
6ac0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
6ad0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 63 6e 74  .            cnt
6ae0: 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  ++;.            
6af0: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d  pExpr->iColumn =
6b00: 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20   j==pTab->iPKey 
6b10: 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20  ? -1 : j;.      
6b20: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66        pExpr->aff
6b30: 69 6e 69 74 79 20 3d 20 70 54 61 62 2d 3e 61 43  inity = pTab->aC
6b40: 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a  ol[j].affinity;.
6b50: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6b60: 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d  r->pColl = pTab-
6b70: 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a  >aCol[j].pColl;.
6b80: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6b90: 72 2d 3e 70 54 61 62 20 3d 20 70 54 61 62 3b 0a  r->pTab = pTab;.
6ba0: 20 20 20 20 20 20 20 20 20 20 20 20 62 72 65 61              brea
6bb0: 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20  k;.          }. 
6bc0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
6bd0: 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a  .    }.#endif /*
6be0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
6bf0: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 2a  _OMIT_TRIGGER) *
6c00: 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a  /..    /*.    **
6c10: 20 50 65 72 68 61 70 73 20 74 68 65 20 6e 61 6d   Perhaps the nam
6c20: 65 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65  e is a reference
6c30: 20 74 6f 20 74 68 65 20 52 4f 57 49 44 0a 20 20   to the ROWID.  
6c40: 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e 74    */.    if( cnt
6c50: 3d 3d 30 20 26 26 20 63 6e 74 54 61 62 3d 3d 31  ==0 && cntTab==1
6c60: 20 26 26 20 73 71 6c 69 74 65 33 49 73 52 6f 77   && sqlite3IsRow
6c70: 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20  id(zCol) ){.    
6c80: 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20    cnt = 1;.     
6c90: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
6ca0: 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70 45 78 70  = -1;.      pExp
6cb0: 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 53 51  r->affinity = SQ
6cc0: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
6cd0: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a  ;.    }..    /*.
6ce0: 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 69 6e      ** If the in
6cf0: 70 75 74 20 69 73 20 6f 66 20 74 68 65 20 66 6f  put is of the fo
6d00: 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72  rm Z (not Y.Z or
6d10: 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20 74 68 65   X.Y.Z) then the
6d20: 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d   name Z.    ** m
6d30: 69 67 68 74 20 72 65 66 65 72 20 74 6f 20 61 6e  ight refer to an
6d40: 20 72 65 73 75 6c 74 2d 73 65 74 20 61 6c 69 61   result-set alia
6d50: 73 2e 20 20 54 68 69 73 20 68 61 70 70 65 6e 73  s.  This happens
6d60: 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77  , for example, w
6d70: 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65 20 61 72  hen.    ** we ar
6d80: 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65  e resolving name
6d90: 73 20 69 6e 20 74 68 65 20 57 48 45 52 45 20 63  s in the WHERE c
6da0: 6c 61 75 73 65 20 6f 66 20 74 68 65 20 66 6f 6c  lause of the fol
6db0: 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a  lowing command:.
6dc0: 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20      **.    **   
6dd0: 20 20 53 45 4c 45 43 54 20 61 2b 62 20 41 53 20    SELECT a+b AS 
6de0: 78 20 46 52 4f 4d 20 74 61 62 6c 65 20 57 48 45  x FROM table WHE
6df0: 52 45 20 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a  RE x<10;.    **.
6e00: 20 20 20 20 2a 2a 20 49 6e 20 63 61 73 65 73 20      ** In cases 
6e10: 6c 69 6b 65 20 74 68 69 73 2c 20 72 65 70 6c 61  like this, repla
6e20: 63 65 20 70 45 78 70 72 20 77 69 74 68 20 61 20  ce pExpr with a 
6e30: 63 6f 70 79 20 6f 66 20 74 68 65 20 65 78 70 72  copy of the expr
6e40: 65 73 73 69 6f 6e 20 74 68 61 74 0a 20 20 20 20  ession that.    
6e50: 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20 72 65 73  ** forms the res
6e60: 75 6c 74 20 73 65 74 20 65 6e 74 72 79 20 28 22  ult set entry ("
6e70: 61 2b 62 22 20 69 6e 20 74 68 65 20 65 78 61 6d  a+b" in the exam
6e80: 70 6c 65 29 20 61 6e 64 20 72 65 74 75 72 6e 20  ple) and return 
6e90: 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a 20 20 20  immediately..   
6ea0: 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20 74 68   ** Note that th
6eb0: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20  e expression in 
6ec0: 74 68 65 20 72 65 73 75 6c 74 20 73 65 74 20 73  the result set s
6ed0: 68 6f 75 6c 64 20 68 61 76 65 20 61 6c 72 65 61  hould have alrea
6ee0: 64 79 20 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72  dy been.    ** r
6ef0: 65 73 6f 6c 76 65 64 20 62 79 20 74 68 65 20 74  esolved by the t
6f00: 69 6d 65 20 74 68 65 20 57 48 45 52 45 20 63 6c  ime the WHERE cl
6f10: 61 75 73 65 20 69 73 20 72 65 73 6f 6c 76 65 64  ause is resolved
6f20: 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
6f30: 20 63 6e 74 3d 3d 30 20 26 26 20 70 45 4c 69 73   cnt==0 && pELis
6f40: 74 21 3d 30 20 26 26 20 7a 54 61 62 3d 3d 30 20  t!=0 && zTab==0 
6f50: 29 7b 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30  ){.      for(j=0
6f60: 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70  ; j<pEList->nExp
6f70: 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; j++){.       
6f80: 20 63 68 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c   char *zAs = pEL
6f90: 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b  ist->a[j].zName;
6fa0: 0a 20 20 20 20 20 20 20 20 69 66 28 20 7a 41 73  .        if( zAs
6fb0: 21 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74  !=0 && sqlite3St
6fc0: 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29  rICmp(zAs, zCol)
6fd0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 20  ==0 ){.         
6fe0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
6ff0: 70 4c 65 66 74 3d 3d 30 20 26 26 20 70 45 78 70  pLeft==0 && pExp
7000: 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a  r->pRight==0 );.
7010: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
7020: 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20  >op = TK_AS;.   
7030: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
7040: 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20  olumn = j;.     
7050: 20 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 65 66       pExpr->pLef
7060: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
7070: 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e  up(pEList->a[j].
7080: 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20  pExpr);.        
7090: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f    sqliteFree(zCo
70a0: 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20 61 73  l);.          as
70b0: 73 65 72 74 28 20 7a 54 61 62 3d 3d 30 20 26 26  sert( zTab==0 &&
70c0: 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20   zDb==0 );.     
70d0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
70e0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d         }.      }
70f0: 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20   .    }..    /* 
7100: 41 64 76 61 6e 63 65 20 74 6f 20 74 68 65 20 6e  Advance to the n
7110: 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74  ext name context
7120: 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c  .  The loop will
7130: 20 65 78 69 74 20 77 68 65 6e 20 65 69 74 68 65   exit when eithe
7140: 72 0a 20 20 20 20 2a 2a 20 77 65 20 68 61 76 65  r.    ** we have
7150: 20 61 20 6d 61 74 63 68 20 28 63 6e 74 3e 30 29   a match (cnt>0)
7160: 20 6f 72 20 77 68 65 6e 20 77 65 20 72 75 6e 20   or when we run 
7170: 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74  out of name cont
7180: 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  exts..    */.   
7190: 20 69 66 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20   if( cnt==0 ){. 
71a0: 20 20 20 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e       pNC = pNC->
71b0: 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  pNext;.    }.  }
71c0: 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58  ..  /*.  ** If X
71d0: 20 61 6e 64 20 59 20 61 72 65 20 4e 55 4c 4c 20   and Y are NULL 
71e0: 28 69 6e 20 6f 74 68 65 72 20 77 6f 72 64 73 20  (in other words 
71f0: 69 66 20 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75  if only the colu
7200: 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a  mn name Z is.  *
7210: 2a 20 73 75 70 70 6c 69 65 64 29 20 61 6e 64 20  * supplied) and 
7220: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 5a 20 69  the value of Z i
7230: 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f  s enclosed in do
7240: 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20 74 68 65  uble-quotes, the
7250: 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61 20 73 74  n.  ** Z is a st
7260: 72 69 6e 67 20 6c 69 74 65 72 61 6c 20 69 66 20  ring literal if 
7270: 69 74 20 64 6f 65 73 6e 27 74 20 6d 61 74 63 68  it doesn't match
7280: 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   any column name
7290: 73 2e 20 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a  s.  In that.  **
72a0: 20 63 61 73 65 2c 20 77 65 20 6e 65 65 64 20 74   case, we need t
72b0: 6f 20 72 65 74 75 72 6e 20 72 69 67 68 74 20 61  o return right a
72c0: 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65  way and not make
72d0: 20 61 6e 79 20 63 68 61 6e 67 65 73 20 74 6f 0a   any changes to.
72e0: 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2f    ** pExpr..  */
72f0: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 26 26  .  if( cnt==0 &&
7300: 20 7a 54 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c   zTab==0 && pCol
7310: 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d  umnToken->z[0]==
7320: 27 22 27 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  '"' ){.    sqlit
7330: 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20  eFree(zCol);.   
7340: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a   return 0;.  }..
7350: 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30    /*.  ** cnt==0
7360: 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77 61 73   means there was
7370: 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20 63 6e 74   not match.  cnt
7380: 3e 31 20 6d 65 61 6e 73 20 74 68 65 72 65 20 77  >1 means there w
7390: 65 72 65 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20  ere two or.  ** 
73a0: 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e 20 20 45  more matches.  E
73b0: 69 74 68 65 72 20 77 61 79 2c 20 77 65 20 68 61  ither way, we ha
73c0: 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a  ve an error..  *
73d0: 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d 31 20 29  /.  if( cnt!=1 )
73e0: 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20  {.    char *z = 
73f0: 30 3b 0a 20 20 20 20 63 68 61 72 20 2a 7a 45 72  0;.    char *zEr
7400: 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d 20 63 6e  r;.    zErr = cn
7410: 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75 63 68 20  t==0 ? "no such 
7420: 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61  column: %s" : "a
7430: 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20  mbiguous column 
7440: 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20 20 20 69  name: %s";.    i
7450: 66 28 20 7a 44 62 20 29 7b 0a 20 20 20 20 20 20  f( zDb ){.      
7460: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
7470: 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a  (&z, zDb, ".", z
7480: 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20  Tab, ".", zCol, 
7490: 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 20 69 66  0);.    }else if
74a0: 28 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20  ( zTab ){.      
74b0: 73 71 6c 69 74 65 33 53 65 74 53 74 72 69 6e 67  sqlite3SetString
74c0: 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20  (&z, zTab, ".", 
74d0: 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65  zCol, 0);.    }e
74e0: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73  lse{.      z = s
74f0: 71 6c 69 74 65 53 74 72 44 75 70 28 7a 43 6f 6c  qliteStrDup(zCol
7500: 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c  );.    }.    sql
7510: 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61  ite3ErrorMsg(pPa
7520: 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20  rse, zErr, z);. 
7530: 20 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29     sqliteFree(z)
7540: 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45  ;.    pTopNC->nE
7550: 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20  rr++;.  }..  /* 
7560: 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d  If a column from
7570: 20 61 20 74 61 62 6c 65 20 69 6e 20 70 53 72 63   a table in pSrc
7580: 4c 69 73 74 20 69 73 20 72 65 66 65 72 65 6e 63  List is referenc
7590: 65 64 2c 20 74 68 65 6e 20 72 65 63 6f 72 64 0a  ed, then record.
75a0: 20 20 2a 2a 20 74 68 69 73 20 66 61 63 74 20 69    ** this fact i
75b0: 6e 20 74 68 65 20 70 53 72 63 4c 69 73 74 2e 61  n the pSrcList.a
75c0: 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69 74 6d 61  [].colUsed bitma
75d0: 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61  sk.  Column 0 ca
75e0: 75 73 65 73 0a 20 20 2a 2a 20 62 69 74 20 30 20  uses.  ** bit 0 
75f0: 74 6f 20 62 65 20 73 65 74 2e 20 20 43 6f 6c 75  to be set.  Colu
7600: 6d 6e 20 31 20 73 65 74 73 20 62 69 74 20 31 2e  mn 1 sets bit 1.
7610: 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20    And so forth. 
7620: 20 49 66 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c   If the.  ** col
7630: 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73 20 67 72  umn number is gr
7640: 65 61 74 65 72 20 74 68 61 6e 20 74 68 65 20 6e  eater than the n
7650: 75 6d 62 65 72 20 6f 66 20 62 69 74 73 20 69 6e  umber of bits in
7660: 20 74 68 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a   the bitmask.  *
7670: 2a 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 68  * then set the h
7680: 69 67 68 2d 6f 72 64 65 72 20 62 69 74 20 6f 66  igh-order bit of
7690: 20 74 68 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20   the bitmask..  
76a0: 2a 2f 0a 20 20 69 66 28 20 70 45 78 70 72 2d 3e  */.  if( pExpr->
76b0: 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d  iColumn>=0 && pM
76c0: 61 74 63 68 21 3d 30 20 29 7b 0a 20 20 20 20 69  atch!=0 ){.    i
76d0: 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43  nt n = pExpr->iC
76e0: 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e  olumn;.    if( n
76f0: 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b  >=sizeof(Bitmask
7700: 29 2a 38 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d  )*8 ){.      n =
7710: 20 73 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29   sizeof(Bitmask)
7720: 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20  *8-1;.    }.    
7730: 61 73 73 65 72 74 28 20 70 4d 61 74 63 68 2d 3e  assert( pMatch->
7740: 69 43 75 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e  iCursor==pExpr->
7750: 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d  iTable );.    pM
7760: 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d  atch->colUsed |=
7770: 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a   1<<n;.  }..  /*
7780: 20 43 6c 65 61 6e 20 75 70 20 61 6e 64 20 72 65   Clean up and re
7790: 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69  turn.  */.  sqli
77a0: 74 65 46 72 65 65 28 7a 44 62 29 3b 0a 20 20 73  teFree(zDb);.  s
77b0: 71 6c 69 74 65 46 72 65 65 28 7a 54 61 62 29 3b  qliteFree(zTab);
77c0: 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 43  .  sqliteFree(zC
77d0: 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  ol);.  sqlite3Ex
77e0: 70 72 44 65 6c 65 74 65 28 70 45 78 70 72 2d 3e  prDelete(pExpr->
77f0: 70 4c 65 66 74 29 3b 0a 20 20 70 45 78 70 72 2d  pLeft);.  pExpr-
7800: 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20 20 73 71  >pLeft = 0;.  sq
7810: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
7820: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a  pExpr->pRight);.
7830: 20 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20    pExpr->pRight 
7840: 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70  = 0;.  pExpr->op
7850: 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20   = TK_COLUMN;.  
7860: 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20  if( cnt==1 ){.  
7870: 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d 30    assert( pNC!=0
7880: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 41   );.    sqlite3A
7890: 75 74 68 52 65 61 64 28 70 50 61 72 73 65 2c 20  uthRead(pParse, 
78a0: 70 45 78 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63  pExpr, pNC->pSrc
78b0: 4c 69 73 74 29 3b 0a 20 20 20 20 69 66 28 20 70  List);.    if( p
78c0: 4d 61 74 63 68 20 26 26 20 21 70 4d 61 74 63 68  Match && !pMatch
78d0: 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20  ->pSelect ){.   
78e0: 20 20 20 70 45 78 70 72 2d 3e 70 54 61 62 20 3d     pExpr->pTab =
78f0: 20 70 4d 61 74 63 68 2d 3e 70 54 61 62 3b 0a 20   pMatch->pTab;. 
7900: 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72     }.  }.  retur
7910: 6e 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a  n cnt!=1;.}../*.
7920: 2a 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f  ** pExpr is a no
7930: 64 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20  de that defines 
7940: 61 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f  a function of so
7950: 6d 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67  me kind.  It mig
7960: 68 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61  ht.** be a synta
7970: 63 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69  ctic function li
7980: 6b 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72  ke "count(x)" or
7990: 20 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66   it might be a f
79a0: 75 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20  unction.** that 
79b0: 69 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70  implements an op
79c0: 65 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20  erator, like "a 
79d0: 4c 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a  LIKE b".  .**.**
79e0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61   This routine ma
79f0: 6b 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e  kes *pzName poin
7a00: 74 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66  t to the name of
7a10: 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e   the function an
7a20: 64 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f  d .** *pnName ho
7a30: 6c 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  ld the number of
7a40: 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74   characters in t
7a50: 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
7a60: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
7a70: 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65   getFunctionName
7a80: 28 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f  (Expr *pExpr, co
7a90: 6e 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d  nst char **pzNam
7aa0: 65 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b  e, int *pnName){
7ab0: 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
7ac0: 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
7ad0: 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a   TK_FUNCTION: {.
7ae0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
7af0: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a  pExpr->token.z;.
7b00: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7b10: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a  pExpr->token.n;.
7b20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7b30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c   }.    case TK_L
7b40: 49 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  IKE: {.      *pz
7b50: 4e 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20  Name = "like";. 
7b60: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34       *pnName = 4
7b70: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7b80: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
7b90: 5f 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a  _GLOB: {.      *
7ba0: 70 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b  pzName = "glob";
7bb0: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
7bc0: 20 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b   4;.      break;
7bd0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
7be0: 54 4b 5f 43 54 49 4d 45 3a 20 7b 0a 20 20 20 20  TK_CTIME: {.    
7bf0: 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72    *pzName = "cur
7c00: 72 65 6e 74 5f 74 69 6d 65 22 3b 0a 20 20 20 20  rent_time";.    
7c10: 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a    *pnName = 12;.
7c20: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
7c30: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43   }.    case TK_C
7c40: 44 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70  DATE: {.      *p
7c50: 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74  zName = "current
7c60: 5f 64 61 74 65 22 3b 0a 20 20 20 20 20 20 2a 70  _date";.      *p
7c70: 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20  nName = 12;.    
7c80: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
7c90: 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45     case TK_CTIME
7ca0: 53 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20 20 2a  STAMP: {.      *
7cb0: 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e  pzName = "curren
7cc0: 74 5f 74 69 6d 65 73 74 61 6d 70 22 3b 0a 20 20  t_timestamp";.  
7cd0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 37      *pnName = 17
7ce0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
7cf0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
7d00: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
7d10: 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e  s designed as an
7d20: 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45   xFunc for walkE
7d30: 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprTree()..**.**
7d40: 20 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69   Resolve symboli
7d50: 63 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f  c names into TK_
7d60: 43 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73  COLUMN operators
7d70: 20 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74   for the current
7d80: 0a 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20  .** node in the 
7d90: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
7da0: 20 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f    Return 0 to co
7db0: 6e 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63  ntinue the searc
7dc0: 68 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72  h down.** the tr
7dd0: 65 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74  ee or 2 to abort
7de0: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a   the tree walk..
7df0: 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69  **.** This routi
7e00: 6e 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72  ne also does err
7e10: 6f 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20  or checking and 
7e20: 6e 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20  name resolution 
7e30: 66 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  for.** function 
7e40: 6e 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72  names.  The oper
7e50: 61 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61  ator for aggrega
7e60: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20  te functions is 
7e70: 63 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b  changed.** to TK
7e80: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a  _AGG_FUNCTION..*
7e90: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d  /.static int nam
7ea0: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f  eResolverStep(vo
7eb0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
7ec0: 70 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f  pExpr){.  NameCo
7ed0: 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61  ntext *pNC = (Na
7ee0: 6d 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b  meContext*)pArg;
7ef0: 0a 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63  .  SrcList *pSrc
7f00: 4c 69 73 74 3b 0a 20 20 50 61 72 73 65 20 2a 70  List;.  Parse *p
7f10: 50 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70 45  Parse;..  if( pE
7f20: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  xpr==0 ) return 
7f30: 31 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43  1;.  assert( pNC
7f40: 21 3d 30 20 29 3b 0a 20 20 70 53 72 63 4c 69 73  !=0 );.  pSrcLis
7f50: 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  t = pNC->pSrcLis
7f60: 74 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e  t;.  pParse = pN
7f70: 43 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66  C->pParse;..  if
7f80: 28 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70  ( ExprHasAnyProp
7f90: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52  erty(pExpr, EP_R
7fa0: 65 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72  esolved) ) retur
7fb0: 6e 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72  n 1;.  ExprSetPr
7fc0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
7fd0: 5f 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e  _Resolved);.#ifn
7fe0: 64 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28  def NDEBUG.  if(
7ff0: 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20   pSrcList ){.   
8000: 20 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28   int i;.    for(
8010: 69 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d  i=0; i<pSrcList-
8020: 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20  >nSrc; i++){.   
8030: 20 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c     assert( pSrcL
8040: 69 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  ist->a[i].iCurso
8050: 72 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74  r>=0 && pSrcList
8060: 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70  ->a[i].iCursor<p
8070: 50 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20  Parse->nTab);.  
8080: 20 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20    }.  }.#endif. 
8090: 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e   switch( pExpr->
80a0: 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75  op ){.    /* Dou
80b0: 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e  ble-quoted strin
80c0: 67 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61  gs (ex: "abc") a
80d0: 72 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74  re used as ident
80e0: 69 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a  ifiers if.    **
80f0: 20 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65   possible.  Othe
8100: 72 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69  rwise they remai
8110: 6e 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53  n as strings.  S
8120: 69 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20  ingle-quoted.   
8130: 20 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a   ** strings (ex:
8140: 20 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61   'abc') are alwa
8150: 79 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61  ys string litera
8160: 6c 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63  ls..    */.    c
8170: 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b  ase TK_STRING: {
8180: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
8190: 2d 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c  ->token.z[0]=='\
81a0: 27 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20  '' ) break;.    
81b0: 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69    /* Fall thru i
81c0: 6e 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61  nto the TK_ID ca
81d0: 73 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20  se if this is a 
81e0: 64 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74  double-quoted st
81f0: 72 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20  ring */.    }.  
8200: 20 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e    /* A lone iden
8210: 74 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61  tifier is the na
8220: 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a  me of a column..
8230: 20 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20      */.    case 
8240: 54 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 6c  TK_ID: {.      l
8250: 6f 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65  ookupName(pParse
8260: 2c 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e  , 0, 0, &pExpr->
8270: 74 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70  token, pNC, pExp
8280: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
8290: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20   1;.    }.  .   
82a0: 20 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65   /* A table name
82b0: 20 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65   and column name
82c0: 3a 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20  :     ID.ID.    
82d0: 2a 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65  ** Or a database
82e0: 2c 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75  , table and colu
82f0: 6d 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20  mn:  ID.ID.ID.  
8300: 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b    */.    case TK
8310: 5f 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f  _DOT: {.      To
8320: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20  ken *pColumn;.  
8330: 20 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c      Token *pTabl
8340: 65 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a  e;.      Token *
8350: 70 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20  pDb;.      Expr 
8360: 2a 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20  *pRight;..      
8370: 2f 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d  /* if( pSrcList=
8380: 3d 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20  =0 ) break; */. 
8390: 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45       pRight = pE
83a0: 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20  xpr->pRight;.   
83b0: 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f     if( pRight->o
83c0: 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20  p==TK_ID ){.    
83d0: 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20      pDb = 0;.   
83e0: 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70       pTable = &p
83f0: 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  Expr->pLeft->tok
8400: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  en;.        pCol
8410: 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74  umn = &pRight->t
8420: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73  oken;.      }els
8430: 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72  e{.        asser
8440: 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54  t( pRight->op==T
8450: 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20  K_DOT );.       
8460: 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70   pDb = &pExpr->p
8470: 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20  Left->token;.   
8480: 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70       pTable = &p
8490: 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f  Right->pLeft->to
84a0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ken;.        pCo
84b0: 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e  lumn = &pRight->
84c0: 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20  pRight->token;. 
84d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f       }.      loo
84e0: 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20  kupName(pParse, 
84f0: 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f  pDb, pTable, pCo
8500: 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  lumn, pNC, pExpr
8510: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
8520: 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a  1;.    }..    /*
8530: 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f   Resolve functio
8540: 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20  n names.    */. 
8550: 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45     case TK_CTIME
8560: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54  :.    case TK_CT
8570: 49 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63 61  IMESTAMP:.    ca
8580: 73 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20 20  se TK_CDATE:.   
8590: 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20   case TK_GLOB:. 
85a0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a     case TK_LIKE:
85b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
85c0: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45  CTION: {.      E
85d0: 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d  xprList *pList =
85e0: 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20   pExpr->pList;  
85f0: 20 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e    /* The argumen
8600: 74 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20  t list */.      
8610: 69 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20  int n = pList ? 
8620: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30  pList->nExpr : 0
8630: 3b 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20  ;  /* Number of 
8640: 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20  arguments */.   
8650: 20 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66     int no_such_f
8660: 75 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f  unc = 0;       /
8670: 2a 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63  * True if no suc
8680: 68 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74  h function exist
8690: 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77  s */.      int w
86a0: 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20  rong_num_args = 
86b0: 30 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69  0;     /* True i
86c0: 66 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  f wrong number o
86d0: 66 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20  f arguments */. 
86e0: 20 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20       int is_agg 
86f0: 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20  = 0;            
8700: 20 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61   /* True if is a
8710: 6e 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  n aggregate func
8720: 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e  tion */.      in
8730: 74 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  t i;.      int n
8740: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  Id;             
8750: 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72         /* Number
8760: 20 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69   of characters i
8770: 6e 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20  n function name 
8780: 2a 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63  */.      const c
8790: 68 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20  har *zId;       
87a0: 20 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63       /* The func
87b0: 74 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20  tion name. */.  
87c0: 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65      FuncDef *pDe
87d0: 66 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  f;              
87e0: 2f 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61  /* Information a
87f0: 62 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f  bout the functio
8800: 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65  n */.      int e
8810: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
8820: 3e 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61  >enc;  /* The da
8830: 74 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20  tabase encoding 
8840: 2a 2f 0a 0a 20 20 20 20 20 20 67 65 74 46 75 6e  */..      getFun
8850: 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c  ctionName(pExpr,
8860: 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20   &zId, &nId);.  
8870: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
8880: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
8890: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
88a0: 6e 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b  nId, n, enc, 0);
88b0: 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d  .      if( pDef=
88c0: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44  =0 ){.        pD
88d0: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
88e0: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
88f0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d  >db, zId, nId, -
8900: 31 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  1, enc, 0);.    
8910: 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20      if( pDef==0 
8920: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f  ){.          no_
8930: 73 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20  such_func = 1;. 
8940: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
8950: 20 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75          wrong_nu
8960: 6d 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20  m_args = 1;.    
8970: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
8980: 65 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67  e{.        is_ag
8990: 67 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d  g = pDef->xFunc=
89a0: 3d 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  =0;.      }.    
89b0: 20 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20    if( is_agg && 
89c0: 21 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29  !pNC->allowAgg )
89d0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
89e0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
89f0: 2c 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67  , "misuse of agg
8a00: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20  regate function 
8a10: 25 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64  %.*s()", nId,zId
8a20: 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e  );.        pNC->
8a30: 6e 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20  nErr++;.        
8a40: 69 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20  is_agg = 0;.    
8a50: 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73    }else if( no_s
8a60: 75 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20  uch_func ){.    
8a70: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
8a80: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20  Msg(pParse, "no 
8a90: 73 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25  such function: %
8aa0: 2e 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b  .*s", nId, zId);
8ab0: 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45  .        pNC->nE
8ac0: 72 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73  rr++;.      }els
8ad0: 65 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f  e if( wrong_num_
8ae0: 61 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20  args ){.        
8af0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
8b00: 70 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75  pParse,"wrong nu
8b10: 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
8b20: 73 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e  s to function %.
8b30: 2a 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20  *s()",.         
8b40: 20 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20      nId, zId);. 
8b50: 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72         pNC->nErr
8b60: 2b 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ++;.      }.    
8b70: 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a    if( is_agg ){.
8b80: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
8b90: 70 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  p = TK_AGG_FUNCT
8ba0: 49 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43  ION;.        pNC
8bb0: 2d 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20  ->hasAgg = 1;.  
8bc0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8bd0: 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c  is_agg ) pNC->al
8be0: 6c 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20  lowAgg = 0;.    
8bf0: 20 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e    for(i=0; pNC->
8c00: 6e 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20  nErr==0 && i<n; 
8c10: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61  i++){.        wa
8c20: 6c 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74  lkExprTree(pList
8c30: 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61  ->a[i].pExpr, na
8c40: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
8c50: 70 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  pNC);.      }.  
8c60: 20 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29      if( is_agg )
8c70: 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d   pNC->allowAgg =
8c80: 20 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58   1;.      /* FIX
8c90: 20 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45   ME:  Compute pE
8ca0: 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61  xpr->affinity ba
8cb0: 73 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63  sed on the expec
8cc0: 74 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20  ted return.     
8cd0: 20 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20   ** type of the 
8ce0: 66 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20  function .      
8cf0: 2a 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  */.      return 
8d00: 69 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69  is_agg;.    }.#i
8d10: 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
8d20: 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63  T_SUBQUERY.    c
8d30: 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
8d40: 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54     case TK_EXIST
8d50: 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61  S:.#endif.    ca
8d60: 73 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20  se TK_IN: {.    
8d70: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65    if( pExpr->pSe
8d80: 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20  lect ){.        
8d90: 69 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e  int nRef = pNC->
8da0: 6e 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71  nRef;.        sq
8db0: 6c 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c  lite3SelectResol
8dc0: 76 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  ve(pParse, pExpr
8dd0: 2d 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b  ->pSelect, pNC);
8de0: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
8df0: 20 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66   pNC->nRef>=nRef
8e00: 20 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   );.        if( 
8e10: 6e 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20  nRef!=pNC->nRef 
8e20: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70  ){.          Exp
8e30: 72 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78  rSetProperty(pEx
8e40: 70 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74  pr, EP_VarSelect
8e50: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
8e60: 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20     }.    }.  }. 
8e70: 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a   return 0;.}../*
8e80: 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65  .** This routine
8e90: 20 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73   walks an expres
8ea0: 73 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65  sion tree and re
8eb0: 73 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65  solves reference
8ec0: 73 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f  s to.** table co
8ed0: 6c 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66  lumns.  Nodes of
8ee0: 20 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20   the form ID.ID 
8ef0: 6f 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e  or ID resolve in
8f00: 74 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74  to an.** index t
8f10: 6f 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74  o the table in t
8f20: 68 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e  he table list an
8f30: 64 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65  d a column offse
8f40: 74 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72  t.  The .** Expr
8f50: 2e 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68  .opcode for such
8f60: 20 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65   nodes is change
8f70: 64 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20  d to TK_COLUMN. 
8f80: 20 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65   The Expr.iTable
8f90: 0a 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61  .** value is cha
8fa0: 6e 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65  nged to the inde
8fb0: 78 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e  x of the referen
8fc0: 63 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61  ced table in pTa
8fd0: 62 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68  bList.** plus th
8fe0: 65 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20  e "base" value. 
8ff0: 20 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20   The base value 
9000: 77 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20  will ultimately 
9010: 62 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44  become the.** VD
9020: 42 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72  BE cursor number
9030: 20 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68   for a cursor th
9040: 61 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69  at is pointing i
9050: 6e 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63  nto the referenc
9060: 65 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68  ed.** table.  Th
9070: 65 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76  e Expr.iColumn v
9080: 61 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20  alue is changed 
9090: 74 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20  to the index of 
90a0: 74 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f  the column .** o
90b0: 66 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64  f the referenced
90c0: 20 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70   table.  The Exp
90d0: 72 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  r.iColumn value 
90e0: 66 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a  for the special.
90f0: 2a 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20  ** ROWID column 
9100: 69 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45  is -1.  Any INTE
9110: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
9120: 63 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20  column is tried 
9130: 61 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66  as an.** alias f
9140: 6f 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20  or ROWID..**.** 
9150: 41 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e  Also resolve fun
9160: 63 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20  ction names and 
9170: 63 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69  check the functi
9180: 6f 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a  ons for proper.*
9190: 2a 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73  * usage.  Make s
91a0: 75 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e  ure all function
91b0: 20 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67   names are recog
91c0: 6e 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75  nized and all fu
91d0: 6e 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20  nctions.** have 
91e0: 74 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62  the correct numb
91f0: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e  er of arguments.
9200: 20 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72    Leave an error
9210: 20 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70   message.** in p
9220: 50 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69  Parse->zErrMsg i
9230: 66 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d  f anything is am
9240: 69 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65  iss.  Return the
9250: 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72   number of error
9260: 73 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  s..**.** If the 
9270: 65 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61  expression conta
9280: 69 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75  ins aggregate fu
9290: 6e 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74  nctions then set
92a0: 20 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70   the EP_Agg.** p
92b0: 72 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65  roperty on the e
92c0: 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e  xpression..*/.in
92d0: 74 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73  t sqlite3ExprRes
92e0: 6f 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d  olveNames(.  Nam
92f0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20  eContext *pNC,  
9300: 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63       /* Namespac
9310: 65 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70  e to resolve exp
9320: 72 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a  ressions in. */.
9330: 20 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20    Expr *pExpr   
9340: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
9350: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62   expression to b
9360: 65 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29  e analyzed. */.)
9370: 7b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  {.  if( pExpr==0
9380: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77   ) return 0;.  w
9390: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
93a0: 72 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53  r, nameResolverS
93b0: 74 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28  tep, pNC);.  if(
93c0: 20 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a   pNC->nErr>0 ){.
93d0: 20 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65      ExprSetPrope
93e0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72  rty(pExpr, EP_Er
93f0: 72 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75  ror);.  }.  retu
9400: 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  rn ExprHasProper
9410: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9420: 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20  or);.}../*.** A 
9430: 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65  pointer instance
9440: 20 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75   of this structu
9450: 72 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61  re is used to pa
9460: 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a  ss information.*
9470: 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78  * through walkEx
9480: 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65  prTree into code
9490: 53 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a  SubqueryStep()..
94a0: 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63  */.typedef struc
94b0: 74 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65  t QueryCoder Que
94c0: 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20  ryCoder;.struct 
94d0: 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50  QueryCoder {.  P
94e0: 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20  arse *pParse;   
94f0: 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69      /* The parsi
9500: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
9510: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43  NameContext *pNC
9520: 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63  ;    /* Namespac
9530: 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f  e of first enclo
9540: 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b  sing query */.};
9550: 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  .../*.** Generat
9560: 65 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75  e code for subqu
9570: 65 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65  eries and IN ope
9580: 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e  rators..**.** IN
9590: 20 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73   operators comes
95a0: 20 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a   in two forms:.*
95b0: 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65  *.**           e
95c0: 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74  xpr IN (exprlist
95d0: 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20  ).** and.**     
95e0: 20 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53        expr IN (S
95f0: 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a  ELECT ...).**.**
9600: 20 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20   The first form 
9610: 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72  is handled by cr
9620: 65 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c  eating a set hol
9630: 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a  ding the list.**
9640: 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75   of allowed valu
9650: 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20  es.  The second 
9660: 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20  form causes the 
9670: 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61  SELECT to genera
9680: 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61  te .** a tempora
9690: 72 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66  ry table..*/.#if
96a0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
96b0: 5f 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73  _SUBQUERY.void s
96c0: 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c  qlite3CodeSubsel
96d0: 65 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73  ect(Parse *pPars
96e0: 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  e, Expr *pExpr){
96f0: 0a 20 20 69 6e 74 20 6c 61 62 65 6c 20 3d 20 30  .  int label = 0
9700: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
9710: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64            /* Add
9720: 72 65 73 73 20 61 66 74 65 72 20 73 75 62 2d 73  ress after sub-s
9730: 65 6c 65 63 74 20 63 6f 64 65 20 2a 2f 0a 20 20  elect code */.  
9740: 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65  Vdbe *v = sqlite
9750: 33 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29  3GetVdbe(pParse)
9760: 3b 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72  ;.  if( v==0 ) r
9770: 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20  eturn;..  /* If 
9780: 74 68 69 73 20 69 73 20 6e 6f 74 20 61 20 76 61  this is not a va
9790: 72 69 61 62 6c 65 20 28 63 6f 72 72 65 6c 61 74  riable (correlat
97a0: 65 64 29 20 73 65 6c 65 63 74 2c 20 74 68 65 6e  ed) select, then
97b0: 20 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 69 74   execute.  ** it
97c0: 20 6f 6e 6c 79 20 6f 6e 63 65 2e 20 55 6e 6c 65   only once. Unle
97d0: 73 73 20 74 68 69 73 20 69 73 20 70 61 72 74 20  ss this is part 
97e0: 6f 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f  of a trigger pro
97f0: 67 72 61 6d 2e 20 49 6e 0a 20 20 2a 2a 20 74 68  gram. In.  ** th
9800: 61 74 20 63 61 73 65 20 72 65 2d 65 78 65 63 75  at case re-execu
9810: 74 65 20 65 76 65 72 79 20 74 69 6d 65 20 28 74  te every time (t
9820: 68 69 73 20 63 6f 75 6c 64 20 62 65 20 6f 70 74  his could be opt
9830: 69 6d 69 7a 65 64 29 2e 0a 20 20 2a 2f 0a 20 20  imized)..  */.  
9840: 69 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50  if( !ExprHasAnyP
9850: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9860: 50 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20  P_VarSelect) && 
9870: 21 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61  !pParse->trigSta
9880: 63 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65  ck ){.    int me
9890: 6d 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  m = pParse->nMem
98a0: 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56  ++;.    sqlite3V
98b0: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d  dbeAddOp(v, OP_M
98c0: 65 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b  emLoad, mem, 0);
98d0: 0a 20 20 20 20 6c 61 62 65 6c 20 3d 20 73 71 6c  .    label = sql
98e0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
98f0: 6c 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65  l(v);.    sqlite
9900: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
9910: 5f 49 66 2c 20 30 2c 20 6c 61 62 65 6c 29 3b 0a  _If, 0, label);.
9920: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9930: 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67  ddOp(v, OP_Integ
9940: 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73  er, 1, 0);.    s
9950: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
9960: 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20  v, OP_MemStore, 
9970: 6d 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20  mem, 1);.  }..  
9980: 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  if( pExpr->pSele
9990: 63 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  ct ){.    sqlite
99a0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
99b0: 5f 41 67 67 43 6f 6e 74 65 78 74 50 75 73 68 2c  _AggContextPush,
99c0: 20 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73   0, 0);.  }..  s
99d0: 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70  witch( pExpr->op
99e0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
99f0: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72  IN: {.      char
9a00: 20 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20   affinity;.     
9a10: 20 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f   KeyInfo keyInfo
9a20: 3b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  ;.      int addr
9a30: 3b 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72  ;        /* Addr
9a40: 65 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 54 65  ess of OP_OpenTe
9a50: 6d 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a  mp instruction *
9a60: 2f 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74  /..      affinit
9a70: 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41  y = sqlite3ExprA
9a80: 66 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70  ffinity(pExpr->p
9a90: 4c 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a  Left);..      /*
9aa0: 20 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73   Whether this is
9ab0: 20 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54   an 'x IN(SELECT
9ac0: 2e 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49  ...)' or an 'x I
9ad0: 4e 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20  N(<exprlist>)'. 
9ae0: 20 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69       ** expressi
9af0: 6f 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64  on it is handled
9b00: 20 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41   the same way. A
9b10: 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65   temporary table
9b20: 20 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69   is .      ** fi
9b30: 6c 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65  lled with single
9b40: 2d 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79  -field index key
9b50: 73 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74  s representing t
9b60: 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20  he results.     
9b70: 20 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c   ** from the SEL
9b80: 45 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72  ECT or the <expr
9b90: 6c 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a  list>..      **.
9ba0: 20 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20        ** If the 
9bb0: 27 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69  'x' expression i
9bc0: 73 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  s a column value
9bd0: 2c 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e  , or the SELECT.
9be0: 2e 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74  ...      ** stat
9bf0: 65 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20  ement returns a 
9c00: 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68  column value, th
9c10: 65 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20  en the affinity 
9c20: 6f 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a  of that.      **
9c30: 20 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20   column is used 
9c40: 74 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64  to build the ind
9c50: 65 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68  ex keys. If both
9c60: 20 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20   'x' and the.   
9c70: 20 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20     ** SELECT... 
9c80: 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f  statement are co
9c90: 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65  lumns, then nume
9ca0: 72 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20  ric affinity is 
9cb0: 75 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66  used.      ** if
9cc0: 20 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68   either column h
9cd0: 61 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e  as NUMERIC or IN
9ce0: 54 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20  TEGER affinity. 
9cf0: 49 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20  If neither.     
9d00: 20 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20   ** 'x' nor the 
9d10: 53 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d  SELECT... statem
9d20: 65 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c  ent are columns,
9d30: 20 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66   then numeric af
9d40: 66 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20  finity.      ** 
9d50: 69 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a  is used..      *
9d60: 2f 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69  /.      pExpr->i
9d70: 54 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e  Table = pParse->
9d80: 6e 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64  nTab++;.      ad
9d90: 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  dr = sqlite3Vdbe
9da0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e  AddOp(v, OP_Open
9db0: 54 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61  Temp, pExpr->iTa
9dc0: 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d  ble, 0);.      m
9dd0: 65 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20  emset(&keyInfo, 
9de0: 30 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66  0, sizeof(keyInf
9df0: 6f 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e  o));.      keyIn
9e00: 66 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20  fo.nField = 1;. 
9e10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
9e20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e  AddOp(v, OP_SetN
9e30: 75 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72  umColumns, pExpr
9e40: 2d 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20  ->iTable, 1);.. 
9e50: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
9e60: 70 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20  pSelect ){.     
9e70: 20 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20     /* Case 1:   
9e80: 20 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43    expr IN (SELEC
9e90: 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a  T ...).        *
9ea0: 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e  *.        ** Gen
9eb0: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72  erate code to wr
9ec0: 69 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ite the results 
9ed0: 6f 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e  of the select in
9ee0: 74 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79  to the temporary
9ef0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c  .        ** tabl
9f00: 65 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20  e allocated and 
9f10: 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20  opened above..  
9f20: 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20        */.       
9f30: 20 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78   int iParm = pEx
9f40: 70 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28  pr->iTable +  ((
9f50: 28 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c  (int)affinity)<<
9f60: 31 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70  16);.        Exp
9f70: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
9f80: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28         assert( (
9f90: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78  pExpr->iTable&0x
9fa0: 30 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72  0000FFFF)==pExpr
9fb0: 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20  ->iTable );.    
9fc0: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
9fd0: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  t(pParse, pExpr-
9fe0: 3e 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65  >pSelect, SRT_Se
9ff0: 74 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20  t, iParm, 0, 0, 
a000: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  0, 0);.        p
a010: 45 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70  EList = pExpr->p
a020: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a  Select->pEList;.
a030: 20 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69          if( pELi
a040: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
a050: 78 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20  xpr>0 ){ .      
a060: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
a070: 6c 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d  l[0] = binaryCom
a080: 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72  pareCollSeq(pPar
a090: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
a0a0: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
a0b0: 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78  pEList->a[0].pEx
a0c0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
a0d0: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
a0e0: 45 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  Expr->pList ){. 
a0f0: 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32         /* Case 2
a100: 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65  :     expr IN (e
a110: 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20  xprlist).       
a120: 20 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68   **..** For each
a130: 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69   expression, bui
a140: 6c 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20  ld an index key 
a150: 66 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74  from the evaluat
a160: 69 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20  ion and.        
a170: 2a 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74  ** store it in t
a180: 68 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62  he temporary tab
a190: 6c 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73  le. If <expr> is
a1a0: 20 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20   a column, then 
a1b0: 75 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  use.        ** t
a1c0: 68 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69  hat columns affi
a1d0: 6e 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69  nity when buildi
a1e0: 6e 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49  ng index keys. I
a1f0: 66 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a  f <expr> is not.
a200: 20 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c          ** a col
a210: 75 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63  umn, use numeric
a220: 20 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20   affinity..     
a230: 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e     */.        in
a240: 74 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28  t i;.        if(
a250: 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20   !affinity ){.  
a260: 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79          affinity
a270: 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55   = SQLITE_AFF_NU
a280: 4d 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d  MERIC;.        }
a290: 0a 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f  .        keyInfo
a2a0: 2e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70  .aColl[0] = pExp
a2b0: 72 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b  r->pLeft->pColl;
a2c0: 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f  ..        /* Loo
a2d0: 70 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65  p through each e
a2e0: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78  xpression in <ex
a2f0: 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20  prlist>. */.    
a300: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
a310: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
a320: 70 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  pr; i++){.      
a330: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
a340: 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b  pExpr->pList->a[
a350: 69 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20  i].pExpr;..     
a360: 20 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68       /* Check th
a370: 61 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  at the expressio
a380: 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 20 61 6e  n is constant an
a390: 64 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20  d valid. */.    
a3a0: 20 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74        if( !sqlit
a3b0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a3c0: 28 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20  (pE2) ){.       
a3d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f       sqlite3Erro
a3e0: 72 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20  rMsg(pParse,.   
a3f0: 20 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68             "righ
a400: 74 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49  t-hand side of I
a410: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
a420: 62 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20  be constant");. 
a430: 20 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72             retur
a440: 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a  n;.          }..
a450: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61            /* Eva
a460: 6c 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73  luate the expres
a470: 73 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20  sion and insert 
a480: 69 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70  it into the temp
a490: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20   table */.      
a4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
a4b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29  ode(pParse, pE2)
a4c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a4d0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
a4e0: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
a4f0: 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
a500: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a510: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a520: 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30  OP_String8, 0, 0
a530: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  );.          sql
a540: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a550: 20 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 70   OP_PutStrKey, p
a560: 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29  Expr->iTable, 0)
a570: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
a580: 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
a590: 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c  3VdbeChangeP3(v,
a5a0: 20 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26   addr, (void *)&
a5b0: 6b 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49  keyInfo, P3_KEYI
a5c0: 4e 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61  NFO);.      brea
a5d0: 6b 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61  k;.    }..    ca
a5e0: 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20  se TK_EXISTS:.  
a5f0: 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54    case TK_SELECT
a600: 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69  : {.      /* Thi
a610: 73 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63  s has to be a sc
a620: 61 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65  alar SELECT.  Ge
a630: 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70  nerate code to p
a640: 75 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20  ut the.      ** 
a650: 76 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65  value of this se
a660: 6c 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79  lect in a memory
a670: 20 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64   cell and record
a680: 20 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20   the number.    
a690: 20 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f    ** of the memo
a6a0: 72 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75  ry cell in iColu
a6b0: 6d 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  mn..      */.   
a6c0: 20 20 20 69 6e 74 20 73 6f 70 3b 0a 20 20 20 20     int sop;.    
a6d0: 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a    Select *pSel;.
a6e0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43  .      pExpr->iC
a6f0: 6f 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e  olumn = pParse->
a700: 6e 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53  nMem++;.      pS
a710: 65 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c  el = pExpr->pSel
a720: 65 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70  ect;.      if( p
a730: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
a740: 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ECT ){.        s
a750: 6f 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20  op = SRT_Mem;.  
a760: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
a770: 20 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20     static const 
a780: 54 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31  Token one = { "1
a790: 22 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20  ", 0, 1 };.     
a7a0: 20 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69     sop = SRT_Exi
a7b0: 73 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  sts;.        sql
a7c0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65  ite3ExprListDele
a7d0: 74 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29  te(pSel->pEList)
a7e0: 3b 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e  ;.        pSel->
a7f0: 70 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33  pEList = sqlite3
a800: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30  ExprListAppend(0
a810: 2c 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  , .             
a820: 20 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c               sql
a830: 69 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45  ite3Expr(TK_INTE
a840: 47 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29  GER, 0, 0, &one)
a850: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
a860: 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63      sqlite3Selec
a870: 74 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20  t(pParse, pSel, 
a880: 73 6f 70 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  sop, pExpr->iCol
a890: 75 6d 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  umn, 0, 0, 0, 0)
a8a0: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
a8b0: 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20     }.  }..  if( 
a8c0: 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29  pExpr->pSelect )
a8d0: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a8e0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
a8f0: 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30  ContextPop, 0, 0
a900: 29 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 61 62  );.  }.  if( lab
a910: 65 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69  el<0 ){.    sqli
a920: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
a930: 62 65 6c 28 76 2c 20 6c 61 62 65 6c 29 3b 0a 20  bel(v, label);. 
a940: 20 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23   }.  return;.}.#
a950: 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
a960: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
a970: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
a980: 20 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20   an instruction 
a990: 74 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68  that will put th
a9a0: 65 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69  e integer descri
a9b0: 62 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b  be by.** text z[
a9c0: 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73  0..n-1] on the s
a9d0: 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  tack..*/.static 
a9e0: 76 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72  void codeInteger
a9f0: 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20  (Vdbe *v, const 
aa00: 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b  char *z, int n){
aa10: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
aa20: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
aa30: 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71  z, &i) ){.    sq
aa40: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
aa50: 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c  , OP_Integer, i,
aa60: 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28   0);.  }else if(
aa70: 20 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34   sqlite3FitsIn64
aa80: 42 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73  Bits(z) ){.    s
aa90: 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c  qlite3VdbeOp3(v,
aaa0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20   OP_Integer, 0, 
aab0: 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73  0, z, n);.  }els
aac0: 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  e{.    sqlite3Vd
aad0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
aae0: 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20  , 0, 0, z, n);. 
aaf0: 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65   }.}../*.** Gene
ab00: 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
ab10: 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
ab20: 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
ab30: 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
ab40: 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68  ion and leave th
ab50: 65 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20  e result on the 
ab60: 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a  top of stack..**
ab70: 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65  .** This code de
ab80: 70 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63  pends on the fac
ab90: 74 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74  t that certain t
aba0: 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a  oken values (ex:
abb0: 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74   TK_EQ).** are t
abc0: 68 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64  he same as opcod
abd0: 65 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50  e values (ex: OP
abe0: 5f 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d  _Eq) that implem
abf0: 65 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f  ent the correspo
ac00: 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69  nding.** operati
ac10: 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d  on.  Special com
ac20: 6d 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20  ments in vdbe.c 
ac30: 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65  and the mkopcode
ac40: 68 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a  h.awk script in.
ac50: 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63  ** the make proc
ac60: 65 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20  ess cause these 
ac70: 76 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e  values to align.
ac80: 20 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74    Assert()s in t
ac90: 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77  he code.** below
aca0: 20 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65   verify that the
acb0: 20 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69   numbers are ali
acc0: 67 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a  gned correctly..
acd0: 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45  */.void sqlite3E
ace0: 78 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70  xprCode(Parse *p
acf0: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
ad00: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
ad10: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
ad20: 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20    int op;.  if( 
ad30: 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20  v==0 ) return;. 
ad40: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b   if( pExpr==0 ){
ad50: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
ad60: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
ad70: 6e 67 38 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20  ng8, 0, 0);  /* 
ad80: 45 6d 70 74 79 20 65 78 70 72 65 73 73 69 6f 6e  Empty expression
ad90: 20 65 76 61 6c 73 20 74 6f 20 4e 55 4c 4c 20 2a   evals to NULL *
ada0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20  /.    return;.  
adb0: 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  }.  op = pExpr->
adc0: 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
add0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
ade0: 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20  COLUMN: {.      
adf0: 69 66 28 20 21 70 50 61 72 73 65 2d 3e 66 69 6c  if( !pParse->fil
ae00: 6c 41 67 67 20 26 26 20 70 45 78 70 72 2d 3e 69  lAgg && pExpr->i
ae10: 41 67 67 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20  Agg>=0 ){.      
ae20: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
ae30: 4f 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c  Op(v, OP_AggGet,
ae40: 20 70 45 78 70 72 2d 3e 69 41 67 67 43 74 78 2c   pExpr->iAggCtx,
ae50: 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20   pExpr->iAgg);. 
ae60: 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70       }else if( p
ae70: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  Expr->iColumn>=0
ae80: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ae90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
aea0: 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72  OP_Column, pExpr
aeb0: 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d  ->iTable, pExpr-
aec0: 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20  >iColumn);.     
aed0: 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
aee0: 44 65 66 61 75 6c 74 28 76 2c 20 70 45 78 70 72  Default(v, pExpr
aef0: 2d 3e 70 54 61 62 2c 20 70 45 78 70 72 2d 3e 69  ->pTab, pExpr->i
af00: 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
af10: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
af20: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
af30: 2c 20 4f 50 5f 52 65 63 6e 6f 2c 20 70 45 78 70  , OP_Recno, pExp
af40: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
af50: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
af60: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
af70: 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b  se TK_INTEGER: {
af80: 0a 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67  .      codeInteg
af90: 65 72 28 76 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  er(v, pExpr->tok
afa0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
afb0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 62 72 65  en.n);.      bre
afc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
afd0: 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 0a 20 20 20  se TK_FLOAT:.   
afe0: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
aff0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b000: 20 54 4b 5f 46 4c 4f 41 54 3d 3d 4f 50 5f 52 65   TK_FLOAT==OP_Re
b010: 61 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  al );.      asse
b020: 72 74 28 20 54 4b 5f 53 54 52 49 4e 47 3d 3d 4f  rt( TK_STRING==O
b030: 50 5f 53 74 72 69 6e 67 38 20 29 3b 0a 20 20 20  P_String8 );.   
b040: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
b050: 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70  3(v, op, 0, 0, p
b060: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70  Expr->token.z, p
b070: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a  Expr->token.n);.
b080: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b090: 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31  eDequoteP3(v, -1
b0a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b0b0: 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51      }.#ifndef SQ
b0c0: 4c 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c  LITE_OMIT_BLOB_L
b0d0: 49 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20  ITERAL.    case 
b0e0: 54 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20  TK_BLOB: {.     
b0f0: 20 61 73 73 65 72 74 28 20 54 4b 5f 42 4c 4f 42   assert( TK_BLOB
b100: 3d 3d 4f 50 5f 48 65 78 42 6c 6f 62 20 29 3b 0a  ==OP_HexBlob );.
b110: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b120: 65 4f 70 33 28 76 2c 20 6f 70 2c 20 30 2c 20 30  eOp3(v, op, 0, 0
b130: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
b140: 2b 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  +1, pExpr->token
b150: 2e 6e 2d 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  .n-1);.      sql
b160: 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50  ite3VdbeDequoteP
b170: 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  3(v, -1);.      
b180: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e  break;.    }.#en
b190: 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  dif.    case TK_
b1a0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
b1b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
b1c0: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
b1d0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b1e0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b1f0: 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20 7b 0a   TK_VARIABLE: {.
b200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
b210: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 56 61 72  eAddOp(v, OP_Var
b220: 69 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69 54  iable, pExpr->iT
b230: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
b240: 69 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  if( pExpr->token
b250: 2e 6e 3e 31 20 29 7b 0a 20 20 20 20 20 20 20 20  .n>1 ){.        
b260: 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67  sqlite3VdbeChang
b270: 65 50 33 28 76 2c 20 2d 31 2c 20 70 45 78 70 72  eP3(v, -1, pExpr
b280: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72  ->token.z, pExpr
b290: 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20  ->token.n);.    
b2a0: 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
b2b0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
b2c0: 54 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20  TK_REGISTER: {. 
b2d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
b2e0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 4c  AddOp(v, OP_MemL
b2f0: 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  oad, pExpr->iTab
b300: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  le, 0);.      br
b310: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b320: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
b330: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
b340: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
b350: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
b360: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
b370: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
b380: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
b390: 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
b3a0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
b3b0: 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
b3c0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
b3d0: 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
b3e0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
b3f0: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b400: 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
b410: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b420: 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
b430: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
b440: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
b450: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
b460: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b470: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b480: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
b490: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
b4a0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b4b0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
b4c0: 74 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  t, op, 0, 0);.  
b4d0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b4e0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44  .    case TK_AND
b4f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  :.    case TK_OR
b500: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 50 4c  :.    case TK_PL
b510: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
b520: 53 54 41 52 3a 0a 20 20 20 20 63 61 73 65 20 54  STAR:.    case T
b530: 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20 63 61 73  K_MINUS:.    cas
b540: 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20 20 63 61  e TK_REM:.    ca
b550: 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a 0a 20 20  se TK_BITAND:.  
b560: 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f 52 3a    case TK_BITOR:
b570: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41  .    case TK_SLA
b580: 53 48 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  SH:.    case TK_
b590: 4c 53 48 49 46 54 3a 0a 20 20 20 20 63 61 73 65  LSHIFT:.    case
b5a0: 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a 20 20 20   TK_RSHIFT: .   
b5b0: 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a   case TK_CONCAT:
b5c0: 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28   {.      assert(
b5d0: 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41 6e 64 20   TK_AND==OP_And 
b5e0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
b5f0: 20 54 4b 5f 4f 52 3d 3d 4f 50 5f 4f 72 20 29 3b   TK_OR==OP_Or );
b600: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b610: 4b 5f 50 4c 55 53 3d 3d 4f 50 5f 41 64 64 20 29  K_PLUS==OP_Add )
b620: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b630: 54 4b 5f 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62  TK_MINUS==OP_Sub
b640: 74 72 61 63 74 20 29 3b 0a 20 20 20 20 20 20 61  tract );.      a
b650: 73 73 65 72 74 28 20 54 4b 5f 52 45 4d 3d 3d 4f  ssert( TK_REM==O
b660: 50 5f 52 65 6d 61 69 6e 64 65 72 20 29 3b 0a 20  P_Remainder );. 
b670: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b680: 42 49 54 41 4e 44 3d 3d 4f 50 5f 42 69 74 41 6e  BITAND==OP_BitAn
b690: 64 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  d );.      asser
b6a0: 74 28 20 54 4b 5f 42 49 54 4f 52 3d 3d 4f 50 5f  t( TK_BITOR==OP_
b6b0: 42 69 74 4f 72 20 29 3b 0a 20 20 20 20 20 20 61  BitOr );.      a
b6c0: 73 73 65 72 74 28 20 54 4b 5f 53 4c 41 53 48 3d  ssert( TK_SLASH=
b6d0: 3d 4f 50 5f 44 69 76 69 64 65 20 29 3b 0a 20 20  =OP_Divide );.  
b6e0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c      assert( TK_L
b6f0: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 4c  SHIFT==OP_ShiftL
b700: 65 66 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  eft );.      ass
b710: 65 72 74 28 20 54 4b 5f 52 53 48 49 46 54 3d 3d  ert( TK_RSHIFT==
b720: 4f 50 5f 53 68 69 66 74 52 69 67 68 74 20 29 3b  OP_ShiftRight );
b730: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b740: 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43 6f 6e  K_CONCAT==OP_Con
b750: 63 61 74 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  cat );.      sql
b760: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
b770: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
b780: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
b790: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
b7a0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
b7b0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b7c0: 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20  dbeAddOp(v, op, 
b7d0: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65  0, 0);.      bre
b7e0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
b7f0: 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a  se TK_UMINUS: {.
b800: 20 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66        Expr *pLef
b810: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  t = pExpr->pLeft
b820: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b830: 70 4c 65 66 74 20 29 3b 0a 20 20 20 20 20 20 69  pLeft );.      i
b840: 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b  f( pLeft->op==TK
b850: 5f 46 4c 4f 41 54 20 7c 7c 20 70 4c 65 66 74 2d  _FLOAT || pLeft-
b860: 3e 6f 70 3d 3d 54 4b 5f 49 4e 54 45 47 45 52 20  >op==TK_INTEGER 
b870: 29 7b 0a 20 20 20 20 20 20 20 20 54 6f 6b 65 6e  ){.        Token
b880: 20 2a 70 20 3d 20 26 70 4c 65 66 74 2d 3e 74 6f   *p = &pLeft->to
b890: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 63 68 61  ken;.        cha
b8a0: 72 20 2a 7a 20 3d 20 73 71 6c 69 74 65 4d 61 6c  r *z = sqliteMal
b8b0: 6c 6f 63 28 20 70 2d 3e 6e 20 2b 20 32 20 29 3b  loc( p->n + 2 );
b8c0: 0a 20 20 20 20 20 20 20 20 73 70 72 69 6e 74 66  .        sprintf
b8d0: 28 7a 2c 20 22 2d 25 2e 2a 73 22 2c 20 70 2d 3e  (z, "-%.*s", p->
b8e0: 6e 2c 20 70 2d 3e 7a 29 3b 0a 20 20 20 20 20 20  n, p->z);.      
b8f0: 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
b900: 3d 54 4b 5f 46 4c 4f 41 54 20 29 7b 0a 20 20 20  =TK_FLOAT ){.   
b910: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
b920: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c  beOp3(v, OP_Real
b930: 2c 20 30 2c 20 30 2c 20 7a 2c 20 70 2d 3e 6e 2b  , 0, 0, z, p->n+
b940: 31 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  1);.        }els
b950: 65 7b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 64  e{.          cod
b960: 65 49 6e 74 65 67 65 72 28 76 2c 20 7a 2c 20 70  eInteger(v, z, p
b970: 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20 20 20 20  ->n+1);.        
b980: 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  }.        sqlite
b990: 46 72 65 65 28 7a 29 3b 0a 20 20 20 20 20 20 20  Free(z);.       
b9a0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
b9b0: 20 20 20 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68        /* Fall th
b9c0: 72 6f 75 67 68 20 69 6e 74 6f 20 54 4b 5f 4e 4f  rough into TK_NO
b9d0: 54 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20 20 63  T */.    }.    c
b9e0: 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 0a 20  ase TK_BITNOT:. 
b9f0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 3a 20     case TK_NOT: 
ba00: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ba10: 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f 42 69  TK_BITNOT==OP_Bi
ba20: 74 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 61 73  tNot );.      as
ba30: 73 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50  sert( TK_NOT==OP
ba40: 5f 4e 6f 74 20 29 3b 0a 20 20 20 20 20 20 73 71  _Not );.      sq
ba50: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ba60: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ba70: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
ba80: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f  e3VdbeAddOp(v, o
ba90: 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 0, 0);.      
baa0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
bab0: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
bac0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
bad0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e  NULL: {.      in
bae0: 74 20 64 65 73 74 3b 0a 20 20 20 20 20 20 61 73  t dest;.      as
baf0: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
bb00: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
bb10: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
bb20: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
bb30: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
bb40: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
bb50: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30  OP_Integer, 1, 0
bb60: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bb70: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bb80: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
bb90: 20 20 20 20 20 20 64 65 73 74 20 3d 20 73 71 6c        dest = sql
bba0: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
bbb0: 64 64 72 28 76 29 20 2b 20 32 3b 0a 20 20 20 20  ddr(v) + 2;.    
bbc0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bbd0: 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73  Op(v, op, 1, des
bbe0: 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  t);.      sqlite
bbf0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
bc00: 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c 20 30 29 3b  _AddImm, -1, 0);
bc10: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bc20: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bc30: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
bc40: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bc50: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67  eAddOp(v, OP_Agg
bc60: 47 65 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 69  Get, 0, pExpr->i
bc70: 41 67 67 29 3b 0a 20 20 20 20 20 20 62 72 65 61  Agg);.      brea
bc80: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
bc90: 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20 20 20  e TK_CDATE:.    
bca0: 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 3a 0a 20  case TK_CTIME:. 
bcb0: 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45     case TK_CTIME
bcc0: 53 54 41 4d 50 3a 0a 20 20 20 20 63 61 73 65 20  STAMP:.    case 
bcd0: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
bce0: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
bcf0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
bd00: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
bd10: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
bd20: 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 69  ->pList;.      i
bd30: 6e 74 20 6e 45 78 70 72 20 3d 20 70 4c 69 73 74  nt nExpr = pList
bd40: 20 3f 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20   ? pList->nExpr 
bd50: 3a 20 30 3b 0a 20 20 20 20 20 20 46 75 6e 63 44  : 0;.      FuncD
bd60: 65 66 20 2a 70 44 65 66 3b 0a 20 20 20 20 20 20  ef *pDef;.      
bd70: 69 6e 74 20 6e 49 64 3b 0a 20 20 20 20 20 20 63  int nId;.      c
bd80: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 49 64 3b 0a  onst char *zId;.
bd90: 20 20 20 20 20 20 69 6e 74 20 70 32 20 3d 20 30        int p2 = 0
bda0: 3b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  ;.      int i;. 
bdb0: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
bdc0: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
bdd0: 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
bde0: 6f 6c 6c 20 3d 20 30 3b 0a 20 20 20 20 20 20 67  oll = 0;.      g
bdf0: 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28 70  etFunctionName(p
be00: 45 78 70 72 2c 20 26 7a 49 64 2c 20 26 6e 49 64  Expr, &zId, &nId
be10: 29 3b 0a 20 20 20 20 20 20 70 44 65 66 20 3d 20  );.      pDef = 
be20: 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74  sqlite3FindFunct
be30: 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  ion(pParse->db, 
be40: 7a 49 64 2c 20 6e 49 64 2c 20 6e 45 78 70 72 2c  zId, nId, nExpr,
be50: 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20 20   enc, 0);.      
be60: 61 73 73 65 72 74 28 20 70 44 65 66 21 3d 30 20  assert( pDef!=0 
be70: 29 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d  );.      nExpr =
be80: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
be90: 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65 2c  ExprList(pParse,
bea0: 20 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 66   pList);.      f
beb0: 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 20  or(i=0; i<nExpr 
bec0: 26 26 20 69 3c 33 32 3b 20 69 2b 2b 29 7b 0a 20  && i<32; i++){. 
bed0: 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74         if( sqlit
bee0: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
bef0: 28 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78  (pList->a[i].pEx
bf00: 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20  pr) ){.         
bf10: 20 70 32 20 7c 3d 20 28 31 3c 3c 69 29 3b 0a 20   p2 |= (1<<i);. 
bf20: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
bf30: 20 69 66 28 20 70 44 65 66 2d 3e 6e 65 65 64 43   if( pDef->needC
bf40: 6f 6c 6c 53 65 71 20 26 26 20 21 70 43 6f 6c 6c  ollSeq && !pColl
bf50: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 43   ){.          pC
bf60: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
bf70: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
bf80: 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78   pList->a[i].pEx
bf90: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  pr);.        }. 
bfa0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
bfb0: 20 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53   pDef->needCollS
bfc0: 65 71 20 29 7b 0a 20 20 20 20 20 20 20 20 69 66  eq ){.        if
bfd0: 28 20 21 70 43 6f 6c 6c 20 29 20 70 43 6f 6c 6c  ( !pColl ) pColl
bfe0: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 70   = pParse->db->p
bff0: 44 66 6c 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20  DfltColl; .     
c000: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70     sqlite3VdbeOp
c010: 33 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  3(v, OP_CollSeq,
c020: 20 30 2c 20 30 2c 20 28 63 68 61 72 20 2a 29 70   0, 0, (char *)p
c030: 43 6f 6c 6c 2c 20 50 33 5f 43 4f 4c 4c 53 45 51  Coll, P3_COLLSEQ
c040: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
c050: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
c060: 76 2c 20 4f 50 5f 46 75 6e 63 74 69 6f 6e 2c 20  v, OP_Function, 
c070: 6e 45 78 70 72 2c 20 70 32 2c 20 28 63 68 61 72  nExpr, p2, (char
c080: 2a 29 70 44 65 66 2c 20 50 33 5f 46 55 4e 43 44  *)pDef, P3_FUNCD
c090: 45 46 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  EF);.      break
c0a0: 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66 20  ;.    }.#ifndef 
c0b0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
c0c0: 55 45 52 59 0a 20 20 20 20 63 61 73 65 20 54 4b  UERY.    case TK
c0d0: 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63 61 73  _EXISTS:.    cas
c0e0: 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a 20  e TK_SELECT: {. 
c0f0: 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65       sqlite3Code
c100: 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73 65  Subselect(pParse
c110: 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20  , pExpr);.      
c120: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c130: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
c140: 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 20  pExpr->iColumn, 
c150: 30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  0);.      VdbeCo
c160: 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 6c 6f 61  mment((v, "# loa
c170: 64 20 73 75 62 71 75 65 72 79 20 72 65 73 75 6c  d subquery resul
c180: 74 22 29 29 3b 0a 20 20 20 20 20 20 62 72 65 61  t"));.      brea
c190: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c1a0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
c1b0: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
c1c0: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
c1d0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 43 6f 64        sqlite3Cod
c1e0: 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72 73  eSubselect(pPars
c1f0: 65 2c 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  e, pExpr);..    
c200: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c210: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
c220: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
c230: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
c240: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
c250: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
c260: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
c270: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
c280: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
c290: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
c2a0: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
c2b0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
c2c0: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
c2d0: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
c2e0: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
c2f0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c300: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
c310: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
c320: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
c330: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
c340: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
c350: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
c360: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
c370: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
c380: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
c390: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
c3a0: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
c3b0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c3c0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c3d0: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
c3e0: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c3f0: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
c400: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c410: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
c420: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
c430: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
c440: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
c450: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c460: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
c470: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c480: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c490: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
c4a0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c4b0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
c4c0: 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20  o, 0, addr+7);. 
c4d0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c4e0: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
c4f0: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
c500: 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20  inity, 1);   /* 
c510: 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20  addr + 4 */.    
c520: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c530: 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  Op(v, OP_Found, 
c540: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
c550: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
c560: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c570: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
c580: 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
c590: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
c5a0: 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61  6 */..      brea
c5b0: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
c5c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
c5d0: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
c5e0: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c5f0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
c600: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c610: 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
c620: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
c630: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
c640: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
c650: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
c660: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c670: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
c680: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c690: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
c6a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c6b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c6c0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
c6d0: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c6e0: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
c6f0: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Ge, 0, 0);.
c700: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c710: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
c720: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
c730: 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
c740: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
c750: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
c760: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c770: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
c780: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
c790: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
c7a0: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30  pRight, OP_Le, 0
c7b0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c7c0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c7d0: 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_And, 0, 0);. 
c7e0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c7f0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
c800: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
c810: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
c820: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c830: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c840: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
c850: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c860: 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
c870: 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61   int expr_end_la
c880: 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  bel;.      int j
c890: 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69  umpInst;.      i
c8a0: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69  nt addr;.      i
c8b0: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  nt nExpr;.      
c8c0: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70  int i;.      Exp
c8d0: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
c8e0: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
c8f0: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
c900: 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73  elem;..      ass
c910: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
c920: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
c930: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
c940: 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
c950: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
c960: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
c970: 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
c980: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
c990: 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
c9a0: 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
c9b0: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
c9c0: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
c9d0: 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61       expr_end_la
c9e0: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
c9f0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
ca00: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
ca10: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
ca20: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
ca30: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
ca40: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
ca50: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
ca60: 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
ca70: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
ca80: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
ca90: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
caa0: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
cab0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
cac0: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cad0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cae0: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
caf0: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
cb00: 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70   = codeCompare(p
cb10: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
cb20: 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  eft, aListelem[i
cb30: 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ].pExpr,.       
cb40: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cb50: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c            OP_Ne,
cb60: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
cb70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cb80: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
cb90: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
cba0: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  se{.          ju
cbb0: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33  mpInst = sqlite3
cbc0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cbd0: 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  IfNot, 1, 0);.  
cbe0: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cbf0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
cc00: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
cc10: 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  m[i+1].pExpr);. 
cc20: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cc30: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
cc40: 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f  to, 0, expr_end_
cc50: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  label);.        
cc60: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cc70: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
cc80: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
cc90: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
cca0: 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72 29   jumpInst, addr)
ccb0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ccc0: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
ccd0: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
cce0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ccf0: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
cd00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
cd10: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
cd20: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
cd30: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cd40: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
cd50: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cd60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cd70: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
cd80: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
cd90: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
cda0: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cdb0: 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f  bel(v, expr_end_
cdc0: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  label);.      br
cdd0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
cde0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cdf0: 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
ce00: 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
ce10: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
ce20: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
ce30: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
ce40: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
ce50: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ce60: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
ce70: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
ce80: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
ce90: 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e  ogram");..return
cea0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ceb0: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
cec0: 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  mn!=OE_Ignore ){
ced0: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
cee0: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
cef0: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c  ==OE_Rollback ||
cf00: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
cf10: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
cf20: 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a   == OE_Abort ||.
cf30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cf40: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
cf50: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20  == OE_Fail );.  
cf60: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cf70: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
cf80: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
cf90: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
cfa0: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
cfb0: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
cfc0: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
cfd0: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
cfe0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cff0: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
d000: 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
d010: 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
d020: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
d030: 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
d040: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
d050: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d060: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
d070: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
d080: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d090: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
d0a0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
d0b0: 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
d0c0: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d0d0: 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65  ent((v, "# raise
d0e0: 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
d0f0: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
d100: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
d110: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d120: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
d130: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d140: 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
d150: 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
d160: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
d170: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
d180: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  on the stack.  S
d190: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45  ee also sqlite3E
d1a0: 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprCode()..**.**
d1b0: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
d1c0: 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74  ght also cache t
d1d0: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f  he result and mo
d1e0: 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74  dify the pExpr t
d1f0: 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ree.** so that i
d200: 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20  t will make use 
d210: 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65  of the cached re
d220: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
d230: 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a  nt evaluations.*
d240: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76  * rather than ev
d250: 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65  aluate the whole
d260: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
d270: 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72  n.  Trivial expr
d280: 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e  essions are.** n
d290: 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74  ot cached.  If t
d2a0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d2b0: 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73   cached, its res
d2c0: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
d2d0: 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f   a .** memory lo
d2e0: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
d2f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
d300: 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
d310: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d320: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
d330: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d340: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e    int iMem;.  in
d350: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
d360: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
d370: 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  urn;.  addr1 = s
d380: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d390: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69  tAddr(v);.  sqli
d3a0: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d3b0: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61 64  se, pExpr);.  ad
d3c0: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
d3d0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d3e0: 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64 64  .  if( addr2>add
d3f0: 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33 56  r1+1 || sqlite3V
d400: 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
d410: 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  1)->opcode==OP_F
d420: 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  unction ){.    i
d430: 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Mem = pExpr->iTa
d440: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
d450: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
d460: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d470: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
d480: 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e   0);.    pExpr->
d490: 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
d4a0: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
d4b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d4c0: 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
d4d0: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
d4e0: 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
d4f0: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
d500: 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20  ssion list onto 
d510: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
d520: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d530: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
d540: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
d550: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
d560: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
d570: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d580: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
d590: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d5a0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d5b0: 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st    /* The exp
d5c0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
d5d0: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  be coded */.){. 
d5e0: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d5f0: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
d600: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65  int i, n;.  Vdbe
d610: 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69 73 74   *v;.  if( pList
d620: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d630: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
d640: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d650: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
d660: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
d670: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
d680: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
d690: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d6a0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
d6b0: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  em->pExpr);.  }.
d6c0: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
d6d0: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d6e0: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
d6f0: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
d700: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
d710: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
d720: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
d730: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d740: 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
d750: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
d760: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
d770: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d780: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
d790: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d7a0: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
d7b0: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
d7c0: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
d7d0: 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
d7e0: 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
d7f0: 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
d800: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rue..**.** This 
d810: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
d820: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
d830: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
d840: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
d850: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
d860: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
d870: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
d880: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
d890: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
d8a0: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
d8b0: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
d8c0: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
d8d0: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
d8e0: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
d8f0: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
d900: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
d910: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
d920: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
d930: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
d940: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
d950: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
d960: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
d970: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
d980: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
d990: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
d9a0: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
d9b0: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
d9c0: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
d9d0: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
d9e0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
d9f0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
da00: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
da10: 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
da20: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
da30: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
da40: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
da50: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
da60: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
da70: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
da80: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
da90: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
daa0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dab0: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
dac0: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
dad0: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
dae0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
daf0: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
db00: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
db10: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
db20: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
db30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
db40: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
db50: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
db60: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
db70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
db80: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
db90: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
dba0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
dbb0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dbc0: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
dbd0: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
dbe0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
dbf0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dc00: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
dc10: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
dc20: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dc30: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
dc40: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
dc50: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
dc60: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
dc70: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
dc80: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
dc90: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
dca0: 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
dcb0: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
dcc0: 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
dcd0: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
dce0: 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
dcf0: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
dd00: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
dd10: 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
dd20: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
dd30: 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
dd40: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
dd50: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dd60: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
dd70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
dd80: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
dd90: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
dda0: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
ddb0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
ddc0: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
ddd0: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
dde0: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
ddf0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
de00: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
de10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
de20: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
de30: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
de40: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
de50: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
de60: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
de70: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      sqli
de80: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
de90: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
dea0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
deb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
dec0: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
ded0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
dee0: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
def0: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
df00: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20  e expression "x 
df10: 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
df20: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
df30: 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
df40: 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20     ** 1 IF (x < 
df50: 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
df60: 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29  ** 2 IF (x <= z)
df70: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
df80: 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20     ** 3 ....    
df90: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
dfa0: 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
dfb0: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
dfc0: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
dfd0: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
dfe0: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
dff0: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
e000: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e010: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
e020: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e030: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
e040: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e050: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e060: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
e070: 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d    addr = codeCom
e080: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
e090: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
e0a0: 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  t, 0, !jumpIfNul
e0b0: 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  l);..      pRigh
e0c0: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
e0d0: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
e0e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e0f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
e100: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
e110: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e120: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
e130: 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  _Le, dest, jumpI
e140: 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
e150: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e160: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e170: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e180: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e190: 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  v, addr, sqlite3
e1a0: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e1b0: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
e1c0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e1d0: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e1e0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e1f0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
e200: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e210: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e220: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
e230: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e240: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
e250: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
e260: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e270: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e280: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
e290: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
e2a0: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
e2b0: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
e2c0: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
e2d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e2e0: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
e2f0: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
e300: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
e310: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
e320: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
e330: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e340: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
e350: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
e360: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
e370: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
e380: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
e390: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
e3a0: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
e3b0: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
e3c0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e3d0: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
e3e0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e3f0: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
e400: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
e410: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e420: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e430: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
e440: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e450: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
e460: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
e470: 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
e480: 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
e490: 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
e4a0: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e4b0: 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
e4c0: 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
e4d0: 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
e4e0: 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
e4f0: 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
e500: 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
e510: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
e520: 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
e530: 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
e540: 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
e550: 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
e560: 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
e570: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
e580: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
e590: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
e5a0: 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
e5b0: 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
e5c0: 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
e5d0: 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
e5e0: 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
e5f0: 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
e600: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
e610: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
e620: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
e630: 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
e640: 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
e650: 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
e660: 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
e670: 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
e680: 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
e690: 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
e6a0: 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
e6b0: 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
e6c0: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
e6d0: 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
e6e0: 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
e6f0: 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
e700: 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
e710: 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
e720: 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
e730: 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
e740: 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
e750: 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
e760: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
e770: 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
e780: 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
e790: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
e7a0: 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
e7b0: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
e7c0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e7d0: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
e7e0: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
e7f0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e800: 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
e810: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
e820: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e830: 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
e840: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
e850: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
e860: 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
e870: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
e880: 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
e890: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
e8a0: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e8b0: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
e8c0: 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
e8d0: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
e8e0: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
e8f0: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
e900: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
e910: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
e920: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
e930: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
e940: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
e950: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
e960: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
e970: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
e980: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
e990: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
e9a0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
e9b0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
e9c0: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
e9d0: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
e9e0: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
e9f0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ea00: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
ea10: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
ea20: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
ea30: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ea40: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ea50: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ea60: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ea70: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ea80: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ea90: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
eaa0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
eab0: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
eac0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ead0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
eae0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
eaf0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
eb00: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
eb10: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
eb20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
eb30: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
eb40: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
eb50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
eb60: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
eb70: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
eb80: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
eb90: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
eba0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ebb0: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ebc0: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
ebd0: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ebe0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ebf0: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
ec00: 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
ec10: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
ec20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ec30: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
ec40: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
ec50: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
ec60: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
ec70: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ec80: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ec90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
eca0: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
ecb0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ecc0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
ecd0: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  TWEEN: {.      /
ece0: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ecf0: 20 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79   is "x BETWEEN y
ed00: 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69   AND z". It is i
ed10: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
ed20: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
ed30: 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47   1 IF (x >= y) G
ed40: 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
ed50: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
ed60: 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20     ** 3 IF (x > 
ed70: 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
ed80: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ed90: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
eda0: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
edb0: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
edc0: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
edd0: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
ede0: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
edf0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ee00: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
ee10: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ee20: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
ee30: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
ee40: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
ee50: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
ee60: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
ee70: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
ee80: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64  dr(v);.      cod
ee90: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
eea0: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
eeb0: 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21  OP_Ge, addr+3, !
eec0: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  jumpIfNull);..  
eed0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eee0: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
eef0: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
ef00: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ef10: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
ef20: 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  t);.      pRight
ef30: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
ef40: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
ef50: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
ef60: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
ef70: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
ef80: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
ef90: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
efa0: 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Gt, dest, jumpIf
efb0: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
efc0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
efd0: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
efe0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
eff0: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
f000: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f010: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f  AddOp(v, OP_IfNo
f020: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  t, jumpIfNull, d
f030: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f040: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
f050: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
f060: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
f070: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
f080: 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
f090: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
f0a0: 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
f0b0: 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
f0c0: 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
f0d0: 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
f0e0: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f0f0: 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
f100: 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a  *pA, Expr *pB){.
f110: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f120: 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  A==0 ){.    retu
f130: 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73  rn pB==0;.  }els
f140: 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20  e if( pB==0 ){. 
f150: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f160: 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
f170: 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
f180: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
f190: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f1a0: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
f1b0: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
f1c0: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
f1d0: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
f1e0: 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
f1f0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f200: 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
f210: 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
f220: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f230: 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
f240: 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
f250: 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
f260: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
f270: 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
f280: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
f290: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
f2a0: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f2b0: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f2c0: 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
f2d0: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
f2e0: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f2f0: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f300: 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
f310: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
f320: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
f330: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
f340: 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
f350: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
f360: 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
f370: 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
f380: 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
f390: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f3a0: 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
f3b0: 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
f3c0: 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
f3d0: 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
f3e0: 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
f3f0: 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
f400: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
f410: 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e  rNICmp(pA->token
f420: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c  .z, pB->token.z,
f430: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30   pB->token.n)!=0
f440: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
f450: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f460: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
f470: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
f480: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
f490: 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ray and return i
f4a0: 74 73 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  ts index..** The
f4b0: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 69 73 20   new element is 
f4c0: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
f4d0: 65 72 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ero.  The callin
f4e0: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  g function is.**
f4f0: 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 69 6c   expected to fil
f500: 6c 20 69 74 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74  l it in..*/.stat
f510: 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67  ic int appendAgg
f520: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
f530: 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72  se){.  if( (pPar
f540: 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d  se->nAgg & 0x7)=
f550: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d  =0 ){.    int am
f560: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  t = pParse->nAgg
f570: 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70   + 8;.    AggExp
f580: 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65  r *aAgg = sqlite
f590: 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  Realloc(pParse->
f5a0: 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66  aAgg, amt*sizeof
f5b0: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
f5c0: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67  ));.    if( aAgg
f5d0: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
f5e0: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
f5f0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
f600: 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aAgg;.  }.  mem
f610: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67  set(&pParse->aAg
f620: 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c  g[pParse->nAgg],
f630: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73   0, sizeof(pPars
f640: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
f650: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
f660: 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Agg++;.}../*.** 
f670: 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63  This is an xFunc
f680: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
f690: 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  e() used to impl
f6a0: 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65  ement .** sqlite
f6b0: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
f6c0: 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
f6d0: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
f6e0: 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
f6f0: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f700: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
f710: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
f720: 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65  alyzes the aggre
f730: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74  gate function at
f740: 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69   pExpr..*/.stati
f750: 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
f760: 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72  regate(void *pAr
f770: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
f780: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45  .  int i;.  AggE
f790: 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 4e 61 6d  xpr *aAgg;.  Nam
f7a0: 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 20 3d 20  eContext *pNC = 
f7b0: 28 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 29 70  (NameContext *)p
f7c0: 41 72 67 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  Arg;.  Parse *pP
f7d0: 61 72 73 65 20 3d 20 70 4e 43 2d 3e 70 50 61 72  arse = pNC->pPar
f7e0: 73 65 3b 0a 20 20 53 72 63 4c 69 73 74 20 2a 70  se;.  SrcList *p
f7f0: 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e 70  SrcList = pNC->p
f800: 53 72 63 4c 69 73 74 3b 0a 0a 20 20 73 77 69 74  SrcList;..  swit
f810: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
f820: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c  .    case TK_COL
f830: 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 66 6f 72  UMN: {.      for
f840: 28 69 3d 30 3b 20 70 53 72 63 4c 69 73 74 20 26  (i=0; pSrcList &
f850: 26 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  & i<pSrcList->nS
f860: 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  rc; i++){.      
f870: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
f880: 62 6c 65 3d 3d 70 53 72 63 4c 69 73 74 2d 3e 61  ble==pSrcList->a
f890: 5b 69 5d 2e 69 43 75 72 73 6f 72 20 29 7b 0a 20  [i].iCursor ){. 
f8a0: 20 20 20 20 20 20 20 20 20 61 41 67 67 20 3d 20           aAgg = 
f8b0: 70 50 61 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20  pParse->aAgg;.  
f8c0: 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b          for(i=0;
f8d0: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
f8e0: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20   i++){.         
f8f0: 20 20 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69     if( aAgg[i].i
f900: 73 41 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b  sAgg ) continue;
f910: 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66 28  .            if(
f920: 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d 3e   aAgg[i].pExpr->
f930: 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e 69  iTable==pExpr->i
f940: 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20 20  Table.          
f950: 20 20 20 26 26 20 61 41 67 67 5b 69 5d 2e 70 45     && aAgg[i].pE
f960: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45  xpr->iColumn==pE
f970: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a  xpr->iColumn ){.
f980: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 62 72                br
f990: 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  eak;.           
f9a0: 20 7d 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20   }.          }. 
f9b0: 20 20 20 20 20 20 20 20 20 69 66 28 20 69 3e 3d           if( i>=
f9c0: 70 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a  pParse->nAgg ){.
f9d0: 20 20 20 20 20 20 20 20 20 20 20 20 69 20 3d 20              i = 
f9e0: 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28 70 50  appendAggInfo(pP
f9f0: 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 20  arse);.         
fa00: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
fa10: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 20  urn 1;.         
fa20: 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b     pParse->aAgg[
fa30: 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20 20  i].isAgg = 0;.  
fa40: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
fa50: 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 20  ->aAgg[i].pExpr 
fa60: 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  = pExpr;.       
fa70: 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20 70     }.          p
fa80: 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a  Expr->iAgg = i;.
fa90: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
faa0: 3e 69 41 67 67 43 74 78 20 3d 20 70 4e 43 2d 3e  >iAggCtx = pNC->
fab0: 6e 44 65 70 74 68 3b 0a 20 20 20 20 20 20 20 20  nDepth;.        
fac0: 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20    return 1;.    
fad0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
fae0: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
faf0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fb00: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
fb10: 20 20 20 20 20 20 69 66 28 20 70 4e 43 2d 3e 6e        if( pNC->n
fb20: 44 65 70 74 68 3d 3d 30 20 29 7b 0a 20 20 20 20  Depth==0 ){.    
fb30: 20 20 20 20 61 41 67 67 20 3d 20 70 50 61 72 73      aAgg = pPars
fb40: 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20 20 20  e->aAgg;.       
fb50: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
fb60: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
fb70: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 21 61            if( !a
fb80: 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63  Agg[i].isAgg ) c
fb90: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20  ontinue;.       
fba0: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78     if( sqlite3Ex
fbb0: 70 72 43 6f 6d 70 61 72 65 28 61 41 67 67 5b 69  prCompare(aAgg[i
fbc0: 5d 2e 70 45 78 70 72 2c 20 70 45 78 70 72 29 20  ].pExpr, pExpr) 
fbd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  ){.            b
fbe0: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
fbf0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
fc00: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
fc10: 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20 20 20  e->nAgg ){.     
fc20: 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20 70 50       u8 enc = pP
fc30: 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 0a 20  arse->db->enc;. 
fc40: 20 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70           i = app
fc50: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
fc60: 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66  e);.          if
fc70: 28 20 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31  ( i<0 ) return 1
fc80: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50 61 72  ;.          pPar
fc90: 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41 67  se->aAgg[i].isAg
fca0: 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 20  g = 1;.         
fcb0: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d   pParse->aAgg[i]
fcc0: 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  .pExpr = pExpr;.
fcd0: 20 20 20 20 20 20 20 20 20 20 70 50 61 72 73 65            pParse
fce0: 2d 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20  ->aAgg[i].pFunc 
fcf0: 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e  = sqlite3FindFun
fd00: 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62  ction(pParse->db
fd10: 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
fd20: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
fd30: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c   pExpr->token.n,
fd40: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
fd50: 70 45 78 70 72 2d 3e 70 4c 69 73 74 20 3f 20 70  pExpr->pList ? p
fd60: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78  Expr->pList->nEx
fd70: 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29 3b  pr : 0, enc, 0);
fd80: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
fd90: 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20 3d     pExpr->iAgg =
fda0: 20 69 3b 0a 20 20 20 20 20 20 20 20 72 65 74 75   i;.        retu
fdb0: 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 1;.      }.  
fdc0: 20 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 70 45    }.  }.  if( pE
fdd0: 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b 0a  xpr->pSelect ){.
fde0: 20 20 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2b      pNC->nDepth+
fdf0: 2b 3b 0a 20 20 20 20 77 61 6c 6b 53 65 6c 65 63  +;.    walkSelec
fe00: 74 45 78 70 72 28 70 45 78 70 72 2d 3e 70 53 65  tExpr(pExpr->pSe
fe10: 6c 65 63 74 2c 20 61 6e 61 6c 79 7a 65 41 67 67  lect, analyzeAgg
fe20: 72 65 67 61 74 65 2c 20 70 4e 43 29 3b 0a 20 20  regate, pNC);.  
fe30: 20 20 70 4e 43 2d 3e 6e 44 65 70 74 68 2d 2d 3b    pNC->nDepth--;
fe40: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
fe50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
fe60: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
fe70: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
fe80: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
fe90: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
fea0: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
feb0: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
fec0: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
fed0: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
fee0: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
fef0: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
ff00: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
ff10: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
ff20: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
ff30: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
ff40: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
ff50: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
ff60: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
ff70: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
ff80: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
ff90: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
ffa0: 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
ffb0: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
ffc0: 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
ffd0: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
ffe0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
fff0: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
10000 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
10010 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43 6f 6e  gregates(NameCon
10020 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72 20  text *pNC, Expr 
10030 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e  *pExpr){.  int n
10040 45 72 72 20 3d 20 70 4e 43 2d 3e 70 50 61 72 73  Err = pNC->pPars
10050 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b 45  e->nErr;.  walkE
10060 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 61  xprTree(pExpr, a
10070 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 2c  nalyzeAggregate,
10080 20 70 4e 43 29 3b 0a 20 20 72 65 74 75 72 6e 20   pNC);.  return 
10090 70 4e 43 2d 3e 70 50 61 72 73 65 2d 3e 6e 45 72  pNC->pParse->nEr
100a0 72 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a  r - nErr;.}../*.
100b0 2a 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72  ** Locate a user
100c0 20 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20   function given 
100d0 61 20 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72  a name, a number
100e0 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e   of arguments an
100f0 64 20 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69  d a flag.** indi
10100 63 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 74  cating whether t
10110 68 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66  he function pref
10120 65 72 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20  ers UTF-16 over 
10130 55 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61  UTF-8.  Return a
10140 0a 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74  .** pointer to t
10150 68 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63  he FuncDef struc
10160 74 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65  ture that define
10170 73 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c  s that function,
10180 20 6f 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55   or return.** NU
10190 4c 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69  LL if the functi
101a0 6f 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73  on does not exis
101b0 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  t..**.** If the 
101c0 63 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d  createFlag argum
101d0 65 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65  ent is true, the
101e0 6e 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20  n a new (blank) 
101f0 46 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63  FuncDef.** struc
10200 74 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20  ture is created 
10210 61 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74  and liked into t
10220 68 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72  he "db" structur
10230 65 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74  e if a.** no mat
10240 63 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70  ching function p
10250 72 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65  reviously existe
10260 64 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46  d.  When createF
10270 6c 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61  lag is true.** a
10280 6e 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61  nd the nArg para
10290 6d 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65  meter is -1, the
102a0 6e 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f  n only a functio
102b0 6e 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a  n that accepts.*
102c0 2a 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20  * any number of 
102d0 61 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62  arguments will b
102e0 65 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a  e returned..**.*
102f0 2a 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20  * If createFlag 
10300 69 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72  is false and nAr
10310 67 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68  g is -1, then th
10320 65 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a  e first valid.**
10330 20 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20   function found 
10340 69 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20  is returned.  A 
10350 66 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69  function is vali
10360 64 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e  d if either xFun
10370 63 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73  c.** or xStep is
10380 20 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a   non-zero..**.**
10390 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
103a0 73 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20  s false, then a 
103b0 66 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68  function with th
103c0 65 20 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20  e required name 
103d0 61 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66  and.** number of
103e0 20 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62   arguments may b
103f0 65 20 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20  e returned even 
10400 69 66 20 74 68 65 20 65 54 65 78 74 52 65 70 20  if the eTextRep 
10410 66 6c 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a  flag does not.**
10420 20 6d 61 74 63 68 20 74 68 61 74 20 72 65 71 75   match that requ
10430 65 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65  ested..*/.FuncDe
10440 66 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75  f *sqlite3FindFu
10450 6e 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65  nction(.  sqlite
10460 33 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20  3 *db,       /* 
10470 41 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65  An open database
10480 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72   */.  const char
10490 20 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65   *zName, /* Name
104a0 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e   of the function
104b0 2e 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d  .  Not null-term
104c0 69 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20  inated */.  int 
104d0 6e 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f  nName,         /
104e0 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72  * Number of char
104f0 61 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61  acters in the na
10500 6d 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67  me */.  int nArg
10510 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75  ,          /* Nu
10520 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
10530 73 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79  s.  -1 means any
10540 20 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20   number */.  u8 
10550 65 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20  enc,            
10560 2f 2a 20 50 72 65 66 65 72 72 65 64 20 74 65 78  /* Preferred tex
10570 74 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20  t encoding */.  
10580 69 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20 20  int createFlag  
10590 20 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77     /* Create new
105a0 20 65 6e 74 72 79 20 69 66 20 74 72 75 65 20 61   entry if true a
105b0 6e 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65  nd does not othe
105c0 72 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29  rwise exist */.)
105d0 7b 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20  {.  FuncDef *p; 
105e0 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
105f0 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
10600 20 20 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73    FuncDef *pFirs
10610 74 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66  t;    /* First f
10620 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69  unction with thi
10630 73 20 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63  s name */.  Func
10640 44 65 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20  Def *pBest = 0; 
10650 2f 2a 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f  /* Best match fo
10660 75 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20  und so far */.  
10670 69 6e 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20  int bestmatch = 
10680 30 3b 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28  0;  ...  assert(
10690 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46   enc==SQLITE_UTF
106a0 38 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45  8 || enc==SQLITE
106b0 5f 55 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d  _UTF16LE || enc=
106c0 3d 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20  =SQLITE_UTF16BE 
106d0 29 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31  );.  if( nArg<-1
106e0 20 29 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20   ) nArg = -1;.. 
106f0 20 70 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44   pFirst = (FuncD
10700 65 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46  ef*)sqlite3HashF
10710 69 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20  ind(&db->aFunc, 
10720 7a 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20  zName, nName);. 
10730 20 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70   for(p=pFirst; p
10740 3b 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20  ; p=p->pNext){. 
10750 20 20 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65     /* During the
10760 20 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20   search for the 
10770 62 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65  best function de
10780 66 69 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61  finition, bestma
10790 74 63 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a  tch is set.    *
107a0 2a 20 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20  * as follows to 
107b0 69 6e 64 69 63 61 74 65 20 74 68 65 20 71 75 61  indicate the qua
107c0 6c 69 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63  lity of the matc
107d0 68 20 77 69 74 68 20 74 68 65 20 64 65 66 69 6e  h with the defin
107e0 69 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69  ition.    ** poi
107f0 6e 74 65 64 20 74 6f 20 62 79 20 70 42 65 73 74  nted to by pBest
10800 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  :.    **.    ** 
10810 30 3a 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c  0: pBest is NULL
10820 2e 20 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62  . No match has b
10830 65 65 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a  een found..    *
10840 2a 20 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20  * 1: A variable 
10850 61 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69  arguments functi
10860 6f 6e 20 74 68 61 74 20 70 72 65 66 65 72 73 20  on that prefers 
10870 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46  UTF-8 when a UTF
10880 2d 31 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e  -16.    **    en
10890 63 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73  coding is reques
108a0 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
108b0 73 61 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20  sa..    ** 2: A 
108c0 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e  variable argumen
108d0 74 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74  ts function that
108e0 20 75 73 65 73 20 55 54 46 2d 31 36 42 45 20 77   uses UTF-16BE w
108f0 68 65 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a  hen UTF-16LE is.
10900 20 20 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73      **    reques
10910 74 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72  ted, or vice ver
10920 73 61 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20  sa..    ** 3: A 
10930 76 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e  variable argumen
10940 74 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e  ts function usin
10950 67 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20  g the same text 
10960 65 6e 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a  encoding..    **
10970 20 34 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77   4: A function w
10980 69 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75  ith the exact nu
10990 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74  mber of argument
109a0 73 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74  s requested that
109b0 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65  .    **    prefe
109c0 72 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20  rs UTF-8 when a 
109d0 55 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20  UTF-16 encoding 
109e0 69 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72  is requested, or
109f0 20 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20   vice versa..   
10a00 20 2a 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f   ** 5: A functio
10a10 6e 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74  n with the exact
10a20 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d   number of argum
10a30 65 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74  ents requested t
10a40 68 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72  hat.    **    pr
10a50 65 66 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77  efers UTF-16LE w
10a60 68 65 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20  hen UTF-16BE is 
10a70 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
10a80 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
10a90 20 36 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74   6: An exact mat
10aa0 63 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a  ch..    **.    *
10ab0 2a 20 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65  * A larger value
10ac0 20 6f 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20   of 'matchqual' 
10ad0 69 6e 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65  indicates a more
10ae0 20 64 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68   desirable match
10af0 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28  ..    */.    if(
10b00 20 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20   p->nArg==-1 || 
10b10 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c  p->nArg==nArg ||
10b20 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20   nArg==-1 ){.   
10b30 20 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31     int match = 1
10b40 3b 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75  ;          /* Qu
10b50 61 6c 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61  ality of this ma
10b60 74 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28  tch */.      if(
10b70 20 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c   p->nArg==nArg |
10b80 7c 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20  | nArg==-1 ){.  
10b90 20 20 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b        match = 4;
10ba0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
10bb0 66 28 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66  f( enc==p->iPref
10bc0 45 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  Enc ){.        m
10bd0 61 74 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20  atch += 2;.     
10be0 20 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66   }.      else if
10bf0 28 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55  ( (enc==SQLITE_U
10c00 54 46 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72  TF16LE && p->iPr
10c10 65 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  efEnc==SQLITE_UT
10c20 46 31 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20  F16BE) ||.      
10c30 20 20 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53           (enc==S
10c40 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 26 26  QLITE_UTF16BE &&
10c50 20 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51   p->iPrefEnc==SQ
10c60 4c 49 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b  LITE_UTF16LE) ){
10c70 0a 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b  .        match +
10c80 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20  = 1;.      }..  
10c90 20 20 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65      if( match>be
10ca0 73 74 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20  stmatch ){.     
10cb0 20 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20     pBest = p;.  
10cc0 20 20 20 20 20 20 62 65 73 74 6d 61 74 63 68 20        bestmatch 
10cd0 3d 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d  = match;.      }
10ce0 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a  .    }.  }..  /*
10cf0 20 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c   If the createFl
10d00 61 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20  ag parameter is 
10d10 74 72 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65  true, and the se
10d20 61 63 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65  ach did not reve
10d30 61 6c 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74  al an.  ** exact
10d40 20 6d 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e   match for the n
10d50 61 6d 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61  ame, number of a
10d60 72 67 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63  rguments and enc
10d70 6f 64 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20  oding, then add 
10d80 61 0a 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79  a.  ** new entry
10d90 20 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62   to the hash tab
10da0 6c 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74  le and return it
10db0 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65  ..  */.  if( cre
10dc0 61 74 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d  ateFlag && bestm
10dd0 61 74 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20  atch<6 && .     
10de0 20 28 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65   (pBest = sqlite
10df0 4d 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70  Malloc(sizeof(*p
10e00 42 65 73 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20  Best)+nName+1)) 
10e10 29 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41  ){.    pBest->nA
10e20 72 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70  rg = nArg;.    p
10e30 42 65 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46  Best->pNext = pF
10e40 69 72 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d  irst;.    pBest-
10e50 3e 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29  >zName = (char*)
10e60 26 70 42 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70  &pBest[1];.    p
10e70 42 65 73 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d  Best->iPrefEnc =
10e80 20 65 6e 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79   enc;.    memcpy
10e90 28 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a  (pBest->zName, z
10ea0 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
10eb0 20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e    pBest->zName[n
10ec0 4e 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 69  Name] = 0;.    i
10ed0 66 28 20 70 42 65 73 74 3d 3d 73 71 6c 69 74 65  f( pBest==sqlite
10ee0 33 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d  3HashInsert(&db-
10ef0 3e 61 46 75 6e 63 2c 70 42 65 73 74 2d 3e 7a 4e  >aFunc,pBest->zN
10f00 61 6d 65 2c 6e 4e 61 6d 65 2c 28 76 6f 69 64 2a  ame,nName,(void*
10f10 29 70 42 65 73 74 29 20 29 7b 0a 20 20 20 20 20  )pBest) ){.     
10f20 20 73 71 6c 69 74 65 46 72 65 65 28 70 42 65 73   sqliteFree(pBes
10f30 74 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  t);.      return
10f40 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20   0;.    }.  }.. 
10f50 20 69 66 28 20 70 42 65 73 74 20 26 26 20 28 70   if( pBest && (p
10f60 42 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70  Best->xStep || p
10f70 42 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63  Best->xFunc || c
10f80 72 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20  reateFlag) ){.  
10f90 20 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a    return pBest;.
10fa0 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
10fb0 7d 0a                                            }.