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

Artifact abadaf7b858084949ac36316a335384498c5b0e2:


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 38 38 20 32 30 30 35 2f 30 31 2f 32 33 20  .188 2005/01/23 
0220: 32 32 3a 34 31 3a 33 37 20 64 61 6e 69 65 6c 6b  22:41:37 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 69 66 28 20 70 54 6f 6b  ight;.  if( pTok
1880: 65 6e 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74  en ){.    assert
1890: 28 20 70 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30  ( pToken->dyn==0
18a0: 20 29 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 73 70   );.    pNew->sp
18b0: 61 6e 20 3d 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  an = pNew->token
18c0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
18d0: 6c 73 65 20 69 66 28 20 70 4c 65 66 74 20 26 26  lse if( pLeft &&
18e0: 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 73   pRight ){.    s
18f0: 71 6c 69 74 65 33 45 78 70 72 53 70 61 6e 28 70  qlite3ExprSpan(p
1900: 4e 65 77 2c 20 26 70 4c 65 66 74 2d 3e 73 70 61  New, &pLeft->spa
1910: 6e 2c 20 26 70 52 69 67 68 74 2d 3e 73 70 61 6e  n, &pRight->span
1920: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
1930: 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  pNew;.}../*.** W
1940: 68 65 6e 20 64 6f 69 6e 67 20 61 20 6e 65 73 74  hen doing a nest
1950: 65 64 20 70 61 72 73 65 2c 20 79 6f 75 20 63 61  ed parse, you ca
1960: 6e 20 69 6e 63 6c 75 64 65 20 74 65 72 6d 73 20  n include terms 
1970: 69 6e 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  in an expression
1980: 0a 2a 2a 20 74 68 61 74 20 6c 6f 6f 6b 20 6c 69  .** that look li
1990: 6b 65 20 74 68 69 73 3a 20 20 20 23 30 20 23 31  ke this:   #0 #1
19a0: 20 23 32 20 2e 2e 2e 20 20 54 68 65 73 65 20 74   #2 ...  These t
19b0: 65 72 6d 73 20 72 65 66 65 72 20 74 6f 20 65 6c  erms refer to el
19c0: 65 6d 65 6e 74 73 0a 2a 2a 20 6f 6e 20 74 68 65  ements.** on the
19d0: 20 73 74 61 63 6b 2e 20 20 22 23 30 22 20 28 6f   stack.  "#0" (o
19e0: 72 20 6a 75 73 74 20 22 23 22 29 20 6d 65 61 6e  r just "#") mean
19f0: 73 20 74 68 65 20 74 6f 70 20 6f 66 20 74 68 65  s the top of the
1a00: 20 73 74 61 63 6b 2e 0a 2a 2a 20 22 23 31 22 20   stack..** "#1" 
1a10: 6d 65 61 6e 73 20 74 68 65 20 6e 65 78 74 20 64  means the next d
1a20: 6f 77 6e 20 6f 6e 20 74 68 65 20 73 74 61 63 6b  own on the stack
1a30: 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e  .  And so forth.
1a40: 20 20 23 2d 31 20 6d 65 61 6e 73 0a 2a 2a 20 6d    #-1 means.** m
1a50: 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 30  emory location 0
1a60: 2e 20 20 23 2d 32 20 6d 65 61 6e 73 20 6d 65 6d  .  #-2 means mem
1a70: 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 20 31 2e 20  ory location 1. 
1a80: 20 41 6e 64 20 73 6f 20 66 6f 72 74 68 2e 0a 2a   And so forth..*
1a90: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
1aa0: 65 20 69 73 20 63 61 6c 6c 65 64 20 62 79 20 74  e is called by t
1ab0: 68 65 20 70 61 72 73 65 72 20 74 6f 20 64 65 61  he parser to dea
1ac0: 6c 20 77 69 74 68 20 6f 6e 20 6f 66 20 74 68 6f  l with on of tho
1ad0: 73 65 20 74 65 72 6d 73 2e 0a 2a 2a 20 49 74 20  se terms..** It 
1ae0: 69 6d 6d 65 64 69 61 74 65 6c 79 20 67 65 6e 65  immediately gene
1af0: 72 61 74 65 73 20 63 6f 64 65 20 74 6f 20 73 74  rates code to st
1b00: 6f 72 65 20 74 68 65 20 76 61 6c 75 65 20 69 6e  ore the value in
1b10: 20 61 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69   a memory locati
1b20: 6f 6e 2e 0a 2a 2a 20 54 68 65 20 72 65 74 75 72  on..** The retur
1b30: 6e 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  ns an expression
1b40: 20 74 68 61 74 20 77 69 6c 6c 20 63 6f 64 65 20   that will code 
1b50: 74 6f 20 65 78 74 72 61 63 74 20 74 68 65 20 76  to extract the v
1b60: 61 6c 75 65 20 66 72 6f 6d 0a 2a 2a 20 74 68 61  alue from.** tha
1b70: 74 20 6d 65 6d 6f 72 79 20 6c 6f 63 61 74 69 6f  t memory locatio
1b80: 6e 20 61 73 20 6e 65 65 64 65 64 2e 0a 2a 2f 0a  n as needed..*/.
1b90: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 52 65 67  Expr *sqlite3Reg
1ba0: 69 73 74 65 72 45 78 70 72 28 50 61 72 73 65 20  isterExpr(Parse 
1bb0: 2a 70 50 61 72 73 65 2c 20 54 6f 6b 65 6e 20 2a  *pParse, Token *
1bc0: 70 54 6f 6b 65 6e 29 7b 0a 20 20 56 64 62 65 20  pToken){.  Vdbe 
1bd0: 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64  *v = pParse->pVd
1be0: 62 65 3b 0a 20 20 45 78 70 72 20 2a 70 3b 0a 20  be;.  Expr *p;. 
1bf0: 20 69 6e 74 20 64 65 70 74 68 3b 0a 20 20 69 66   int depth;.  if
1c00: 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  ( v==0 ) return 
1c10: 30 3b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  0;.  if( pParse-
1c20: 3e 6e 65 73 74 65 64 3d 3d 30 20 29 7b 0a 20 20  >nested==0 ){.  
1c30: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1c40: 67 28 70 50 61 72 73 65 2c 20 22 6e 65 61 72 20  g(pParse, "near 
1c50: 5c 22 25 54 5c 22 3a 20 73 79 6e 74 61 78 20 65  \"%T\": syntax e
1c60: 72 72 6f 72 22 2c 20 70 54 6f 6b 65 6e 29 3b 0a  rror", pToken);.
1c70: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
1c80: 7d 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45  }.  p = sqlite3E
1c90: 78 70 72 28 54 4b 5f 52 45 47 49 53 54 45 52 2c  xpr(TK_REGISTER,
1ca0: 20 30 2c 20 30 2c 20 70 54 6f 6b 65 6e 29 3b 0a   0, 0, pToken);.
1cb0: 20 20 69 66 28 20 70 3d 3d 30 20 29 7b 0a 20 20    if( p==0 ){.  
1cc0: 20 20 72 65 74 75 72 6e 20 30 3b 20 20 2f 2a 20    return 0;  /* 
1cd0: 4d 61 6c 6c 6f 63 20 66 61 69 6c 65 64 20 2a 2f  Malloc failed */
1ce0: 0a 20 20 7d 0a 20 20 64 65 70 74 68 20 3d 20 61  .  }.  depth = a
1cf0: 74 6f 69 28 26 70 54 6f 6b 65 6e 2d 3e 7a 5b 31  toi(&pToken->z[1
1d00: 5d 29 3b 0a 20 20 69 66 28 20 64 65 70 74 68 3e  ]);.  if( depth>
1d10: 3d 30 20 29 7b 0a 20 20 20 20 70 2d 3e 69 54 61  =0 ){.    p->iTa
1d20: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
1d30: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
1d40: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
1d50: 5f 44 75 70 2c 20 64 65 70 74 68 2c 20 30 29 3b  _Dup, depth, 0);
1d60: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
1d70: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65 6d 53  AddOp(v, OP_MemS
1d80: 74 6f 72 65 2c 20 70 2d 3e 69 54 61 62 6c 65 2c  tore, p->iTable,
1d90: 20 31 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20   1);.  }else{.  
1da0: 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 2d 31    p->iTable = -1
1db0: 2d 64 65 70 74 68 3b 0a 20 20 7d 0a 20 20 72 65  -depth;.  }.  re
1dc0: 74 75 72 6e 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn p;.}../*.**
1dd0: 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65 73   Join two expres
1de0: 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20 41  sions using an A
1df0: 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49 66  ND operator.  If
1e00: 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73 69   either expressi
1e10: 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20 74  on is.** NULL, t
1e20: 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e 20  hen just return 
1e30: 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65 73  the other expres
1e40: 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  sion..*/.Expr *s
1e50: 71 6c 69 74 65 33 45 78 70 72 41 6e 64 28 45 78  qlite3ExprAnd(Ex
1e60: 70 72 20 2a 70 4c 65 66 74 2c 20 45 78 70 72 20  pr *pLeft, Expr 
1e70: 2a 70 52 69 67 68 74 29 7b 0a 20 20 69 66 28 20  *pRight){.  if( 
1e80: 70 4c 65 66 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pLeft==0 ){.    
1e90: 72 65 74 75 72 6e 20 70 52 69 67 68 74 3b 0a 20  return pRight;. 
1ea0: 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69 67 68   }else if( pRigh
1eb0: 74 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  t==0 ){.    retu
1ec0: 72 6e 20 70 4c 65 66 74 3b 0a 20 20 7d 65 6c 73  rn pLeft;.  }els
1ed0: 65 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 73 71  e{.    return sq
1ee0: 6c 69 74 65 33 45 78 70 72 28 54 4b 5f 41 4e 44  lite3Expr(TK_AND
1ef0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c  , pLeft, pRight,
1f00: 20 30 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a   0);.  }.}../*.*
1f10: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 2e 73  * Set the Expr.s
1f20: 70 61 6e 20 66 69 65 6c 64 20 6f 66 20 74 68 65  pan field of the
1f30: 20 67 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f   given expressio
1f40: 6e 20 74 6f 20 73 70 61 6e 20 61 6c 6c 0a 2a 2a  n to span all.**
1f50: 20 74 65 78 74 20 62 65 74 77 65 65 6e 20 74 68   text between th
1f60: 65 20 74 77 6f 20 67 69 76 65 6e 20 74 6f 6b 65  e two given toke
1f70: 6e 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  ns..*/.void sqli
1f80: 74 65 33 45 78 70 72 53 70 61 6e 28 45 78 70 72  te3ExprSpan(Expr
1f90: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
1fa0: 70 4c 65 66 74 2c 20 54 6f 6b 65 6e 20 2a 70 52  pLeft, Token *pR
1fb0: 69 67 68 74 29 7b 0a 20 20 61 73 73 65 72 74 28  ight){.  assert(
1fc0: 20 70 52 69 67 68 74 21 3d 30 20 29 3b 0a 20 20   pRight!=0 );.  
1fd0: 61 73 73 65 72 74 28 20 70 4c 65 66 74 21 3d 30  assert( pLeft!=0
1fe0: 20 29 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74   );.  if( !sqlit
1ff0: 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61 69 6c 65 64  e3_malloc_failed
2000: 20 26 26 20 70 52 69 67 68 74 2d 3e 7a 20 26 26   && pRight->z &&
2010: 20 70 4c 65 66 74 2d 3e 7a 20 29 7b 0a 20 20 20   pLeft->z ){.   
2020: 20 61 73 73 65 72 74 28 20 70 4c 65 66 74 2d 3e   assert( pLeft->
2030: 64 79 6e 3d 3d 30 20 7c 7c 20 70 4c 65 66 74 2d  dyn==0 || pLeft-
2040: 3e 7a 5b 70 4c 65 66 74 2d 3e 6e 5d 3d 3d 30 20  >z[pLeft->n]==0 
2050: 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74  );.    if( pLeft
2060: 2d 3e 64 79 6e 3d 3d 30 20 26 26 20 70 52 69 67  ->dyn==0 && pRig
2070: 68 74 2d 3e 64 79 6e 3d 3d 30 20 29 7b 0a 20 20  ht->dyn==0 ){.  
2080: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
2090: 7a 20 3d 20 70 4c 65 66 74 2d 3e 7a 3b 0a 20 20  z = pLeft->z;.  
20a0: 20 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e      pExpr->span.
20b0: 6e 20 3d 20 70 52 69 67 68 74 2d 3e 6e 20 2b 20  n = pRight->n + 
20c0: 41 64 64 72 28 70 52 69 67 68 74 2d 3e 7a 29 20  Addr(pRight->z) 
20d0: 2d 20 41 64 64 72 28 70 4c 65 66 74 2d 3e 7a 29  - Addr(pLeft->z)
20e0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
20f0: 20 20 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e 7a     pExpr->span.z
2100: 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
2110: 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75  }../*.** Constru
2120: 63 74 20 61 20 6e 65 77 20 65 78 70 72 65 73 73  ct a new express
2130: 69 6f 6e 20 6e 6f 64 65 20 66 6f 72 20 61 20 66  ion node for a f
2140: 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 6d 75 6c  unction with mul
2150: 74 69 70 6c 65 0a 2a 2a 20 61 72 67 75 6d 65 6e  tiple.** argumen
2160: 74 73 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c  ts..*/.Expr *sql
2170: 69 74 65 33 45 78 70 72 46 75 6e 63 74 69 6f 6e  ite3ExprFunction
2180: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
2190: 2c 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b 65 6e 29  , Token *pToken)
21a0: 7b 0a 20 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a  {.  Expr *pNew;.
21b0: 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d    pNew = sqliteM
21c0: 61 6c 6c 6f 63 28 20 73 69 7a 65 6f 66 28 45 78  alloc( sizeof(Ex
21d0: 70 72 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  pr) );.  if( pNe
21e0: 77 3d 3d 30 20 29 7b 0a 20 20 20 20 2f 2a 20 73  w==0 ){.    /* s
21f0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 65  qlite3ExprListDe
2200: 6c 65 74 65 28 70 4c 69 73 74 29 3b 20 2f 2f 20  lete(pList); // 
2210: 4c 65 61 6b 20 70 4c 69 73 74 20 77 68 65 6e 20  Leak pList when 
2220: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
2230: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
2240: 7d 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 54  }.  pNew->op = T
2250: 4b 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20 20 70 4e  K_FUNCTION;.  pN
2260: 65 77 2d 3e 70 4c 69 73 74 20 3d 20 70 4c 69 73  ew->pList = pLis
2270: 74 3b 0a 20 20 69 66 28 20 70 54 6f 6b 65 6e 20  t;.  if( pToken 
2280: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
2290: 54 6f 6b 65 6e 2d 3e 64 79 6e 3d 3d 30 20 29 3b  Token->dyn==0 );
22a0: 0a 20 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e  .    pNew->token
22b0: 20 3d 20 2a 70 54 6f 6b 65 6e 3b 0a 20 20 7d 65   = *pToken;.  }e
22c0: 6c 73 65 7b 0a 20 20 20 20 70 4e 65 77 2d 3e 74  lse{.    pNew->t
22d0: 6f 6b 65 6e 2e 7a 20 3d 20 30 3b 0a 20 20 7d 0a  oken.z = 0;.  }.
22e0: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 20 3d 20 70    pNew->span = p
22f0: 4e 65 77 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 72 65  New->token;.  re
2300: 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a  turn pNew;.}../*
2310: 0a 2a 2a 20 41 73 73 69 67 6e 20 61 20 76 61 72  .** Assign a var
2320: 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 74 6f 20  iable number to 
2330: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 68  an expression th
2340: 61 74 20 65 6e 63 6f 64 65 73 20 61 20 77 69 6c  at encodes a wil
2350: 64 63 61 72 64 0a 2a 2a 20 69 6e 20 74 68 65 20  dcard.** in the 
2360: 6f 72 69 67 69 6e 61 6c 20 53 51 4c 20 73 74 61  original SQL sta
2370: 74 65 6d 65 6e 74 2e 20 20 0a 2a 2a 0a 2a 2a 20  tement.  .**.** 
2380: 57 69 6c 64 63 61 72 64 73 20 63 6f 6e 73 69 73  Wildcards consis
2390: 74 69 6e 67 20 6f 66 20 61 20 73 69 6e 67 6c 65  ting of a single
23a0: 20 22 3f 22 20 61 72 65 20 61 73 73 69 67 6e 65   "?" are assigne
23b0: 64 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  d the next seque
23c0: 6e 74 69 61 6c 0a 2a 2a 20 76 61 72 69 61 62 6c  ntial.** variabl
23d0: 65 20 6e 75 6d 62 65 72 2e 0a 2a 2a 0a 2a 2a 20  e number..**.** 
23e0: 57 69 6c 64 63 61 72 64 73 20 6f 66 20 74 68 65  Wildcards of the
23f0: 20 66 6f 72 6d 20 22 3f 6e 6e 6e 22 20 61 72 65   form "?nnn" are
2400: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e 75   assigned the nu
2410: 6d 62 65 72 20 22 6e 6e 6e 22 2e 20 20 57 65 20  mber "nnn".  We 
2420: 6d 61 6b 65 0a 2a 2a 20 73 75 72 65 20 22 6e 6e  make.** sure "nn
2430: 6e 22 20 69 73 20 6e 6f 74 20 74 6f 6f 20 62 65  n" is not too be
2440: 20 74 6f 20 61 76 6f 69 64 20 61 20 64 65 6e 69   to avoid a deni
2450: 61 6c 20 6f 66 20 73 65 72 76 69 63 65 20 61 74  al of service at
2460: 74 61 63 6b 20 77 68 65 6e 0a 2a 2a 20 74 68 65  tack when.** the
2470: 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 20 63   SQL statement c
2480: 6f 6d 65 73 20 66 72 6f 6d 20 61 6e 20 65 78 74  omes from an ext
2490: 65 72 6e 61 6c 20 73 6f 75 72 63 65 2e 0a 2a 2a  ernal source..**
24a0: 0a 2a 2a 20 57 69 6c 64 63 61 72 64 73 20 6f 66  .** Wildcards of
24b0: 20 74 68 65 20 66 6f 72 6d 20 22 3a 61 61 61 22   the form ":aaa"
24c0: 20 6f 72 20 22 24 61 61 61 22 20 61 72 65 20 61   or "$aaa" are a
24d0: 73 73 69 67 6e 65 64 20 74 68 65 20 73 61 6d 65  ssigned the same
24e0: 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20 74 68   number.** as th
24f0: 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73 74 61  e previous insta
2500: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2510: 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20 69 66  wildcard.  Or if
2520: 20 74 68 69 73 20 69 73 20 74 68 65 20 66 69 72   this is the fir
2530: 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65 20 6f  st.** instance o
2540: 66 20 74 68 65 20 77 69 6c 64 63 61 72 64 2c 20  f the wildcard, 
2550: 74 68 65 20 6e 65 78 74 20 73 65 71 75 65 6e 69  the next sequeni
2560: 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62  al variable numb
2570: 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67 6e 65  er is.** assigne
2580: 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  d..*/.void sqlit
2590: 65 33 45 78 70 72 41 73 73 69 67 6e 56 61 72 4e  e3ExprAssignVarN
25a0: 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70 50 61  umber(Parse *pPa
25b0: 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72  rse, Expr *pExpr
25c0: 29 7b 0a 20 20 54 6f 6b 65 6e 20 2a 70 54 6f 6b  ){.  Token *pTok
25d0: 65 6e 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d  en;.  if( pExpr=
25e0: 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 70  =0 ) return;.  p
25f0: 54 6f 6b 65 6e 20 3d 20 26 70 45 78 70 72 2d 3e  Token = &pExpr->
2600: 74 6f 6b 65 6e 3b 0a 20 20 61 73 73 65 72 74 28  token;.  assert(
2610: 20 70 54 6f 6b 65 6e 2d 3e 6e 3e 3d 31 20 29 3b   pToken->n>=1 );
2620: 0a 20 20 61 73 73 65 72 74 28 20 70 54 6f 6b 65  .  assert( pToke
2630: 6e 2d 3e 7a 21 3d 30 20 29 3b 0a 20 20 61 73 73  n->z!=0 );.  ass
2640: 65 72 74 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30  ert( pToken->z[0
2650: 5d 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70 54  ]!=0 );.  if( pT
2660: 6f 6b 65 6e 2d 3e 6e 3d 3d 31 20 29 7b 0a 20 20  oken->n==1 ){.  
2670: 20 20 2f 2a 20 57 69 6c 64 63 61 72 64 20 6f 66    /* Wildcard of
2680: 20 74 68 65 20 66 6f 72 6d 20 22 3f 22 2e 20 20   the form "?".  
2690: 41 73 73 69 67 6e 20 74 68 65 20 6e 65 78 74 20  Assign the next 
26a0: 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20  variable number 
26b0: 2a 2f 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 54  */.    pExpr->iT
26c0: 61 62 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d  able = ++pParse-
26d0: 3e 6e 56 61 72 3b 0a 20 20 7d 65 6c 73 65 20 69  >nVar;.  }else i
26e0: 66 28 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d  f( pToken->z[0]=
26f0: 3d 27 3f 27 20 29 7b 0a 20 20 20 20 2f 2a 20 57  ='?' ){.    /* W
2700: 69 6c 64 63 61 72 64 20 6f 66 20 74 68 65 20 66  ildcard of the f
2710: 6f 72 6d 20 22 3f 6e 6e 6e 22 2e 20 20 43 6f 6e  orm "?nnn".  Con
2720: 76 65 72 74 20 22 6e 6e 6e 22 20 74 6f 20 61 6e  vert "nnn" to an
2730: 20 69 6e 74 65 67 65 72 20 61 6e 64 0a 20 20 20   integer and.   
2740: 20 2a 2a 20 75 73 65 20 69 74 20 61 73 20 74 68   ** use it as th
2750: 65 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  e variable numbe
2760: 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 69 3b 0a  r */.    int i;.
2770: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
2780: 65 20 3d 20 69 20 3d 20 61 74 6f 69 28 26 70 54  e = i = atoi(&pT
2790: 6f 6b 65 6e 2d 3e 7a 5b 31 5d 29 3b 0a 20 20 20  oken->z[1]);.   
27a0: 20 69 66 28 20 69 3c 31 20 7c 7c 20 69 3e 53 51   if( i<1 || i>SQ
27b0: 4c 49 54 45 5f 4d 41 58 5f 56 41 52 49 41 42 4c  LITE_MAX_VARIABL
27c0: 45 5f 4e 55 4d 42 45 52 20 29 7b 0a 20 20 20 20  E_NUMBER ){.    
27d0: 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
27e0: 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69 61  g(pParse, "varia
27f0: 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74 20  ble number must 
2800: 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61 6e  be between ?1 an
2810: 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20 20  d ?%d",.        
2820: 20 20 53 51 4c 49 54 45 5f 4d 41 58 5f 56 41 52    SQLITE_MAX_VAR
2830: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 29 3b 0a 20  IABLE_NUMBER);. 
2840: 20 20 20 7d 0a 20 20 20 20 69 66 28 20 69 3e 70     }.    if( i>p
2850: 50 61 72 73 65 2d 3e 6e 56 61 72 20 29 7b 0a 20  Parse->nVar ){. 
2860: 20 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61       pParse->nVa
2870: 72 20 3d 20 69 3b 0a 20 20 20 20 7d 0a 20 20 7d  r = i;.    }.  }
2880: 65 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 57 69 6c  else{.    /* Wil
2890: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
28a0: 72 6d 20 22 3a 61 61 61 22 20 6f 72 20 22 24 61  rm ":aaa" or "$a
28b0: 61 61 22 2e 20 20 52 65 75 73 65 20 74 68 65 20  aa".  Reuse the 
28c0: 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a 20 20  same variable.  
28d0: 20 20 2a 2a 20 6e 75 6d 62 65 72 20 61 73 20 74    ** number as t
28e0: 68 65 20 70 72 69 6f 72 20 61 70 70 65 61 72 61  he prior appeara
28f0: 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d 65 20  nce of the same 
2900: 6e 61 6d 65 2c 20 6f 72 20 69 66 20 74 68 65 20  name, or if the 
2910: 6e 61 6d 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  name.    ** has 
2920: 6e 65 76 65 72 20 61 70 70 65 61 72 65 64 20 62  never appeared b
2930: 65 66 6f 72 65 2c 20 72 65 75 73 65 20 74 68 65  efore, reuse the
2940: 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 20 6e   same variable n
2950: 75 6d 62 65 72 0a 20 20 20 20 2a 2f 0a 20 20 20  umber.    */.   
2960: 20 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 20 20 6e   int i, n;.    n
2970: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e 3b 0a 20 20   = pToken->n;.  
2980: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61    for(i=0; i<pPa
2990: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3b 20 69  rse->nVarExpr; i
29a0: 2b 2b 29 7b 0a 20 20 20 20 20 20 45 78 70 72 20  ++){.      Expr 
29b0: 2a 70 45 3b 0a 20 20 20 20 20 20 69 66 28 20 28  *pE;.      if( (
29c0: 70 45 20 3d 20 70 50 61 72 73 65 2d 3e 61 70 56  pE = pParse->apV
29d0: 61 72 45 78 70 72 5b 69 5d 29 21 3d 30 0a 20 20  arExpr[i])!=0.  
29e0: 20 20 20 20 20 20 20 20 26 26 20 70 45 2d 3e 74          && pE->t
29f0: 6f 6b 65 6e 2e 6e 3d 3d 6e 0a 20 20 20 20 20 20  oken.n==n.      
2a00: 20 20 20 20 26 26 20 6d 65 6d 63 6d 70 28 70 45      && memcmp(pE
2a10: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 54 6f 6b 65  ->token.z, pToke
2a20: 6e 2d 3e 7a 2c 20 6e 29 3d 3d 30 20 29 7b 0a 20  n->z, n)==0 ){. 
2a30: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54         pExpr->iT
2a40: 61 62 6c 65 20 3d 20 70 45 2d 3e 69 54 61 62 6c  able = pE->iTabl
2a50: 65 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  e;.        break
2a60: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a  ;.      }.    }.
2a70: 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61 72 73      if( i>=pPars
2a80: 65 2d 3e 6e 56 61 72 45 78 70 72 20 29 7b 0a 20  e->nVarExpr ){. 
2a90: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
2aa0: 6c 65 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  le = ++pParse->n
2ab0: 56 61 72 3b 0a 20 20 20 20 20 20 69 66 28 20 70  Var;.      if( p
2ac0: 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 3e  Parse->nVarExpr>
2ad0: 3d 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  =pParse->nVarExp
2ae0: 72 41 6c 6c 6f 63 2d 31 20 29 7b 0a 20 20 20 20  rAlloc-1 ){.    
2af0: 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 56 61 72      pParse->nVar
2b00: 45 78 70 72 41 6c 6c 6f 63 20 2b 3d 20 70 50 61  ExprAlloc += pPa
2b10: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b20: 6f 63 20 2b 20 31 30 3b 0a 20 20 20 20 20 20 20  oc + 10;.       
2b30: 20 70 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78   pParse->apVarEx
2b40: 70 72 20 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c  pr = sqliteReall
2b50: 6f 63 28 70 50 61 72 73 65 2d 3e 61 70 56 61 72  oc(pParse->apVar
2b60: 45 78 70 72 2c 0a 20 20 20 20 20 20 20 20 20 20  Expr,.          
2b70: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 50 61               pPa
2b80: 72 73 65 2d 3e 6e 56 61 72 45 78 70 72 41 6c 6c  rse->nVarExprAll
2b90: 6f 63 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65  oc*sizeof(pParse
2ba0: 2d 3e 61 70 56 61 72 45 78 70 72 5b 30 5d 29 20  ->apVarExpr[0]) 
2bb0: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
2bc0: 20 69 66 28 20 21 73 71 6c 69 74 65 33 5f 6d 61   if( !sqlite3_ma
2bd0: 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20  lloc_failed ){. 
2be0: 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70         assert( p
2bf0: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2c00: 21 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 70  !=0 );.        p
2c10: 50 61 72 73 65 2d 3e 61 70 56 61 72 45 78 70 72  Parse->apVarExpr
2c20: 5b 70 50 61 72 73 65 2d 3e 6e 56 61 72 45 78 70  [pParse->nVarExp
2c30: 72 2b 2b 5d 20 3d 20 70 45 78 70 72 3b 0a 20 20  r++] = pExpr;.  
2c40: 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 20      }.    }.  } 
2c50: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
2c60: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
2c70: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
2c80: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2c90: 45 78 70 72 44 65 6c 65 74 65 28 45 78 70 72 20  ExprDelete(Expr 
2ca0: 2a 70 29 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20  *p){.  if( p==0 
2cb0: 29 20 72 65 74 75 72 6e 3b 0a 20 20 69 66 28 20  ) return;.  if( 
2cc0: 70 2d 3e 73 70 61 6e 2e 64 79 6e 20 29 20 73 71  p->span.dyn ) sq
2cd0: 6c 69 74 65 46 72 65 65 28 28 63 68 61 72 2a 29  liteFree((char*)
2ce0: 70 2d 3e 73 70 61 6e 2e 7a 29 3b 0a 20 20 69 66  p->span.z);.  if
2cf0: 28 20 70 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 29  ( p->token.dyn )
2d00: 20 73 71 6c 69 74 65 46 72 65 65 28 28 63 68 61   sqliteFree((cha
2d10: 72 2a 29 70 2d 3e 74 6f 6b 65 6e 2e 7a 29 3b 0a  r*)p->token.z);.
2d20: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
2d30: 65 74 65 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20  ete(p->pLeft);. 
2d40: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
2d50: 74 65 28 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  te(p->pRight);. 
2d60: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
2d70: 44 65 6c 65 74 65 28 70 2d 3e 70 4c 69 73 74 29  Delete(p->pList)
2d80: 3b 0a 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63  ;.  sqlite3Selec
2d90: 74 44 65 6c 65 74 65 28 70 2d 3e 70 53 65 6c 65  tDelete(p->pSele
2da0: 63 74 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65  ct);.  sqliteFre
2db0: 65 28 70 29 3b 0a 7d 0a 0a 0a 2f 2a 0a 2a 2a 20  e(p);.}.../*.** 
2dc0: 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 67 72  The following gr
2dd0: 6f 75 70 20 6f 66 20 72 6f 75 74 69 6e 65 73 20  oup of routines 
2de0: 6d 61 6b 65 20 64 65 65 70 20 63 6f 70 69 65 73  make deep copies
2df0: 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 73 2c   of expressions,
2e00: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
2e10: 69 73 74 73 2c 20 49 44 20 6c 69 73 74 73 2c 20  ists, ID lists, 
2e20: 61 6e 64 20 73 65 6c 65 63 74 20 73 74 61 74 65  and select state
2e30: 6d 65 6e 74 73 2e 20 20 54 68 65 20 63 6f 70 69  ments.  The copi
2e40: 65 73 20 63 61 6e 0a 2a 2a 20 62 65 20 64 65 6c  es can.** be del
2e50: 65 74 65 64 20 28 62 79 20 62 65 69 6e 67 20 70  eted (by being p
2e60: 61 73 73 65 64 20 74 6f 20 74 68 65 69 72 20 72  assed to their r
2e70: 65 73 70 65 63 74 69 76 65 20 2e 2e 2e 44 65 6c  espective ...Del
2e80: 65 74 65 28 29 20 72 6f 75 74 69 6e 65 73 29 0a  ete() routines).
2e90: 2a 2a 20 77 69 74 68 6f 75 74 20 65 66 66 65 63  ** without effec
2ea0: 74 69 6e 67 20 74 68 65 20 6f 72 69 67 69 6e 61  ting the origina
2eb0: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 65 78  ls..**.** The ex
2ec0: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2c 20 49  pression list, I
2ed0: 44 2c 20 61 6e 64 20 73 6f 75 72 63 65 20 6c 69  D, and source li
2ee0: 73 74 73 20 72 65 74 75 72 6e 20 62 79 20 73 71  sts return by sq
2ef0: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
2f00: 28 29 2c 0a 2a 2a 20 73 71 6c 69 74 65 33 49 64  (),.** sqlite3Id
2f10: 4c 69 73 74 44 75 70 28 29 2c 20 61 6e 64 20 73  ListDup(), and s
2f20: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
2f30: 28 29 20 63 61 6e 20 6e 6f 74 20 62 65 20 66 75  () can not be fu
2f40: 72 74 68 65 72 20 65 78 70 61 6e 64 65 64 20 0a  rther expanded .
2f50: 2a 2a 20 62 79 20 73 75 62 73 65 71 75 65 6e 74  ** by subsequent
2f60: 20 63 61 6c 6c 73 20 74 6f 20 73 71 6c 69 74 65   calls to sqlite
2f70: 2a 4c 69 73 74 41 70 70 65 6e 64 28 29 20 72 6f  *ListAppend() ro
2f80: 75 74 69 6e 65 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  utines..**.** An
2f90: 79 20 74 61 62 6c 65 73 20 74 68 61 74 20 74 68  y tables that th
2fa0: 65 20 53 72 63 4c 69 73 74 20 6d 69 67 68 74 20  e SrcList might 
2fb0: 70 6f 69 6e 74 20 74 6f 20 61 72 65 20 6e 6f 74  point to are not
2fc0: 20 64 75 70 6c 69 63 61 74 65 64 2e 0a 2a 2f 0a   duplicated..*/.
2fd0: 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70  Expr *sqlite3Exp
2fe0: 72 44 75 70 28 45 78 70 72 20 2a 70 29 7b 0a 20  rDup(Expr *p){. 
2ff0: 20 45 78 70 72 20 2a 70 4e 65 77 3b 0a 20 20 69   Expr *pNew;.  i
3000: 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( p==0 ) return
3010: 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c   0;.  pNew = sql
3020: 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73 69  iteMallocRaw( si
3030: 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69 66  zeof(*p) );.  if
3040: 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75  ( pNew==0 ) retu
3050: 72 6e 20 30 3b 0a 20 20 6d 65 6d 63 70 79 28 70  rn 0;.  memcpy(p
3060: 4e 65 77 2c 20 70 2c 20 73 69 7a 65 6f 66 28 2a  New, p, sizeof(*
3070: 70 4e 65 77 29 29 3b 0a 20 20 69 66 28 20 70 2d  pNew));.  if( p-
3080: 3e 74 6f 6b 65 6e 2e 7a 21 3d 30 20 29 7b 0a 20  >token.z!=0 ){. 
3090: 20 20 20 70 4e 65 77 2d 3e 74 6f 6b 65 6e 2e 7a     pNew->token.z
30a0: 20 3d 20 73 71 6c 69 74 65 53 74 72 4e 44 75 70   = sqliteStrNDup
30b0: 28 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 2d 3e  (p->token.z, p->
30c0: 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 70 4e  token.n);.    pN
30d0: 65 77 2d 3e 74 6f 6b 65 6e 2e 64 79 6e 20 3d 20  ew->token.dyn = 
30e0: 31 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  1;.  }else{.    
30f0: 61 73 73 65 72 74 28 20 70 4e 65 77 2d 3e 74 6f  assert( pNew->to
3100: 6b 65 6e 2e 7a 3d 3d 30 20 29 3b 0a 20 20 7d 0a  ken.z==0 );.  }.
3110: 20 20 70 4e 65 77 2d 3e 73 70 61 6e 2e 7a 20 3d    pNew->span.z =
3120: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 4c 65 66   0;.  pNew->pLef
3130: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 44  t = sqlite3ExprD
3140: 75 70 28 70 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  up(p->pLeft);.  
3150: 70 4e 65 77 2d 3e 70 52 69 67 68 74 20 3d 20 73  pNew->pRight = s
3160: 71 6c 69 74 65 33 45 78 70 72 44 75 70 28 70 2d  qlite3ExprDup(p-
3170: 3e 70 52 69 67 68 74 29 3b 0a 20 20 70 4e 65 77  >pRight);.  pNew
3180: 2d 3e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  ->pList = sqlite
3190: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
31a0: 70 4c 69 73 74 29 3b 0a 20 20 70 4e 65 77 2d 3e  pList);.  pNew->
31b0: 70 53 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65  pSelect = sqlite
31c0: 33 53 65 6c 65 63 74 44 75 70 28 70 2d 3e 70 53  3SelectDup(p->pS
31d0: 65 6c 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e  elect);.  return
31e0: 20 70 4e 65 77 3b 0a 7d 0a 76 6f 69 64 20 73 71   pNew;.}.void sq
31f0: 6c 69 74 65 33 54 6f 6b 65 6e 43 6f 70 79 28 54  lite3TokenCopy(T
3200: 6f 6b 65 6e 20 2a 70 54 6f 2c 20 54 6f 6b 65 6e  oken *pTo, Token
3210: 20 2a 70 46 72 6f 6d 29 7b 0a 20 20 69 66 28 20   *pFrom){.  if( 
3220: 70 54 6f 2d 3e 64 79 6e 20 29 20 73 71 6c 69 74  pTo->dyn ) sqlit
3230: 65 46 72 65 65 28 28 63 68 61 72 2a 29 70 54 6f  eFree((char*)pTo
3240: 2d 3e 7a 29 3b 0a 20 20 69 66 28 20 70 46 72 6f  ->z);.  if( pFro
3250: 6d 2d 3e 7a 20 29 7b 0a 20 20 20 20 70 54 6f 2d  m->z ){.    pTo-
3260: 3e 6e 20 3d 20 70 46 72 6f 6d 2d 3e 6e 3b 0a 20  >n = pFrom->n;. 
3270: 20 20 20 70 54 6f 2d 3e 7a 20 3d 20 73 71 6c 69     pTo->z = sqli
3280: 74 65 53 74 72 4e 44 75 70 28 70 46 72 6f 6d 2d  teStrNDup(pFrom-
3290: 3e 7a 2c 20 70 46 72 6f 6d 2d 3e 6e 29 3b 0a 20  >z, pFrom->n);. 
32a0: 20 20 20 70 54 6f 2d 3e 64 79 6e 20 3d 20 31 3b     pTo->dyn = 1;
32b0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70 54  .  }else{.    pT
32c0: 6f 2d 3e 7a 20 3d 20 30 3b 0a 20 20 7d 0a 7d 0a  o->z = 0;.  }.}.
32d0: 45 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65  ExprList *sqlite
32e0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 45 78 70  3ExprListDup(Exp
32f0: 72 4c 69 73 74 20 2a 70 29 7b 0a 20 20 45 78 70  rList *p){.  Exp
3300: 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 73  rList *pNew;.  s
3310: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
3320: 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a 70 4f 6c  tem *pItem, *pOl
3330: 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 3b 0a  dItem;.  int i;.
3340: 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74    if( p==0 ) ret
3350: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20  urn 0;.  pNew = 
3360: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
3370: 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b 0a 20  zeof(*pNew) );. 
3380: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
3390: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
33a0: 3e 6e 45 78 70 72 20 3d 20 70 4e 65 77 2d 3e 6e  >nExpr = pNew->n
33b0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 45 78 70 72  Alloc = p->nExpr
33c0: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 70 49  ;.  pNew->a = pI
33d0: 74 65 6d 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  tem = sqliteMall
33e0: 6f 63 28 20 70 2d 3e 6e 45 78 70 72 2a 73 69 7a  oc( p->nExpr*siz
33f0: 65 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a  eof(p->a[0]) );.
3400: 20 20 69 66 28 20 70 49 74 65 6d 3d 3d 30 20 29    if( pItem==0 )
3410: 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  {.    sqliteFree
3420: 28 70 4e 65 77 29 3b 0a 20 20 20 20 72 65 74 75  (pNew);.    retu
3430: 72 6e 20 30 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c  rn 0;.  } .  pOl
3440: 64 49 74 65 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20  dItem = p->a;.  
3450: 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45  for(i=0; i<p->nE
3460: 78 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b  xpr; i++, pItem+
3470: 2b 2c 20 70 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a  +, pOldItem++){.
3480: 20 20 20 20 45 78 70 72 20 2a 70 4e 65 77 45 78      Expr *pNewEx
3490: 70 72 2c 20 2a 70 4f 6c 64 45 78 70 72 3b 0a 20  pr, *pOldExpr;. 
34a0: 20 20 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 20     pItem->pExpr 
34b0: 3d 20 70 4e 65 77 45 78 70 72 20 3d 20 73 71 6c  = pNewExpr = sql
34c0: 69 74 65 33 45 78 70 72 44 75 70 28 70 4f 6c 64  ite3ExprDup(pOld
34d0: 45 78 70 72 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Expr = pOldItem-
34e0: 3e 70 45 78 70 72 29 3b 0a 20 20 20 20 69 66 28  >pExpr);.    if(
34f0: 20 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e   pOldExpr->span.
3500: 7a 21 3d 30 20 26 26 20 70 4e 65 77 45 78 70 72  z!=0 && pNewExpr
3510: 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 41 6c 77   ){.      /* Alw
3520: 61 79 73 20 6d 61 6b 65 20 61 20 63 6f 70 79 20  ays make a copy 
3530: 6f 66 20 74 68 65 20 73 70 61 6e 20 66 6f 72 20  of the span for 
3540: 74 6f 70 2d 6c 65 76 65 6c 20 65 78 70 72 65 73  top-level expres
3550: 73 69 6f 6e 73 20 69 6e 20 74 68 65 0a 20 20 20  sions in the.   
3560: 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e     ** expression
3570: 20 6c 69 73 74 2e 20 20 54 68 65 20 6c 6f 67 69   list.  The logi
3580: 63 20 69 6e 20 53 45 4c 45 43 54 20 70 72 6f 63  c in SELECT proc
3590: 65 73 73 69 6e 67 20 74 68 61 74 20 64 65 74 65  essing that dete
35a0: 72 6d 69 6e 65 73 0a 20 20 20 20 20 20 2a 2a 20  rmines.      ** 
35b0: 74 68 65 20 6e 61 6d 65 73 20 6f 66 20 63 6f 6c  the names of col
35c0: 75 6d 6e 73 20 69 6e 20 74 68 65 20 72 65 73 75  umns in the resu
35d0: 6c 74 20 73 65 74 20 6e 65 65 64 73 20 74 68 69  lt set needs thi
35e0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 2a 2f  s information */
35f0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 54 6f  .      sqlite3To
3600: 6b 65 6e 43 6f 70 79 28 26 70 4e 65 77 45 78 70  kenCopy(&pNewExp
3610: 72 2d 3e 73 70 61 6e 2c 20 26 70 4f 6c 64 45 78  r->span, &pOldEx
3620: 70 72 2d 3e 73 70 61 6e 29 3b 0a 20 20 20 20 7d  pr->span);.    }
3630: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 65  .    assert( pNe
3640: 77 45 78 70 72 3d 3d 30 20 7c 7c 20 70 4e 65 77  wExpr==0 || pNew
3650: 45 78 70 72 2d 3e 73 70 61 6e 2e 7a 21 3d 30 20  Expr->span.z!=0 
3660: 0a 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20  .            || 
3670: 70 4f 6c 64 45 78 70 72 2d 3e 73 70 61 6e 2e 7a  pOldExpr->span.z
3680: 3d 3d 30 20 7c 7c 20 73 71 6c 69 74 65 33 5f 6d  ==0 || sqlite3_m
3690: 61 6c 6c 6f 63 5f 66 61 69 6c 65 64 20 29 3b 0a  alloc_failed );.
36a0: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
36b0: 20 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28   = sqliteStrDup(
36c0: 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29  pOldItem->zName)
36d0: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 73 6f 72  ;.    pItem->sor
36e0: 74 4f 72 64 65 72 20 3d 20 70 4f 6c 64 49 74 65  tOrder = pOldIte
36f0: 6d 2d 3e 73 6f 72 74 4f 72 64 65 72 3b 0a 20 20  m->sortOrder;.  
3700: 20 20 70 49 74 65 6d 2d 3e 69 73 41 67 67 20 3d    pItem->isAgg =
3710: 20 70 4f 6c 64 49 74 65 6d 2d 3e 69 73 41 67 67   pOldItem->isAgg
3720: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 64 6f 6e  ;.    pItem->don
3730: 65 20 3d 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74  e = 0;.  }.  ret
3740: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
3750: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
3760: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
3770: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
3780: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
3790: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
37a0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
37b0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
37c0: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
37d0: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
37e0: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
37f0: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
3800: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
3810: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
3820: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
3830: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
3840: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3850: 4d 49 54 5f 43 55 52 53 4f 52 29 20 7c 7c 20 21  MIT_CURSOR) || !
3860: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
3870: 4d 49 54 5f 56 49 45 57 29 20 5c 0a 20 7c 7c 20  MIT_VIEW) \. || 
3880: 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f  !defined(SQLITE_
3890: 4f 4d 49 54 5f 54 52 49 47 47 45 52 29 20 7c 7c  OMIT_TRIGGER) ||
38a0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
38b0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
38c0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
38d0: 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69  SrcListDup(SrcLi
38e0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
38f0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
3900: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
3910: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3920: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
3930: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
3940: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
3950: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
3960: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
3970: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3980: 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b  locRaw( nByte );
3990: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
39a0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
39b0: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
39c0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
39d0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
39e0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
39f0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
3a00: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3a10: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3a20: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
3a30: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
3a40: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
3a50: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
3a60: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
3a70: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
3a80: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
3a90: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
3aa0: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3ab0: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3ac0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
3ad0: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
3ae0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
3af0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
3b00: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
3b10: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
3b20: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
3b30: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
3b40: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
3b50: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62    pNewItem->pTab
3b60: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74   = 0;.    pNewIt
3b70: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
3b80: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3b90: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
3ba0: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3bb0: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
3bc0: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
3bd0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
3be0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
3bf0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
3c00: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
3c10: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
3c20: 65 77 3b 0a 7d 0a 49 64 4c 69 73 74 20 2a 73 71  ew;.}.IdList *sq
3c30: 6c 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 49  lite3IdListDup(I
3c40: 64 4c 69 73 74 20 2a 70 29 7b 0a 20 20 49 64 4c  dList *p){.  IdL
3c50: 69 73 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74  ist *pNew;.  int
3c60: 20 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29   i;.  if( p==0 )
3c70: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3c80: 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63  w = sqliteMalloc
3c90: 52 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 4e 65  Raw( sizeof(*pNe
3ca0: 77 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65 77  w) );.  if( pNew
3cb0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
3cc0: 20 20 70 4e 65 77 2d 3e 6e 49 64 20 3d 20 70 4e    pNew->nId = pN
3cd0: 65 77 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e  ew->nAlloc = p->
3ce0: 6e 49 64 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d  nId;.  pNew->a =
3cf0: 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77   sqliteMallocRaw
3d00: 28 20 70 2d 3e 6e 49 64 2a 73 69 7a 65 6f 66 28  ( p->nId*sizeof(
3d10: 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20 20 69 66  p->a[0]) );.  if
3d20: 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20 29 20 72  ( pNew->a==0 ) r
3d30: 65 74 75 72 6e 20 30 3b 0a 20 20 66 6f 72 28 69  eturn 0;.  for(i
3d40: 3d 30 3b 20 69 3c 70 2d 3e 6e 49 64 3b 20 69 2b  =0; i<p->nId; i+
3d50: 2b 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 49  +){.    struct I
3d60: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4e 65 77  dList_item *pNew
3d70: 49 74 65 6d 20 3d 20 26 70 4e 65 77 2d 3e 61 5b  Item = &pNew->a[
3d80: 69 5d 3b 0a 20 20 20 20 73 74 72 75 63 74 20 49  i];.    struct I
3d90: 64 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4f 6c 64  dList_item *pOld
3da0: 49 74 65 6d 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b  Item = &p->a[i];
3db0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a  .    pNewItem->z
3dc0: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 53 74 72  Name = sqliteStr
3dd0: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  Dup(pOldItem->zN
3de0: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
3df0: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
3e00: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
3e10: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
3e20: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
3e30: 65 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70  ectDup(Select *p
3e40: 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 4e 65  ){.  Select *pNe
3e50: 77 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  w;.  if( p==0 ) 
3e60: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
3e70: 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 52   = sqliteMallocR
3e80: 61 77 28 20 73 69 7a 65 6f 66 28 2a 70 29 20 29  aw( sizeof(*p) )
3e90: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
3ea0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
3eb0: 65 77 2d 3e 69 73 44 69 73 74 69 6e 63 74 20 3d  ew->isDistinct =
3ec0: 20 70 2d 3e 69 73 44 69 73 74 69 6e 63 74 3b 0a   p->isDistinct;.
3ed0: 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73 74 20 3d    pNew->pEList =
3ee0: 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74   sqlite3ExprList
3ef0: 44 75 70 28 70 2d 3e 70 45 4c 69 73 74 29 3b 0a  Dup(p->pEList);.
3f00: 20 20 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73    pNew->pSrc = s
3f10: 71 6c 69 74 65 33 53 72 63 4c 69 73 74 44 75 70  qlite3SrcListDup
3f20: 28 70 2d 3e 70 53 72 63 29 3b 0a 20 20 70 4e 65  (p->pSrc);.  pNe
3f30: 77 2d 3e 70 57 68 65 72 65 20 3d 20 73 71 6c 69  w->pWhere = sqli
3f40: 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 57  te3ExprDup(p->pW
3f50: 68 65 72 65 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  here);.  pNew->p
3f60: 47 72 6f 75 70 42 79 20 3d 20 73 71 6c 69 74 65  GroupBy = sqlite
3f70: 33 45 78 70 72 4c 69 73 74 44 75 70 28 70 2d 3e  3ExprListDup(p->
3f80: 70 47 72 6f 75 70 42 79 29 3b 0a 20 20 70 4e 65  pGroupBy);.  pNe
3f90: 77 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c  w->pHaving = sql
3fa0: 69 74 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70  ite3ExprDup(p->p
3fb0: 48 61 76 69 6e 67 29 3b 0a 20 20 70 4e 65 77 2d  Having);.  pNew-
3fc0: 3e 70 4f 72 64 65 72 42 79 20 3d 20 73 71 6c 69  >pOrderBy = sqli
3fd0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
3fe0: 2d 3e 70 4f 72 64 65 72 42 79 29 3b 0a 20 20 70  ->pOrderBy);.  p
3ff0: 4e 65 77 2d 3e 6f 70 20 3d 20 70 2d 3e 6f 70 3b  New->op = p->op;
4000: 0a 20 20 70 4e 65 77 2d 3e 70 50 72 69 6f 72 20  .  pNew->pPrior 
4010: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
4020: 75 70 28 70 2d 3e 70 50 72 69 6f 72 29 3b 0a 20  up(p->pPrior);. 
4030: 20 70 4e 65 77 2d 3e 6e 4c 69 6d 69 74 20 3d 20   pNew->nLimit = 
4040: 70 2d 3e 6e 4c 69 6d 69 74 3b 0a 20 20 70 4e 65  p->nLimit;.  pNe
4050: 77 2d 3e 6e 4f 66 66 73 65 74 20 3d 20 70 2d 3e  w->nOffset = p->
4060: 6e 4f 66 66 73 65 74 3b 0a 20 20 70 4e 65 77 2d  nOffset;.  pNew-
4070: 3e 69 4c 69 6d 69 74 20 3d 20 2d 31 3b 0a 20 20  >iLimit = -1;.  
4080: 70 4e 65 77 2d 3e 69 4f 66 66 73 65 74 20 3d 20  pNew->iOffset = 
4090: 2d 31 3b 0a 20 20 70 4e 65 77 2d 3e 70 70 4f 70  -1;.  pNew->ppOp
40a0: 65 6e 54 65 6d 70 20 3d 20 30 3b 0a 20 20 70 4e  enTemp = 0;.  pN
40b0: 65 77 2d 3e 70 46 65 74 63 68 20 3d 20 30 3b 0a  ew->pFetch = 0;.
40c0: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
40d0: 0a 23 65 6c 73 65 0a 53 65 6c 65 63 74 20 2a 73  .#else.Select *s
40e0: 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28  qlite3SelectDup(
40f0: 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 61 73  Select *p){.  as
4100: 73 65 72 74 28 20 70 3d 3d 30 20 29 3b 0a 20 20  sert( p==0 );.  
4110: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64  return 0;.}.#end
4120: 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61  if.../*.** Add a
4130: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74 6f 20   new element to 
4140: 74 68 65 20 65 6e 64 20 6f 66 20 61 6e 20 65 78  the end of an ex
4150: 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 20 20  pression list.  
4160: 49 66 20 70 4c 69 73 74 20 69 73 0a 2a 2a 20 69  If pList is.** i
4170: 6e 69 74 69 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74  nitially NULL, t
4180: 68 65 6e 20 63 72 65 61 74 65 20 61 20 6e 65 77  hen create a new
4190: 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74   expression list
41a0: 2e 0a 2a 2f 0a 45 78 70 72 4c 69 73 74 20 2a 73  ..*/.ExprList *s
41b0: 71 6c 69 74 65 33 45 78 70 72 4c 69 73 74 41 70  qlite3ExprListAp
41c0: 70 65 6e 64 28 45 78 70 72 4c 69 73 74 20 2a 70  pend(ExprList *p
41d0: 4c 69 73 74 2c 20 45 78 70 72 20 2a 70 45 78 70  List, Expr *pExp
41e0: 72 2c 20 54 6f 6b 65 6e 20 2a 70 4e 61 6d 65 29  r, Token *pName)
41f0: 7b 0a 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30  {.  if( pList==0
4200: 20 29 7b 0a 20 20 20 20 70 4c 69 73 74 20 3d 20   ){.    pList = 
4210: 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 73 69  sqliteMalloc( si
4220: 7a 65 6f 66 28 45 78 70 72 4c 69 73 74 29 20 29  zeof(ExprList) )
4230: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 3d  ;.    if( pList=
4240: 3d 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73  =0 ){.      /* s
4250: 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65  qlite3ExprDelete
4260: 28 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b  (pExpr); // Leak
4270: 20 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f   memory if mallo
4280: 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20  c fails */.     
4290: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d   return 0;.    }
42a0: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4c 69  .    assert( pLi
42b0: 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 20 29 3b  st->nAlloc==0 );
42c0: 0a 20 20 7d 0a 20 20 69 66 28 20 70 4c 69 73 74  .  }.  if( pList
42d0: 2d 3e 6e 41 6c 6c 6f 63 3c 3d 70 4c 69 73 74 2d  ->nAlloc<=pList-
42e0: 3e 6e 45 78 70 72 20 29 7b 0a 20 20 20 20 70 4c  >nExpr ){.    pL
42f0: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 70 4c  ist->nAlloc = pL
4300: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 32 20 2b 20  ist->nAlloc*2 + 
4310: 34 3b 0a 20 20 20 20 70 4c 69 73 74 2d 3e 61 20  4;.    pList->a 
4320: 3d 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28  = sqliteRealloc(
4330: 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74 2d  pList->a, pList-
4340: 3e 6e 41 6c 6c 6f 63 2a 73 69 7a 65 6f 66 28 70  >nAlloc*sizeof(p
4350: 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a 20 20  List->a[0]));.  
4360: 20 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 3d 3d    if( pList->a==
4370: 30 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20 73 71  0 ){.      /* sq
4380: 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28  lite3ExprDelete(
4390: 70 45 78 70 72 29 3b 20 2f 2f 20 4c 65 61 6b 20  pExpr); // Leak 
43a0: 6d 65 6d 6f 72 79 20 69 66 20 6d 61 6c 6c 6f 63  memory if malloc
43b0: 20 66 61 69 6c 73 20 2a 2f 0a 20 20 20 20 20 20   fails */.      
43c0: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3d 20 70  pList->nExpr = p
43d0: 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 3d 20 30  List->nAlloc = 0
43e0: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70  ;.      return p
43f0: 4c 69 73 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  List;.    }.  }.
4400: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
4410: 3e 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 70  >a!=0 );.  if( p
4420: 45 78 70 72 20 7c 7c 20 70 4e 61 6d 65 20 29 7b  Expr || pName ){
4430: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
4440: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
4450: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
4460: 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a 20 20  st->nExpr++];.  
4470: 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d 2c 20    memset(pItem, 
4480: 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74 65 6d  0, sizeof(*pItem
4490: 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70  ));.    pItem->p
44a0: 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20 20  Expr = pExpr;.  
44b0: 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d    pItem->zName =
44c0: 20 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d   sqlite3NameFrom
44d0: 54 6f 6b 65 6e 28 70 4e 61 6d 65 29 3b 0a 20 20  Token(pName);.  
44e0: 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69 73 74  }.  return pList
44f0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74  ;.}../*.** Delet
4500: 65 20 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72  e an entire expr
4510: 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a  ession list..*/.
4520: 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
4530: 4c 69 73 74 44 65 6c 65 74 65 28 45 78 70 72 4c  ListDelete(ExprL
4540: 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20 69  ist *pList){.  i
4550: 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 45  nt i;.  struct E
4560: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
4570: 74 65 6d 3b 0a 20 20 69 66 28 20 70 4c 69 73 74  tem;.  if( pList
4580: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
4590: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 61  assert( pList->a
45a0: 21 3d 30 20 7c 7c 20 28 70 4c 69 73 74 2d 3e 6e  !=0 || (pList->n
45b0: 45 78 70 72 3d 3d 30 20 26 26 20 70 4c 69 73 74  Expr==0 && pList
45c0: 2d 3e 6e 41 6c 6c 6f 63 3d 3d 30 29 20 29 3b 0a  ->nAlloc==0) );.
45d0: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
45e0: 3e 6e 45 78 70 72 3c 3d 70 4c 69 73 74 2d 3e 6e  >nExpr<=pList->n
45f0: 41 6c 6c 6f 63 20 29 3b 0a 20 20 66 6f 72 28 70  Alloc );.  for(p
4600: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
4610: 3d 30 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78  =0; i<pList->nEx
4620: 70 72 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  pr; i++, pItem++
4630: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
4640: 70 72 44 65 6c 65 74 65 28 70 49 74 65 6d 2d 3e  prDelete(pItem->
4650: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
4660: 74 65 46 72 65 65 28 70 49 74 65 6d 2d 3e 7a 4e  teFree(pItem->zN
4670: 61 6d 65 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69  ame);.  }.  sqli
4680: 74 65 46 72 65 65 28 70 4c 69 73 74 2d 3e 61 29  teFree(pList->a)
4690: 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65 28 70  ;.  sqliteFree(p
46a0: 4c 69 73 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  List);.}../*.** 
46b0: 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69  Walk an expressi
46c0: 6f 6e 20 74 72 65 65 2e 20 20 43 61 6c 6c 20 78  on tree.  Call x
46d0: 46 75 6e 63 20 66 6f 72 20 65 61 63 68 20 6e 6f  Func for each no
46e0: 64 65 20 76 69 73 69 74 65 64 2e 0a 2a 2a 0a 2a  de visited..**.*
46f0: 2a 20 54 68 65 20 72 65 74 75 72 6e 20 76 61 6c  * The return val
4700: 75 65 20 66 72 6f 6d 20 78 46 75 6e 63 20 64 65  ue from xFunc de
4710: 74 65 72 6d 69 6e 65 73 20 77 68 65 74 68 65 72  termines whether
4720: 20 74 68 65 20 74 72 65 65 20 77 61 6c 6b 20 63   the tree walk c
4730: 6f 6e 74 69 6e 75 65 73 2e 0a 2a 2a 20 30 20 6d  ontinues..** 0 m
4740: 65 61 6e 73 20 63 6f 6e 74 69 6e 75 65 20 77 61  eans continue wa
4750: 6c 6b 69 6e 67 20 74 68 65 20 74 72 65 65 2e 20  lking the tree. 
4760: 20 31 20 6d 65 61 6e 73 20 64 6f 20 6e 6f 74 20   1 means do not 
4770: 77 61 6c 6b 20 63 68 69 6c 64 72 65 6e 0a 2a 2a  walk children.**
4780: 20 6f 66 20 74 68 65 20 63 75 72 72 65 6e 74 20   of the current 
4790: 6e 6f 64 65 20 62 75 74 20 63 6f 6e 74 69 6e 75  node but continu
47a0: 65 20 77 69 74 68 20 73 69 62 6c 69 6e 67 73 2e  e with siblings.
47b0: 20 20 32 20 6d 65 61 6e 73 20 61 62 61 6e 64 6f    2 means abando
47c0: 6e 0a 2a 2a 20 74 68 65 20 74 72 65 65 20 77 61  n.** the tree wa
47d0: 6c 6b 20 63 6f 6d 70 6c 65 74 65 6c 79 2e 0a 2a  lk completely..*
47e0: 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75 72 6e 20  *.** The return 
47f0: 76 61 6c 75 65 20 66 72 6f 6d 20 74 68 69 73 20  value from this 
4800: 72 6f 75 74 69 6e 65 20 69 73 20 31 20 74 6f 20  routine is 1 to 
4810: 61 62 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65  abandon the tree
4820: 20 77 61 6c 6b 0a 2a 2a 20 61 6e 64 20 30 20 74   walk.** and 0 t
4830: 6f 20 63 6f 6e 74 69 6e 75 65 2e 0a 2a 2f 0a 73  o continue..*/.s
4840: 74 61 74 69 63 20 69 6e 74 20 77 61 6c 6b 45 78  tatic int walkEx
4850: 70 72 54 72 65 65 28 45 78 70 72 20 2a 70 45 78  prTree(Expr *pEx
4860: 70 72 2c 20 69 6e 74 20 28 2a 78 46 75 6e 63 29  pr, int (*xFunc)
4870: 28 76 6f 69 64 2a 2c 45 78 70 72 2a 29 2c 20 76  (void*,Expr*), v
4880: 6f 69 64 20 2a 70 41 72 67 29 7b 0a 20 20 45 78  oid *pArg){.  Ex
4890: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 3b 0a 20  prList *pList;. 
48a0: 20 69 6e 74 20 72 63 3b 0a 20 20 69 66 28 20 70   int rc;.  if( p
48b0: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
48c0: 20 30 3b 0a 20 20 72 63 20 3d 20 28 2a 78 46 75   0;.  rc = (*xFu
48d0: 6e 63 29 28 70 41 72 67 2c 20 70 45 78 70 72 29  nc)(pArg, pExpr)
48e0: 3b 0a 20 20 69 66 28 20 72 63 3d 3d 30 20 29 7b  ;.  if( rc==0 ){
48f0: 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45 78 70  .    if( walkExp
4900: 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70 4c 65  rTree(pExpr->pLe
4910: 66 74 2c 20 78 46 75 6e 63 2c 20 70 41 72 67 29  ft, xFunc, pArg)
4920: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20   ) return 1;.   
4930: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4940: 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c  e(pExpr->pRight,
4950: 20 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20   xFunc, pArg) ) 
4960: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 70 4c  return 1;.    pL
4970: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
4980: 73 74 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  st;.    if( pLis
4990: 74 20 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  t ){.      int i
49a0: 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20 45  ;.      struct E
49b0: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
49c0: 74 65 6d 3b 0a 20 20 20 20 20 20 66 6f 72 28 69  tem;.      for(i
49d0: 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2c 20 70  =pList->nExpr, p
49e0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 3b 20 69  Item=pList->a; i
49f0: 3e 30 3b 20 69 2d 2d 2c 20 70 49 74 65 6d 2b 2b  >0; i--, pItem++
4a00: 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 77  ){.        if( w
4a10: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 49 74 65  alkExprTree(pIte
4a20: 6d 2d 3e 70 45 78 70 72 2c 20 78 46 75 6e 63 2c  m->pExpr, xFunc,
4a30: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4a40: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  1;.      }.    }
4a50: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 63  .  }.  return rc
4a60: 3e 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  >1;.}../*.** Thi
4a70: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73  s routine is des
4a80: 69 67 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e  igned as an xFun
4a90: 63 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72  c for walkExprTr
4aa0: 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20 70 41 72 67  ee()..**.** pArg
4ab0: 20 69 73 20 72 65 61 6c 6c 79 20 61 20 70 6f 69   is really a poi
4ac0: 6e 74 65 72 20 74 6f 20 61 6e 20 69 6e 74 65 67  nter to an integ
4ad0: 65 72 2e 20 20 49 66 20 77 65 20 63 61 6e 20 74  er.  If we can t
4ae0: 65 6c 6c 20 62 79 20 6c 6f 6f 6b 69 6e 67 0a 2a  ell by looking.*
4af0: 2a 20 61 74 20 70 45 78 70 72 20 74 68 61 74 20  * at pExpr that 
4b00: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 74  the expression t
4b10: 68 61 74 20 63 6f 6e 74 61 69 6e 73 20 70 45 78  hat contains pEx
4b20: 70 72 20 69 73 20 6e 6f 74 20 61 20 63 6f 6e 73  pr is not a cons
4b30: 74 61 6e 74 0a 2a 2a 20 65 78 70 72 65 73 73 69  tant.** expressi
4b40: 6f 6e 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 41  on, then set *pA
4b50: 72 67 20 74 6f 20 30 20 61 6e 64 20 72 65 74 75  rg to 0 and retu
4b60: 72 6e 20 32 20 74 6f 20 61 62 61 6e 64 6f 6e 20  rn 2 to abandon 
4b70: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
4b80: 2a 20 49 66 20 70 45 78 70 72 20 64 6f 65 73 20  * If pExpr does 
4b90: 64 6f 65 73 20 6e 6f 74 20 64 69 73 71 75 61 6c  does not disqual
4ba0: 69 66 79 20 74 68 65 20 65 78 70 72 65 73 73 69  ify the expressi
4bb0: 6f 6e 20 66 72 6f 6d 20 62 65 69 6e 67 20 61 20  on from being a 
4bc0: 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 74 68 65 6e  constant.** then
4bd0: 20 64 6f 20 6e 6f 74 68 69 6e 67 2e 0a 2a 2a 0a   do nothing..**.
4be0: 2a 2a 20 41 66 74 65 72 20 77 61 6c 6b 69 6e 67  ** After walking
4bf0: 20 74 68 65 20 77 68 6f 6c 65 20 74 72 65 65 2c   the whole tree,
4c00: 20 69 66 20 6e 6f 20 6e 6f 64 65 73 20 61 72 65   if no nodes are
4c10: 20 66 6f 75 6e 64 20 74 68 61 74 20 64 69 73 71   found that disq
4c20: 75 61 6c 69 66 79 0a 2a 2a 20 74 68 65 20 65 78  ualify.** the ex
4c30: 70 72 65 73 73 69 6f 6e 20 61 73 20 63 6f 6e 73  pression as cons
4c40: 74 61 6e 74 2c 20 74 68 65 6e 20 77 65 20 61 73  tant, then we as
4c50: 73 75 6d 65 20 74 68 65 20 77 68 6f 6c 65 20 65  sume the whole e
4c60: 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20 69 73 20  xpression.** is 
4c70: 63 6f 6e 73 74 61 6e 74 2e 20 20 53 65 65 20 73  constant.  See s
4c80: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
4c90: 74 61 6e 74 28 29 20 66 6f 72 20 61 64 64 69 74  tant() for addit
4ca0: 69 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f  ional informatio
4cb0: 6e 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  n..*/.static int
4cc0: 20 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74   exprNodeIsConst
4cd0: 61 6e 74 28 76 6f 69 64 20 2a 70 41 72 67 2c 20  ant(void *pArg, 
4ce0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
4cf0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
4d00: 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b  p ){.    case TK
4d10: 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _ID:.    case TK
4d20: 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61 73  _COLUMN:.    cas
4d30: 65 20 54 4b 5f 44 4f 54 3a 0a 20 20 20 20 63 61  e TK_DOT:.    ca
4d40: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
4d50: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
4d60: 46 55 4e 43 54 49 4f 4e 3a 0a 23 69 66 6e 64 65  FUNCTION:.#ifnde
4d70: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
4d80: 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
4d90: 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20 20 20 63  TK_SELECT:.    c
4da0: 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 23  ase TK_EXISTS:.#
4db0: 65 6e 64 69 66 0a 20 20 20 20 20 20 2a 28 28 69  endif.      *((i
4dc0: 6e 74 2a 29 70 41 72 67 29 20 3d 20 30 3b 0a 20  nt*)pArg) = 0;. 
4dd0: 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a 20       return 2;. 
4de0: 20 20 20 64 65 66 61 75 6c 74 3a 0a 20 20 20 20     default:.    
4df0: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a    return 0;.  }.
4e00: 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e  }../*.** Walk an
4e10: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
4e20: 2e 20 20 52 65 74 75 72 6e 20 31 20 69 66 20 74  .  Return 1 if t
4e30: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
4e40: 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 61 6e 64   constant.** and
4e50: 20 30 20 69 66 20 69 74 20 69 6e 76 6f 6c 76 65   0 if it involve
4e60: 73 20 76 61 72 69 61 62 6c 65 73 2e 0a 2a 2a 0a  s variables..**.
4e70: 2a 2a 20 46 6f 72 20 74 68 65 20 70 75 72 70 6f  ** For the purpo
4e80: 73 65 73 20 6f 66 20 74 68 69 73 20 66 75 6e 63  ses of this func
4e90: 74 69 6f 6e 2c 20 61 20 64 6f 75 62 6c 65 2d 71  tion, a double-q
4ea0: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 28 65 78  uoted string (ex
4eb0: 3a 20 22 61 62 63 22 29 0a 2a 2a 20 69 73 20 63  : "abc").** is c
4ec0: 6f 6e 73 69 64 65 72 65 64 20 61 20 76 61 72 69  onsidered a vari
4ed0: 61 62 6c 65 20 62 75 74 20 61 20 73 69 6e 67 6c  able but a singl
4ee0: 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67 20  e-quoted string 
4ef0: 28 65 78 3a 20 27 61 62 63 27 29 20 69 73 0a 2a  (ex: 'abc') is.*
4f00: 2a 20 61 20 63 6f 6e 73 74 61 6e 74 2e 0a 2a 2f  * a constant..*/
4f10: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
4f20: 49 73 43 6f 6e 73 74 61 6e 74 28 45 78 70 72 20  IsConstant(Expr 
4f30: 2a 70 29 7b 0a 20 20 69 6e 74 20 69 73 43 6f 6e  *p){.  int isCon
4f40: 73 74 20 3d 20 31 3b 0a 20 20 77 61 6c 6b 45 78  st = 1;.  walkEx
4f50: 70 72 54 72 65 65 28 70 2c 20 65 78 70 72 4e 6f  prTree(p, exprNo
4f60: 64 65 49 73 43 6f 6e 73 74 61 6e 74 2c 20 26 69  deIsConstant, &i
4f70: 73 43 6f 6e 73 74 29 3b 0a 20 20 72 65 74 75 72  sConst);.  retur
4f80: 6e 20 69 73 43 6f 6e 73 74 3b 0a 7d 0a 0a 2f 2a  n isConst;.}../*
4f90: 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65  .** If the expre
4fa0: 73 73 69 6f 6e 20 70 20 63 6f 64 65 73 20 61 20  ssion p codes a 
4fb0: 63 6f 6e 73 74 61 6e 74 20 69 6e 74 65 67 65 72  constant integer
4fc0: 20 74 68 61 74 20 69 73 20 73 6d 61 6c 6c 20 65   that is small e
4fd0: 6e 6f 75 67 68 0a 2a 2a 20 74 6f 20 66 69 74 20  nough.** to fit 
4fe0: 69 6e 20 61 20 33 32 2d 62 69 74 20 69 6e 74 65  in a 32-bit inte
4ff0: 67 65 72 2c 20 72 65 74 75 72 6e 20 31 20 61 6e  ger, return 1 an
5000: 64 20 70 75 74 20 74 68 65 20 76 61 6c 75 65 20  d put the value 
5010: 6f 66 20 74 68 65 20 69 6e 74 65 67 65 72 0a 2a  of the integer.*
5020: 2a 20 69 6e 20 2a 70 56 61 6c 75 65 2e 20 20 49  * in *pValue.  I
5030: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
5040: 20 69 73 20 6e 6f 74 20 61 6e 20 69 6e 74 65 67   is not an integ
5050: 65 72 20 6f 72 20 69 66 20 69 74 20 69 73 20 74  er or if it is t
5060: 6f 6f 20 62 69 67 0a 2a 2a 20 74 6f 20 66 69 74  oo big.** to fit
5070: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
5080: 62 69 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74  bit integer, ret
5090: 75 72 6e 20 30 20 61 6e 64 20 6c 65 61 76 65 20  urn 0 and leave 
50a0: 2a 70 56 61 6c 75 65 20 75 6e 63 68 61 6e 67 65  *pValue unchange
50b0: 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
50c0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 45  3ExprIsInteger(E
50d0: 78 70 72 20 2a 70 2c 20 69 6e 74 20 2a 70 56 61  xpr *p, int *pVa
50e0: 6c 75 65 29 7b 0a 20 20 73 77 69 74 63 68 28 20  lue){.  switch( 
50f0: 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  p->op ){.    cas
5100: 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a  e TK_INTEGER: {.
5110: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
5120: 33 47 65 74 49 6e 74 33 32 28 70 2d 3e 74 6f 6b  3GetInt32(p->tok
5130: 65 6e 2e 7a 2c 20 70 56 61 6c 75 65 29 20 29 7b  en.z, pValue) ){
5140: 0a 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20  .        return 
5150: 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  1;.      }.     
5160: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
5170: 20 20 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a    case TK_UPLUS:
5180: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
5190: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
51a0: 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20 70  eger(p->pLeft, p
51b0: 56 61 6c 75 65 29 3b 0a 20 20 20 20 7d 0a 20 20  Value);.    }.  
51c0: 20 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53    case TK_UMINUS
51d0: 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 76 3b  : {.      int v;
51e0: 0a 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74  .      if( sqlit
51f0: 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28  e3ExprIsInteger(
5200: 70 2d 3e 70 4c 65 66 74 2c 20 26 76 29 20 29 7b  p->pLeft, &v) ){
5210: 0a 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65  .        *pValue
5220: 20 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72   = -v;.        r
5230: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
5240: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
5250: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
5260: 20 62 72 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65   break;.  }.  re
5270: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  turn 0;.}../*.**
5280: 20 52 65 74 75 72 6e 20 54 52 55 45 20 69 66 20   Return TRUE if 
5290: 74 68 65 20 67 69 76 65 6e 20 73 74 72 69 6e 67  the given string
52a0: 20 69 73 20 61 20 72 6f 77 2d 69 64 20 63 6f 6c   is a row-id col
52b0: 75 6d 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 69 6e 74  umn name..*/.int
52c0: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
52d0: 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 29 7b 0a  const char *z){.
52e0: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
52f0: 49 43 6d 70 28 7a 2c 20 22 5f 52 4f 57 49 44 5f  ICmp(z, "_ROWID_
5300: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5310: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5320: 74 72 49 43 6d 70 28 7a 2c 20 22 52 4f 57 49 44  trICmp(z, "ROWID
5330: 22 29 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  ")==0 ) return 1
5340: 3b 0a 20 20 69 66 28 20 73 71 6c 69 74 65 33 53  ;.  if( sqlite3S
5350: 74 72 49 43 6d 70 28 7a 2c 20 22 4f 49 44 22 29  trICmp(z, "OID")
5360: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  ==0 ) return 1;.
5370: 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f    return 0;.}../
5380: 2a 0a 2a 2a 20 47 69 76 65 6e 20 74 68 65 20 6e  *.** Given the n
5390: 61 6d 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  ame of a column 
53a0: 6f 66 20 74 68 65 20 66 6f 72 6d 20 58 2e 59 2e  of the form X.Y.
53b0: 5a 20 6f 72 20 59 2e 5a 20 6f 72 20 6a 75 73 74  Z or Y.Z or just
53c0: 20 5a 2c 20 6c 6f 6f 6b 20 75 70 0a 2a 2a 20 74   Z, look up.** t
53d0: 68 61 74 20 6e 61 6d 65 20 69 6e 20 74 68 65 20  hat name in the 
53e0: 73 65 74 20 6f 66 20 73 6f 75 72 63 65 20 74 61  set of source ta
53f0: 62 6c 65 73 20 69 6e 20 70 53 72 63 4c 69 73 74  bles in pSrcList
5400: 20 61 6e 64 20 6d 61 6b 65 20 74 68 65 20 70 45   and make the pE
5410: 78 70 72 20 0a 2a 2a 20 65 78 70 72 65 73 73 69  xpr .** expressi
5420: 6f 6e 20 6e 6f 64 65 20 72 65 66 65 72 20 62 61  on node refer ba
5430: 63 6b 20 74 6f 20 74 68 61 74 20 73 6f 75 72 63  ck to that sourc
5440: 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20 66  e column.  The f
5450: 6f 6c 6c 6f 77 69 6e 67 20 63 68 61 6e 67 65 73  ollowing changes
5460: 0a 2a 2a 20 61 72 65 20 6d 61 64 65 20 74 6f 20  .** are made to 
5470: 70 45 78 70 72 3a 0a 2a 2a 0a 2a 2a 20 20 20 20  pExpr:.**.**    
5480: 70 45 78 70 72 2d 3e 69 44 62 20 20 20 20 20 20  pExpr->iDb      
5490: 20 20 20 20 20 53 65 74 20 74 68 65 20 69 6e 64       Set the ind
54a0: 65 78 20 69 6e 20 64 62 2d 3e 61 44 62 5b 5d 20  ex in db->aDb[] 
54b0: 6f 66 20 74 68 65 20 64 61 74 61 62 61 73 65 20  of the database 
54c0: 68 6f 6c 64 69 6e 67 0a 2a 2a 20 20 20 20 20 20  holding.**      
54d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
54e0: 20 20 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a 2a     the table..**
54f0: 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c      pExpr->iTabl
5500: 65 20 20 20 20 20 20 20 20 53 65 74 20 74 6f 20  e        Set to 
5510: 74 68 65 20 63 75 72 73 6f 72 20 6e 75 6d 62 65  the cursor numbe
5520: 72 20 66 6f 72 20 74 68 65 20 74 61 62 6c 65 20  r for the table 
5530: 6f 62 74 61 69 6e 65 64 0a 2a 2a 20 20 20 20 20  obtained.**     
5540: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5550: 20 20 20 20 66 72 6f 6d 20 70 53 72 63 4c 69 73      from pSrcLis
5560: 74 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e  t..**    pExpr->
5570: 69 43 6f 6c 75 6d 6e 20 20 20 20 20 20 20 53 65  iColumn       Se
5580: 74 20 74 6f 20 74 68 65 20 63 6f 6c 75 6d 6e 20  t to the column 
5590: 6e 75 6d 62 65 72 20 77 69 74 68 69 6e 20 74 68  number within th
55a0: 65 20 74 61 62 6c 65 2e 0a 2a 2a 20 20 20 20 70  e table..**    p
55b0: 45 78 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20  Expr->op        
55c0: 20 20 20 20 53 65 74 20 74 6f 20 54 4b 5f 43 4f      Set to TK_CO
55d0: 4c 55 4d 4e 2e 0a 2a 2a 20 20 20 20 70 45 78 70  LUMN..**    pExp
55e0: 72 2d 3e 70 4c 65 66 74 20 20 20 20 20 20 20 20  r->pLeft        
55f0: 20 41 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20   Any expression 
5600: 74 68 69 73 20 70 6f 69 6e 74 73 20 74 6f 20 69  this points to i
5610: 73 20 64 65 6c 65 74 65 64 0a 2a 2a 20 20 20 20  s deleted.**    
5620: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 20 20  pExpr->pRight   
5630: 20 20 20 20 20 41 6e 79 20 65 78 70 72 65 73 73       Any express
5640: 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74 73 20  ion this points 
5650: 74 6f 20 69 73 20 64 65 6c 65 74 65 64 2e 0a 2a  to is deleted..*
5660: 2a 0a 2a 2a 20 54 68 65 20 70 44 62 54 6f 6b 65  *.** The pDbToke
5670: 6e 20 69 73 20 74 68 65 20 6e 61 6d 65 20 6f 66  n is the name of
5680: 20 74 68 65 20 64 61 74 61 62 61 73 65 20 28 74   the database (t
5690: 68 65 20 22 58 22 29 2e 20 20 54 68 69 73 20 76  he "X").  This v
56a0: 61 6c 75 65 20 6d 61 79 20 62 65 0a 2a 2a 20 4e  alue may be.** N
56b0: 55 4c 4c 20 6d 65 61 6e 69 6e 67 20 74 68 61 74  ULL meaning that
56c0: 20 6e 61 6d 65 20 69 73 20 6f 66 20 74 68 65 20   name is of the 
56d0: 66 6f 72 6d 20 59 2e 5a 20 6f 72 20 5a 2e 20 20  form Y.Z or Z.  
56e0: 41 6e 79 20 61 76 61 69 6c 61 62 6c 65 20 64 61  Any available da
56f0: 74 61 62 61 73 65 0a 2a 2a 20 63 61 6e 20 62 65  tabase.** can be
5700: 20 75 73 65 64 2e 20 20 54 68 65 20 70 54 61 62   used.  The pTab
5710: 6c 65 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  leToken is the n
5720: 61 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65  ame of the table
5730: 20 28 74 68 65 20 22 59 22 29 2e 20 20 54 68 69   (the "Y").  Thi
5740: 73 0a 2a 2a 20 76 61 6c 75 65 20 63 61 6e 20 62  s.** value can b
5750: 65 20 4e 55 4c 4c 20 69 66 20 70 44 62 54 6f 6b  e NULL if pDbTok
5760: 65 6e 20 69 73 20 61 6c 73 6f 20 4e 55 4c 4c 2e  en is also NULL.
5770: 20 20 49 66 20 70 54 61 62 6c 65 54 6f 6b 65 6e    If pTableToken
5780: 20 69 73 20 4e 55 4c 4c 20 69 74 0a 2a 2a 20 6d   is NULL it.** m
5790: 65 61 6e 73 20 74 68 61 74 20 74 68 65 20 66 6f  eans that the fo
57a0: 72 6d 20 6f 66 20 74 68 65 20 6e 61 6d 65 20 69  rm of the name i
57b0: 73 20 5a 20 61 6e 64 20 74 68 61 74 20 63 6f 6c  s Z and that col
57c0: 75 6d 6e 73 20 66 72 6f 6d 20 61 6e 79 20 74 61  umns from any ta
57d0: 62 6c 65 0a 2a 2a 20 63 61 6e 20 62 65 20 75 73  ble.** can be us
57e0: 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65  ed..**.** If the
57f0: 20 6e 61 6d 65 20 63 61 6e 6e 6f 74 20 62 65 20   name cannot be 
5800: 72 65 73 6f 6c 76 65 64 20 75 6e 61 6d 62 69 67  resolved unambig
5810: 75 6f 75 73 6c 79 2c 20 6c 65 61 76 65 20 61 6e  uously, leave an
5820: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 0a 2a   error message.*
5830: 2a 20 69 6e 20 70 50 61 72 73 65 20 61 6e 64 20  * in pParse and 
5840: 72 65 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 2e  return non-zero.
5850: 20 20 52 65 74 75 72 6e 20 7a 65 72 6f 20 6f 6e    Return zero on
5860: 20 73 75 63 63 65 73 73 2e 0a 2a 2f 0a 73 74 61   success..*/.sta
5870: 74 69 63 20 69 6e 74 20 6c 6f 6f 6b 75 70 4e 61  tic int lookupNa
5880: 6d 65 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  me(.  Parse *pPa
5890: 72 73 65 2c 20 20 20 20 20 20 2f 2a 20 54 68 65  rse,      /* The
58a0: 20 70 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74   parsing context
58b0: 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70 44 62   */.  Token *pDb
58c0: 54 6f 6b 65 6e 2c 20 20 20 20 20 2f 2a 20 4e 61  Token,     /* Na
58d0: 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62 61  me of the databa
58e0: 73 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20 74 61  se containing ta
58f0: 62 6c 65 2c 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a  ble, or NULL */.
5900: 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65 54    Token *pTableT
5910: 6f 6b 65 6e 2c 20 20 2f 2a 20 4e 61 6d 65 20 6f  oken,  /* Name o
5920: 66 20 74 61 62 6c 65 20 63 6f 6e 74 61 69 6e 69  f table containi
5930: 6e 67 20 63 6f 6c 75 6d 6e 2c 20 6f 72 20 4e 55  ng column, or NU
5940: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
5950: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2c 20 2f 2a 20  ColumnToken, /* 
5960: 4e 61 6d 65 20 6f 66 20 74 68 65 20 63 6f 6c 75  Name of the colu
5970: 6d 6e 2e 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e  mn. */.  NameCon
5980: 74 65 78 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a  text *pNC,    /*
5990: 20 54 68 65 20 6e 61 6d 65 20 63 6f 6e 74 65 78   The name contex
59a0: 74 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c 76  t used to resolv
59b0: 65 20 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20  e the name */.  
59c0: 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20 20  Expr *pExpr     
59d0: 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 74 68 69       /* Make thi
59e0: 73 20 45 58 50 52 20 6e 6f 64 65 20 70 6f 69 6e  s EXPR node poin
59f0: 74 20 74 6f 20 74 68 65 20 73 65 6c 65 63 74 65  t to the selecte
5a00: 64 20 63 6f 6c 75 6d 6e 20 2a 2f 0a 29 7b 0a 20  d column */.){. 
5a10: 20 63 68 61 72 20 2a 7a 44 62 20 3d 20 30 3b 20   char *zDb = 0; 
5a20: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66        /* Name of
5a30: 20 74 68 65 20 64 61 74 61 62 61 73 65 2e 20 20   the database.  
5a40: 54 68 65 20 22 58 22 20 69 6e 20 58 2e 59 2e 5a  The "X" in X.Y.Z
5a50: 20 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 54 61 62   */.  char *zTab
5a60: 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61   = 0;      /* Na
5a70: 6d 65 20 6f 66 20 74 68 65 20 74 61 62 6c 65 2e  me of the table.
5a80: 20 20 54 68 65 20 22 59 22 20 69 6e 20 58 2e 59    The "Y" in X.Y
5a90: 2e 5a 20 6f 72 20 59 2e 5a 20 2a 2f 0a 20 20 63  .Z or Y.Z */.  c
5aa0: 68 61 72 20 2a 7a 43 6f 6c 20 3d 20 30 3b 20 20  har *zCol = 0;  
5ab0: 20 20 20 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74      /* Name of t
5ac0: 68 65 20 63 6f 6c 75 6d 6e 2e 20 20 54 68 65 20  he column.  The 
5ad0: 22 5a 22 20 2a 2f 0a 20 20 69 6e 74 20 69 2c 20  "Z" */.  int i, 
5ae0: 6a 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  j;            /*
5af0: 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72 73 20 2a   Loop counters *
5b00: 2f 0a 20 20 69 6e 74 20 63 6e 74 20 3d 20 30 3b  /.  int cnt = 0;
5b10: 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62           /* Numb
5b20: 65 72 20 6f 66 20 6d 61 74 63 68 69 6e 67 20 63  er of matching c
5b30: 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20 2a 2f 0a 20  olumn names */. 
5b40: 20 69 6e 74 20 63 6e 74 54 61 62 20 3d 20 30 3b   int cntTab = 0;
5b50: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
5b60: 6f 66 20 6d 61 74 63 68 69 6e 67 20 74 61 62 6c  of matching tabl
5b70: 65 20 6e 61 6d 65 73 20 2a 2f 0a 20 20 73 71 6c  e names */.  sql
5b80: 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
5b90: 65 2d 3e 64 62 3b 20 20 2f 2a 20 54 68 65 20 64  e->db;  /* The d
5ba0: 61 74 61 62 61 73 65 20 2a 2f 0a 20 20 73 74 72  atabase */.  str
5bb0: 75 63 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d  uct SrcList_item
5bc0: 20 2a 70 49 74 65 6d 3b 20 20 20 20 20 20 20 2f   *pItem;       /
5bd0: 2a 20 55 73 65 20 66 6f 72 20 6c 6f 6f 70 69 6e  * Use for loopin
5be0: 67 20 6f 76 65 72 20 70 53 72 63 4c 69 73 74 20  g over pSrcList 
5bf0: 69 74 65 6d 73 20 2a 2f 0a 20 20 73 74 72 75 63  items */.  struc
5c00: 74 20 53 72 63 4c 69 73 74 5f 69 74 65 6d 20 2a  t SrcList_item *
5c10: 70 4d 61 74 63 68 20 3d 20 30 3b 20 20 2f 2a 20  pMatch = 0;  /* 
5c20: 54 68 65 20 6d 61 74 63 68 69 6e 67 20 70 53 72  The matching pSr
5c30: 63 4c 69 73 74 20 69 74 65 6d 20 2a 2f 0a 20 20  cList item */.  
5c40: 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 54 6f  NameContext *pTo
5c50: 70 4e 43 20 3d 20 70 4e 43 3b 20 20 20 20 20 20  pNC = pNC;      
5c60: 20 20 2f 2a 20 46 69 72 73 74 20 6e 61 6d 65 63    /* First namec
5c70: 6f 6e 74 65 78 74 20 69 6e 20 74 68 65 20 6c 69  ontext in the li
5c80: 73 74 20 2a 2f 0a 0a 20 20 61 73 73 65 72 74 28  st */..  assert(
5c90: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 20 26 26   pColumnToken &&
5ca0: 20 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a   pColumnToken->z
5cb0: 20 29 3b 20 2f 2a 20 54 68 65 20 5a 20 69 6e 20   ); /* The Z in 
5cc0: 58 2e 59 2e 5a 20 63 61 6e 6e 6f 74 20 62 65 20  X.Y.Z cannot be 
5cd0: 4e 55 4c 4c 20 2a 2f 0a 20 20 7a 44 62 20 3d 20  NULL */.  zDb = 
5ce0: 73 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54  sqlite3NameFromT
5cf0: 6f 6b 65 6e 28 70 44 62 54 6f 6b 65 6e 29 3b 0a  oken(pDbToken);.
5d00: 20 20 7a 54 61 62 20 3d 20 73 71 6c 69 74 65 33    zTab = sqlite3
5d10: 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 54  NameFromToken(pT
5d20: 61 62 6c 65 54 6f 6b 65 6e 29 3b 0a 20 20 7a 43  ableToken);.  zC
5d30: 6f 6c 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d 65  ol = sqlite3Name
5d40: 46 72 6f 6d 54 6f 6b 65 6e 28 70 43 6f 6c 75 6d  FromToken(pColum
5d50: 6e 54 6f 6b 65 6e 29 3b 0a 20 20 69 66 28 20 73  nToken);.  if( s
5d60: 71 6c 69 74 65 33 5f 6d 61 6c 6c 6f 63 5f 66 61  qlite3_malloc_fa
5d70: 69 6c 65 64 20 29 7b 0a 20 20 20 20 72 65 74 75  iled ){.    retu
5d80: 72 6e 20 31 3b 20 20 2f 2a 20 4c 65 61 6b 20 6d  rn 1;  /* Leak m
5d90: 65 6d 6f 72 79 20 28 7a 44 62 20 61 6e 64 20 7a  emory (zDb and z
5da0: 54 61 62 29 20 69 66 20 6d 61 6c 6c 6f 63 20 66  Tab) if malloc f
5db0: 61 69 6c 73 20 2a 2f 0a 20 20 7d 0a 0a 20 20 70  ails */.  }..  p
5dc0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 2d  Expr->iTable = -
5dd0: 31 3b 0a 20 20 77 68 69 6c 65 28 20 70 4e 43 20  1;.  while( pNC 
5de0: 26 26 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20  && cnt==0 ){.   
5df0: 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c 69   SrcList *pSrcLi
5e00: 73 74 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69  st = pNC->pSrcLi
5e10: 73 74 3b 0a 20 20 20 20 45 78 70 72 4c 69 73 74  st;.    ExprList
5e20: 20 2a 70 45 4c 69 73 74 20 3d 20 70 4e 43 2d 3e   *pEList = pNC->
5e30: 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20 70 4e 43  pEList;..    pNC
5e40: 2d 3e 6e 52 65 66 2b 2b 3b 0a 20 20 20 20 2f 2a  ->nRef++;.    /*
5e50: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
5e60: 20 7c 7c 20 70 45 4c 69 73 74 3d 3d 30 20 29 3b   || pEList==0 );
5e70: 20 2a 2f 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c   */.    for(i=0,
5e80: 20 70 49 74 65 6d 3d 70 53 72 63 4c 69 73 74 2d   pItem=pSrcList-
5e90: 3e 61 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  >a; i<pSrcList->
5ea0: 6e 53 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d  nSrc; i++, pItem
5eb0: 2b 2b 29 7b 0a 20 20 20 20 20 20 54 61 62 6c 65  ++){.      Table
5ec0: 20 2a 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e   *pTab = pItem->
5ed0: 70 54 61 62 3b 0a 20 20 20 20 20 20 43 6f 6c 75  pTab;.      Colu
5ee0: 6d 6e 20 2a 70 43 6f 6c 3b 0a 0a 20 20 20 20 20  mn *pCol;..     
5ef0: 20 69 66 28 20 70 54 61 62 3d 3d 30 20 29 20 63   if( pTab==0 ) c
5f00: 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 61  ontinue;.      a
5f10: 73 73 65 72 74 28 20 70 54 61 62 2d 3e 6e 43 6f  ssert( pTab->nCo
5f20: 6c 3e 30 20 29 3b 0a 20 20 20 20 20 20 69 66 28  l>0 );.      if(
5f30: 20 7a 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20   zTab ){.       
5f40: 20 69 66 28 20 70 49 74 65 6d 2d 3e 7a 41 6c 69   if( pItem->zAli
5f50: 61 73 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  as ){.          
5f60: 63 68 61 72 20 2a 7a 54 61 62 4e 61 6d 65 20 3d  char *zTabName =
5f70: 20 70 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a   pItem->zAlias;.
5f80: 20 20 20 20 20 20 20 20 20 20 69 66 28 20 73 71            if( sq
5f90: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61  lite3StrICmp(zTa
5fa0: 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20  bName, zTab)!=0 
5fb0: 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20  ) continue;.    
5fc0: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
5fd0: 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61 62 4e       char *zTabN
5fe0: 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e 61 6d  ame = pTab->zNam
5ff0: 65 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  e;.          if(
6000: 20 7a 54 61 62 4e 61 6d 65 3d 3d 30 20 7c 7c 20   zTabName==0 || 
6010: 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a  sqlite3StrICmp(z
6020: 54 61 62 4e 61 6d 65 2c 20 7a 54 61 62 29 21 3d  TabName, zTab)!=
6030: 30 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  0 ) continue;.  
6040: 20 20 20 20 20 20 20 20 69 66 28 20 7a 44 62 21          if( zDb!
6050: 3d 30 20 26 26 20 73 71 6c 69 74 65 33 53 74 72  =0 && sqlite3Str
6060: 49 43 6d 70 28 64 62 2d 3e 61 44 62 5b 70 54 61  ICmp(db->aDb[pTa
6070: 62 2d 3e 69 44 62 5d 2e 7a 4e 61 6d 65 2c 20 7a  b->iDb].zName, z
6080: 44 62 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20  Db)!=0 ){.      
6090: 20 20 20 20 20 20 63 6f 6e 74 69 6e 75 65 3b 0a        continue;.
60a0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
60b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
60c0: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
60d0: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
60e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d   pExpr->iTable =
60f0: 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b   pItem->iCursor;
6100: 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
6110: 69 44 62 20 3d 20 70 54 61 62 2d 3e 69 44 62 3b  iDb = pTab->iDb;
6120: 0a 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20  .        pMatch 
6130: 3d 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 7d  = pItem;.      }
6140: 0a 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 2c 20  .      for(j=0, 
6150: 70 43 6f 6c 3d 70 54 61 62 2d 3e 61 43 6f 6c 3b  pCol=pTab->aCol;
6160: 20 6a 3c 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   j<pTab->nCol; j
6170: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a 20 20 20  ++, pCol++){.   
6180: 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33       if( sqlite3
6190: 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e  StrICmp(pCol->zN
61a0: 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b  ame, zCol)==0 ){
61b0: 0a 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b  .          cnt++
61c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78 70  ;.          pExp
61d0: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
61e0: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
61f0: 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d 20 70        pMatch = p
6200: 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  Item;.          
6210: 70 45 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61  pExpr->iDb = pTa
6220: 62 2d 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20  b->iDb;.        
6230: 20 20 2f 2a 20 53 75 62 73 74 69 74 75 74 65 20    /* Substitute 
6240: 74 68 65 20 72 6f 77 69 64 20 28 63 6f 6c 75 6d  the rowid (colum
6250: 6e 20 2d 31 29 20 66 6f 72 20 74 68 65 20 49 4e  n -1) for the IN
6260: 54 45 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45  TEGER PRIMARY KE
6270: 59 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 70  Y */.          p
6280: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20  Expr->iColumn = 
6290: 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f  j==pTab->iPKey ?
62a0: 20 2d 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20   -1 : j;.       
62b0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
62c0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
62d0: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
62e0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70 43         pExpr->pC
62f0: 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c  oll = pTab->aCol
6300: 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20 20 20  [j].pColl;.     
6310: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
6320: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6330: 20 20 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c    }..#ifndef SQL
6340: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
6350: 0a 20 20 20 20 2f 2a 20 49 66 20 77 65 20 68 61  .    /* If we ha
6360: 76 65 20 6e 6f 74 20 61 6c 72 65 61 64 79 20 72  ve not already r
6370: 65 73 6f 6c 76 65 64 20 74 68 65 20 6e 61 6d 65  esolved the name
6380: 2c 20 74 68 65 6e 20 6d 61 79 62 65 20 0a 20 20  , then maybe .  
6390: 20 20 2a 2a 20 69 74 20 69 73 20 61 20 6e 65 77    ** it is a new
63a0: 2e 2a 20 6f 72 20 6f 6c 64 2e 2a 20 74 72 69 67  .* or old.* trig
63b0: 67 65 72 20 61 72 67 75 6d 65 6e 74 20 72 65 66  ger argument ref
63c0: 65 72 65 6e 63 65 0a 20 20 20 20 2a 2f 0a 20 20  erence.    */.  
63d0: 20 20 69 66 28 20 7a 44 62 3d 3d 30 20 26 26 20    if( zDb==0 && 
63e0: 7a 54 61 62 21 3d 30 20 26 26 20 63 6e 74 3d 3d  zTab!=0 && cnt==
63f0: 30 20 26 26 20 70 50 61 72 73 65 2d 3e 74 72 69  0 && pParse->tri
6400: 67 53 74 61 63 6b 21 3d 30 20 29 7b 0a 20 20 20  gStack!=0 ){.   
6410: 20 20 20 54 72 69 67 67 65 72 53 74 61 63 6b 20     TriggerStack 
6420: 2a 70 54 72 69 67 67 65 72 53 74 61 63 6b 20 3d  *pTriggerStack =
6430: 20 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61   pParse->trigSta
6440: 63 6b 3b 0a 20 20 20 20 20 20 54 61 62 6c 65 20  ck;.      Table 
6450: 2a 70 54 61 62 20 3d 20 30 3b 0a 20 20 20 20 20  *pTab = 0;.     
6460: 20 69 66 28 20 70 54 72 69 67 67 65 72 53 74 61   if( pTriggerSta
6470: 63 6b 2d 3e 6e 65 77 49 64 78 20 21 3d 20 2d 31  ck->newIdx != -1
6480: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6490: 6d 70 28 22 6e 65 77 22 2c 20 7a 54 61 62 29 20  mp("new", zTab) 
64a0: 3d 3d 20 30 20 29 7b 0a 20 20 20 20 20 20 20 20  == 0 ){.        
64b0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
64c0: 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e  pTriggerStack->n
64d0: 65 77 49 64 78 3b 0a 20 20 20 20 20 20 20 20 61  ewIdx;.        a
64e0: 73 73 65 72 74 28 20 70 54 72 69 67 67 65 72 53  ssert( pTriggerS
64f0: 74 61 63 6b 2d 3e 70 54 61 62 20 29 3b 0a 20 20  tack->pTab );.  
6500: 20 20 20 20 20 20 70 54 61 62 20 3d 20 70 54 72        pTab = pTr
6510: 69 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62  iggerStack->pTab
6520: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66  ;.      }else if
6530: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
6540: 3e 6f 6c 64 49 64 78 20 21 3d 20 2d 31 20 26 26  >oldIdx != -1 &&
6550: 20 73 71 6c 69 74 65 33 53 74 72 49 43 6d 70 28   sqlite3StrICmp(
6560: 22 6f 6c 64 22 2c 20 7a 54 61 62 29 3d 3d 30 20  "old", zTab)==0 
6570: 29 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  ){.        pExpr
6580: 2d 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67  ->iTable = pTrig
6590: 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64 78  gerStack->oldIdx
65a0: 3b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  ;.        assert
65b0: 28 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  ( pTriggerStack-
65c0: 3e 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20  >pTab );.       
65d0: 20 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72   pTab = pTrigger
65e0: 53 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20  Stack->pTab;.   
65f0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20     }..      if( 
6600: 70 54 61 62 20 29 7b 20 0a 20 20 20 20 20 20 20  pTab ){ .       
6610: 20 69 6e 74 20 6a 3b 0a 20 20 20 20 20 20 20 20   int j;.        
6620: 43 6f 6c 75 6d 6e 20 2a 70 43 6f 6c 20 3d 20 70  Column *pCol = p
6630: 54 61 62 2d 3e 61 43 6f 6c 3b 0a 0a 20 20 20 20  Tab->aCol;..    
6640: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
6650: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
6660: 20 20 20 20 63 6e 74 54 61 62 2b 2b 3b 0a 20 20      cntTab++;.  
6670: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6680: 20 3c 20 70 54 61 62 2d 3e 6e 43 6f 6c 3b 20 6a   < pTab->nCol; j
6690: 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 20 7b 0a 20 20  ++, pCol++) {.  
66a0: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
66b0: 74 65 33 53 74 72 49 43 6d 70 28 70 43 6f 6c 2d  te3StrICmp(pCol-
66c0: 3e 7a 4e 61 6d 65 2c 20 7a 43 6f 6c 29 3d 3d 30  >zName, zCol)==0
66d0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
66e0: 63 6e 74 2b 2b 3b 0a 20 20 20 20 20 20 20 20 20  cnt++;.         
66f0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
6700: 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d 3e 69 50 4b  n = j==pTab->iPK
6710: 65 79 20 3f 20 2d 31 20 3a 20 6a 3b 0a 20 20 20  ey ? -1 : j;.   
6720: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6730: 61 66 66 69 6e 69 74 79 20 3d 20 70 54 61 62 2d  affinity = pTab-
6740: 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66 69 6e 69 74  >aCol[j].affinit
6750: 79 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  y;.            p
6760: 45 78 70 72 2d 3e 70 43 6f 6c 6c 20 3d 20 70 54  Expr->pColl = pT
6770: 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 70 43 6f 6c  ab->aCol[j].pCol
6780: 6c 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 62  l;.            b
6790: 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 20 20  reak;.          
67a0: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
67b0: 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66    }.    }.#endif
67c0: 20 2f 2a 20 21 64 65 66 69 6e 65 64 28 53 51 4c   /* !defined(SQL
67d0: 49 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52  ITE_OMIT_TRIGGER
67e0: 29 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20  ) */..    /*.   
67f0: 20 2a 2a 20 50 65 72 68 61 70 73 20 74 68 65 20   ** Perhaps the 
6800: 6e 61 6d 65 20 69 73 20 61 20 72 65 66 65 72 65  name is a refere
6810: 6e 63 65 20 74 6f 20 74 68 65 20 52 4f 57 49 44  nce to the ROWID
6820: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6830: 63 6e 74 3d 3d 30 20 26 26 20 63 6e 74 54 61 62  cnt==0 && cntTab
6840: 3d 3d 31 20 26 26 20 73 71 6c 69 74 65 33 49 73  ==1 && sqlite3Is
6850: 52 6f 77 69 64 28 7a 43 6f 6c 29 20 29 7b 0a 20  Rowid(zCol) ){. 
6860: 20 20 20 20 20 63 6e 74 20 3d 20 31 3b 0a 20 20       cnt = 1;.  
6870: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6880: 6d 6e 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 70  mn = -1;.      p
6890: 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d  Expr->affinity =
68a0: 20 53 51 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45   SQLITE_AFF_INTE
68b0: 47 45 52 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20  GER;.    }..    
68c0: 2f 2a 0a 20 20 20 20 2a 2a 20 49 66 20 74 68 65  /*.    ** If the
68d0: 20 69 6e 70 75 74 20 69 73 20 6f 66 20 74 68 65   input is of the
68e0: 20 66 6f 72 6d 20 5a 20 28 6e 6f 74 20 59 2e 5a   form Z (not Y.Z
68f0: 20 6f 72 20 58 2e 59 2e 5a 29 20 74 68 65 6e 20   or X.Y.Z) then 
6900: 74 68 65 20 6e 61 6d 65 20 5a 0a 20 20 20 20 2a  the name Z.    *
6910: 2a 20 6d 69 67 68 74 20 72 65 66 65 72 20 74 6f  * might refer to
6920: 20 61 6e 20 72 65 73 75 6c 74 2d 73 65 74 20 61   an result-set a
6930: 6c 69 61 73 2e 20 20 54 68 69 73 20 68 61 70 70  lias.  This happ
6940: 65 6e 73 2c 20 66 6f 72 20 65 78 61 6d 70 6c 65  ens, for example
6950: 2c 20 77 68 65 6e 0a 20 20 20 20 2a 2a 20 77 65  , when.    ** we
6960: 20 61 72 65 20 72 65 73 6f 6c 76 69 6e 67 20 6e   are resolving n
6970: 61 6d 65 73 20 69 6e 20 74 68 65 20 57 48 45 52  ames in the WHER
6980: 45 20 63 6c 61 75 73 65 20 6f 66 20 74 68 65 20  E clause of the 
6990: 66 6f 6c 6c 6f 77 69 6e 67 20 63 6f 6d 6d 61 6e  following comman
69a0: 64 3a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  d:.    **.    **
69b0: 20 20 20 20 20 53 45 4c 45 43 54 20 61 2b 62 20       SELECT a+b 
69c0: 41 53 20 78 20 46 52 4f 4d 20 74 61 62 6c 65 20  AS x FROM table 
69d0: 57 48 45 52 45 20 78 3c 31 30 3b 0a 20 20 20 20  WHERE x<10;.    
69e0: 2a 2a 0a 20 20 20 20 2a 2a 20 49 6e 20 63 61 73  **.    ** In cas
69f0: 65 73 20 6c 69 6b 65 20 74 68 69 73 2c 20 72 65  es like this, re
6a00: 70 6c 61 63 65 20 70 45 78 70 72 20 77 69 74 68  place pExpr with
6a10: 20 61 20 63 6f 70 79 20 6f 66 20 74 68 65 20 65   a copy of the e
6a20: 78 70 72 65 73 73 69 6f 6e 20 74 68 61 74 0a 20  xpression that. 
6a30: 20 20 20 2a 2a 20 66 6f 72 6d 73 20 74 68 65 20     ** forms the 
6a40: 72 65 73 75 6c 74 20 73 65 74 20 65 6e 74 72 79  result set entry
6a50: 20 28 22 61 2b 62 22 20 69 6e 20 74 68 65 20 65   ("a+b" in the e
6a60: 78 61 6d 70 6c 65 29 20 61 6e 64 20 72 65 74 75  xample) and retu
6a70: 72 6e 20 69 6d 6d 65 64 69 61 74 65 6c 79 2e 0a  rn immediately..
6a80: 20 20 20 20 2a 2a 20 4e 6f 74 65 20 74 68 61 74      ** Note that
6a90: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
6aa0: 69 6e 20 74 68 65 20 72 65 73 75 6c 74 20 73 65  in the result se
6ab0: 74 20 73 68 6f 75 6c 64 20 68 61 76 65 20 61 6c  t should have al
6ac0: 72 65 61 64 79 20 62 65 65 6e 0a 20 20 20 20 2a  ready been.    *
6ad0: 2a 20 72 65 73 6f 6c 76 65 64 20 62 79 20 74 68  * resolved by th
6ae0: 65 20 74 69 6d 65 20 74 68 65 20 57 48 45 52 45  e time the WHERE
6af0: 20 63 6c 61 75 73 65 20 69 73 20 72 65 73 6f 6c   clause is resol
6b00: 76 65 64 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ved..    */.    
6b10: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 70 45  if( cnt==0 && pE
6b20: 4c 69 73 74 21 3d 30 20 26 26 20 7a 54 61 62 3d  List!=0 && zTab=
6b30: 3d 30 20 29 7b 0a 20 20 20 20 20 20 66 6f 72 28  =0 ){.      for(
6b40: 6a 3d 30 3b 20 6a 3c 70 45 4c 69 73 74 2d 3e 6e  j=0; j<pEList->n
6b50: 45 78 70 72 3b 20 6a 2b 2b 29 7b 0a 20 20 20 20  Expr; j++){.    
6b60: 20 20 20 20 63 68 61 72 20 2a 7a 41 73 20 3d 20      char *zAs = 
6b70: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 7a 4e 61  pEList->a[j].zNa
6b80: 6d 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  me;.        if( 
6b90: 7a 41 73 21 3d 30 20 26 26 20 73 71 6c 69 74 65  zAs!=0 && sqlite
6ba0: 33 53 74 72 49 43 6d 70 28 7a 41 73 2c 20 7a 43  3StrICmp(zAs, zC
6bb0: 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20  ol)==0 ){.      
6bc0: 20 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70      assert( pExp
6bd0: 72 2d 3e 70 4c 65 66 74 3d 3d 30 20 26 26 20 70  r->pLeft==0 && p
6be0: 45 78 70 72 2d 3e 70 52 69 67 68 74 3d 3d 30 20  Expr->pRight==0 
6bf0: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  );.          pEx
6c00: 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 41 53 3b 0a  pr->op = TK_AS;.
6c10: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
6c20: 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20 20  >iColumn = j;.  
6c30: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 70          pExpr->p
6c40: 4c 65 66 74 20 3d 20 73 71 6c 69 74 65 33 45 78  Left = sqlite3Ex
6c50: 70 72 44 75 70 28 70 45 4c 69 73 74 2d 3e 61 5b  prDup(pEList->a[
6c60: 6a 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20 20  j].pExpr);.     
6c70: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
6c80: 7a 43 6f 6c 29 3b 0a 20 20 20 20 20 20 20 20 20  zCol);.         
6c90: 20 61 73 73 65 72 74 28 20 7a 54 61 62 3d 3d 30   assert( zTab==0
6ca0: 20 26 26 20 7a 44 62 3d 3d 30 20 29 3b 0a 20 20   && zDb==0 );.  
6cb0: 20 20 20 20 20 20 20 20 72 65 74 75 72 6e 20 30          return 0
6cc0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
6cd0: 20 20 7d 20 0a 20 20 20 20 7d 0a 0a 20 20 20 20    } .    }..    
6ce0: 2f 2a 20 41 64 76 61 6e 63 65 20 74 6f 20 74 68  /* Advance to th
6cf0: 65 20 6e 65 78 74 20 6e 61 6d 65 20 63 6f 6e 74  e next name cont
6d00: 65 78 74 2e 20 20 54 68 65 20 6c 6f 6f 70 20 77  ext.  The loop w
6d10: 69 6c 6c 20 65 78 69 74 20 77 68 65 6e 20 65 69  ill exit when ei
6d20: 74 68 65 72 0a 20 20 20 20 2a 2a 20 77 65 20 68  ther.    ** we h
6d30: 61 76 65 20 61 20 6d 61 74 63 68 20 28 63 6e 74  ave a match (cnt
6d40: 3e 30 29 20 6f 72 20 77 68 65 6e 20 77 65 20 72  >0) or when we r
6d50: 75 6e 20 6f 75 74 20 6f 66 20 6e 61 6d 65 20 63  un out of name c
6d60: 6f 6e 74 65 78 74 73 2e 0a 20 20 20 20 2a 2f 0a  ontexts..    */.
6d70: 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30 20 29      if( cnt==0 )
6d80: 7b 0a 20 20 20 20 20 20 70 4e 43 20 3d 20 70 4e  {.      pNC = pN
6d90: 43 2d 3e 70 4e 65 78 74 3b 0a 20 20 20 20 7d 0a  C->pNext;.    }.
6da0: 20 20 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 49    }..  /*.  ** I
6db0: 66 20 58 20 61 6e 64 20 59 20 61 72 65 20 4e 55  f X and Y are NU
6dc0: 4c 4c 20 28 69 6e 20 6f 74 68 65 72 20 77 6f 72  LL (in other wor
6dd0: 64 73 20 69 66 20 6f 6e 6c 79 20 74 68 65 20 63  ds if only the c
6de0: 6f 6c 75 6d 6e 20 6e 61 6d 65 20 5a 20 69 73 0a  olumn name Z is.
6df0: 20 20 2a 2a 20 73 75 70 70 6c 69 65 64 29 20 61    ** supplied) a
6e00: 6e 64 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20  nd the value of 
6e10: 5a 20 69 73 20 65 6e 63 6c 6f 73 65 64 20 69 6e  Z is enclosed in
6e20: 20 64 6f 75 62 6c 65 2d 71 75 6f 74 65 73 2c 20   double-quotes, 
6e30: 74 68 65 6e 0a 20 20 2a 2a 20 5a 20 69 73 20 61  then.  ** Z is a
6e40: 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c 20   string literal 
6e50: 69 66 20 69 74 20 64 6f 65 73 6e 27 74 20 6d 61  if it doesn't ma
6e60: 74 63 68 20 61 6e 79 20 63 6f 6c 75 6d 6e 20 6e  tch any column n
6e70: 61 6d 65 73 2e 20 20 49 6e 20 74 68 61 74 0a 20  ames.  In that. 
6e80: 20 2a 2a 20 63 61 73 65 2c 20 77 65 20 6e 65 65   ** case, we nee
6e90: 64 20 74 6f 20 72 65 74 75 72 6e 20 72 69 67 68  d to return righ
6ea0: 74 20 61 77 61 79 20 61 6e 64 20 6e 6f 74 20 6d  t away and not m
6eb0: 61 6b 65 20 61 6e 79 20 63 68 61 6e 67 65 73 20  ake any changes 
6ec0: 74 6f 0a 20 20 2a 2a 20 70 45 78 70 72 2e 0a 20  to.  ** pExpr.. 
6ed0: 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 3d 3d 30   */.  if( cnt==0
6ee0: 20 26 26 20 7a 54 61 62 3d 3d 30 20 26 26 20 70   && zTab==0 && p
6ef0: 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 2d 3e 7a 5b 30  ColumnToken->z[0
6f00: 5d 3d 3d 27 22 27 20 29 7b 0a 20 20 20 20 73 71  ]=='"' ){.    sq
6f10: 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b 0a  liteFree(zCol);.
6f20: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
6f30: 7d 0a 0a 20 20 2f 2a 0a 20 20 2a 2a 20 63 6e 74  }..  /*.  ** cnt
6f40: 3d 3d 30 20 6d 65 61 6e 73 20 74 68 65 72 65 20  ==0 means there 
6f50: 77 61 73 20 6e 6f 74 20 6d 61 74 63 68 2e 20 20  was not match.  
6f60: 63 6e 74 3e 31 20 6d 65 61 6e 73 20 74 68 65 72  cnt>1 means ther
6f70: 65 20 77 65 72 65 20 74 77 6f 20 6f 72 0a 20 20  e were two or.  
6f80: 2a 2a 20 6d 6f 72 65 20 6d 61 74 63 68 65 73 2e  ** more matches.
6f90: 20 20 45 69 74 68 65 72 20 77 61 79 2c 20 77 65    Either way, we
6fa0: 20 68 61 76 65 20 61 6e 20 65 72 72 6f 72 2e 0a   have an error..
6fb0: 20 20 2a 2f 0a 20 20 69 66 28 20 63 6e 74 21 3d    */.  if( cnt!=
6fc0: 31 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  1 ){.    char *z
6fd0: 20 3d 20 30 3b 0a 20 20 20 20 63 68 61 72 20 2a   = 0;.    char *
6fe0: 7a 45 72 72 3b 0a 20 20 20 20 7a 45 72 72 20 3d  zErr;.    zErr =
6ff0: 20 63 6e 74 3d 3d 30 20 3f 20 22 6e 6f 20 73 75   cnt==0 ? "no su
7000: 63 68 20 63 6f 6c 75 6d 6e 3a 20 25 73 22 20 3a  ch column: %s" :
7010: 20 22 61 6d 62 69 67 75 6f 75 73 20 63 6f 6c 75   "ambiguous colu
7020: 6d 6e 20 6e 61 6d 65 3a 20 25 73 22 3b 0a 20 20  mn name: %s";.  
7030: 20 20 69 66 28 20 7a 44 62 20 29 7b 0a 20 20 20    if( zDb ){.   
7040: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
7050: 69 6e 67 28 26 7a 2c 20 7a 44 62 2c 20 22 2e 22  ing(&z, zDb, "."
7060: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7070: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l, 0);.    }else
7080: 20 69 66 28 20 7a 54 61 62 20 29 7b 0a 20 20 20   if( zTab ){.   
7090: 20 20 20 73 71 6c 69 74 65 33 53 65 74 53 74 72     sqlite3SetStr
70a0: 69 6e 67 28 26 7a 2c 20 7a 54 61 62 2c 20 22 2e  ing(&z, zTab, ".
70b0: 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b 0a 20 20 20  ", zCol, 0);.   
70c0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 7a 20   }else{.      z 
70d0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 7a  = sqliteStrDup(z
70e0: 43 6f 6c 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20  Col);.    }.    
70f0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
7100: 70 50 61 72 73 65 2c 20 7a 45 72 72 2c 20 7a 29  pParse, zErr, z)
7110: 3b 0a 20 20 20 20 73 71 6c 69 74 65 46 72 65 65  ;.    sqliteFree
7120: 28 7a 29 3b 0a 20 20 20 20 70 54 6f 70 4e 43 2d  (z);.    pTopNC-
7130: 3e 6e 45 72 72 2b 2b 3b 0a 20 20 7d 0a 0a 20 20  >nErr++;.  }..  
7140: 2f 2a 20 49 66 20 61 20 63 6f 6c 75 6d 6e 20 66  /* If a column f
7150: 72 6f 6d 20 61 20 74 61 62 6c 65 20 69 6e 20 70  rom a table in p
7160: 53 72 63 4c 69 73 74 20 69 73 20 72 65 66 65 72  SrcList is refer
7170: 65 6e 63 65 64 2c 20 74 68 65 6e 20 72 65 63 6f  enced, then reco
7180: 72 64 0a 20 20 2a 2a 20 74 68 69 73 20 66 61 63  rd.  ** this fac
7190: 74 20 69 6e 20 74 68 65 20 70 53 72 63 4c 69 73  t in the pSrcLis
71a0: 74 2e 61 5b 5d 2e 63 6f 6c 55 73 65 64 20 62 69  t.a[].colUsed bi
71b0: 74 6d 61 73 6b 2e 20 20 43 6f 6c 75 6d 6e 20 30  tmask.  Column 0
71c0: 20 63 61 75 73 65 73 0a 20 20 2a 2a 20 62 69 74   causes.  ** bit
71d0: 20 30 20 74 6f 20 62 65 20 73 65 74 2e 20 20 43   0 to be set.  C
71e0: 6f 6c 75 6d 6e 20 31 20 73 65 74 73 20 62 69 74  olumn 1 sets bit
71f0: 20 31 2e 20 20 41 6e 64 20 73 6f 20 66 6f 72 74   1.  And so fort
7200: 68 2e 20 20 49 66 20 74 68 65 0a 20 20 2a 2a 20  h.  If the.  ** 
7210: 63 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 69 73  column number is
7220: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
7230: 65 20 6e 75 6d 62 65 72 20 6f 66 20 62 69 74 73  e number of bits
7240: 20 69 6e 20 74 68 65 20 62 69 74 6d 61 73 6b 0a   in the bitmask.
7250: 20 20 2a 2a 20 74 68 65 6e 20 73 65 74 20 74 68    ** then set th
7260: 65 20 68 69 67 68 2d 6f 72 64 65 72 20 62 69 74  e high-order bit
7270: 20 6f 66 20 74 68 65 20 62 69 74 6d 61 73 6b 2e   of the bitmask.
7280: 0a 20 20 2a 2f 0a 20 20 69 66 28 20 70 45 78 70  .  */.  if( pExp
7290: 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 26 26  r->iColumn>=0 &&
72a0: 20 70 4d 61 74 63 68 21 3d 30 20 29 7b 0a 20 20   pMatch!=0 ){.  
72b0: 20 20 69 6e 74 20 6e 20 3d 20 70 45 78 70 72 2d    int n = pExpr-
72c0: 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 69 66  >iColumn;.    if
72d0: 28 20 6e 3e 3d 73 69 7a 65 6f 66 28 42 69 74 6d  ( n>=sizeof(Bitm
72e0: 61 73 6b 29 2a 38 20 29 7b 0a 20 20 20 20 20 20  ask)*8 ){.      
72f0: 6e 20 3d 20 73 69 7a 65 6f 66 28 42 69 74 6d 61  n = sizeof(Bitma
7300: 73 6b 29 2a 38 2d 31 3b 0a 20 20 20 20 7d 0a 20  sk)*8-1;.    }. 
7310: 20 20 20 61 73 73 65 72 74 28 20 70 4d 61 74 63     assert( pMatc
7320: 68 2d 3e 69 43 75 72 73 6f 72 3d 3d 70 45 78 70  h->iCursor==pExp
7330: 72 2d 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20  r->iTable );.   
7340: 20 70 4d 61 74 63 68 2d 3e 63 6f 6c 55 73 65 64   pMatch->colUsed
7350: 20 7c 3d 20 31 3c 3c 6e 3b 0a 20 20 7d 0a 0a 20   |= 1<<n;.  }.. 
7360: 20 2f 2a 20 43 6c 65 61 6e 20 75 70 20 61 6e 64   /* Clean up and
7370: 20 72 65 74 75 72 6e 0a 20 20 2a 2f 0a 20 20 73   return.  */.  s
7380: 71 6c 69 74 65 46 72 65 65 28 7a 44 62 29 3b 0a  qliteFree(zDb);.
7390: 20 20 73 71 6c 69 74 65 46 72 65 65 28 7a 54 61    sqliteFree(zTa
73a0: 62 29 3b 0a 20 20 73 71 6c 69 74 65 46 72 65 65  b);.  sqliteFree
73b0: 28 7a 43 6f 6c 29 3b 0a 20 20 73 71 6c 69 74 65  (zCol);.  sqlite
73c0: 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78 70  3ExprDelete(pExp
73d0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 70 45 78  r->pLeft);.  pEx
73e0: 70 72 2d 3e 70 4c 65 66 74 20 3d 20 30 3b 0a 20  pr->pLeft = 0;. 
73f0: 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65   sqlite3ExprDele
7400: 74 65 28 70 45 78 70 72 2d 3e 70 52 69 67 68 74  te(pExpr->pRight
7410: 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 52 69 67  );.  pExpr->pRig
7420: 68 74 20 3d 20 30 3b 0a 20 20 70 45 78 70 72 2d  ht = 0;.  pExpr-
7430: 3e 6f 70 20 3d 20 54 4b 5f 43 4f 4c 55 4d 4e 3b  >op = TK_COLUMN;
7440: 0a 20 20 69 66 28 20 63 6e 74 3d 3d 31 20 29 7b  .  if( cnt==1 ){
7450: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 4e 43  .    assert( pNC
7460: 21 3d 30 20 26 26 20 70 4e 43 2d 3e 70 53 72 63  !=0 && pNC->pSrc
7470: 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20 20 73  List!=0 );.    s
7480: 71 6c 69 74 65 33 41 75 74 68 52 65 61 64 28 70  qlite3AuthRead(p
7490: 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 70 4e  Parse, pExpr, pN
74a0: 43 2d 3e 70 53 72 63 4c 69 73 74 29 3b 0a 20 20  C->pSrcList);.  
74b0: 7d 0a 20 20 72 65 74 75 72 6e 20 63 6e 74 21 3d  }.  return cnt!=
74c0: 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  1;.}../*.** pExp
74d0: 72 20 69 73 20 61 20 6e 6f 64 65 20 74 68 61 74  r is a node that
74e0: 20 64 65 66 69 6e 65 73 20 61 20 66 75 6e 63 74   defines a funct
74f0: 69 6f 6e 20 6f 66 20 73 6f 6d 65 20 6b 69 6e 64  ion of some kind
7500: 2e 20 20 49 74 20 6d 69 67 68 74 0a 2a 2a 20 62  .  It might.** b
7510: 65 20 61 20 73 79 6e 74 61 63 74 69 63 20 66 75  e a syntactic fu
7520: 6e 63 74 69 6f 6e 20 6c 69 6b 65 20 22 63 6f 75  nction like "cou
7530: 6e 74 28 78 29 22 20 6f 72 20 69 74 20 6d 69 67  nt(x)" or it mig
7540: 68 74 20 62 65 20 61 20 66 75 6e 63 74 69 6f 6e  ht be a function
7550: 0a 2a 2a 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  .** that impleme
7560: 6e 74 73 20 61 6e 20 6f 70 65 72 61 74 6f 72 2c  nts an operator,
7570: 20 6c 69 6b 65 20 22 61 20 4c 49 4b 45 20 62 22   like "a LIKE b"
7580: 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  .  .**.** This r
7590: 6f 75 74 69 6e 65 20 6d 61 6b 65 73 20 2a 70 7a  outine makes *pz
75a0: 4e 61 6d 65 20 70 6f 69 6e 74 20 74 6f 20 74 68  Name point to th
75b0: 65 20 6e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  e name of the fu
75c0: 6e 63 74 69 6f 6e 20 61 6e 64 20 0a 2a 2a 20 2a  nction and .** *
75d0: 70 6e 4e 61 6d 65 20 68 6f 6c 64 20 74 68 65 20  pnName hold the 
75e0: 6e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61 63  number of charac
75f0: 74 65 72 73 20 69 6e 20 74 68 65 20 66 75 6e 63  ters in the func
7600: 74 69 6f 6e 20 6e 61 6d 65 2e 0a 2a 2f 0a 73 74  tion name..*/.st
7610: 61 74 69 63 20 76 6f 69 64 20 67 65 74 46 75 6e  atic void getFun
7620: 63 74 69 6f 6e 4e 61 6d 65 28 45 78 70 72 20 2a  ctionName(Expr *
7630: 70 45 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61  pExpr, const cha
7640: 72 20 2a 2a 70 7a 4e 61 6d 65 2c 20 69 6e 74 20  r **pzName, int 
7650: 2a 70 6e 4e 61 6d 65 29 7b 0a 20 20 73 77 69 74  *pnName){.  swit
7660: 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b  ch( pExpr->op ){
7670: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e  .    case TK_FUN
7680: 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 2a  CTION: {.      *
7690: 70 7a 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e  pzName = pExpr->
76a0: 74 6f 6b 65 6e 2e 7a 3b 0a 20 20 20 20 20 20 2a  token.z;.      *
76b0: 70 6e 4e 61 6d 65 20 3d 20 70 45 78 70 72 2d 3e  pnName = pExpr->
76c0: 74 6f 6b 65 6e 2e 6e 3b 0a 20 20 20 20 20 20 62  token.n;.      b
76d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
76e0: 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 20 7b 0a  case TK_LIKE: {.
76f0: 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20        *pzName = 
7700: 22 6c 69 6b 65 22 3b 0a 20 20 20 20 20 20 2a 70  "like";.      *p
7710: 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20 20 20  nName = 4;.     
7720: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
7730: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 20    case TK_GLOB: 
7740: 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20  {.      *pzName 
7750: 3d 20 22 67 6c 6f 62 22 3b 0a 20 20 20 20 20 20  = "glob";.      
7760: 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b 0a 20 20 20  *pnName = 4;.   
7770: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
7780: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d      case TK_CTIM
7790: 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61  E: {.      *pzNa
77a0: 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f 74 69  me = "current_ti
77b0: 6d 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e 4e 61  me";.      *pnNa
77c0: 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20 20 62  me = 12;.      b
77d0: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
77e0: 63 61 73 65 20 54 4b 5f 43 44 41 54 45 3a 20 7b  case TK_CDATE: {
77f0: 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d  .      *pzName =
7800: 20 22 63 75 72 72 65 6e 74 5f 64 61 74 65 22 3b   "current_date";
7810: 0a 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d  .      *pnName =
7820: 20 31 32 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   12;.      break
7830: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
7840: 20 54 4b 5f 43 54 49 4d 45 53 54 41 4d 50 3a 20   TK_CTIMESTAMP: 
7850: 7b 0a 20 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20  {.      *pzName 
7860: 3d 20 22 63 75 72 72 65 6e 74 5f 74 69 6d 65 73  = "current_times
7870: 74 61 6d 70 22 3b 0a 20 20 20 20 20 20 2a 70 6e  tamp";.      *pn
7880: 4e 61 6d 65 20 3d 20 31 37 3b 0a 20 20 20 20 20  Name = 17;.     
7890: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
78a0: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20  }.}../*.** This 
78b0: 72 6f 75 74 69 6e 65 20 69 73 20 64 65 73 69 67  routine is desig
78c0: 6e 65 64 20 61 73 20 61 6e 20 78 46 75 6e 63 20  ned as an xFunc 
78d0: 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65 65  for walkExprTree
78e0: 28 29 2e 0a 2a 2a 0a 2a 2a 20 52 65 73 6f 6c 76  ()..**.** Resolv
78f0: 65 20 73 79 6d 62 6f 6c 69 63 20 6e 61 6d 65 73  e symbolic names
7900: 20 69 6e 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 20   into TK_COLUMN 
7910: 6f 70 65 72 61 74 6f 72 73 20 66 6f 72 20 74 68  operators for th
7920: 65 20 63 75 72 72 65 6e 74 0a 2a 2a 20 6e 6f 64  e current.** nod
7930: 65 20 69 6e 20 74 68 65 20 65 78 70 72 65 73 73  e in the express
7940: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
7950: 6e 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65 20  n 0 to continue 
7960: 74 68 65 20 73 65 61 72 63 68 20 64 6f 77 6e 0a  the search down.
7970: 2a 2a 20 74 68 65 20 74 72 65 65 20 6f 72 20 32  ** the tree or 2
7980: 20 74 6f 20 61 62 6f 72 74 20 74 68 65 20 74 72   to abort the tr
7990: 65 65 20 77 61 6c 6b 2e 0a 2a 2a 0a 2a 2a 20 54  ee walk..**.** T
79a0: 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6c 73 6f  his routine also
79b0: 20 64 6f 65 73 20 65 72 72 6f 72 20 63 68 65 63   does error chec
79c0: 6b 69 6e 67 20 61 6e 64 20 6e 61 6d 65 20 72 65  king and name re
79d0: 73 6f 6c 75 74 69 6f 6e 20 66 6f 72 0a 2a 2a 20  solution for.** 
79e0: 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 2e 20  function names. 
79f0: 20 54 68 65 20 6f 70 65 72 61 74 6f 72 20 66 6f   The operator fo
7a00: 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  r aggregate func
7a10: 74 69 6f 6e 73 20 69 73 20 63 68 61 6e 67 65 64  tions is changed
7a20: 0a 2a 2a 20 74 6f 20 54 4b 5f 41 47 47 5f 46 55  .** to TK_AGG_FU
7a30: 4e 43 54 49 4f 4e 2e 0a 2a 2f 0a 73 74 61 74 69  NCTION..*/.stati
7a40: 63 20 69 6e 74 20 6e 61 6d 65 52 65 73 6f 6c 76  c int nameResolv
7a50: 65 72 53 74 65 70 28 76 6f 69 64 20 2a 70 41 72  erStep(void *pAr
7a60: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
7a70: 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a  .  NameContext *
7a80: 70 4e 43 20 3d 20 28 4e 61 6d 65 43 6f 6e 74 65  pNC = (NameConte
7a90: 78 74 2a 29 70 41 72 67 3b 0a 20 20 53 72 63 4c  xt*)pArg;.  SrcL
7aa0: 69 73 74 20 2a 70 53 72 63 4c 69 73 74 3b 0a 20  ist *pSrcList;. 
7ab0: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 0a   Parse *pParse;.
7ac0: 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21 3d  .  assert( pNC!=
7ad0: 30 20 29 3b 0a 20 20 70 53 72 63 4c 69 73 74 20  0 );.  pSrcList 
7ae0: 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74 3b  = pNC->pSrcList;
7af0: 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43 2d  .  pParse = pNC-
7b00: 3e 70 50 61 72 73 65 3b 0a 20 20 69 66 28 20 70  >pParse;.  if( p
7b10: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
7b20: 20 31 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61   1;.  if( ExprHa
7b30: 73 41 6e 79 50 72 6f 70 65 72 74 79 28 70 45 78  sAnyProperty(pEx
7b40: 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65 64 29  pr, EP_Resolved)
7b50: 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 45   ) return 1;.  E
7b60: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
7b70: 45 78 70 72 2c 20 45 50 5f 52 65 73 6f 6c 76 65  Expr, EP_Resolve
7b80: 64 29 3b 0a 23 69 66 6e 64 65 66 20 4e 44 45 42  d);.#ifndef NDEB
7b90: 55 47 0a 20 20 69 66 28 20 70 53 72 63 4c 69 73  UG.  if( pSrcLis
7ba0: 74 20 29 7b 0a 20 20 20 20 69 6e 74 20 69 3b 0a  t ){.    int i;.
7bb0: 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70      for(i=0; i<p
7bc0: 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63 3b 20 69  SrcList->nSrc; i
7bd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 61 73 73 65 72  ++){.      asser
7be0: 74 28 20 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69  t( pSrcList->a[i
7bf0: 5d 2e 69 43 75 72 73 6f 72 3e 3d 30 20 26 26 20  ].iCursor>=0 && 
7c00: 70 53 72 63 4c 69 73 74 2d 3e 61 5b 69 5d 2e 69  pSrcList->a[i].i
7c10: 43 75 72 73 6f 72 3c 70 50 61 72 73 65 2d 3e 6e  Cursor<pParse->n
7c20: 54 61 62 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  Tab);.    }.  }.
7c30: 23 65 6e 64 69 66 0a 20 20 73 77 69 74 63 68 28  #endif.  switch(
7c40: 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20   pExpr->op ){.  
7c50: 20 20 2f 2a 20 44 6f 75 62 6c 65 2d 71 75 6f 74    /* Double-quot
7c60: 65 64 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ed strings (ex: 
7c70: 22 61 62 63 22 29 20 61 72 65 20 75 73 65 64 20  "abc") are used 
7c80: 61 73 20 69 64 65 6e 74 69 66 69 65 72 73 20 69  as identifiers i
7c90: 66 0a 20 20 20 20 2a 2a 20 70 6f 73 73 69 62 6c  f.    ** possibl
7ca0: 65 2e 20 20 4f 74 68 65 72 77 69 73 65 20 74 68  e.  Otherwise th
7cb0: 65 79 20 72 65 6d 61 69 6e 20 61 73 20 73 74 72  ey remain as str
7cc0: 69 6e 67 73 2e 20 20 53 69 6e 67 6c 65 2d 71 75  ings.  Single-qu
7cd0: 6f 74 65 64 0a 20 20 20 20 2a 2a 20 73 74 72 69  oted.    ** stri
7ce0: 6e 67 73 20 28 65 78 3a 20 27 61 62 63 27 29 20  ngs (ex: 'abc') 
7cf0: 61 72 65 20 61 6c 77 61 79 73 20 73 74 72 69 6e  are always strin
7d00: 67 20 6c 69 74 65 72 61 6c 73 2e 0a 20 20 20 20  g literals..    
7d10: 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  */.    case TK_S
7d20: 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 69  TRING: {.      i
7d30: 66 28 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e  f( pExpr->token.
7d40: 7a 5b 30 5d 3d 3d 27 5c 27 27 20 29 20 62 72 65  z[0]=='\'' ) bre
7d50: 61 6b 3b 0a 20 20 20 20 20 20 2f 2a 20 46 61 6c  ak;.      /* Fal
7d60: 6c 20 74 68 72 75 20 69 6e 74 6f 20 74 68 65 20  l thru into the 
7d70: 54 4b 5f 49 44 20 63 61 73 65 20 69 66 20 74 68  TK_ID case if th
7d80: 69 73 20 69 73 20 61 20 64 6f 75 62 6c 65 2d 71  is is a double-q
7d90: 75 6f 74 65 64 20 73 74 72 69 6e 67 20 2a 2f 0a  uoted string */.
7da0: 20 20 20 20 7d 0a 20 20 20 20 2f 2a 20 41 20 6c      }.    /* A l
7db0: 6f 6e 65 20 69 64 65 6e 74 69 66 69 65 72 20 69  one identifier i
7dc0: 73 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20  s the name of a 
7dd0: 63 6f 6c 75 6d 6e 2e 0a 20 20 20 20 2a 2f 0a 20  column..    */. 
7de0: 20 20 20 63 61 73 65 20 54 4b 5f 49 44 3a 20 7b     case TK_ID: {
7df0: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
7e00: 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
7e10: 20 20 20 20 20 20 6c 6f 6f 6b 75 70 4e 61 6d 65        lookupName
7e20: 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20 26  (pParse, 0, 0, &
7e30: 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2c 20 70 4e  pExpr->token, pN
7e40: 43 2c 20 70 45 78 70 72 29 3b 0a 20 20 20 20 20  C, pExpr);.     
7e50: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
7e60: 0a 20 20 0a 20 20 20 20 2f 2a 20 41 20 74 61 62  .  .    /* A tab
7e70: 6c 65 20 6e 61 6d 65 20 61 6e 64 20 63 6f 6c 75  le name and colu
7e80: 6d 6e 20 6e 61 6d 65 3a 20 20 20 20 20 49 44 2e  mn name:     ID.
7e90: 49 44 0a 20 20 20 20 2a 2a 20 4f 72 20 61 20 64  ID.    ** Or a d
7ea0: 61 74 61 62 61 73 65 2c 20 74 61 62 6c 65 20 61  atabase, table a
7eb0: 6e 64 20 63 6f 6c 75 6d 6e 3a 20 20 49 44 2e 49  nd column:  ID.I
7ec0: 44 2e 49 44 0a 20 20 20 20 2a 2f 0a 20 20 20 20  D.ID.    */.    
7ed0: 63 61 73 65 20 54 4b 5f 44 4f 54 3a 20 7b 0a 20  case TK_DOT: {. 
7ee0: 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 43 6f 6c       Token *pCol
7ef0: 75 6d 6e 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e  umn;.      Token
7f00: 20 2a 70 54 61 62 6c 65 3b 0a 20 20 20 20 20 20   *pTable;.      
7f10: 54 6f 6b 65 6e 20 2a 70 44 62 3b 0a 20 20 20 20  Token *pDb;.    
7f20: 20 20 45 78 70 72 20 2a 70 52 69 67 68 74 3b 0a    Expr *pRight;.
7f30: 0a 20 20 20 20 20 20 69 66 28 20 70 53 72 63 4c  .      if( pSrcL
7f40: 69 73 74 3d 3d 30 20 29 20 62 72 65 61 6b 3b 0a  ist==0 ) break;.
7f50: 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20 70        pRight = p
7f60: 45 78 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20  Expr->pRight;.  
7f70: 20 20 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e      if( pRight->
7f80: 6f 70 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20  op==TK_ID ){.   
7f90: 20 20 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20       pDb = 0;.  
7fa0: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
7fb0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f  pExpr->pLeft->to
7fc0: 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f  ken;.        pCo
7fd0: 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e  lumn = &pRight->
7fe0: 74 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c  token;.      }el
7ff0: 73 65 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65  se{.        asse
8000: 72 74 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d  rt( pRight->op==
8010: 54 4b 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20  TK_DOT );.      
8020: 20 20 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e    pDb = &pExpr->
8030: 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  pLeft->token;.  
8040: 20 20 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26        pTable = &
8050: 70 52 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74  pRight->pLeft->t
8060: 6f 6b 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43  oken;.        pC
8070: 6f 6c 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d  olumn = &pRight-
8080: 3e 70 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a  >pRight->token;.
8090: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f        }.      lo
80a0: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
80b0: 20 70 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43   pDb, pTable, pC
80c0: 6f 6c 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70  olumn, pNC, pExp
80d0: 72 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e  r);.      return
80e0: 20 31 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f   1;.    }..    /
80f0: 2a 20 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69  * Resolve functi
8100: 6f 6e 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a  on names.    */.
8110: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d      case TK_CTIM
8120: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  E:.    case TK_C
8130: 54 49 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63  TIMESTAMP:.    c
8140: 61 73 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20  ase TK_CDATE:.  
8150: 20 20 2f 2a 20 4e 6f 74 65 3a 20 54 68 65 20 61    /* Note: The a
8160: 62 6f 76 65 20 74 68 72 65 65 20 77 65 72 65 20  bove three were 
8170: 61 20 73 65 70 65 72 61 74 65 20 63 61 73 65 20  a seperate case 
8180: 69 6e 20 73 71 6c 6d 6f 74 6f 2e 20 52 65 61 73  in sqlmoto. Reas
8190: 6f 6e 3f 20 2a 2f 0a 20 20 20 20 63 61 73 65 20  on? */.    case 
81a0: 54 4b 5f 47 4c 4f 42 3a 0a 20 20 20 20 63 61 73  TK_GLOB:.    cas
81b0: 65 20 54 4b 5f 4c 49 4b 45 3a 0a 20 20 20 20 63  e TK_LIKE:.    c
81c0: 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a  ase TK_FUNCTION:
81d0: 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69 73   {.      ExprLis
81e0: 74 20 2a 70 4c 69 73 74 20 3d 20 70 45 78 70 72  t *pList = pExpr
81f0: 2d 3e 70 4c 69 73 74 3b 20 20 20 20 2f 2a 20 54  ->pList;    /* T
8200: 68 65 20 61 72 67 75 6d 65 6e 74 20 6c 69 73 74  he argument list
8210: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e 20   */.      int n 
8220: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
8230: 3e 6e 45 78 70 72 20 3a 20 30 3b 20 20 2f 2a 20  >nExpr : 0;  /* 
8240: 4e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  Number of argume
8250: 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  nts */.      int
8260: 20 6e 6f 5f 73 75 63 68 5f 66 75 6e 63 20 3d 20   no_such_func = 
8270: 30 3b 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65  0;       /* True
8280: 20 69 66 20 6e 6f 20 73 75 63 68 20 66 75 6e 63   if no such func
8290: 74 69 6f 6e 20 65 78 69 73 74 73 20 2a 2f 0a 20  tion exists */. 
82a0: 20 20 20 20 20 69 6e 74 20 77 72 6f 6e 67 5f 6e       int wrong_n
82b0: 75 6d 5f 61 72 67 73 20 3d 20 30 3b 20 20 20 20  um_args = 0;    
82c0: 20 2f 2a 20 54 72 75 65 20 69 66 20 77 72 6f 6e   /* True if wron
82d0: 67 20 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75  g number of argu
82e0: 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 69  ments */.      i
82f0: 6e 74 20 69 73 5f 61 67 67 20 3d 20 30 3b 20 20  nt is_agg = 0;  
8300: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 72             /* Tr
8310: 75 65 20 69 66 20 69 73 20 61 6e 20 61 67 67 72  ue if is an aggr
8320: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 2a  egate function *
8330: 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  /.      int i;. 
8340: 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 20 20 20       int nId;   
8350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
8360: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 63 68   /* Number of ch
8370: 61 72 61 63 74 65 72 73 20 69 6e 20 66 75 6e 63  aracters in func
8380: 74 69 6f 6e 20 6e 61 6d 65 20 2a 2f 0a 20 20 20  tion name */.   
8390: 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
83a0: 49 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 2f  Id;            /
83b0: 2a 20 54 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e  * The function n
83c0: 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 46 75  ame. */.      Fu
83d0: 6e 63 44 65 66 20 2a 70 44 65 66 3b 20 20 20 20  ncDef *pDef;    
83e0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 49 6e 66            /* Inf
83f0: 6f 72 6d 61 74 69 6f 6e 20 61 62 6f 75 74 20 74  ormation about t
8400: 68 65 20 66 75 6e 63 74 69 6f 6e 20 2a 2f 0a 20  he function */. 
8410: 20 20 20 20 20 69 6e 74 20 65 6e 63 20 3d 20 70       int enc = p
8420: 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b 20  Parse->db->enc; 
8430: 20 2f 2a 20 54 68 65 20 64 61 74 61 62 61 73 65   /* The database
8440: 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 0a 20 20   encoding */..  
8450: 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f 6e 4e      getFunctionN
8460: 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49 64 2c  ame(pExpr, &zId,
8470: 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20 70 44   &nId);.      pD
8480: 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64  ef = sqlite3Find
8490: 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d  Function(pParse-
84a0: 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 6e  >db, zId, nId, n
84b0: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
84c0: 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a   if( pDef==0 ){.
84d0: 20 20 20 20 20 20 20 20 70 44 65 66 20 3d 20 73          pDef = s
84e0: 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63 74 69  qlite3FindFuncti
84f0: 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c 20 7a  on(pParse->db, z
8500: 49 64 2c 20 6e 49 64 2c 20 2d 31 2c 20 65 6e 63  Id, nId, -1, enc
8510: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 69 66  , 0);.        if
8520: 28 20 70 44 65 66 3d 3d 30 20 29 7b 0a 20 20 20  ( pDef==0 ){.   
8530: 20 20 20 20 20 20 20 6e 6f 5f 73 75 63 68 5f 66         no_such_f
8540: 75 6e 63 20 3d 20 31 3b 0a 20 20 20 20 20 20 20  unc = 1;.       
8550: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
8560: 20 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73    wrong_num_args
8570: 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 7d 0a   = 1;.        }.
8580: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
8590: 20 20 20 20 20 69 73 5f 61 67 67 20 3d 20 70 44       is_agg = pD
85a0: 65 66 2d 3e 78 46 75 6e 63 3d 3d 30 3b 0a 20 20  ef->xFunc==0;.  
85b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
85c0: 69 73 5f 61 67 67 20 26 26 20 21 70 4e 43 2d 3e  is_agg && !pNC->
85d0: 61 6c 6c 6f 77 41 67 67 20 29 7b 0a 20 20 20 20  allowAgg ){.    
85e0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
85f0: 4d 73 67 28 70 50 61 72 73 65 2c 20 22 6d 69 73  Msg(pParse, "mis
8600: 75 73 65 20 6f 66 20 61 67 67 72 65 67 61 74 65  use of aggregate
8610: 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29   function %.*s()
8620: 22 2c 20 6e 49 64 2c 7a 49 64 29 3b 0a 20 20 20  ", nId,zId);.   
8630: 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b       pNC->nErr++
8640: 3b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  ;.        is_agg
8650: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73   = 0;.      }els
8660: 65 20 69 66 28 20 6e 6f 5f 73 75 63 68 5f 66 75  e if( no_such_fu
8670: 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  nc ){.        sq
8680: 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50  lite3ErrorMsg(pP
8690: 61 72 73 65 2c 20 22 6e 6f 20 73 75 63 68 20 66  arse, "no such f
86a0: 75 6e 63 74 69 6f 6e 3a 20 25 2e 2a 73 22 2c 20  unction: %.*s", 
86b0: 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20  nId, zId);.     
86c0: 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a     pNC->nErr++;.
86d0: 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
86e0: 77 72 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 29  wrong_num_args )
86f0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
8700: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
8710: 2c 22 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f  ,"wrong number o
8720: 66 20 61 72 67 75 6d 65 6e 74 73 20 74 6f 20 66  f arguments to f
8730: 75 6e 63 74 69 6f 6e 20 25 2e 2a 73 28 29 22 2c  unction %.*s()",
8740: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 49  .             nI
8750: 64 2c 20 7a 49 64 29 3b 0a 20 20 20 20 20 20 20  d, zId);.       
8760: 20 70 4e 43 2d 3e 6e 45 72 72 2b 2b 3b 0a 20 20   pNC->nErr++;.  
8770: 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20      }.      if( 
8780: 69 73 5f 61 67 67 20 29 7b 0a 20 20 20 20 20 20  is_agg ){.      
8790: 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b    pExpr->op = TK
87a0: 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3b 0a 20  _AGG_FUNCTION;. 
87b0: 20 20 20 20 20 20 20 70 4e 43 2d 3e 68 61 73 41         pNC->hasA
87c0: 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a  gg = 1;.      }.
87d0: 20 20 20 20 20 20 69 66 28 20 69 73 5f 61 67 67        if( is_agg
87e0: 20 29 20 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67   ) pNC->allowAgg
87f0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 66 6f 72 28   = 0;.      for(
8800: 69 3d 30 3b 20 70 4e 43 2d 3e 6e 45 72 72 3d 3d  i=0; pNC->nErr==
8810: 30 20 26 26 20 69 3c 6e 3b 20 69 2b 2b 29 7b 0a  0 && i<n; i++){.
8820: 20 20 20 20 20 20 20 20 77 61 6c 6b 45 78 70 72          walkExpr
8830: 54 72 65 65 28 70 4c 69 73 74 2d 3e 61 5b 69 5d  Tree(pList->a[i]
8840: 2e 70 45 78 70 72 2c 20 6e 61 6d 65 52 65 73 6f  .pExpr, nameReso
8850: 6c 76 65 72 53 74 65 70 2c 20 70 4e 43 29 3b 0a  lverStep, pNC);.
8860: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
8870: 28 20 69 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e  ( is_agg ) pNC->
8880: 61 6c 6c 6f 77 41 67 67 20 3d 20 31 3b 0a 20 20  allowAgg = 1;.  
8890: 20 20 20 20 2f 2a 20 46 49 58 20 4d 45 3a 20 20      /* FIX ME:  
88a0: 43 6f 6d 70 75 74 65 20 70 45 78 70 72 2d 3e 61  Compute pExpr->a
88b0: 66 66 69 6e 69 74 79 20 62 61 73 65 64 20 6f 6e  ffinity based on
88c0: 20 74 68 65 20 65 78 70 65 63 74 65 64 20 72 65   the expected re
88d0: 74 75 72 6e 0a 20 20 20 20 20 20 2a 2a 20 74 79  turn.      ** ty
88e0: 70 65 20 6f 66 20 74 68 65 20 66 75 6e 63 74 69  pe of the functi
88f0: 6f 6e 20 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  on .      */.   
8900: 20 20 20 72 65 74 75 72 6e 20 69 73 5f 61 67 67     return is_agg
8910: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
8920: 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 20 46 6f  turn 0;.}../* Fo
8930: 72 77 61 72 64 20 64 65 63 6c 61 72 61 74 69 6f  rward declaratio
8940: 6e 20 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  n */.static int 
8950: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 53  sqlite3ExprCodeS
8960: 75 62 71 75 65 72 79 28 50 61 72 73 65 2a 2c 20  ubquery(Parse*, 
8970: 4e 61 6d 65 43 6f 6e 74 65 78 74 2a 2c 20 45 78  NameContext*, Ex
8980: 70 72 2a 29 3b 0a 0a 2f 2a 0a 2a 2a 20 54 68 69  pr*);../*.** Thi
8990: 73 20 72 6f 75 74 69 6e 65 20 77 61 6c 6b 73 20  s routine walks 
89a0: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  an expression tr
89b0: 65 65 20 61 6e 64 20 72 65 73 6f 6c 76 65 73 20  ee and resolves 
89c0: 72 65 66 65 72 65 6e 63 65 73 20 74 6f 0a 2a 2a  references to.**
89d0: 20 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 73 2e 20   table columns. 
89e0: 20 4e 6f 64 65 73 20 6f 66 20 74 68 65 20 66 6f   Nodes of the fo
89f0: 72 6d 20 49 44 2e 49 44 20 6f 72 20 49 44 20 72  rm ID.ID or ID r
8a00: 65 73 6f 6c 76 65 20 69 6e 74 6f 20 61 6e 0a 2a  esolve into an.*
8a10: 2a 20 69 6e 64 65 78 20 74 6f 20 74 68 65 20 74  * index to the t
8a20: 61 62 6c 65 20 69 6e 20 74 68 65 20 74 61 62 6c  able in the tabl
8a30: 65 20 6c 69 73 74 20 61 6e 64 20 61 20 63 6f 6c  e list and a col
8a40: 75 6d 6e 20 6f 66 66 73 65 74 2e 20 20 54 68 65  umn offset.  The
8a50: 20 0a 2a 2a 20 45 78 70 72 2e 6f 70 63 6f 64 65   .** Expr.opcode
8a60: 20 66 6f 72 20 73 75 63 68 20 6e 6f 64 65 73 20   for such nodes 
8a70: 69 73 20 63 68 61 6e 67 65 64 20 74 6f 20 54 4b  is changed to TK
8a80: 5f 43 4f 4c 55 4d 4e 2e 20 20 54 68 65 20 45 78  _COLUMN.  The Ex
8a90: 70 72 2e 69 54 61 62 6c 65 0a 2a 2a 20 76 61 6c  pr.iTable.** val
8aa0: 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74 6f  ue is changed to
8ab0: 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68   the index of th
8ac0: 65 20 72 65 66 65 72 65 6e 63 65 64 20 74 61 62  e referenced tab
8ad0: 6c 65 20 69 6e 20 70 54 61 62 4c 69 73 74 0a 2a  le in pTabList.*
8ae0: 2a 20 70 6c 75 73 20 74 68 65 20 22 62 61 73 65  * plus the "base
8af0: 22 20 76 61 6c 75 65 2e 20 20 54 68 65 20 62 61  " value.  The ba
8b00: 73 65 20 76 61 6c 75 65 20 77 69 6c 6c 20 75 6c  se value will ul
8b10: 74 69 6d 61 74 65 6c 79 20 62 65 63 6f 6d 65 20  timately become 
8b20: 74 68 65 0a 2a 2a 20 56 44 42 45 20 63 75 72 73  the.** VDBE curs
8b30: 6f 72 20 6e 75 6d 62 65 72 20 66 6f 72 20 61 20  or number for a 
8b40: 63 75 72 73 6f 72 20 74 68 61 74 20 69 73 20 70  cursor that is p
8b50: 6f 69 6e 74 69 6e 67 20 69 6e 74 6f 20 74 68 65  ointing into the
8b60: 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a 20 74   referenced.** t
8b70: 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72 2e  able.  The Expr.
8b80: 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 69 73  iColumn value is
8b90: 20 63 68 61 6e 67 65 64 20 74 6f 20 74 68 65 20   changed to the 
8ba0: 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
8bb0: 75 6d 6e 20 0a 2a 2a 20 6f 66 20 74 68 65 20 72  umn .** of the r
8bc0: 65 66 65 72 65 6e 63 65 64 20 74 61 62 6c 65 2e  eferenced table.
8bd0: 20 20 54 68 65 20 45 78 70 72 2e 69 43 6f 6c 75    The Expr.iColu
8be0: 6d 6e 20 76 61 6c 75 65 20 66 6f 72 20 74 68 65  mn value for the
8bf0: 20 73 70 65 63 69 61 6c 0a 2a 2a 20 52 4f 57 49   special.** ROWI
8c00: 44 20 63 6f 6c 75 6d 6e 20 69 73 20 2d 31 2e 20  D column is -1. 
8c10: 20 41 6e 79 20 49 4e 54 45 47 45 52 20 50 52 49   Any INTEGER PRI
8c20: 4d 41 52 59 20 4b 45 59 20 63 6f 6c 75 6d 6e 20  MARY KEY column 
8c30: 69 73 20 74 72 69 65 64 20 61 73 20 61 6e 0a 2a  is tried as an.*
8c40: 2a 20 61 6c 69 61 73 20 66 6f 72 20 52 4f 57 49  * alias for ROWI
8c50: 44 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20 72 65  D..**.** Also re
8c60: 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e 20 6e  solve function n
8c70: 61 6d 65 73 20 61 6e 64 20 63 68 65 63 6b 20 74  ames and check t
8c80: 68 65 20 66 75 6e 63 74 69 6f 6e 73 20 66 6f 72  he functions for
8c90: 20 70 72 6f 70 65 72 0a 2a 2a 20 75 73 61 67 65   proper.** usage
8ca0: 2e 20 20 4d 61 6b 65 20 73 75 72 65 20 61 6c 6c  .  Make sure all
8cb0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 73 20   function names 
8cc0: 61 72 65 20 72 65 63 6f 67 6e 69 7a 65 64 20 61  are recognized a
8cd0: 6e 64 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 73  nd all functions
8ce0: 0a 2a 2a 20 68 61 76 65 20 74 68 65 20 63 6f 72  .** have the cor
8cf0: 72 65 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61  rect number of a
8d00: 72 67 75 6d 65 6e 74 73 2e 20 20 4c 65 61 76 65  rguments.  Leave
8d10: 20 61 6e 20 65 72 72 6f 72 20 6d 65 73 73 61 67   an error messag
8d20: 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73 65 2d 3e  e.** in pParse->
8d30: 7a 45 72 72 4d 73 67 20 69 66 20 61 6e 79 74 68  zErrMsg if anyth
8d40: 69 6e 67 20 69 73 20 61 6d 69 73 73 2e 20 20 52  ing is amiss.  R
8d50: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
8d60: 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2a 0a 2a   of errors..**.*
8d70: 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73  * If the express
8d80: 69 6f 6e 20 63 6f 6e 74 61 69 6e 73 20 61 67 67  ion contains agg
8d90: 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73  regate functions
8da0: 20 74 68 65 6e 20 73 65 74 20 74 68 65 20 45 50   then set the EP
8db0: 5f 41 67 67 0a 2a 2a 20 70 72 6f 70 65 72 74 79  _Agg.** property
8dc0: 20 6f 6e 20 74 68 65 20 65 78 70 72 65 73 73 69   on the expressi
8dd0: 6f 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  on..*/.int sqlit
8de0: 65 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d  e3ExprResolveNam
8df0: 65 73 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  es(.  Parse *pPa
8e00: 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a  rse,          /*
8e10: 20 54 68 65 20 70 61 72 73 65 72 20 63 6f 6e 74   The parser cont
8e20: 65 78 74 20 2a 2f 0a 20 20 53 72 63 4c 69 73 74  ext */.  SrcList
8e30: 20 2a 70 53 72 63 4c 69 73 74 2c 20 20 20 20 20   *pSrcList,     
8e40: 20 2f 2a 20 4c 69 73 74 20 6f 66 20 74 61 62 6c   /* List of tabl
8e50: 65 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f 6c  es used to resol
8e60: 76 65 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 20  ve column names 
8e70: 2a 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70  */.  ExprList *p
8e80: 45 4c 69 73 74 2c 20 20 20 20 20 20 20 2f 2a 20  EList,       /* 
8e90: 4c 69 73 74 20 6f 66 20 65 78 70 72 65 73 73 69  List of expressi
8ea0: 6f 6e 73 20 75 73 65 64 20 74 6f 20 72 65 73 6f  ons used to reso
8eb0: 6c 76 65 20 22 41 53 22 20 2a 2f 0a 20 20 4e 61  lve "AS" */.  Na
8ec0: 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20  meContext *pNC, 
8ed0: 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61        /* Namespa
8ee0: 63 65 20 6f 66 20 65 6e 63 6c 6f 73 69 6e 67 20  ce of enclosing 
8ef0: 73 74 61 74 65 6d 65 6e 74 20 2a 2f 0a 20 20 45  statement */.  E
8f00: 78 70 72 20 2a 70 45 78 70 72 2c 20 20 20 20 20  xpr *pExpr,     
8f10: 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78         /* The ex
8f20: 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65 20 61  pression to be a
8f30: 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 20 20 69 6e  nalyzed. */.  in
8f40: 74 20 61 6c 6c 6f 77 41 67 67 2c 20 20 20 20 20  t allowAgg,     
8f50: 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20 74 6f        /* True to
8f60: 20 61 6c 6c 6f 77 20 61 67 67 72 65 67 61 74 65   allow aggregate
8f70: 20 65 78 70 72 65 73 73 69 6f 6e 73 20 2a 2f 0a   expressions */.
8f80: 20 20 69 6e 74 20 63 6f 64 65 53 75 62 71 75 65    int codeSubque
8f90: 72 79 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20  ry        /* If 
8fa0: 74 72 75 65 2c 20 74 68 65 6e 20 67 65 6e 65 72  true, then gener
8fb0: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 75 62  ate code for sub
8fc0: 71 75 65 72 69 65 73 20 74 6f 6f 20 2a 2f 0a 29  queries too */.)
8fd0: 7b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20  {.  NameContext 
8fe0: 73 4e 43 3b 0a 0a 20 20 69 66 28 20 70 45 78 70  sNC;..  if( pExp
8ff0: 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  r==0 ) return 0;
9000: 0a 20 20 6d 65 6d 73 65 74 28 26 73 4e 43 2c 20  .  memset(&sNC, 
9010: 30 2c 20 73 69 7a 65 6f 66 28 73 4e 43 29 29 3b  0, sizeof(sNC));
9020: 0a 20 20 73 4e 43 2e 70 53 72 63 4c 69 73 74 20  .  sNC.pSrcList 
9030: 3d 20 70 53 72 63 4c 69 73 74 3b 0a 20 20 73 4e  = pSrcList;.  sN
9040: 43 2e 70 50 61 72 73 65 20 3d 20 70 50 61 72 73  C.pParse = pPars
9050: 65 3b 0a 20 20 73 4e 43 2e 70 45 4c 69 73 74 20  e;.  sNC.pEList 
9060: 3d 20 70 45 4c 69 73 74 3b 0a 20 20 73 4e 43 2e  = pEList;.  sNC.
9070: 61 6c 6c 6f 77 41 67 67 20 3d 20 61 6c 6c 6f 77  allowAgg = allow
9080: 41 67 67 3b 0a 20 20 73 4e 43 2e 70 4e 65 78 74  Agg;.  sNC.pNext
9090: 20 3d 20 70 4e 43 3b 0a 20 20 77 61 6c 6b 45 78   = pNC;.  walkEx
90a0: 70 72 54 72 65 65 28 70 45 78 70 72 2c 20 6e 61  prTree(pExpr, na
90b0: 6d 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20  meResolverStep, 
90c0: 26 73 4e 43 29 3b 0a 20 20 69 66 28 20 73 4e 43  &sNC);.  if( sNC
90d0: 2e 68 61 73 41 67 67 20 29 7b 0a 20 20 20 20 45  .hasAgg ){.    E
90e0: 78 70 72 53 65 74 50 72 6f 70 65 72 74 79 28 70  xprSetProperty(p
90f0: 45 78 70 72 2c 20 45 50 5f 41 67 67 29 3b 0a 20  Expr, EP_Agg);. 
9100: 20 7d 0a 20 20 69 66 28 20 73 4e 43 2e 6e 45 72   }.  if( sNC.nEr
9110: 72 3e 30 20 29 7b 0a 20 20 20 20 45 78 70 72 53  r>0 ){.    ExprS
9120: 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  etProperty(pExpr
9130: 2c 20 45 50 5f 45 72 72 6f 72 29 3b 0a 20 20 7d  , EP_Error);.  }
9140: 65 6c 73 65 20 69 66 28 20 63 6f 64 65 53 75 62  else if( codeSub
9150: 71 75 65 72 79 20 20 26 26 20 73 71 6c 69 74 65  query  && sqlite
9160: 33 45 78 70 72 43 6f 64 65 53 75 62 71 75 65 72  3ExprCodeSubquer
9170: 79 28 70 50 61 72 73 65 2c 20 26 73 4e 43 2c 20  y(pParse, &sNC, 
9180: 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 72 65  pExpr) ){.    re
9190: 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65  turn 1;.  }.  re
91a0: 74 75 72 6e 20 45 78 70 72 48 61 73 50 72 6f 70  turn ExprHasProp
91b0: 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45  erty(pExpr, EP_E
91c0: 72 72 6f 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  rror);.}../*.** 
91d0: 41 20 70 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e  A pointer instan
91e0: 63 65 20 6f 66 20 74 68 69 73 20 73 74 72 75 63  ce of this struc
91f0: 74 75 72 65 20 69 73 20 75 73 65 64 20 74 6f 20  ture is used to 
9200: 70 61 73 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  pass information
9210: 0a 2a 2a 20 74 68 72 6f 75 67 68 20 77 61 6c 6b  .** through walk
9220: 45 78 70 72 54 72 65 65 20 69 6e 74 6f 20 63 6f  ExprTree into co
9230: 64 65 53 75 62 71 75 65 72 79 53 74 65 70 28 29  deSubqueryStep()
9240: 2e 0a 2a 2f 0a 74 79 70 65 64 65 66 20 73 74 72  ..*/.typedef str
9250: 75 63 74 20 51 75 65 72 79 43 6f 64 65 72 20 51  uct QueryCoder Q
9260: 75 65 72 79 43 6f 64 65 72 3b 0a 73 74 72 75 63  ueryCoder;.struc
9270: 74 20 51 75 65 72 79 43 6f 64 65 72 20 7b 0a 20  t QueryCoder {. 
9280: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 3b 20   Parse *pParse; 
9290: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 70 61 72        /* The par
92a0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
92b0: 20 20 4e 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70    NameContext *p
92c0: 4e 43 3b 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70  NC;    /* Namesp
92d0: 61 63 65 20 6f 66 20 66 69 72 73 74 20 65 6e 63  ace of first enc
92e0: 6c 6f 73 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a  losing query */.
92f0: 7d 3b 0a 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  };.../*.** Gener
9300: 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 75 62  ate code for sub
9310: 71 75 65 72 69 65 73 20 61 6e 64 20 49 4e 20 6f  queries and IN o
9320: 70 65 72 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20  perators..**.** 
9330: 49 4e 20 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d  IN operators com
9340: 65 73 20 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a  es in two forms:
9350: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 20 20 20 20  .**.**          
9360: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
9370: 73 74 29 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20  st).** and.**   
9380: 20 20 20 20 20 20 20 20 65 78 70 72 20 49 4e 20          expr IN 
9390: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
93a0: 2a 2a 20 54 68 65 20 66 69 72 73 74 20 66 6f 72  ** The first for
93b0: 6d 20 69 73 20 68 61 6e 64 6c 65 64 20 62 79 20  m is handled by 
93c0: 63 72 65 61 74 69 6e 67 20 61 20 73 65 74 20 68  creating a set h
93d0: 6f 6c 64 69 6e 67 20 74 68 65 20 6c 69 73 74 0a  olding the list.
93e0: 2a 2a 20 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61  ** of allowed va
93f0: 6c 75 65 73 2e 20 20 54 68 65 20 73 65 63 6f 6e  lues.  The secon
9400: 64 20 66 6f 72 6d 20 63 61 75 73 65 73 20 74 68  d form causes th
9410: 65 20 53 45 4c 45 43 54 20 74 6f 20 67 65 6e 65  e SELECT to gene
9420: 72 61 74 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f  rate .** a tempo
9430: 72 61 72 79 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a  rary table..**.*
9440: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61  * This routine a
9450: 6c 73 6f 20 6c 6f 6f 6b 73 20 66 6f 72 20 73 63  lso looks for sc
9460: 61 6c 61 72 20 53 45 4c 45 43 54 73 20 74 68 61  alar SELECTs tha
9470: 74 20 61 72 65 20 70 61 72 74 20 6f 66 20 61 6e  t are part of an
9480: 20 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 20   expression..** 
9490: 49 66 20 69 74 20 66 69 6e 64 73 20 61 6e 79 2c  If it finds any,
94a0: 20 69 74 20 67 65 6e 65 72 61 74 65 73 20 63 6f   it generates co
94b0: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
94c0: 76 61 6c 75 65 20 6f 66 20 74 68 61 74 20 73 65  value of that se
94d0: 6c 65 63 74 0a 2a 2a 20 69 6e 74 6f 20 61 20 6d  lect.** into a m
94e0: 65 6d 6f 72 79 20 63 65 6c 6c 2e 0a 2a 2a 0a 2a  emory cell..**.*
94f0: 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69  * This routine i
9500: 73 20 61 20 63 61 6c 6c 62 61 63 6b 20 66 6f 72  s a callback for
9510: 20 77 61 6c 6c 45 78 70 72 54 72 65 65 28 29 20   wallExprTree() 
9520: 75 73 65 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e  used to implemen
9530: 74 0a 2a 2a 20 73 71 6c 69 74 65 33 45 78 70 72  t.** sqlite3Expr
9540: 43 6f 64 65 53 75 62 71 75 65 72 79 28 29 2e 20  CodeSubquery(). 
9550: 20 53 65 65 20 63 6f 6d 6d 65 6e 74 73 20 6f 6e   See comments on
9560: 20 74 68 6f 73 65 20 72 6f 75 74 69 6e 65 73 20   those routines 
9570: 66 6f 72 0a 2a 2a 20 61 64 64 69 74 69 6f 6e 61  for.** additiona
9580: 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a  l information..*
9590: 2f 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  /.#ifndef SQLITE
95a0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 73  _OMIT_SUBQUERY.s
95b0: 74 61 74 69 63 20 69 6e 74 20 63 6f 64 65 53 75  tatic int codeSu
95c0: 62 71 75 65 72 79 53 74 65 70 28 76 6f 69 64 20  bqueryStep(void 
95d0: 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78  *pArg, Expr *pEx
95e0: 70 72 29 7b 0a 20 20 51 75 65 72 79 43 6f 64 65  pr){.  QueryCode
95f0: 72 20 2a 70 43 6f 64 65 72 20 3d 20 28 51 75 65  r *pCoder = (Que
9600: 72 79 43 6f 64 65 72 2a 29 70 41 72 67 3b 0a 20  ryCoder*)pArg;. 
9610: 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 20 3d   Parse *pParse =
9620: 20 70 43 6f 64 65 72 2d 3e 70 50 61 72 73 65 3b   pCoder->pParse;
9630: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
9640: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
9650: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
9660: 20 63 68 61 72 20 61 66 66 69 6e 69 74 79 3b 0a   char affinity;.
9670: 20 20 20 20 20 20 56 64 62 65 20 2a 76 20 3d 20        Vdbe *v = 
9680: 73 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70  sqlite3GetVdbe(p
9690: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 4b 65  Parse);.      Ke
96a0: 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b 0a 20  yInfo keyInfo;. 
96b0: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 20 20       int addr;  
96c0: 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65 73 73        /* Address
96d0: 20 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 20   of OP_OpenTemp 
96e0: 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a  instruction */..
96f0: 20 20 20 20 20 20 69 66 28 20 76 3d 3d 30 20 29        if( v==0 )
9700: 20 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 20   return 2;.     
9710: 20 61 66 66 69 6e 69 74 79 20 3d 20 73 71 6c 69   affinity = sqli
9720: 74 65 33 45 78 70 72 41 66 66 69 6e 69 74 79 28  te3ExprAffinity(
9730: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 0a  pExpr->pLeft);..
9740: 20 20 20 20 20 20 2f 2a 20 57 68 65 74 68 65 72        /* Whether
9750: 20 74 68 69 73 20 69 73 20 61 6e 20 27 78 20 49   this is an 'x I
9760: 4e 28 53 45 4c 45 43 54 2e 2e 2e 29 27 20 6f 72  N(SELECT...)' or
9770: 20 61 6e 20 27 78 20 49 4e 28 3c 65 78 70 72 6c   an 'x IN(<exprl
9780: 69 73 74 3e 29 27 0a 20 20 20 20 20 20 2a 2a 20  ist>)'.      ** 
9790: 65 78 70 72 65 73 73 69 6f 6e 20 69 74 20 69 73  expression it is
97a0: 20 68 61 6e 64 6c 65 64 20 74 68 65 20 73 61 6d   handled the sam
97b0: 65 20 77 61 79 2e 20 41 20 74 65 6d 70 6f 72 61  e way. A tempora
97c0: 72 79 20 74 61 62 6c 65 20 69 73 20 0a 20 20 20  ry table is .   
97d0: 20 20 20 2a 2a 20 66 69 6c 6c 65 64 20 77 69 74     ** filled wit
97e0: 68 20 73 69 6e 67 6c 65 2d 66 69 65 6c 64 20 69  h single-field i
97f0: 6e 64 65 78 20 6b 65 79 73 20 72 65 70 72 65 73  ndex keys repres
9800: 65 6e 74 69 6e 67 20 74 68 65 20 72 65 73 75 6c  enting the resul
9810: 74 73 0a 20 20 20 20 20 20 2a 2a 20 66 72 6f 6d  ts.      ** from
9820: 20 74 68 65 20 53 45 4c 45 43 54 20 6f 72 20 74   the SELECT or t
9830: 68 65 20 3c 65 78 70 72 6c 69 73 74 3e 2e 0a 20  he <exprlist>.. 
9840: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
9850: 20 49 66 20 74 68 65 20 27 78 27 20 65 78 70 72   If the 'x' expr
9860: 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6c 75  ession is a colu
9870: 6d 6e 20 76 61 6c 75 65 2c 20 6f 72 20 74 68 65  mn value, or the
9880: 20 53 45 4c 45 43 54 2e 2e 2e 0a 20 20 20 20 20   SELECT....     
9890: 20 2a 2a 20 73 74 61 74 65 6d 65 6e 74 20 72 65   ** statement re
98a0: 74 75 72 6e 73 20 61 20 63 6f 6c 75 6d 6e 20 76  turns a column v
98b0: 61 6c 75 65 2c 20 74 68 65 6e 20 74 68 65 20 61  alue, then the a
98c0: 66 66 69 6e 69 74 79 20 6f 66 20 74 68 61 74 0a  ffinity of that.
98d0: 20 20 20 20 20 20 2a 2a 20 63 6f 6c 75 6d 6e 20        ** column 
98e0: 69 73 20 75 73 65 64 20 74 6f 20 62 75 69 6c 64  is used to build
98f0: 20 74 68 65 20 69 6e 64 65 78 20 6b 65 79 73 2e   the index keys.
9900: 20 49 66 20 62 6f 74 68 20 27 78 27 20 61 6e 64   If both 'x' and
9910: 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 53 45   the.      ** SE
9920: 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65 6e  LECT... statemen
9930: 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20 74  t are columns, t
9940: 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66 69  hen numeric affi
9950: 6e 69 74 79 20 69 73 20 75 73 65 64 0a 20 20 20  nity is used.   
9960: 20 20 20 2a 2a 20 69 66 20 65 69 74 68 65 72 20     ** if either 
9970: 63 6f 6c 75 6d 6e 20 68 61 73 20 4e 55 4d 45 52  column has NUMER
9980: 49 43 20 6f 72 20 49 4e 54 45 47 45 52 20 61 66  IC or INTEGER af
9990: 66 69 6e 69 74 79 2e 20 49 66 20 6e 65 69 74 68  finity. If neith
99a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 27 78 27 20  er.      ** 'x' 
99b0: 6e 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e  nor the SELECT..
99c0: 2e 20 73 74 61 74 65 6d 65 6e 74 20 61 72 65 20  . statement are 
99d0: 63 6f 6c 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75  columns, then nu
99e0: 6d 65 72 69 63 20 61 66 66 69 6e 69 74 79 0a 20  meric affinity. 
99f0: 20 20 20 20 20 2a 2a 20 69 73 20 75 73 65 64 2e       ** is used.
9a00: 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20  .      */.      
9a10: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20  pExpr->iTable = 
9a20: 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 0a  pParse->nTab++;.
9a30: 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
9a40: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9a50: 20 4f 50 5f 4f 70 65 6e 54 65 6d 70 2c 20 70 45   OP_OpenTemp, pE
9a60: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
9a70: 0a 20 20 20 20 20 20 6d 65 6d 73 65 74 28 26 6b  .      memset(&k
9a80: 65 79 49 6e 66 6f 2c 20 30 2c 20 73 69 7a 65 6f  eyInfo, 0, sizeo
9a90: 66 28 6b 65 79 49 6e 66 6f 29 29 3b 0a 20 20 20  f(keyInfo));.   
9aa0: 20 20 20 6b 65 79 49 6e 66 6f 2e 6e 46 69 65 6c     keyInfo.nFiel
9ab0: 64 20 3d 20 31 3b 0a 20 20 20 20 20 20 73 71 6c  d = 1;.      sql
9ac0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
9ad0: 20 4f 50 5f 53 65 74 4e 75 6d 43 6f 6c 75 6d 6e   OP_SetNumColumn
9ae0: 73 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  s, pExpr->iTable
9af0: 2c 20 31 29 3b 0a 0a 20 20 20 20 20 20 69 66 28  , 1);..      if(
9b00: 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20   pExpr->pSelect 
9b10: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61  ){.        /* Ca
9b20: 73 65 20 31 3a 20 20 20 20 20 65 78 70 72 20 49  se 1:     expr I
9b30: 4e 20 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 20  N (SELECT ...). 
9b40: 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20         **.      
9b50: 20 20 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f    ** Generate co
9b60: 64 65 20 74 6f 20 77 72 69 74 65 20 74 68 65 20  de to write the 
9b70: 72 65 73 75 6c 74 73 20 6f 66 20 74 68 65 20 73  results of the s
9b80: 65 6c 65 63 74 20 69 6e 74 6f 20 74 68 65 20 74  elect into the t
9b90: 65 6d 70 6f 72 61 72 79 0a 20 20 20 20 20 20 20  emporary.       
9ba0: 20 2a 2a 20 74 61 62 6c 65 20 61 6c 6c 6f 63 61   ** table alloca
9bb0: 74 65 64 20 61 6e 64 20 6f 70 65 6e 65 64 20 61  ted and opened a
9bc0: 62 6f 76 65 2e 0a 20 20 20 20 20 20 20 20 2a 2f  bove..        */
9bd0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 50 61  .        int iPa
9be0: 72 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61 62  rm = pExpr->iTab
9bf0: 6c 65 20 2b 20 20 28 28 28 69 6e 74 29 61 66 66  le +  (((int)aff
9c00: 69 6e 69 74 79 29 3c 3c 31 36 29 3b 0a 20 20 20  inity)<<16);.   
9c10: 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70       ExprList *p
9c20: 45 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20 61  EList;.        a
9c30: 73 73 65 72 74 28 20 28 70 45 78 70 72 2d 3e 69  ssert( (pExpr->i
9c40: 54 61 62 6c 65 26 30 78 30 30 30 30 46 46 46 46  Table&0x0000FFFF
9c50: 29 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  )==pExpr->iTable
9c60: 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   );.        sqli
9c70: 74 65 33 53 65 6c 65 63 74 28 70 50 61 72 73 65  te3Select(pParse
9c80: 2c 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  , pExpr->pSelect
9c90: 2c 20 53 52 54 5f 53 65 74 2c 20 69 50 61 72 6d  , SRT_Set, iParm
9ca0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29  , 0, 0, 0, 0, 0)
9cb0: 3b 0a 20 20 20 20 20 20 20 20 70 45 4c 69 73 74  ;.        pEList
9cc0: 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63   = pExpr->pSelec
9cd0: 74 2d 3e 70 45 4c 69 73 74 3b 0a 20 20 20 20 20  t->pEList;.     
9ce0: 20 20 20 69 66 28 20 70 45 4c 69 73 74 20 26 26     if( pEList &&
9cf0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30   pEList->nExpr>0
9d00: 20 29 7b 20 0a 20 20 20 20 20 20 20 20 20 20 6b   ){ .          k
9d10: 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c 5b 30 5d 20  eyInfo.aColl[0] 
9d20: 3d 20 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 43  = binaryCompareC
9d30: 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70  ollSeq(pParse, p
9d40: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 0a 20 20 20  Expr->pLeft,.   
9d50: 20 20 20 20 20 20 20 20 20 20 20 70 45 4c 69 73             pELis
9d60: 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29 3b 0a  t->a[0].pExpr);.
9d70: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
9d80: 7d 65 6c 73 65 20 69 66 28 20 70 45 78 70 72 2d  }else if( pExpr-
9d90: 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20 20  >pList ){.      
9da0: 20 20 2f 2a 20 43 61 73 65 20 32 3a 20 20 20 20    /* Case 2:    
9db0: 20 65 78 70 72 20 49 4e 20 28 65 78 70 72 6c 69   expr IN (exprli
9dc0: 73 74 29 0a 20 20 20 20 20 20 20 20 2a 2a 0a 09  st).        **..
9dd0: 2a 2a 20 46 6f 72 20 65 61 63 68 20 65 78 70 72  ** For each expr
9de0: 65 73 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e  ession, build an
9df0: 20 69 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20   index key from 
9e00: 74 68 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61  the evaluation a
9e10: 6e 64 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74  nd.        ** st
9e20: 6f 72 65 20 69 74 20 69 6e 20 74 68 65 20 74 65  ore it in the te
9e30: 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49  mporary table. I
9e40: 66 20 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f  f <expr> is a co
9e50: 6c 75 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20  lumn, then use. 
9e60: 20 20 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63         ** that c
9e70: 6f 6c 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20  olumns affinity 
9e80: 77 68 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e  when building in
9e90: 64 65 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78  dex keys. If <ex
9ea0: 70 72 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20  pr> is not.     
9eb0: 20 20 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20     ** a column, 
9ec0: 75 73 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69  use numeric affi
9ed0: 6e 69 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f  nity..        */
9ee0: 0a 20 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a  .        int i;.
9ef0: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 66 66          if( !aff
9f00: 69 6e 69 74 79 20 29 7b 0a 20 20 20 20 20 20 20  inity ){.       
9f10: 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20 53 51     affinity = SQ
9f20: 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43  LITE_AFF_NUMERIC
9f30: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
9f40: 20 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c      keyInfo.aCol
9f50: 6c 5b 30 5d 20 3d 20 70 45 78 70 72 2d 3e 70 4c  l[0] = pExpr->pL
9f60: 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a 0a 20 20 20  eft->pColl;..   
9f70: 20 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 74 68 72       /* Loop thr
9f80: 6f 75 67 68 20 65 61 63 68 20 65 78 70 72 65 73  ough each expres
9f90: 73 69 6f 6e 20 69 6e 20 3c 65 78 70 72 6c 69 73  sion in <exprlis
9fa0: 74 3e 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 66  t>. */.        f
9fb0: 6f 72 28 69 3d 30 3b 20 69 3c 70 45 78 70 72 2d  or(i=0; i<pExpr-
9fc0: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
9fd0: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20 20 45  ++){.          E
9fe0: 78 70 72 20 2a 70 45 32 20 3d 20 70 45 78 70 72  xpr *pE2 = pExpr
9ff0: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45  ->pList->a[i].pE
a000: 78 70 72 3b 0a 0a 20 20 20 20 20 20 20 20 20 20  xpr;..          
a010: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
a020: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20  e expression is 
a030: 63 6f 6e 73 74 61 6e 74 20 61 6e 64 20 76 61 6c  constant and val
a040: 69 64 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  id. */.         
a050: 20 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70   if( !sqlite3Exp
a060: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32 29  rIsConstant(pE2)
a070: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
a080: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
a090: 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20 20 20  pParse,.        
a0a0: 20 20 20 20 20 20 22 72 69 67 68 74 2d 68 61 6e        "right-han
a0b0: 64 20 73 69 64 65 20 6f 66 20 49 4e 20 6f 70 65  d side of IN ope
a0c0: 72 61 74 6f 72 20 6d 75 73 74 20 62 65 20 63 6f  rator must be co
a0d0: 6e 73 74 61 6e 74 22 29 3b 0a 20 20 20 20 20 20  nstant");.      
a0e0: 20 20 20 20 20 20 72 65 74 75 72 6e 20 32 3b 0a        return 2;.
a0f0: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
a100: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
a110: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
a120: 73 28 70 50 61 72 73 65 2c 20 30 2c 20 30 2c 20  s(pParse, 0, 0, 
a130: 30 2c 20 70 45 32 2c 20 30 2c 20 30 29 20 29 7b  0, pE2, 0, 0) ){
a140: 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 65 74  .            ret
a150: 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 20 20 20  urn 2;.         
a160: 20 7d 0a 0a 20 20 20 20 20 20 20 20 20 20 2f 2a   }..          /*
a170: 20 45 76 61 6c 75 61 74 65 20 74 68 65 20 65 78   Evaluate the ex
a180: 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 69 6e 73  pression and ins
a190: 65 72 74 20 69 74 20 69 6e 74 6f 20 74 68 65 20  ert it into the 
a1a0: 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f 0a 20 20  temp table */.  
a1b0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
a1c0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
a1d0: 70 45 32 29 3b 0a 20 20 20 20 20 20 20 20 20 20  pE2);.          
a1e0: 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76  sqlite3VdbeOp3(v
a1f0: 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2c  , OP_MakeRecord,
a200: 20 31 2c 20 30 2c 20 26 61 66 66 69 6e 69 74 79   1, 0, &affinity
a210: 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20  , 1);.          
a220: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
a230: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
a240: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20  0, 0);.         
a250: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
a260: 70 28 76 2c 20 4f 50 5f 50 75 74 53 74 72 4b 65  p(v, OP_PutStrKe
a270: 79 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  y, pExpr->iTable
a280: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  , 0);.        }.
a290: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
a2a0: 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50  lite3VdbeChangeP
a2b0: 33 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69 64  3(v, addr, (void
a2c0: 20 2a 29 26 6b 65 79 49 6e 66 6f 2c 20 50 33 5f   *)&keyInfo, P3_
a2d0: 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20 20  KEYINFO);.      
a2e0: 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a  return 1;.    }.
a2f0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
a300: 53 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  STS:.    case TK
a310: 5f 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20  _SELECT: {.     
a320: 20 2f 2a 20 54 68 69 73 20 68 61 73 20 74 6f 20   /* This has to 
a330: 62 65 20 61 20 73 63 61 6c 61 72 20 53 45 4c 45  be a scalar SELE
a340: 43 54 2e 20 20 47 65 6e 65 72 61 74 65 20 63 6f  CT.  Generate co
a350: 64 65 20 74 6f 20 70 75 74 20 74 68 65 0a 20 20  de to put the.  
a360: 20 20 20 20 2a 2a 20 76 61 6c 75 65 20 6f 66 20      ** value of 
a370: 74 68 69 73 20 73 65 6c 65 63 74 20 69 6e 20 61  this select in a
a380: 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 61 6e 64   memory cell and
a390: 20 72 65 63 6f 72 64 20 74 68 65 20 6e 75 6d 62   record the numb
a3a0: 65 72 0a 20 20 20 20 20 20 2a 2a 20 6f 66 20 74  er.      ** of t
a3b0: 68 65 20 6d 65 6d 6f 72 79 20 63 65 6c 6c 20 69  he memory cell i
a3c0: 6e 20 69 43 6f 6c 75 6d 6e 2e 0a 20 20 20 20 20  n iColumn..     
a3d0: 20 2a 2f 0a 20 20 20 20 20 20 4e 61 6d 65 43 6f   */.      NameCo
a3e0: 6e 74 65 78 74 20 2a 70 4e 43 3b 0a 20 20 20 20  ntext *pNC;.    
a3f0: 20 20 69 6e 74 20 6e 52 65 66 3b 0a 20 20 20 20    int nRef;.    
a400: 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 20 20 20    Vdbe *v;.     
a410: 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20   int addr;.     
a420: 20 69 6e 74 20 73 6f 70 3b 0a 20 20 20 20 20 20   int sop;.      
a430: 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 0a 20  Select *pSel;.. 
a440: 20 20 20 20 20 70 4e 43 20 3d 20 70 43 6f 64 65       pNC = pCode
a450: 72 2d 3e 70 4e 43 3b 0a 20 20 20 20 20 20 69 66  r->pNC;.      if
a460: 28 20 70 4e 43 20 29 20 6e 52 65 66 20 3d 20 70  ( pNC ) nRef = p
a470: 4e 43 2d 3e 6e 52 65 66 3b 0a 20 20 20 20 20 20  NC->nRef;.      
a480: 73 71 6c 69 74 65 33 43 6f 64 65 56 65 72 69 66  sqlite3CodeVerif
a490: 79 53 63 68 65 6d 61 28 70 50 61 72 73 65 2c 20  ySchema(pParse, 
a4a0: 2d 31 29 3b 20 2f 2a 20 49 6e 73 65 72 74 20 74  -1); /* Insert t
a4b0: 68 65 20 63 6f 6f 6b 69 65 20 76 65 72 69 66 69  he cookie verifi
a4c0: 65 72 20 47 6f 74 6f 20 2a 2f 0a 20 20 20 20 20  er Goto */.     
a4d0: 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74 56   v = sqlite3GetV
a4e0: 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20 20  dbe(pParse);.   
a4f0: 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65     addr = sqlite
a500: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
a510: 5f 47 6f 74 6f 2c 20 30 2c 20 30 29 3b 0a 20 20  _Goto, 0, 0);.  
a520: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
a530: 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65  mn = pParse->nMe
a540: 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65 6c 20  m++;.      pSel 
a550: 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63 74  = pExpr->pSelect
a560: 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70  ;.      if( pExp
a570: 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54  r->op==TK_SELECT
a580: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f 70 20   ){.        sop 
a590: 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20 20 20  = SRT_Mem;.     
a5a0: 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
a5b0: 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54 6f 6b  static const Tok
a5c0: 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22 2c 20  en one = { "1", 
a5d0: 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20 20 20  0, 1 };.        
a5e0: 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73 74 73  sop = SRT_Exists
a5f0: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
a600: 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65 28  3ExprListDelete(
a610: 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b 0a 20  pSel->pEList);. 
a620: 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70 45 4c         pSel->pEL
a630: 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ist = sqlite3Exp
a640: 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c 20 0a  rListAppend(0, .
a650: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
a660: 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65            sqlite
a670: 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47 45 52  3Expr(TK_INTEGER
a680: 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 2c 20 30  , 0, 0, &one), 0
a690: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
a6a0: 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70   sqlite3Select(p
a6b0: 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73 6f 70  Parse, pSel, sop
a6c0: 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
a6d0: 2c 20 30 2c 20 30 2c 20 30 2c 20 30 2c 20 70 4e  , 0, 0, 0, 0, pN
a6e0: 43 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4e  C);.      if( pN
a6f0: 43 20 26 26 20 70 4e 43 2d 3e 6e 52 65 66 3e 6e  C && pNC->nRef>n
a700: 52 65 66 20 29 7b 0a 20 20 20 20 20 20 20 20 2f  Ref ){.        /
a710: 2a 20 53 75 62 71 75 65 72 79 20 76 61 6c 75 65  * Subquery value
a720: 20 63 68 61 6e 67 65 73 2e 20 20 45 76 61 6c 75   changes.  Evalu
a730: 61 74 65 20 61 74 20 65 61 63 68 20 75 73 65 20  ate at each use 
a740: 2a 2f 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  */.        pExpr
a750: 2d 3e 69 54 61 62 6c 65 20 3d 20 61 64 64 72 2b  ->iTable = addr+
a760: 31 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  1;.        sqlit
a770: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a780: 50 5f 52 65 74 75 72 6e 2c 20 30 2c 20 30 29 3b  P_Return, 0, 0);
a790: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
a7a0: 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c 20  VdbeChangeP2(v, 
a7b0: 61 64 64 72 2c 20 73 71 6c 69 74 65 33 56 64 62  addr, sqlite3Vdb
a7c0: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 29  eCurrentAddr(v))
a7d0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
a7e0: 20 20 20 20 20 20 20 2f 2a 20 53 75 62 71 75 65         /* Subque
a7f0: 72 79 20 76 61 6c 75 65 20 69 73 20 63 6f 6e 73  ry value is cons
a800: 74 61 6e 74 2e 20 20 65 76 61 6c 75 61 74 65 20  tant.  evaluate 
a810: 6f 6e 6c 79 20 6f 6e 63 65 2e 20 2a 2f 0a 20 20  only once. */.  
a820: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61        pExpr->iTa
a830: 62 6c 65 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  ble = -1;.      
a840: 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61    sqlite3VdbeCha
a850: 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20 61  ngeP2(v, addr, a
a860: 64 64 72 2b 31 29 3b 0a 20 20 20 20 20 20 7d 0a  ddr+1);.      }.
a870: 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
a880: 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75      }.  }.  retu
a890: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f  rn 0;.}.#endif /
a8a0: 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
a8b0: 42 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a  BQUERY */../*.**
a8c0: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74   Generate code t
a8d0: 6f 20 65 76 61 6c 75 61 74 65 20 73 75 62 71 75  o evaluate subqu
a8e0: 65 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65  eries and IN ope
a8f0: 72 61 74 6f 72 73 20 63 6f 6e 74 61 69 6e 65 64  rators contained
a900: 0a 2a 2a 20 69 6e 20 65 78 70 72 65 73 73 69 6f  .** in expressio
a910: 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74  n pExpr..*/.stat
a920: 69 63 20 69 6e 74 20 73 71 6c 69 74 65 33 45 78  ic int sqlite3Ex
a930: 70 72 43 6f 64 65 53 75 62 71 75 65 72 79 28 0a  prCodeSubquery(.
a940: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
a950: 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 65 72         /* Parser
a960: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
a970: 74 20 2a 70 4e 43 2c 20 20 20 20 2f 2a 20 46 69  t *pNC,    /* Fi
a980: 72 73 74 20 65 6e 63 6c 6f 73 69 6e 67 20 6e 61  rst enclosing na
a990: 6d 65 73 70 61 63 65 2e 20 20 4f 66 74 65 6e 20  mespace.  Often 
a9a0: 4e 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a  NULL */.  Expr *
a9b0: 70 45 78 70 72 20 20 20 20 20 20 20 20 20 20 2f  pExpr          /
a9c0: 2a 20 53 75 62 71 75 65 72 79 20 74 6f 20 62 65  * Subquery to be
a9d0: 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 23 69 66   coded */.){.#if
a9e0: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
a9f0: 5f 53 55 42 51 55 45 52 59 0a 20 20 51 75 65 72  _SUBQUERY.  Quer
aa00: 79 43 6f 64 65 72 20 73 43 6f 64 65 72 3b 0a 20  yCoder sCoder;. 
aa10: 20 73 43 6f 64 65 72 2e 70 50 61 72 73 65 20 3d   sCoder.pParse =
aa20: 20 70 50 61 72 73 65 3b 0a 20 20 73 43 6f 64 65   pParse;.  sCode
aa30: 72 2e 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 77  r.pNC = pNC;.  w
aa40: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
aa50: 72 2c 20 63 6f 64 65 53 75 62 71 75 65 72 79 53  r, codeSubqueryS
aa60: 74 65 70 2c 20 26 73 43 6f 64 65 72 29 3b 0a 23  tep, &sCoder);.#
aa70: 65 6e 64 69 66 0a 20 20 72 65 74 75 72 6e 20 30  endif.  return 0
aa80: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  ;.}../*.** Gener
aa90: 61 74 65 20 61 6e 20 69 6e 73 74 72 75 63 74 69  ate an instructi
aaa0: 6f 6e 20 74 68 61 74 20 77 69 6c 6c 20 70 75 74  on that will put
aab0: 20 74 68 65 20 69 6e 74 65 67 65 72 20 64 65 73   the integer des
aac0: 63 72 69 62 65 20 62 79 0a 2a 2a 20 74 65 78 74  cribe by.** text
aad0: 20 7a 5b 30 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68   z[0..n-1] on th
aae0: 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74  e stack..*/.stat
aaf0: 69 63 20 76 6f 69 64 20 63 6f 64 65 49 6e 74 65  ic void codeInte
ab00: 67 65 72 28 56 64 62 65 20 2a 76 2c 20 63 6f 6e  ger(Vdbe *v, con
ab10: 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74 20  st char *z, int 
ab20: 6e 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69  n){.  int i;.  i
ab30: 66 28 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  f( sqlite3GetInt
ab40: 33 32 28 7a 2c 20 26 69 29 20 29 7b 0a 20 20 20  32(z, &i) ){.   
ab50: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
ab60: 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c  p(v, OP_Integer,
ab70: 20 69 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 20   i, 0);.  }else 
ab80: 69 66 28 20 73 71 6c 69 74 65 33 46 69 74 73 49  if( sqlite3FitsI
ab90: 6e 36 34 42 69 74 73 28 7a 29 20 29 7b 0a 20 20  n64Bits(z) ){.  
aba0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
abb0: 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20  (v, OP_Integer, 
abc0: 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d  0, 0, z, n);.  }
abd0: 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65  else{.    sqlite
abe0: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 52  3VdbeOp3(v, OP_R
abf0: 65 61 6c 2c 20 30 2c 20 30 2c 20 7a 2c 20 6e 29  eal, 0, 0, z, n)
ac00: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47  ;.  }.}../*.** G
ac10: 65 6e 65 72 61 74 65 20 63 6f 64 65 20 69 6e 74  enerate code int
ac20: 6f 20 74 68 65 20 63 75 72 72 65 6e 74 20 56 64  o the current Vd
ac30: 62 65 20 74 6f 20 65 76 61 6c 75 61 74 65 20 74  be to evaluate t
ac40: 68 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72  he given.** expr
ac50: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
ac60: 20 74 68 65 20 72 65 73 75 6c 74 20 6f 6e 20 74   the result on t
ac70: 68 65 20 74 6f 70 20 6f 66 20 73 74 61 63 6b 2e  he top of stack.
ac80: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 63 6f 64 65  .**.** This code
ac90: 20 64 65 70 65 6e 64 73 20 6f 6e 20 74 68 65 20   depends on the 
aca0: 66 61 63 74 20 74 68 61 74 20 63 65 72 74 61 69  fact that certai
acb0: 6e 20 74 6f 6b 65 6e 20 76 61 6c 75 65 73 20 28  n token values (
acc0: 65 78 3a 20 54 4b 5f 45 51 29 0a 2a 2a 20 61 72  ex: TK_EQ).** ar
acd0: 65 20 74 68 65 20 73 61 6d 65 20 61 73 20 6f 70  e the same as op
ace0: 63 6f 64 65 20 76 61 6c 75 65 73 20 28 65 78 3a  code values (ex:
acf0: 20 4f 50 5f 45 71 29 20 74 68 61 74 20 69 6d 70   OP_Eq) that imp
ad00: 6c 65 6d 65 6e 74 20 74 68 65 20 63 6f 72 72 65  lement the corre
ad10: 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20 6f 70 65 72  sponding.** oper
ad20: 61 74 69 6f 6e 2e 20 20 53 70 65 63 69 61 6c 20  ation.  Special 
ad30: 63 6f 6d 6d 65 6e 74 73 20 69 6e 20 76 64 62 65  comments in vdbe
ad40: 2e 63 20 61 6e 64 20 74 68 65 20 6d 6b 6f 70 63  .c and the mkopc
ad50: 6f 64 65 68 2e 61 77 6b 20 73 63 72 69 70 74 20  odeh.awk script 
ad60: 69 6e 0a 2a 2a 20 74 68 65 20 6d 61 6b 65 20 70  in.** the make p
ad70: 72 6f 63 65 73 73 20 63 61 75 73 65 20 74 68 65  rocess cause the
ad80: 73 65 20 76 61 6c 75 65 73 20 74 6f 20 61 6c 69  se values to ali
ad90: 67 6e 2e 20 20 41 73 73 65 72 74 28 29 73 20 69  gn.  Assert()s i
ada0: 6e 20 74 68 65 20 63 6f 64 65 0a 2a 2a 20 62 65  n the code.** be
adb0: 6c 6f 77 20 76 65 72 69 66 79 20 74 68 61 74 20  low verify that 
adc0: 74 68 65 20 6e 75 6d 62 65 72 73 20 61 72 65 20  the numbers are 
add0: 61 6c 69 67 6e 65 64 20 63 6f 72 72 65 63 74 6c  aligned correctl
ade0: 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  y..*/.void sqlit
adf0: 65 33 45 78 70 72 43 6f 64 65 28 50 61 72 73 65  e3ExprCode(Parse
ae00: 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a   *pParse, Expr *
ae10: 70 45 78 70 72 29 7b 0a 20 20 56 64 62 65 20 2a  pExpr){.  Vdbe *
ae20: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
ae30: 65 3b 0a 20 20 69 6e 74 20 6f 70 3b 0a 20 20 69  e;.  int op;.  i
ae40: 66 28 20 76 3d 3d 30 20 29 20 72 65 74 75 72 6e  f( v==0 ) return
ae50: 3b 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30  ;.  if( pExpr==0
ae60: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56   ){.    sqlite3V
ae70: 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53  dbeAddOp(v, OP_S
ae80: 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 20 20  tring8, 0, 0);  
ae90: 2f 2a 20 45 6d 70 74 79 20 65 78 70 72 65 73 73  /* Empty express
aea0: 69 6f 6e 20 65 76 61 6c 73 20 74 6f 20 4e 55 4c  ion evals to NUL
aeb0: 4c 20 2a 2f 0a 20 20 20 20 72 65 74 75 72 6e 3b  L */.    return;
aec0: 0a 20 20 7d 0a 20 20 6f 70 20 3d 20 70 45 78 70  .  }.  op = pExp
aed0: 72 2d 3e 6f 70 3b 0a 20 20 73 77 69 74 63 68 28  r->op;.  switch(
aee0: 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20   op ){.    case 
aef0: 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20  TK_COLUMN: {.   
af00: 20 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 75     if( pParse->u
af10: 73 65 41 67 67 20 29 7b 0a 20 20 20 20 20 20 20  seAgg ){.       
af20: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
af30: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
af40: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
af50: 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
af60: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e   pExpr->iColumn>
af70: 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71  =0 ){.        sq
af80: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
af90: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78  , OP_Column, pEx
afa0: 70 72 2d 3e 69 54 61 62 6c 65 2c 20 70 45 78 70  pr->iTable, pExp
afb0: 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66  r->iColumn);.#if
afc0: 6e 64 65 66 20 4e 44 45 42 55 47 0a 20 20 20 20  ndef NDEBUG.    
afd0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 73      if( pExpr->s
afe0: 70 61 6e 2e 7a 20 26 26 20 70 45 78 70 72 2d 3e  pan.z && pExpr->
aff0: 73 70 61 6e 2e 6e 3e 30 20 26 26 20 70 45 78 70  span.n>0 && pExp
b000: 72 2d 3e 73 70 61 6e 2e 6e 3c 31 30 30 20 29 7b  r->span.n<100 ){
b010: 0a 20 20 20 20 20 20 20 20 20 20 56 64 62 65 43  .          VdbeC
b020: 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 23 20 25 54  omment((v, "# %T
b030: 22 2c 20 26 70 45 78 70 72 2d 3e 73 70 61 6e 29  ", &pExpr->span)
b040: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 23 65 6e  );.        }.#en
b050: 64 69 66 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b  dif.      }else{
b060: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
b070: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b080: 52 65 63 6e 6f 2c 20 70 45 78 70 72 2d 3e 69 54  Recno, pExpr->iT
b090: 61 62 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20  able, 0);.      
b0a0: 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  }.      break;. 
b0b0: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b0c0: 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20 20 20  _INTEGER: {.    
b0d0: 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28 76 2c    codeInteger(v,
b0e0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c   pExpr->token.z,
b0f0: 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29   pExpr->token.n)
b100: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b110: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b120: 5f 46 4c 4f 41 54 3a 0a 20 20 20 20 63 61 73 65  _FLOAT:.    case
b130: 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20   TK_STRING: {.  
b140: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 46      assert( TK_F
b150: 4c 4f 41 54 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b  LOAT==OP_Real );
b160: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54  .      assert( T
b170: 4b 5f 53 54 52 49 4e 47 3d 3d 4f 50 5f 53 74 72  K_STRING==OP_Str
b180: 69 6e 67 38 20 29 3b 0a 20 20 20 20 20 20 73 71  ing8 );.      sq
b190: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b1a0: 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d  op, 0, 0, pExpr-
b1b0: 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d  >token.z, pExpr-
b1c0: 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20 20 20 20  >token.n);.     
b1d0: 20 73 71 6c 69 74 65 33 56 64 62 65 44 65 71 75   sqlite3VdbeDequ
b1e0: 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20  oteP3(v, -1);.  
b1f0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b200: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
b210: 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54 45 52 41  OMIT_BLOB_LITERA
b220: 4c 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 4c  L.    case TK_BL
b230: 4f 42 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  OB: {.      asse
b240: 72 74 28 20 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f  rt( TK_BLOB==OP_
b250: 48 65 78 42 6c 6f 62 20 29 3b 0a 20 20 20 20 20  HexBlob );.     
b260: 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33 28   sqlite3VdbeOp3(
b270: 76 2c 20 6f 70 2c 20 30 2c 20 30 2c 20 70 45 78  v, op, 0, 0, pEx
b280: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70  pr->token.z+1, p
b290: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29  Expr->token.n-1)
b2a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
b2b0: 64 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20  dbeDequoteP3(v, 
b2c0: 2d 31 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  -1);.      break
b2d0: 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20  ;.    }.#endif. 
b2e0: 20 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a     case TK_NULL:
b2f0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
b300: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
b310: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
b320: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
b330: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 56   }.    case TK_V
b340: 41 52 49 41 42 4c 45 3a 20 7b 0a 20 20 20 20 20  ARIABLE: {.     
b350: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b360: 70 28 76 2c 20 4f 50 5f 56 61 72 69 61 62 6c 65  p(v, OP_Variable
b370: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
b380: 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
b390: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20  Expr->token.n>1 
b3a0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
b3b0: 65 33 56 64 62 65 43 68 61 6e 67 65 50 33 28 76  e3VdbeChangeP3(v
b3c0: 2c 20 2d 31 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  , -1, pExpr->tok
b3d0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
b3e0: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  en.n);.      }. 
b3f0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
b400: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  }.    case TK_RE
b410: 47 49 53 54 45 52 3a 20 7b 0a 20 20 20 20 20 20  GISTER: {.      
b420: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
b430: 28 76 2c 20 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20  (v, OP_MemLoad, 
b440: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30  pExpr->iTable, 0
b450: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
b460: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b470: 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LT:.    case T
b480: 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_LE:.    case T
b490: 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GT:.    case T
b4a0: 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_GE:.    case T
b4b0: 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65 20 54  K_NE:.    case T
b4c0: 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20 61 73  K_EQ: {.      as
b4d0: 73 65 72 74 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f  sert( TK_LT==OP_
b4e0: 4c 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  Lt );.      asse
b4f0: 72 74 28 20 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  rt( TK_LE==OP_Le
b500: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b510: 28 20 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 20 29  ( TK_GT==OP_Gt )
b520: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b530: 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a  TK_GE==OP_Ge );.
b540: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b550: 5f 45 51 3d 3d 4f 50 5f 45 71 20 29 3b 0a 20 20  _EQ==OP_Eq );.  
b560: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
b570: 45 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 20 20  E==OP_Ne );.    
b580: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
b590: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
b5a0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73  >pLeft);.      s
b5b0: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
b5c0: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
b5d0: 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64  ight);.      cod
b5e0: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
b5f0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
b600: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
b610: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 62  , 0, 0);.      b
b620: 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
b630: 63 61 73 65 20 54 4b 5f 41 4e 44 3a 0a 20 20 20  case TK_AND:.   
b640: 20 63 61 73 65 20 54 4b 5f 4f 52 3a 0a 20 20 20   case TK_OR:.   
b650: 20 63 61 73 65 20 54 4b 5f 50 4c 55 53 3a 0a 20   case TK_PLUS:. 
b660: 20 20 20 63 61 73 65 20 54 4b 5f 53 54 41 52 3a     case TK_STAR:
b670: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d 49 4e  .    case TK_MIN
b680: 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  US:.    case TK_
b690: 52 45 4d 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  REM:.    case TK
b6a0: 5f 42 49 54 41 4e 44 3a 0a 20 20 20 20 63 61 73  _BITAND:.    cas
b6b0: 65 20 54 4b 5f 42 49 54 4f 52 3a 0a 20 20 20 20  e TK_BITOR:.    
b6c0: 63 61 73 65 20 54 4b 5f 53 4c 41 53 48 3a 0a 20  case TK_SLASH:. 
b6d0: 20 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46     case TK_LSHIF
b6e0: 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52  T:.    case TK_R
b6f0: 53 48 49 46 54 3a 20 0a 20 20 20 20 63 61 73 65  SHIFT: .    case
b700: 20 54 4b 5f 43 4f 4e 43 41 54 3a 20 7b 0a 20 20   TK_CONCAT: {.  
b710: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 41      assert( TK_A
b720: 4e 44 3d 3d 4f 50 5f 41 6e 64 20 29 3b 0a 20 20  ND==OP_And );.  
b730: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4f      assert( TK_O
b740: 52 3d 3d 4f 50 5f 4f 72 20 29 3b 0a 20 20 20 20  R==OP_Or );.    
b750: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55    assert( TK_PLU
b760: 53 3d 3d 4f 50 5f 41 64 64 20 29 3b 0a 20 20 20  S==OP_Add );.   
b770: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4d 49     assert( TK_MI
b780: 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61 63 74  NUS==OP_Subtract
b790: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b7a0: 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
b7b0: 61 69 6e 64 65 72 20 29 3b 0a 20 20 20 20 20 20  ainder );.      
b7c0: 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54 41 4e  assert( TK_BITAN
b7d0: 44 3d 3d 4f 50 5f 42 69 74 41 6e 64 20 29 3b 0a  D==OP_BitAnd );.
b7e0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b7f0: 5f 42 49 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72  _BITOR==OP_BitOr
b800: 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
b810: 28 20 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44  ( TK_SLASH==OP_D
b820: 69 76 69 64 65 20 29 3b 0a 20 20 20 20 20 20 61  ivide );.      a
b830: 73 73 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54  ssert( TK_LSHIFT
b840: 3d 3d 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29  ==OP_ShiftLeft )
b850: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b860: 54 4b 5f 52 53 48 49 46 54 3d 3d 4f 50 5f 53 68  TK_RSHIFT==OP_Sh
b870: 69 66 74 52 69 67 68 74 20 29 3b 0a 20 20 20 20  iftRight );.    
b880: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 43 4f 4e    assert( TK_CON
b890: 43 41 54 3d 3d 4f 50 5f 43 6f 6e 63 61 74 20 29  CAT==OP_Concat )
b8a0: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
b8b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
b8c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
b8d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b8e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b8f0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20  pr->pRight);.   
b900: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b910: 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29  dOp(v, op, 0, 0)
b920: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
b930: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b940: 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20  _UMINUS: {.     
b950: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
b960: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
b970: 20 20 20 61 73 73 65 72 74 28 20 70 4c 65 66 74     assert( pLeft
b980: 20 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 4c   );.      if( pL
b990: 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41  eft->op==TK_FLOA
b9a0: 54 20 7c 7c 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d  T || pLeft->op==
b9b0: 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20 20  TK_INTEGER ){.  
b9c0: 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70 20 3d        Token *p =
b9d0: 20 26 70 4c 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a   &pLeft->token;.
b9e0: 20 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 20          char *z 
b9f0: 3d 20 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 20  = sqliteMalloc( 
ba00: 70 2d 3e 6e 20 2b 20 32 20 29 3b 0a 20 20 20 20  p->n + 2 );.    
ba10: 20 20 20 20 73 70 72 69 6e 74 66 28 7a 2c 20 22      sprintf(z, "
ba20: 2d 25 2e 2a 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d  -%.*s", p->n, p-
ba30: 3e 7a 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  >z);.        if(
ba40: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
ba50: 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
ba60: 20 20 73 71 6c 69 74 65 33 56 64 62 65 4f 70 33    sqlite3VdbeOp3
ba70: 28 76 2c 20 4f 50 5f 52 65 61 6c 2c 20 30 2c 20  (v, OP_Real, 0, 
ba80: 30 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  0, z, p->n+1);. 
ba90: 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20         }else{.  
baa0: 20 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65          codeInte
bab0: 67 65 72 28 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31  ger(v, z, p->n+1
bac0: 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20  );.        }.   
bad0: 20 20 20 20 20 73 71 6c 69 74 65 46 72 65 65 28       sqliteFree(
bae0: 7a 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61  z);.        brea
baf0: 6b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  k;.      }.     
bb00: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75 67 68   /* Fall through
bb10: 20 69 6e 74 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a   into TK_NOT */.
bb20: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
bb30: 4b 5f 42 49 54 4e 4f 54 3a 0a 20 20 20 20 63 61  K_BITNOT:.    ca
bb40: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
bb50: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
bb60: 54 4e 4f 54 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20  TNOT==OP_BitNot 
bb70: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
bb80: 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20   TK_NOT==OP_Not 
bb90: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
bba0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
bbb0: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
bbc0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
bbd0: 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c 20 30 2c  eAddOp(v, op, 0,
bbe0: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
bbf0: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
bc00: 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20   TK_ISNULL:.    
bc10: 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a  case TK_NOTNULL:
bc20: 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73   {.      int des
bc30: 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  t;.      assert(
bc40: 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49   TK_ISNULL==OP_I
bc50: 73 4e 75 6c 6c 20 29 3b 0a 20 20 20 20 20 20 61  sNull );.      a
bc60: 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
bc70: 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
bc80: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bc90: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e  beAddOp(v, OP_In
bca0: 74 65 67 65 72 2c 20 31 2c 20 30 29 3b 0a 20 20  teger, 1, 0);.  
bcb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
bcc0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
bcd0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
bce0: 20 64 65 73 74 20 3d 20 73 71 6c 69 74 65 33 56   dest = sqlite3V
bcf0: 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76  dbeCurrentAddr(v
bd00: 29 20 2b 20 32 3b 0a 20 20 20 20 20 20 73 71 6c  ) + 2;.      sql
bd10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
bd20: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
bd30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
bd40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
bd50: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 0a 20 20 20 20  mm, -1, 0);.    
bd60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
bd70: 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 46     case TK_AGG_F
bd80: 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20  UNCTION: {.     
bd90: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
bda0: 70 28 76 2c 20 4f 50 5f 41 67 67 47 65 74 2c 20  p(v, OP_AggGet, 
bdb0: 30 2c 20 70 45 78 70 72 2d 3e 69 41 67 67 29 3b  0, pExpr->iAgg);
bdc0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
bdd0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
bde0: 43 44 41 54 45 3a 0a 20 20 20 20 63 61 73 65 20  CDATE:.    case 
bdf0: 54 4b 5f 43 54 49 4d 45 3a 0a 20 20 20 20 63 61  TK_CTIME:.    ca
be00: 73 65 20 54 4b 5f 43 54 49 4d 45 53 54 41 4d 50  se TK_CTIMESTAMP
be10: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 4c  :.    case TK_GL
be20: 4f 42 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OB:.    case TK_
be30: 4c 49 4b 45 3a 0a 20 20 20 20 63 61 73 65 20 54  LIKE:.    case T
be40: 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20  K_FUNCTION: {.  
be50: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c      ExprList *pL
be60: 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ist = pExpr->pLi
be70: 73 74 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 45  st;.      int nE
be80: 78 70 72 20 3d 20 70 4c 69 73 74 20 3f 20 70 4c  xpr = pList ? pL
be90: 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b 0a  ist->nExpr : 0;.
bea0: 20 20 20 20 20 20 46 75 6e 63 44 65 66 20 2a 70        FuncDef *p
beb0: 44 65 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e  Def;.      int n
bec0: 49 64 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20  Id;.      const 
bed0: 63 68 61 72 20 2a 7a 49 64 3b 0a 20 20 20 20 20  char *zId;.     
bee0: 20 69 6e 74 20 70 32 20 3d 20 30 3b 0a 20 20 20   int p2 = 0;.   
bef0: 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20     int i;.      
bf00: 75 38 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d  u8 enc = pParse-
bf10: 3e 64 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20  >db->enc;.      
bf20: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
bf30: 20 30 3b 0a 20 20 20 20 20 20 67 65 74 46 75 6e   0;.      getFun
bf40: 63 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c  ctionName(pExpr,
bf50: 20 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20   &zId, &nId);.  
bf60: 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74      pDef = sqlit
bf70: 65 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70  e3FindFunction(p
bf80: 50 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20  Parse->db, zId, 
bf90: 6e 49 64 2c 20 6e 45 78 70 72 2c 20 65 6e 63 2c  nId, nExpr, enc,
bfa0: 20 30 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72   0);.      asser
bfb0: 74 28 20 70 44 65 66 21 3d 30 20 29 3b 0a 20 20  t( pDef!=0 );.  
bfc0: 20 20 20 20 6e 45 78 70 72 20 3d 20 73 71 6c 69      nExpr = sqli
bfd0: 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72 4c  te3ExprCodeExprL
bfe0: 69 73 74 28 70 50 61 72 73 65 2c 20 70 4c 69 73  ist(pParse, pLis
bff0: 74 29 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  t);.      for(i=
c000: 30 3b 20 69 3c 6e 45 78 70 72 20 26 26 20 69 3c  0; i<nExpr && i<
c010: 33 32 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  32; i++){.      
c020: 20 20 69 66 28 20 73 71 6c 69 74 65 33 45 78 70    if( sqlite3Exp
c030: 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 4c 69 73  rIsConstant(pLis
c040: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 20 29  t->a[i].pExpr) )
c050: 7b 0a 20 20 20 20 20 20 20 20 20 20 70 32 20 7c  {.          p2 |
c060: 3d 20 28 31 3c 3c 69 29 3b 0a 20 20 20 20 20 20  = (1<<i);.      
c070: 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66 28 20    }.        if( 
c080: 70 44 65 66 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65  pDef->needCollSe
c090: 71 20 26 26 20 21 70 43 6f 6c 6c 20 29 7b 0a 20  q && !pColl ){. 
c0a0: 20 20 20 20 20 20 20 20 20 70 43 6f 6c 6c 20 3d           pColl =
c0b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c   sqlite3ExprColl
c0c0: 53 65 71 28 70 50 61 72 73 65 2c 20 70 4c 69 73  Seq(pParse, pLis
c0d0: 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29 3b 0a  t->a[i].pExpr);.
c0e0: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
c0f0: 7d 0a 20 20 20 20 20 20 69 66 28 20 70 44 65 66  }.      if( pDef
c100: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 29 7b  ->needCollSeq ){
c110: 0a 20 20 20 20 20 20 20 20 69 66 28 20 21 70 43  .        if( !pC
c120: 6f 6c 6c 20 29 20 70 43 6f 6c 6c 20 3d 20 70 50  oll ) pColl = pP
c130: 61 72 73 65 2d 3e 64 62 2d 3e 70 44 66 6c 74 43  arse->db->pDfltC
c140: 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20 73 71  oll; .        sq
c150: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
c160: 4f 50 5f 43 6f 6c 6c 53 65 71 2c 20 30 2c 20 30  OP_CollSeq, 0, 0
c170: 2c 20 28 63 68 61 72 20 2a 29 70 43 6f 6c 6c 2c  , (char *)pColl,
c180: 20 50 33 5f 43 4f 4c 4c 53 45 51 29 3b 0a 20 20   P3_COLLSEQ);.  
c190: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
c1a0: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c1b0: 5f 46 75 6e 63 74 69 6f 6e 2c 20 6e 45 78 70 72  _Function, nExpr
c1c0: 2c 20 70 32 2c 20 28 63 68 61 72 2a 29 70 44 65  , p2, (char*)pDe
c1d0: 66 2c 20 50 33 5f 46 55 4e 43 44 45 46 29 3b 0a  f, P3_FUNCDEF);.
c1e0: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
c1f0: 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54   }.#ifndef SQLIT
c200: 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a  E_OMIT_SUBQUERY.
c210: 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53      case TK_EXIS
c220: 54 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  TS:.    case TK_
c230: 53 45 4c 45 43 54 3a 20 7b 0a 20 20 20 20 20 20  SELECT: {.      
c240: 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  if( pExpr->iTabl
c250: 65 3e 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20  e>=0 ){.        
c260: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c270: 28 76 2c 20 4f 50 5f 47 6f 73 75 62 2c 20 30 2c  (v, OP_Gosub, 0,
c280: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b   pExpr->iTable);
c290: 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
c2a0: 6d 65 6e 74 28 28 76 2c 20 22 23 20 72 75 6e 20  ment((v, "# run 
c2b0: 73 75 62 71 75 65 72 79 22 29 29 3b 0a 20 20 20  subquery"));.   
c2c0: 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
c2d0: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c2e0: 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70 72  P_MemLoad, pExpr
c2f0: 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20  ->iColumn, 0);. 
c300: 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74       VdbeComment
c310: 28 28 76 2c 20 22 23 20 6c 6f 61 64 20 73 75 62  ((v, "# load sub
c320: 71 75 65 72 79 20 72 65 73 75 6c 74 22 29 29 3b  query result"));
c330: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
c340: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
c350: 49 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  IN: {.      int 
c360: 61 64 64 72 3b 0a 20 20 20 20 20 20 63 68 61 72  addr;.      char
c370: 20 61 66 66 69 6e 69 74 79 3b 0a 0a 20 20 20 20   affinity;..    
c380: 20 20 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20    /* Figure out 
c390: 74 68 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20  the affinity to 
c3a0: 75 73 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  use to create a 
c3b0: 6b 65 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73  key from the res
c3c0: 75 6c 74 73 0a 20 20 20 20 20 20 2a 2a 20 6f 66  ults.      ** of
c3d0: 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 2e   the expression.
c3e0: 20 61 66 66 69 6e 69 74 79 53 74 72 20 73 74 6f   affinityStr sto
c3f0: 72 65 73 20 61 20 73 74 61 74 69 63 20 73 74 72  res a static str
c400: 69 6e 67 20 73 75 69 74 61 62 6c 65 20 66 6f 72  ing suitable for
c410: 0a 20 20 20 20 20 20 2a 2a 20 50 33 20 6f 66 20  .      ** P3 of 
c420: 4f 50 5f 4d 61 6b 65 52 65 63 6f 72 64 2e 0a 20  OP_MakeRecord.. 
c430: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 61 66       */.      af
c440: 66 69 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69  finity = compari
c450: 73 6f 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70  sonAffinity(pExp
c460: 72 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  r);..      sqlit
c470: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
c480: 50 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 30 29  P_Integer, 1, 0)
c490: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 43 6f 64 65  ;..      /* Code
c4a0: 20 74 68 65 20 3c 65 78 70 72 3e 20 66 72 6f 6d   the <expr> from
c4b0: 20 22 3c 65 78 70 72 3e 20 49 4e 20 28 2e 2e 2e   "<expr> IN (...
c4c0: 29 22 2e 20 54 68 65 20 74 65 6d 70 6f 72 61 72  )". The temporar
c4d0: 79 20 74 61 62 6c 65 0a 20 20 20 20 20 20 2a 2a  y table.      **
c4e0: 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 63   pExpr->iTable c
c4f0: 6f 6e 74 61 69 6e 73 20 74 68 65 20 76 61 6c 75  ontains the valu
c500: 65 73 20 74 68 61 74 20 6d 61 6b 65 20 75 70 20  es that make up 
c510: 74 68 65 20 28 2e 2e 2e 29 20 73 65 74 2e 0a 20  the (...) set.. 
c520: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71       */.      sq
c530: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c540: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
c550: 66 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20  ft);.      addr 
c560: 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75 72  = sqlite3VdbeCur
c570: 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20 20  rentAddr(v);.   
c580: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c590: 64 4f 70 28 76 2c 20 4f 50 5f 4e 6f 74 4e 75 6c  dOp(v, OP_NotNul
c5a0: 6c 2c 20 2d 31 2c 20 61 64 64 72 2b 34 29 3b 20  l, -1, addr+4); 
c5b0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 61 64             /* ad
c5c0: 64 72 20 2b 20 30 20 2a 2f 0a 20 20 20 20 20 20  dr + 0 */.      
c5d0: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c5e0: 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 32 2c 20 30  (v, OP_Pop, 2, 0
c5f0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
c600: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c610: 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a  String8, 0, 0);.
c620: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c630: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
c640: 6f 2c 20 30 2c 20 61 64 64 72 2b 37 29 3b 0a 20  o, 0, addr+7);. 
c650: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c660: 4f 70 33 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65  Op3(v, OP_MakeRe
c670: 63 6f 72 64 2c 20 31 2c 20 30 2c 20 26 61 66 66  cord, 1, 0, &aff
c680: 69 6e 69 74 79 2c 20 31 29 3b 20 20 20 2f 2a 20  inity, 1);   /* 
c690: 61 64 64 72 20 2b 20 34 20 2a 2f 0a 20 20 20 20  addr + 4 */.    
c6a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c6b0: 4f 70 28 76 2c 20 4f 50 5f 46 6f 75 6e 64 2c 20  Op(v, OP_Found, 
c6c0: 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 61  pExpr->iTable, a
c6d0: 64 64 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71  ddr+7);.      sq
c6e0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c6f0: 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20 2d 31 2c  , OP_AddImm, -1,
c700: 20 30 29 3b 20 20 20 20 20 20 20 20 20 20 20 20   0);            
c710: 20 20 20 20 20 20 2f 2a 20 61 64 64 72 20 2b 20        /* addr + 
c720: 36 20 2a 2f 0a 0a 20 20 20 20 20 20 62 72 65 61  6 */..      brea
c730: 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
c740: 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57      case TK_BETW
c750: 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  EEN: {.      Exp
c760: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
c770: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 73  ->pLeft;.      s
c780: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
c790: 74 65 6d 20 2a 70 4c 49 74 65 6d 20 3d 20 70 45  tem *pLItem = pE
c7a0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 3b 0a 20  xpr->pList->a;. 
c7b0: 20 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68       Expr *pRigh
c7c0: 74 20 3d 20 70 4c 49 74 65 6d 2d 3e 70 45 78 70  t = pLItem->pExp
c7d0: 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  r;.      sqlite3
c7e0: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
c7f0: 20 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73   pLeft);.      s
c800: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
c810: 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29  v, OP_Dup, 0, 0)
c820: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
c830: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c840: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 63  pRight);.      c
c850: 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
c860: 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
c870: 2c 20 4f 50 5f 47 65 2c 20 30 2c 20 30 29 3b 0a  , OP_Ge, 0, 0);.
c880: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c890: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 75 6c  eAddOp(v, OP_Pul
c8a0: 6c 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  l, 1, 0);.      
c8b0: 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
c8c0: 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
c8d0: 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
c8e0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
c8f0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
c900: 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
c910: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20  (pParse, pLeft, 
c920: 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 30  pRight, OP_Le, 0
c930: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
c940: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
c950: 4f 50 5f 41 6e 64 2c 20 30 2c 20 30 29 3b 0a 20  OP_And, 0, 0);. 
c960: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
c970: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 50  }.    case TK_UP
c980: 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  LUS:.    case TK
c990: 5f 41 53 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _AS: {.      sql
c9a0: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
c9b0: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
c9c0: 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  t);.      break;
c9d0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
c9e0: 54 4b 5f 43 41 53 45 3a 20 7b 0a 20 20 20 20 20  TK_CASE: {.     
c9f0: 20 69 6e 74 20 65 78 70 72 5f 65 6e 64 5f 6c 61   int expr_end_la
ca00: 62 65 6c 3b 0a 20 20 20 20 20 20 69 6e 74 20 6a  bel;.      int j
ca10: 75 6d 70 49 6e 73 74 3b 0a 20 20 20 20 20 20 69  umpInst;.      i
ca20: 6e 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 69  nt addr;.      i
ca30: 6e 74 20 6e 45 78 70 72 3b 0a 20 20 20 20 20 20  nt nExpr;.      
ca40: 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 45 78 70  int i;.      Exp
ca50: 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20  rList *pEList;. 
ca60: 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72       struct Expr
ca70: 4c 69 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74  List_item *aList
ca80: 65 6c 65 6d 3b 0a 0a 20 20 20 20 20 20 61 73 73  elem;..      ass
ca90: 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73 74  ert(pExpr->pList
caa0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
cab0: 28 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e  (pExpr->pList->n
cac0: 45 78 70 72 20 25 20 32 29 20 3d 3d 20 30 29 3b  Expr % 2) == 0);
cad0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 70 45  .      assert(pE
cae0: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
caf0: 72 20 3e 20 30 29 3b 0a 20 20 20 20 20 20 70 45  r > 0);.      pE
cb00: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  List = pExpr->pL
cb10: 69 73 74 3b 0a 20 20 20 20 20 20 61 4c 69 73 74  ist;.      aList
cb20: 65 6c 65 6d 20 3d 20 70 45 4c 69 73 74 2d 3e 61  elem = pEList->a
cb30: 3b 0a 20 20 20 20 20 20 6e 45 78 70 72 20 3d 20  ;.      nExpr = 
cb40: 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 0a 20  pEList->nExpr;. 
cb50: 20 20 20 20 20 65 78 70 72 5f 65 6e 64 5f 6c 61       expr_end_la
cb60: 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56 64 62  bel = sqlite3Vdb
cb70: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
cb80: 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e       if( pExpr->
cb90: 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20  pLeft ){.       
cba0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
cbb0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
cbc0: 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 7d 0a  pLeft);.      }.
cbd0: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
cbe0: 3c 6e 45 78 70 72 3b 20 69 3d 69 2b 32 29 7b 0a  <nExpr; i=i+2){.
cbf0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
cc00: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
cc10: 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
cc20: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28  pr);.        if(
cc30: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b   pExpr->pLeft ){
cc40: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
cc50: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
cc60: 50 5f 44 75 70 2c 20 31 2c 20 31 29 3b 0a 20 20  P_Dup, 1, 1);.  
cc70: 20 20 20 20 20 20 20 20 6a 75 6d 70 49 6e 73 74          jumpInst
cc80: 20 3d 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70   = codeCompare(p
cc90: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
cca0: 65 66 74 2c 20 61 4c 69 73 74 65 6c 65 6d 5b 69  eft, aListelem[i
ccb0: 5d 2e 70 45 78 70 72 2c 0a 20 20 20 20 20 20 20  ].pExpr,.       
ccc0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
ccd0: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 2c            OP_Ne,
cce0: 20 30 2c 20 31 29 3b 0a 20 20 20 20 20 20 20 20   0, 1);.        
ccf0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
cd00: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
cd10: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c   0);.        }el
cd20: 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 6a 75  se{.          ju
cd30: 6d 70 49 6e 73 74 20 3d 20 73 71 6c 69 74 65 33  mpInst = sqlite3
cd40: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
cd50: 49 66 4e 6f 74 2c 20 31 2c 20 30 29 3b 0a 20 20  IfNot, 1, 0);.  
cd60: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20        }.        
cd70: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
cd80: 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65  pParse, aListele
cd90: 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 29 3b 0a 20  m[i+1].pExpr);. 
cda0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cdb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f  beAddOp(v, OP_Go
cdc0: 74 6f 2c 20 30 2c 20 65 78 70 72 5f 65 6e 64 5f  to, 0, expr_end_
cdd0: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 20 20  label);.        
cde0: 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33 56 64  addr = sqlite3Vd
cdf0: 62 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29  beCurrentAddr(v)
ce00: 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
ce10: 33 56 64 62 65 43 68 61 6e 67 65 50 32 28 76 2c  3VdbeChangeP2(v,
ce20: 20 6a 75 6d 70 49 6e 73 74 2c 20 61 64 64 72 29   jumpInst, addr)
ce30: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
ce40: 69 66 28 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  if( pExpr->pLeft
ce50: 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
ce60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
ce70: 4f 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20  OP_Pop, 1, 0);. 
ce80: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
ce90: 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 20 29   pExpr->pRight )
cea0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
ceb0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
cec0: 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 29  , pExpr->pRight)
ced0: 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20  ;.      }else{. 
cee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
cef0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74  beAddOp(v, OP_St
cf00: 72 69 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20  ring8, 0, 0);.  
cf10: 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
cf20: 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
cf30: 62 65 6c 28 76 2c 20 65 78 70 72 5f 65 6e 64 5f  bel(v, expr_end_
cf40: 6c 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72  label);.      br
cf50: 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
cf60: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cf70: 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
cf80: 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
cf90: 20 20 69 66 28 20 21 70 50 61 72 73 65 2d 3e 74    if( !pParse->t
cfa0: 72 69 67 53 74 61 63 6b 20 29 7b 0a 20 20 20 20  rigStack ){.    
cfb0: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
cfc0: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
cfd0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cfe0: 20 20 20 22 52 41 49 53 45 28 29 20 6d 61 79 20     "RAISE() may 
cff0: 6f 6e 6c 79 20 62 65 20 75 73 65 64 20 77 69 74  only be used wit
d000: 68 69 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72  hin a trigger-pr
d010: 6f 67 72 61 6d 22 29 3b 0a 09 72 65 74 75 72 6e  ogram");..return
d020: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20  ;.      }.      
d030: 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  if( pExpr->iColu
d040: 6d 6e 21 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b  mn!=OE_Ignore ){
d050: 0a 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74  .         assert
d060: 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ( pExpr->iColumn
d070: 3d 3d 4f 45 5f 52 6f 6c 6c 62 61 63 6b 20 7c 7c  ==OE_Rollback ||
d080: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
d090: 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e    pExpr->iColumn
d0a0: 20 3d 3d 20 4f 45 5f 41 62 6f 72 74 20 7c 7c 0a   == OE_Abort ||.
d0b0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d0c0: 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20   pExpr->iColumn 
d0d0: 3d 3d 20 4f 45 5f 46 61 69 6c 20 29 3b 0a 20 20  == OE_Fail );.  
d0e0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d0f0: 62 65 4f 70 33 28 76 2c 20 4f 50 5f 48 61 6c 74  beOp3(v, OP_Halt
d100: 2c 20 53 51 4c 49 54 45 5f 43 4f 4e 53 54 52 41  , SQLITE_CONSTRA
d110: 49 4e 54 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c  INT, pExpr->iCol
d120: 75 6d 6e 2c 0a 20 20 20 20 20 20 20 20 20 20 20  umn,.           
d130: 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
d140: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
d150: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
d160: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
d170: 62 65 44 65 71 75 6f 74 65 50 33 28 76 2c 20 2d  beDequoteP3(v, -
d180: 31 29 3b 0a 20 20 20 20 20 20 7d 20 65 6c 73 65  1);.      } else
d190: 20 7b 0a 20 20 20 20 20 20 20 20 20 61 73 73 65   {.         asse
d1a0: 72 74 28 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  rt( pExpr->iColu
d1b0: 6d 6e 20 3d 3d 20 4f 45 5f 49 67 6e 6f 72 65 20  mn == OE_Ignore 
d1c0: 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71 6c 69  );.         sqli
d1d0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
d1e0: 4f 50 5f 43 6f 6e 74 65 78 74 50 6f 70 2c 20 30  OP_ContextPop, 0
d1f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 20 73  , 0);.         s
d200: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
d210: 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 70  v, OP_Goto, 0, p
d220: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
d230: 2d 3e 69 67 6e 6f 72 65 4a 75 6d 70 29 3b 0a 20  ->ignoreJump);. 
d240: 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d          VdbeComm
d250: 65 6e 74 28 28 76 2c 20 22 23 20 72 61 69 73 65  ent((v, "# raise
d260: 28 49 47 4e 4f 52 45 29 22 29 29 3b 0a 20 20 20  (IGNORE)"));.   
d270: 20 20 20 7d 0a 20 20 20 20 7d 0a 23 65 6e 64 69     }.    }.#endi
d280: 66 0a 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 7d  f.    break;.  }
d290: 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c 49  .}..#ifndef SQLI
d2a0: 54 45 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a  TE_OMIT_TRIGGER.
d2b0: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d2c0: 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 74 65  ode that evalute
d2d0: 73 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  s the given expr
d2e0: 65 73 73 69 6f 6e 20 61 6e 64 20 6c 65 61 76 65  ession and leave
d2f0: 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a 20  s the result.** 
d300: 6f 6e 20 74 68 65 20 73 74 61 63 6b 2e 20 20 53  on the stack.  S
d310: 65 65 20 61 6c 73 6f 20 73 71 6c 69 74 65 33 45  ee also sqlite3E
d320: 78 70 72 43 6f 64 65 28 29 2e 0a 2a 2a 0a 2a 2a  xprCode()..**.**
d330: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 69   This routine mi
d340: 67 68 74 20 61 6c 73 6f 20 63 61 63 68 65 20 74  ght also cache t
d350: 68 65 20 72 65 73 75 6c 74 20 61 6e 64 20 6d 6f  he result and mo
d360: 64 69 66 79 20 74 68 65 20 70 45 78 70 72 20 74  dify the pExpr t
d370: 72 65 65 0a 2a 2a 20 73 6f 20 74 68 61 74 20 69  ree.** so that i
d380: 74 20 77 69 6c 6c 20 6d 61 6b 65 20 75 73 65 20  t will make use 
d390: 6f 66 20 74 68 65 20 63 61 63 68 65 64 20 72 65  of the cached re
d3a0: 73 75 6c 74 20 6f 6e 20 73 75 62 73 65 71 75 65  sult on subseque
d3b0: 6e 74 20 65 76 61 6c 75 61 74 69 6f 6e 73 0a 2a  nt evaluations.*
d3c0: 2a 20 72 61 74 68 65 72 20 74 68 61 6e 20 65 76  * rather than ev
d3d0: 61 6c 75 61 74 65 20 74 68 65 20 77 68 6f 6c 65  aluate the whole
d3e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 67 61 69   expression agai
d3f0: 6e 2e 20 20 54 72 69 76 69 61 6c 20 65 78 70 72  n.  Trivial expr
d400: 65 73 73 69 6f 6e 73 20 61 72 65 0a 2a 2a 20 6e  essions are.** n
d410: 6f 74 20 63 61 63 68 65 64 2e 20 20 49 66 20 74  ot cached.  If t
d420: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d430: 20 63 61 63 68 65 64 2c 20 69 74 73 20 72 65 73   cached, its res
d440: 75 6c 74 20 69 73 20 73 74 6f 72 65 64 20 69 6e  ult is stored in
d450: 20 61 20 0a 2a 2a 20 6d 65 6d 6f 72 79 20 6c 6f   a .** memory lo
d460: 63 61 74 69 6f 6e 2e 0a 2a 2f 0a 76 6f 69 64 20  cation..*/.void 
d470: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41  sqlite3ExprCodeA
d480: 6e 64 43 61 63 68 65 28 50 61 72 73 65 20 2a 70  ndCache(Parse *p
d490: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d4a0: 70 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d  pr){.  Vdbe *v =
d4b0: 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a   pParse->pVdbe;.
d4c0: 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 20 20 69 6e    int iMem;.  in
d4d0: 74 20 61 64 64 72 31 2c 20 61 64 64 72 32 3b 0a  t addr1, addr2;.
d4e0: 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65 74    if( v==0 ) ret
d4f0: 75 72 6e 3b 0a 20 20 61 64 64 72 31 20 3d 20 73  urn;.  addr1 = s
d500: 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e  qlite3VdbeCurren
d510: 74 41 64 64 72 28 76 29 3b 0a 20 20 73 71 6c 69  tAddr(v);.  sqli
d520: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d530: 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 61 64  se, pExpr);.  ad
d540: 64 72 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr2 = sqlite3Vdb
d550: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d560: 0a 20 20 69 66 28 20 61 64 64 72 32 3e 61 64 64  .  if( addr2>add
d570: 72 31 2b 31 20 7c 7c 20 73 71 6c 69 74 65 33 56  r1+1 || sqlite3V
d580: 64 62 65 47 65 74 4f 70 28 76 2c 20 61 64 64 72  dbeGetOp(v, addr
d590: 31 29 2d 3e 6f 70 63 6f 64 65 3d 3d 4f 50 5f 46  1)->opcode==OP_F
d5a0: 75 6e 63 74 69 6f 6e 20 29 7b 0a 20 20 20 20 69  unction ){.    i
d5b0: 4d 65 6d 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Mem = pExpr->iTa
d5c0: 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d  ble = pParse->nM
d5d0: 65 6d 2b 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65  em++;.    sqlite
d5e0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
d5f0: 5f 4d 65 6d 53 74 6f 72 65 2c 20 69 4d 65 6d 2c  _MemStore, iMem,
d600: 20 30 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e   0);.    pExpr->
d610: 6f 70 20 3d 20 54 4b 5f 52 45 47 49 53 54 45 52  op = TK_REGISTER
d620: 3b 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 0a 0a  ;.  }.}.#endif..
d630: 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63  /*.** Generate c
d640: 6f 64 65 20 74 68 61 74 20 70 75 73 68 65 73 20  ode that pushes 
d650: 74 68 65 20 76 61 6c 75 65 20 6f 66 20 65 76 65  the value of eve
d660: 72 79 20 65 6c 65 6d 65 6e 74 20 6f 66 20 74 68  ry element of th
d670: 65 20 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65  e given.** expre
d680: 73 73 69 6f 6e 20 6c 69 73 74 20 6f 6e 74 6f 20  ssion list onto 
d690: 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2a 0a 2a 2a  the stack..**.**
d6a0: 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62   Return the numb
d6b0: 65 72 20 6f 66 20 65 6c 65 6d 65 6e 74 73 20 70  er of elements p
d6c0: 75 73 68 65 64 20 6f 6e 74 6f 20 74 68 65 20 73  ushed onto the s
d6d0: 74 61 63 6b 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c  tack..*/.int sql
d6e0: 69 74 65 33 45 78 70 72 43 6f 64 65 45 78 70 72  ite3ExprCodeExpr
d6f0: 4c 69 73 74 28 0a 20 20 50 61 72 73 65 20 2a 70  List(.  Parse *p
d700: 50 61 72 73 65 2c 20 20 20 20 20 2f 2a 20 50 61  Parse,     /* Pa
d710: 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  rsing context */
d720: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69  .  ExprList *pLi
d730: 73 74 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70  st    /* The exp
d740: 72 65 73 73 69 6f 6e 20 6c 69 73 74 20 74 6f 20  ression list to 
d750: 62 65 20 63 6f 64 65 64 20 2a 2f 0a 29 7b 0a 20  be coded */.){. 
d760: 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74   struct ExprList
d770: 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20  _item *pItem;.  
d780: 69 6e 74 20 69 2c 20 6e 3b 0a 20 20 56 64 62 65  int i, n;.  Vdbe
d790: 20 2a 76 3b 0a 20 20 69 66 28 20 70 4c 69 73 74   *v;.  if( pList
d7a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
d7b0: 20 20 76 20 3d 20 73 71 6c 69 74 65 33 47 65 74    v = sqlite3Get
d7c0: 56 64 62 65 28 70 50 61 72 73 65 29 3b 0a 20 20  Vdbe(pParse);.  
d7d0: 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72  n = pList->nExpr
d7e0: 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
d7f0: 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
d800: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
d810: 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72  .    sqlite3Expr
d820: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 49 74  Code(pParse, pIt
d830: 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20 7d 0a  em->pExpr);.  }.
d840: 20 20 72 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f    return n;.}../
d850: 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f  *.** Generate co
d860: 64 65 20 66 6f 72 20 61 20 62 6f 6f 6c 65 61 6e  de for a boolean
d870: 20 65 78 70 72 65 73 73 69 6f 6e 20 73 75 63 68   expression such
d880: 20 74 68 61 74 20 61 20 6a 75 6d 70 20 69 73 20   that a jump is 
d890: 6d 61 64 65 0a 2a 2a 20 74 6f 20 74 68 65 20 6c  made.** to the l
d8a0: 61 62 65 6c 20 22 64 65 73 74 22 20 69 66 20 74  abel "dest" if t
d8b0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
d8c0: 20 74 72 75 65 20 62 75 74 20 65 78 65 63 75 74   true but execut
d8d0: 69 6f 6e 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73  ion.** continues
d8e0: 20 73 74 72 61 69 67 68 74 20 74 68 72 75 20 69   straight thru i
d8f0: 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  f the expression
d900: 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2a 0a 2a 2a   is false..**.**
d910: 20 49 66 20 74 68 65 20 65 78 70 72 65 73 73 69   If the expressi
d920: 6f 6e 20 65 76 61 6c 75 61 74 65 73 20 74 6f 20  on evaluates to 
d930: 4e 55 4c 4c 20 28 6e 65 69 74 68 65 72 20 74 72  NULL (neither tr
d940: 75 65 20 6e 6f 72 20 66 61 6c 73 65 29 2c 20 74  ue nor false), t
d950: 68 65 6e 0a 2a 2a 20 74 61 6b 65 20 74 68 65 20  hen.** take the 
d960: 6a 75 6d 70 20 69 66 20 74 68 65 20 6a 75 6d 70  jump if the jump
d970: 49 66 4e 75 6c 6c 20 66 6c 61 67 20 69 73 20 74  IfNull flag is t
d980: 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  rue..**.** This 
d990: 63 6f 64 65 20 64 65 70 65 6e 64 73 20 6f 6e 20  code depends on 
d9a0: 74 68 65 20 66 61 63 74 20 74 68 61 74 20 63 65  the fact that ce
d9b0: 72 74 61 69 6e 20 74 6f 6b 65 6e 20 76 61 6c 75  rtain token valu
d9c0: 65 73 20 28 65 78 3a 20 54 4b 5f 45 51 29 0a 2a  es (ex: TK_EQ).*
d9d0: 2a 20 61 72 65 20 74 68 65 20 73 61 6d 65 20 61  * are the same a
d9e0: 73 20 6f 70 63 6f 64 65 20 76 61 6c 75 65 73 20  s opcode values 
d9f0: 28 65 78 3a 20 4f 50 5f 45 71 29 20 74 68 61 74  (ex: OP_Eq) that
da00: 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65 20 63   implement the c
da10: 6f 72 72 65 73 70 6f 6e 64 69 6e 67 0a 2a 2a 20  orresponding.** 
da20: 6f 70 65 72 61 74 69 6f 6e 2e 20 20 53 70 65 63  operation.  Spec
da30: 69 61 6c 20 63 6f 6d 6d 65 6e 74 73 20 69 6e 20  ial comments in 
da40: 76 64 62 65 2e 63 20 61 6e 64 20 74 68 65 20 6d  vdbe.c and the m
da50: 6b 6f 70 63 6f 64 65 68 2e 61 77 6b 20 73 63 72  kopcodeh.awk scr
da60: 69 70 74 20 69 6e 0a 2a 2a 20 74 68 65 20 6d 61  ipt in.** the ma
da70: 6b 65 20 70 72 6f 63 65 73 73 20 63 61 75 73 65  ke process cause
da80: 20 74 68 65 73 65 20 76 61 6c 75 65 73 20 74 6f   these values to
da90: 20 61 6c 69 67 6e 2e 20 20 41 73 73 65 72 74 28   align.  Assert(
daa0: 29 73 20 69 6e 20 74 68 65 20 63 6f 64 65 0a 2a  )s in the code.*
dab0: 2a 20 62 65 6c 6f 77 20 76 65 72 69 66 79 20 74  * below verify t
dac0: 68 61 74 20 74 68 65 20 6e 75 6d 62 65 72 73 20  hat the numbers 
dad0: 61 72 65 20 61 6c 69 67 6e 65 64 20 63 6f 72 72  are aligned corr
dae0: 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f 69 64 20 73  ectly..*/.void s
daf0: 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75 65  qlite3ExprIfTrue
db00: 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20  (Parse *pParse, 
db10: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74  Expr *pExpr, int
db20: 20 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49   dest, int jumpI
db30: 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a  fNull){.  Vdbe *
db40: 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62  v = pParse->pVdb
db50: 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b  e;.  int op = 0;
db60: 0a 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70  .  if( v==0 || p
db70: 45 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e  Expr==0 ) return
db80: 3b 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e  ;.  op = pExpr->
db90: 6f 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70  op;.  switch( op
dba0: 20 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   ){.    case TK_
dbb0: 41 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74  AND: {.      int
dbc0: 20 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62   d2 = sqlite3Vdb
dbd0: 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
dbe0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
dbf0: 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
dc00: 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
dc10: 2c 20 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  , !jumpIfNull);.
dc20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
dc30: 72 49 66 54 72 75 65 28 70 50 61 72 73 65 2c 20  rIfTrue(pParse, 
dc40: 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64  pExpr->pRight, d
dc50: 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  est, jumpIfNull)
dc60: 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
dc70: 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28  dbeResolveLabel(
dc80: 76 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72  v, d2);.      br
dc90: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
dca0: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
dcb0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
dcc0: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
dcd0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
dce0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
dcf0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
dd00: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
dd10: 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73  xpr->pRight, des
dd20: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
dd30: 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
dd40: 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e   }.    case TK_N
dd50: 4f 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  OT: {.      sqli
dd60: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
dd70: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
dd80: 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
dd90: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
dda0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
ddb0: 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
ddc0: 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
ddd0: 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
dde0: 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
ddf0: 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
de00: 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
de10: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 54     assert( TK_LT
de20: 3d 3d 4f 50 5f 4c 74 20 29 3b 0a 20 20 20 20 20  ==OP_Lt );.     
de30: 20 61 73 73 65 72 74 28 20 54 4b 5f 4c 45 3d 3d   assert( TK_LE==
de40: 4f 50 5f 4c 65 20 29 3b 0a 20 20 20 20 20 20 61  OP_Le );.      a
de50: 73 73 65 72 74 28 20 54 4b 5f 47 54 3d 3d 4f 50  ssert( TK_GT==OP
de60: 5f 47 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73  _Gt );.      ass
de70: 65 72 74 28 20 54 4b 5f 47 45 3d 3d 4f 50 5f 47  ert( TK_GE==OP_G
de80: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
de90: 74 28 20 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 20  t( TK_EQ==OP_Eq 
dea0: 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
deb0: 20 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 20 29 3b   TK_NE==OP_Ne );
dec0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
ded0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
dee0: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
def0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
df00: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
df10: 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 20 20  r->pRight);.    
df20: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
df30: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
df40: 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  ft, pExpr->pRigh
df50: 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a 75 6d  t, op, dest, jum
df60: 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20  pIfNull);.      
df70: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
df80: 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a   case TK_ISNULL:
df90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
dfa0: 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 61 73  NULL: {.      as
dfb0: 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d  sert( TK_ISNULL=
dfc0: 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
dfd0: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e      assert( TK_N
dfe0: 4f 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75  OTNULL==OP_NotNu
dff0: 6c 6c 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ll );.      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 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e020: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
e030: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
e040: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
e050: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
e060: 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
e070: 4e 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68  N: {.      /* Th
e080: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 22 78 20  e expression "x 
e090: 42 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22  BETWEEN y AND z"
e0a0: 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20   is implemented 
e0b0: 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20  as:.      **.   
e0c0: 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20 3c 20     ** 1 IF (x < 
e0d0: 79 29 20 47 4f 54 4f 20 33 0a 20 20 20 20 20 20  y) GOTO 3.      
e0e0: 2a 2a 20 32 20 49 46 20 28 78 20 3c 3d 20 7a 29  ** 2 IF (x <= z)
e0f0: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
e100: 20 20 20 2a 2a 20 33 20 2e 2e 2e 0a 20 20 20 20     ** 3 ....    
e110: 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 61    */.      int a
e120: 64 64 72 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ddr;.      Expr 
e130: 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e  *pLeft = pExpr->
e140: 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 45 78 70  pLeft;.      Exp
e150: 72 20 2a 70 52 69 67 68 74 20 3d 20 70 45 78 70  r *pRight = pExp
e160: 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
e170: 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69  Expr;.      sqli
e180: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
e190: 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20 20 20 20  se, pLeft);.    
e1a0: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
e1b0: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 30 2c  Op(v, OP_Dup, 0,
e1c0: 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74   0);.      sqlit
e1d0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
e1e0: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
e1f0: 20 20 61 64 64 72 20 3d 20 63 6f 64 65 43 6f 6d    addr = codeCom
e200: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65  pare(pParse, pLe
e210: 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c  ft, pRight, OP_L
e220: 74 2c 20 30 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  t, 0, !jumpIfNul
e230: 6c 29 3b 0a 0a 20 20 20 20 20 20 70 52 69 67 68  l);..      pRigh
e240: 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74  t = pExpr->pList
e250: 2d 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20  ->a[1].pExpr;.  
e260: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
e270: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67  ode(pParse, pRig
e280: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
e290: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e2a0: 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50  Left, pRight, OP
e2b0: 5f 4c 65 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  _Le, dest, jumpI
e2c0: 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20 20 20 73  fNull);..      s
e2d0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
e2e0: 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30  v, OP_Integer, 0
e2f0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  , 0);.      sqli
e300: 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 32 28  te3VdbeChangeP2(
e310: 76 2c 20 61 64 64 72 2c 20 73 71 6c 69 74 65 33  v, addr, sqlite3
e320: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
e330: 76 29 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  v));.      sqlit
e340: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
e350: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
e360: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e370: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
e380: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
e390: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
e3a0: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
e3b0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
e3c0: 4f 50 5f 49 66 2c 20 6a 75 6d 70 49 66 4e 75 6c  OP_If, jumpIfNul
e3d0: 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20 20  l, dest);.      
e3e0: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d  break;.    }.  }
e3f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61  .}../*.** Genera
e400: 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f  te code for a bo
e410: 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  olean expression
e420: 20 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d   such that a jum
e430: 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20  p is made.** to 
e440: 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22  the label "dest"
e450: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
e460: 6f 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20  on is false but 
e470: 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e  execution.** con
e480: 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20  tinues straight 
e490: 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72  thru if the expr
e4a0: 65 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a  ession is true..
e4b0: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  **.** If the exp
e4c0: 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65  ression evaluate
e4d0: 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68  s to NULL (neith
e4e0: 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73  er true nor fals
e4f0: 65 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20  e) then.** jump 
e500: 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73  if jumpIfNull is
e510: 20 74 72 75 65 20 6f 72 20 66 61 6c 6c 20 74 68   true or fall th
e520: 72 6f 75 67 68 20 69 66 20 6a 75 6d 70 49 66 4e  rough if jumpIfN
e530: 75 6c 6c 20 69 73 20 66 61 6c 73 65 2e 0a 2a 2f  ull is false..*/
e540: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
e550: 72 49 66 46 61 6c 73 65 28 50 61 72 73 65 20 2a  rIfFalse(Parse *
e560: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
e570: 78 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69  xpr, int dest, i
e580: 6e 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a  nt jumpIfNull){.
e590: 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72    Vdbe *v = pPar
e5a0: 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74  se->pVdbe;.  int
e5b0: 20 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76   op = 0;.  if( v
e5c0: 3d 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20  ==0 || pExpr==0 
e5d0: 29 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20  ) return;..  /* 
e5e0: 54 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78  The value of pEx
e5f0: 70 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72  pr->op and op ar
e600: 65 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c  e related as fol
e610: 6c 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20  lows:.  **.  ** 
e620: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20        pExpr->op 
e630: 20 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20             op.  
e640: 2a 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d  **       -------
e650: 2d 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d  --          ----
e660: 2d 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20  ------.  **     
e670: 20 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20    TK_ISNULL     
e680: 20 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a       OP_NotNull.
e690: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f    **       TK_NO
e6a0: 54 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50  TNULL         OP
e6b0: 5f 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20  _IsNull.  **    
e6c0: 20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20     TK_NE        
e6d0: 20 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a        OP_Eq.  **
e6e0: 20 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20         TK_EQ    
e6f0: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a            OP_Ne.
e700: 20 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54    **       TK_GT
e710: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50                OP
e720: 5f 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54  _Le.  **       T
e730: 4b 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20  K_LE            
e740: 20 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20    OP_Gt.  **    
e750: 20 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20     TK_GE        
e760: 20 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a        OP_Lt.  **
e770: 20 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20         TK_LT    
e780: 20 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a            OP_Ge.
e790: 20 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74    **.  ** For ot
e7a0: 68 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45  her values of pE
e7b0: 78 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75  xpr->op, op is u
e7c0: 6e 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75  ndefined and unu
e7d0: 73 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61  sed..  ** The va
e7e0: 6c 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f  lue of TK_ and O
e7f0: 50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65  P_ constants are
e800: 20 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74   arranged such t
e810: 68 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20  hat we.  ** can 
e820: 63 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70  compute the mapp
e830: 69 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20  ing above using 
e840: 74 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78  the following ex
e850: 70 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41  pression..  ** A
e860: 73 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20  ssert()s verify 
e870: 74 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61  that the computa
e880: 74 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e  tion is correct.
e890: 0a 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70  .  */.  op = ((p
e8a0: 45 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e  Expr->op+(TK_ISN
e8b0: 55 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49  ULL&1))^1)-(TK_I
e8c0: 53 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20  SNULL&1);..  /* 
e8d0: 56 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61  Verify correct a
e8e0: 6c 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20  lignment of TK_ 
e8f0: 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74  and OP_ constant
e900: 73 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28  s.  */.  assert(
e910: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49   pExpr->op!=TK_I
e920: 53 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  SNULL || op==OP_
e930: 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73  NotNull );.  ass
e940: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
e950: 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70  TK_NOTNULL || op
e960: 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20  ==OP_IsNull );. 
e970: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
e980: 6f 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d  op!=TK_NE || op=
e990: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65  =OP_Eq );.  asse
e9a0: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
e9b0: 4b 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  K_EQ || op==OP_N
e9c0: 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
e9d0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20  Expr->op!=TK_LT 
e9e0: 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a  || op==OP_Ge );.
e9f0: 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
ea00: 3e 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70  >op!=TK_LE || op
ea10: 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73  ==OP_Gt );.  ass
ea20: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d  ert( pExpr->op!=
ea30: 54 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f  TK_GT || op==OP_
ea40: 4c 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  Le );.  assert( 
ea50: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45  pExpr->op!=TK_GE
ea60: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b   || op==OP_Lt );
ea70: 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70  ..  switch( pExp
ea80: 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73  r->op ){.    cas
ea90: 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20  e TK_AND: {.    
eaa0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
eab0: 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
eac0: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ead0: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
eae0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
eaf0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
eb00: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
eb10: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
eb20: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
eb30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
eb40: 4f 52 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  OR: {.      int 
eb50: 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
eb60: 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
eb70: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
eb80: 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
eb90: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32 2c 20  xpr->pLeft, d2, 
eba0: 21 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20  !jumpIfNull);.  
ebb0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
ebc0: 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70  fFalse(pParse, p
ebd0: 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 64 65  Expr->pRight, de
ebe0: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
ebf0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
ec00: 62 65 52 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76  beResolveLabel(v
ec10: 2c 20 64 32 29 3b 0a 20 20 20 20 20 20 62 72 65  , d2);.      bre
ec20: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
ec30: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
ec40: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
ec50: 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45 78  True(pParse, pEx
ec60: 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
ec70: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ec80: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ec90: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a  .    case TK_LT:
eca0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a  .    case TK_LE:
ecb0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54 3a  .    case TK_GT:
ecc0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45 3a  .    case TK_GE:
ecd0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45 3a  .    case TK_NE:
ece0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51 3a  .    case TK_EQ:
ecf0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
ed00: 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c  ExprCode(pParse,
ed10: 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a   pExpr->pLeft);.
ed20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ed30: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ed40: 78 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20  xpr->pRight);.  
ed50: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
ed60: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ed70: 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
ed80: 67 68 74 2c 20 6f 70 2c 20 64 65 73 74 2c 20 6a  ght, op, dest, j
ed90: 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
eda0: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
edb0: 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
edc0: 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
edd0: 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
ede0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
edf0: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
ee00: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
ee10: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
ee20: 20 6f 70 2c 20 31 2c 20 64 65 73 74 29 3b 0a 20   op, 1, dest);. 
ee30: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ee40: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 45  }.    case TK_BE
ee50: 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20 20 2f  TWEEN: {.      /
ee60: 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
ee70: 20 69 73 20 22 78 20 42 45 54 57 45 45 4e 20 79   is "x BETWEEN y
ee80: 20 41 4e 44 20 7a 22 2e 20 49 74 20 69 73 20 69   AND z". It is i
ee90: 6d 70 6c 65 6d 65 6e 74 65 64 20 61 73 3a 0a 20  mplemented as:. 
eea0: 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
eeb0: 20 31 20 49 46 20 28 78 20 3e 3d 20 79 29 20 47   1 IF (x >= y) G
eec0: 4f 54 4f 20 33 0a 20 20 20 20 20 20 2a 2a 20 32  OTO 3.      ** 2
eed0: 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20 20 20   GOTO <dest>.   
eee0: 20 20 20 2a 2a 20 33 20 49 46 20 28 78 20 3e 20     ** 3 IF (x > 
eef0: 7a 29 20 47 4f 54 4f 20 3c 64 65 73 74 3e 0a 20  z) GOTO <dest>. 
ef00: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 6e       */.      in
ef10: 74 20 61 64 64 72 3b 0a 20 20 20 20 20 20 45 78  t addr;.      Ex
ef20: 70 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70  pr *pLeft = pExp
ef30: 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20  r->pLeft;.      
ef40: 45 78 70 72 20 2a 70 52 69 67 68 74 20 3d 20 70  Expr *pRight = p
ef50: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30  Expr->pList->a[0
ef60: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73  ].pExpr;.      s
ef70: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
ef80: 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a 20  Parse, pLeft);. 
ef90: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
efa0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c  AddOp(v, OP_Dup,
efb0: 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71   0, 0);.      sq
efc0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
efd0: 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a 20  arse, pRight);. 
efe0: 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c 69       addr = sqli
eff0: 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64  te3VdbeCurrentAd
f000: 64 72 28 76 29 3b 0a 20 20 20 20 20 20 63 6f 64  dr(v);.      cod
f010: 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
f020: 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20   pLeft, pRight, 
f030: 4f 50 5f 47 65 2c 20 61 64 64 72 2b 33 2c 20 21  OP_Ge, addr+3, !
f040: 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20  jumpIfNull);..  
f050: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
f060: 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20  ddOp(v, OP_Pop, 
f070: 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  1, 0);.      sql
f080: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
f090: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73   OP_Goto, 0, des
f0a0: 74 29 3b 0a 20 20 20 20 20 20 70 52 69 67 68 74  t);.      pRight
f0b0: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
f0c0: 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
f0d0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
f0e0: 64 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  de(pParse, pRigh
f0f0: 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f  t);.      codeCo
f100: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 4c  mpare(pParse, pL
f110: 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f  eft, pRight, OP_
f120: 47 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  Gt, dest, jumpIf
f130: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
f140: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
f150: 66 61 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73  fault: {.      s
f160: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
f170: 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20  Parse, pExpr);. 
f180: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
f190: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 66 4e 6f  AddOp(v, OP_IfNo
f1a0: 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 2c 20 64  t, jumpIfNull, d
f1b0: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
f1c0: 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  k;.    }.  }.}..
f1d0: 2f 2a 0a 2a 2a 20 44 6f 20 61 20 64 65 65 70 20  /*.** Do a deep 
f1e0: 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 66 20 74 77  comparison of tw
f1f0: 6f 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65  o expression tre
f200: 65 73 2e 20 20 52 65 74 75 72 6e 20 54 52 55 45  es.  Return TRUE
f210: 20 28 6e 6f 6e 2d 7a 65 72 6f 29 0a 2a 2a 20 69   (non-zero).** i
f220: 66 20 74 68 65 79 20 61 72 65 20 69 64 65 6e 74  f they are ident
f230: 69 63 61 6c 20 61 6e 64 20 72 65 74 75 72 6e 20  ical and return 
f240: 46 41 4c 53 45 20 69 66 20 74 68 65 79 20 64 69  FALSE if they di
f250: 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61 79 2e  ffer in any way.
f260: 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45  .*/.int sqlite3E
f270: 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70 72 20  xprCompare(Expr 
f280: 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 29 7b 0a  *pA, Expr *pB){.
f290: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 70    int i;.  if( p
f2a0: 41 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75  A==0 ){.    retu
f2b0: 72 6e 20 70 42 3d 3d 30 3b 0a 20 20 7d 65 6c 73  rn pB==0;.  }els
f2c0: 65 20 69 66 28 20 70 42 3d 3d 30 20 29 7b 0a 20  e if( pB==0 ){. 
f2d0: 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d     return 0;.  }
f2e0: 0a 20 20 69 66 28 20 70 41 2d 3e 6f 70 21 3d 70  .  if( pA->op!=p
f2f0: 42 2d 3e 6f 70 20 29 20 72 65 74 75 72 6e 20 30  B->op ) return 0
f300: 3b 0a 20 20 69 66 28 20 21 73 71 6c 69 74 65 33  ;.  if( !sqlite3
f310: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f320: 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66 74  pLeft, pB->pLeft
f330: 29 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  ) ) return 0;.  
f340: 69 66 28 20 21 73 71 6c 69 74 65 33 45 78 70 72  if( !sqlite3Expr
f350: 43 6f 6d 70 61 72 65 28 70 41 2d 3e 70 52 69 67  Compare(pA->pRig
f360: 68 74 2c 20 70 42 2d 3e 70 52 69 67 68 74 29 20  ht, pB->pRight) 
f370: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
f380: 28 20 70 41 2d 3e 70 4c 69 73 74 20 29 7b 0a 20  ( pA->pList ){. 
f390: 20 20 20 69 66 28 20 70 42 2d 3e 70 4c 69 73 74     if( pB->pList
f3a0: 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a  ==0 ) return 0;.
f3b0: 20 20 20 20 69 66 28 20 70 41 2d 3e 70 4c 69 73      if( pA->pLis
f3c0: 74 2d 3e 6e 45 78 70 72 21 3d 70 42 2d 3e 70 4c  t->nExpr!=pB->pL
f3d0: 69 73 74 2d 3e 6e 45 78 70 72 20 29 20 72 65 74  ist->nExpr ) ret
f3e0: 75 72 6e 20 30 3b 0a 20 20 20 20 66 6f 72 28 69  urn 0;.    for(i
f3f0: 3d 30 3b 20 69 3c 70 41 2d 3e 70 4c 69 73 74 2d  =0; i<pA->pList-
f400: 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b 0a 20 20  >nExpr; i++){.  
f410: 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65 33      if( !sqlite3
f420: 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d 3e  ExprCompare(pA->
f430: 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70  pList->a[i].pExp
f440: 72 2c 20 70 42 2d 3e 70 4c 69 73 74 2d 3e 61 5b  r, pB->pList->a[
f450: 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20 20  i].pExpr) ){.   
f460: 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20       return 0;. 
f470: 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
f480: 65 6c 73 65 20 69 66 28 20 70 42 2d 3e 70 4c 69  else if( pB->pLi
f490: 73 74 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  st ){.    return
f4a0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
f4b0: 2d 3e 70 53 65 6c 65 63 74 20 7c 7c 20 70 42 2d  ->pSelect || pB-
f4c0: 3e 70 53 65 6c 65 63 74 20 29 20 72 65 74 75 72  >pSelect ) retur
f4d0: 6e 20 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 69  n 0;.  if( pA->i
f4e0: 54 61 62 6c 65 21 3d 70 42 2d 3e 69 54 61 62 6c  Table!=pB->iTabl
f4f0: 65 20 7c 7c 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e  e || pA->iColumn
f500: 21 3d 70 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20  !=pB->iColumn ) 
f510: 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20  return 0;.  if( 
f520: 70 41 2d 3e 74 6f 6b 65 6e 2e 7a 20 29 7b 0a 20  pA->token.z ){. 
f530: 20 20 20 69 66 28 20 70 42 2d 3e 74 6f 6b 65 6e     if( pB->token
f540: 2e 7a 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30  .z==0 ) return 0
f550: 3b 0a 20 20 20 20 69 66 28 20 70 42 2d 3e 74 6f  ;.    if( pB->to
f560: 6b 65 6e 2e 6e 21 3d 70 41 2d 3e 74 6f 6b 65 6e  ken.n!=pA->token
f570: 2e 6e 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20  .n ) return 0;. 
f580: 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74     if( sqlite3St
f590: 72 4e 49 43 6d 70 28 70 41 2d 3e 74 6f 6b 65 6e  rNICmp(pA->token
f5a0: 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65 6e 2e 7a 2c  .z, pB->token.z,
f5b0: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 29 21 3d 30   pB->token.n)!=0
f5c0: 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d   ) return 0;.  }
f5d0: 0a 20 20 72 65 74 75 72 6e 20 31 3b 0a 7d 0a 0a  .  return 1;.}..
f5e0: 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20  /*.** Add a new 
f5f0: 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70  element to the p
f600: 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20 61 72  Parse->aAgg[] ar
f610: 72 61 79 20 61 6e 64 20 72 65 74 75 72 6e 20 69  ray and return i
f620: 74 73 20 69 6e 64 65 78 2e 0a 2a 2a 20 54 68 65  ts index..** The
f630: 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 69 73 20   new element is 
f640: 69 6e 69 74 69 61 6c 69 7a 65 64 20 74 6f 20 7a  initialized to z
f650: 65 72 6f 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e  ero.  The callin
f660: 67 20 66 75 6e 63 74 69 6f 6e 20 69 73 0a 2a 2a  g function is.**
f670: 20 65 78 70 65 63 74 65 64 20 74 6f 20 66 69 6c   expected to fil
f680: 6c 20 69 74 20 69 6e 2e 0a 2a 2f 0a 73 74 61 74  l it in..*/.stat
f690: 69 63 20 69 6e 74 20 61 70 70 65 6e 64 41 67 67  ic int appendAgg
f6a0: 49 6e 66 6f 28 50 61 72 73 65 20 2a 70 50 61 72  Info(Parse *pPar
f6b0: 73 65 29 7b 0a 20 20 69 66 28 20 28 70 50 61 72  se){.  if( (pPar
f6c0: 73 65 2d 3e 6e 41 67 67 20 26 20 30 78 37 29 3d  se->nAgg & 0x7)=
f6d0: 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20 61 6d  =0 ){.    int am
f6e0: 74 20 3d 20 70 50 61 72 73 65 2d 3e 6e 41 67 67  t = pParse->nAgg
f6f0: 20 2b 20 38 3b 0a 20 20 20 20 41 67 67 45 78 70   + 8;.    AggExp
f700: 72 20 2a 61 41 67 67 20 3d 20 73 71 6c 69 74 65  r *aAgg = sqlite
f710: 52 65 61 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  Realloc(pParse->
f720: 61 41 67 67 2c 20 61 6d 74 2a 73 69 7a 65 6f 66  aAgg, amt*sizeof
f730: 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30 5d  (pParse->aAgg[0]
f740: 29 29 3b 0a 20 20 20 20 69 66 28 20 61 41 67 67  ));.    if( aAgg
f750: 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 72 65 74  ==0 ){.      ret
f760: 75 72 6e 20 2d 31 3b 0a 20 20 20 20 7d 0a 20 20  urn -1;.    }.  
f770: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 20 3d    pParse->aAgg =
f780: 20 61 41 67 67 3b 0a 20 20 7d 0a 20 20 6d 65 6d   aAgg;.  }.  mem
f790: 73 65 74 28 26 70 50 61 72 73 65 2d 3e 61 41 67  set(&pParse->aAg
f7a0: 67 5b 70 50 61 72 73 65 2d 3e 6e 41 67 67 5d 2c  g[pParse->nAgg],
f7b0: 20 30 2c 20 73 69 7a 65 6f 66 28 70 50 61 72 73   0, sizeof(pPars
f7c0: 65 2d 3e 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20  e->aAgg[0]));.  
f7d0: 72 65 74 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e  return pParse->n
f7e0: 41 67 67 2b 2b 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Agg++;.}../*.** 
f7f0: 54 68 69 73 20 69 73 20 61 6e 20 78 46 75 6e 63  This is an xFunc
f800: 20 66 6f 72 20 77 61 6c 6b 45 78 70 72 54 72 65   for walkExprTre
f810: 65 28 29 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  e() used to impl
f820: 65 6d 65 6e 74 20 0a 2a 2a 20 73 71 6c 69 74 65  ement .** sqlite
f830: 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67 67 72  3ExprAnalyzeAggr
f840: 65 67 61 74 65 73 28 29 2e 20 20 53 65 65 20 73  egates().  See s
f850: 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a  qlite3ExprAnalyz
f860: 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a 20 66  eAggregates.** f
f870: 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e  or additional in
f880: 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2a 0a 2a 2a  formation..**.**
f890: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 61 6e   This routine an
f8a0: 61 6c 79 7a 65 73 20 74 68 65 20 61 67 67 72 65  alyzes the aggre
f8b0: 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 61 74  gate function at
f8c0: 20 70 45 78 70 72 2e 0a 2a 2f 0a 73 74 61 74 69   pExpr..*/.stati
f8d0: 63 20 69 6e 74 20 61 6e 61 6c 79 7a 65 41 67 67  c int analyzeAgg
f8e0: 72 65 67 61 74 65 28 76 6f 69 64 20 2a 70 41 72  regate(void *pAr
f8f0: 67 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b  g, Expr *pExpr){
f900: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 41 67 67 45  .  int i;.  AggE
f910: 78 70 72 20 2a 61 41 67 67 3b 0a 20 20 50 61 72  xpr *aAgg;.  Par
f920: 73 65 20 2a 70 50 61 72 73 65 20 3d 20 28 50 61  se *pParse = (Pa
f930: 72 73 65 2a 29 70 41 72 67 3b 0a 0a 20 20 73 77  rse*)pArg;..  sw
f940: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
f950: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
f960: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 61  OLUMN: {.      a
f970: 41 67 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41  Agg = pParse->aA
f980: 67 67 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d  gg;.      for(i=
f990: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67  0; i<pParse->nAg
f9a0: 67 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  g; i++){.       
f9b0: 20 69 66 28 20 61 41 67 67 5b 69 5d 2e 69 73 41   if( aAgg[i].isA
f9c0: 67 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20  gg ) continue;. 
f9d0: 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67 5b         if( aAgg[
f9e0: 69 5d 2e 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  i].pExpr->iTable
f9f0: 3d 3d 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 0a  ==pExpr->iTable.
fa00: 20 20 20 20 20 20 20 20 20 26 26 20 61 41 67 67           && aAgg
fa10: 5b 69 5d 2e 70 45 78 70 72 2d 3e 69 43 6f 6c 75  [i].pExpr->iColu
fa20: 6d 6e 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75  mn==pExpr->iColu
fa30: 6d 6e 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  mn ){.          
fa40: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
fa50: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
fa60: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
fa70: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 69 20  gg ){.        i 
fa80: 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66 6f 28  = appendAggInfo(
fa90: 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20  pParse);.       
faa0: 20 69 66 28 20 69 3c 30 20 29 20 72 65 74 75 72   if( i<0 ) retur
fab0: 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61  n 1;.        pPa
fac0: 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69 73 41  rse->aAgg[i].isA
fad0: 67 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 20 20  gg = 0;.        
fae0: 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e  pParse->aAgg[i].
faf0: 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a 20  pExpr = pExpr;. 
fb00: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 70 45 78       }.      pEx
fb10: 70 72 2d 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20  pr->iAgg = i;.  
fb20: 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20      return 1;.  
fb30: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
fb40: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a  AGG_FUNCTION: {.
fb50: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
fb60: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
fb70: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
fb80: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
fb90: 20 20 20 20 20 20 20 20 69 66 28 20 21 61 41 67          if( !aAg
fba0: 67 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e  g[i].isAgg ) con
fbb0: 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69  tinue;.        i
fbc0: 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  f( sqlite3ExprCo
fbd0: 6d 70 61 72 65 28 61 41 67 67 5b 69 5d 2e 70 45  mpare(aAgg[i].pE
fbe0: 78 70 72 2c 20 70 45 78 70 72 29 20 29 7b 0a 20  xpr, pExpr) ){. 
fbf0: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
fc00: 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20          }.      
fc10: 7d 0a 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70  }.      if( i>=p
fc20: 50 61 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20  Parse->nAgg ){. 
fc30: 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
fc40: 70 50 61 72 73 65 2d 3e 64 62 2d 3e 65 6e 63 3b  pParse->db->enc;
fc50: 0a 20 20 20 20 20 20 20 20 69 20 3d 20 61 70 70  .        i = app
fc60: 65 6e 64 41 67 67 49 6e 66 6f 28 70 50 61 72 73  endAggInfo(pPars
fc70: 65 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20  e);.        if( 
fc80: 69 3c 30 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  i<0 ) return 1;.
fc90: 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e          pParse->
fca0: 61 41 67 67 5b 69 5d 2e 69 73 41 67 67 20 3d 20  aAgg[i].isAgg = 
fcb0: 31 3b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  1;.        pPars
fcc0: 65 2d 3e 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  e->aAgg[i].pExpr
fcd0: 20 3d 20 70 45 78 70 72 3b 0a 20 20 20 20 20 20   = pExpr;.      
fce0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
fcf0: 5d 2e 70 46 75 6e 63 20 3d 20 73 71 6c 69 74 65  ].pFunc = sqlite
fd00: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
fd10: 61 72 73 65 2d 3e 64 62 2c 0a 20 20 20 20 20 20  arse->db,.      
fd20: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 74 6f         pExpr->to
fd30: 6b 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f  ken.z, pExpr->to
fd40: 6b 65 6e 2e 6e 2c 0a 20 20 20 20 20 20 20 20 20  ken.n,.         
fd50: 20 20 20 20 70 45 78 70 72 2d 3e 70 4c 69 73 74      pExpr->pList
fd60: 20 3f 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   ? pExpr->pList-
fd70: 3e 6e 45 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c  >nExpr : 0, enc,
fd80: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
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 72 65 74 75 72 6e   i;.      return
fdb0: 20 31 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20   1;.    }.  }.  
fdc0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
fdd0: 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68 65 20 67  ** Analyze the g
fde0: 69 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  iven expression 
fdf0: 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61 67 67 72  looking for aggr
fe00: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 73 20  egate functions 
fe10: 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61 72 69 61  and.** for varia
fe20: 62 6c 65 73 20 74 68 61 74 20 6e 65 65 64 20 74  bles that need t
fe30: 6f 20 62 65 20 61 64 64 65 64 20 74 6f 20 74 68  o be added to th
fe40: 65 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d  e pParse->aAgg[]
fe50: 20 61 72 72 61 79 2e 0a 2a 2a 20 4d 61 6b 65 20   array..** Make 
fe60: 61 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74 72 69  additional entri
fe70: 65 73 20 74 6f 20 74 68 65 20 70 50 61 72 73 65  es to the pParse
fe80: 2d 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 20 61  ->aAgg[] array a
fe90: 73 20 6e 65 63 65 73 73 61 72 79 2e 0a 2a 2a 0a  s necessary..**.
fea0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
feb0: 73 68 6f 75 6c 64 20 6f 6e 6c 79 20 62 65 20 63  should only be c
fec0: 61 6c 6c 65 64 20 61 66 74 65 72 20 74 68 65 20  alled after the 
fed0: 65 78 70 72 65 73 73 69 6f 6e 20 68 61 73 20 62  expression has b
fee0: 65 65 6e 0a 2a 2a 20 61 6e 61 6c 79 7a 65 64 20  een.** analyzed 
fef0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 52 65  by sqlite3ExprRe
ff00: 73 6f 6c 76 65 4e 61 6d 65 73 28 29 2e 0a 2a 2a  solveNames()..**
ff10: 0a 2a 2a 20 49 66 20 65 72 72 6f 72 73 20 61 72  .** If errors ar
ff20: 65 20 73 65 65 6e 2c 20 6c 65 61 76 65 20 61 6e  e seen, leave an
ff30: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
ff40: 6e 20 7a 45 72 72 4d 73 67 20 61 6e 64 20 72 65  n zErrMsg and re
ff50: 74 75 72 6e 0a 2a 2a 20 74 68 65 20 6e 75 6d 62  turn.** the numb
ff60: 65 72 20 6f 66 20 65 72 72 6f 72 73 2e 0a 2a 2f  er of errors..*/
ff70: 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72  .int sqlite3Expr
ff80: 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
ff90: 73 28 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c  s(Parse *pParse,
ffa0: 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20   Expr *pExpr){. 
ffb0: 20 69 6e 74 20 6e 45 72 72 20 3d 20 70 50 61 72   int nErr = pPar
ffc0: 73 65 2d 3e 6e 45 72 72 3b 0a 20 20 77 61 6c 6b  se->nErr;.  walk
ffd0: 45 78 70 72 54 72 65 65 28 70 45 78 70 72 2c 20  ExprTree(pExpr, 
ffe0: 61 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  analyzeAggregate
fff0: 2c 20 70 50 61 72 73 65 29 3b 0a 20 20 72 65 74  , pParse);.  ret
10000 75 72 6e 20 70 50 61 72 73 65 2d 3e 6e 45 72 72  urn pParse->nErr
10010 20 2d 20 6e 45 72 72 3b 0a 7d 0a 0a 2f 2a 0a 2a   - nErr;.}../*.*
10020 2a 20 4c 6f 63 61 74 65 20 61 20 75 73 65 72 20  * Locate a user 
10030 66 75 6e 63 74 69 6f 6e 20 67 69 76 65 6e 20 61  function given a
10040 20 6e 61 6d 65 2c 20 61 20 6e 75 6d 62 65 72 20   name, a number 
10050 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61 6e 64  of arguments and
10060 20 61 20 66 6c 61 67 0a 2a 2a 20 69 6e 64 69 63   a flag.** indic
10070 61 74 69 6e 67 20 77 68 65 74 68 65 72 20 74 68  ating whether th
10080 65 20 66 75 6e 63 74 69 6f 6e 20 70 72 65 66 65  e function prefe
10090 72 73 20 55 54 46 2d 31 36 20 6f 76 65 72 20 55  rs UTF-16 over U
100a0 54 46 2d 38 2e 20 20 52 65 74 75 72 6e 20 61 0a  TF-8.  Return a.
100b0 2a 2a 20 70 6f 69 6e 74 65 72 20 74 6f 20 74 68  ** pointer to th
100c0 65 20 46 75 6e 63 44 65 66 20 73 74 72 75 63 74  e FuncDef struct
100d0 75 72 65 20 74 68 61 74 20 64 65 66 69 6e 65 73  ure that defines
100e0 20 74 68 61 74 20 66 75 6e 63 74 69 6f 6e 2c 20   that function, 
100f0 6f 72 20 72 65 74 75 72 6e 0a 2a 2a 20 4e 55 4c  or return.** NUL
10100 4c 20 69 66 20 74 68 65 20 66 75 6e 63 74 69 6f  L if the functio
10110 6e 20 64 6f 65 73 20 6e 6f 74 20 65 78 69 73 74  n does not exist
10120 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 63  ..**.** If the c
10130 72 65 61 74 65 46 6c 61 67 20 61 72 67 75 6d 65  reateFlag argume
10140 6e 74 20 69 73 20 74 72 75 65 2c 20 74 68 65 6e  nt is true, then
10150 20 61 20 6e 65 77 20 28 62 6c 61 6e 6b 29 20 46   a new (blank) F
10160 75 6e 63 44 65 66 0a 2a 2a 20 73 74 72 75 63 74  uncDef.** struct
10170 75 72 65 20 69 73 20 63 72 65 61 74 65 64 20 61  ure is created a
10180 6e 64 20 6c 69 6b 65 64 20 69 6e 74 6f 20 74 68  nd liked into th
10190 65 20 22 64 62 22 20 73 74 72 75 63 74 75 72 65  e "db" structure
101a0 20 69 66 20 61 0a 2a 2a 20 6e 6f 20 6d 61 74 63   if a.** no matc
101b0 68 69 6e 67 20 66 75 6e 63 74 69 6f 6e 20 70 72  hing function pr
101c0 65 76 69 6f 75 73 6c 79 20 65 78 69 73 74 65 64  eviously existed
101d0 2e 20 20 57 68 65 6e 20 63 72 65 61 74 65 46 6c  .  When createFl
101e0 61 67 20 69 73 20 74 72 75 65 0a 2a 2a 20 61 6e  ag is true.** an
101f0 64 20 74 68 65 20 6e 41 72 67 20 70 61 72 61 6d  d the nArg param
10200 65 74 65 72 20 69 73 20 2d 31 2c 20 74 68 65 6e  eter is -1, then
10210 20 6f 6e 6c 79 20 61 20 66 75 6e 63 74 69 6f 6e   only a function
10220 20 74 68 61 74 20 61 63 63 65 70 74 73 0a 2a 2a   that accepts.**
10230 20 61 6e 79 20 6e 75 6d 62 65 72 20 6f 66 20 61   any number of a
10240 72 67 75 6d 65 6e 74 73 20 77 69 6c 6c 20 62 65  rguments will be
10250 20 72 65 74 75 72 6e 65 64 2e 0a 2a 2a 0a 2a 2a   returned..**.**
10260 20 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69   If createFlag i
10270 73 20 66 61 6c 73 65 20 61 6e 64 20 6e 41 72 67  s false and nArg
10280 20 69 73 20 2d 31 2c 20 74 68 65 6e 20 74 68 65   is -1, then the
10290 20 66 69 72 73 74 20 76 61 6c 69 64 0a 2a 2a 20   first valid.** 
102a0 66 75 6e 63 74 69 6f 6e 20 66 6f 75 6e 64 20 69  function found i
102b0 73 20 72 65 74 75 72 6e 65 64 2e 20 20 41 20 66  s returned.  A f
102c0 75 6e 63 74 69 6f 6e 20 69 73 20 76 61 6c 69 64  unction is valid
102d0 20 69 66 20 65 69 74 68 65 72 20 78 46 75 6e 63   if either xFunc
102e0 0a 2a 2a 20 6f 72 20 78 53 74 65 70 20 69 73 20  .** or xStep is 
102f0 6e 6f 6e 2d 7a 65 72 6f 2e 0a 2a 2a 0a 2a 2a 20  non-zero..**.** 
10300 49 66 20 63 72 65 61 74 65 46 6c 61 67 20 69 73  If createFlag is
10310 20 66 61 6c 73 65 2c 20 74 68 65 6e 20 61 20 66   false, then a f
10320 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
10330 20 72 65 71 75 69 72 65 64 20 6e 61 6d 65 20 61   required name a
10340 6e 64 0a 2a 2a 20 6e 75 6d 62 65 72 20 6f 66 20  nd.** number of 
10350 61 72 67 75 6d 65 6e 74 73 20 6d 61 79 20 62 65  arguments may be
10360 20 72 65 74 75 72 6e 65 64 20 65 76 65 6e 20 69   returned even i
10370 66 20 74 68 65 20 65 54 65 78 74 52 65 70 20 66  f the eTextRep f
10380 6c 61 67 20 64 6f 65 73 20 6e 6f 74 0a 2a 2a 20  lag does not.** 
10390 6d 61 74 63 68 20 74 68 61 74 20 72 65 71 75 65  match that reque
103a0 73 74 65 64 2e 0a 2a 2f 0a 46 75 6e 63 44 65 66  sted..*/.FuncDef
103b0 20 2a 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e   *sqlite3FindFun
103c0 63 74 69 6f 6e 28 0a 20 20 73 71 6c 69 74 65 33  ction(.  sqlite3
103d0 20 2a 64 62 2c 20 20 20 20 20 20 20 2f 2a 20 41   *db,       /* A
103e0 6e 20 6f 70 65 6e 20 64 61 74 61 62 61 73 65 20  n open database 
103f0 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  */.  const char 
10400 2a 7a 4e 61 6d 65 2c 20 2f 2a 20 4e 61 6d 65 20  *zName, /* Name 
10410 6f 66 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 2e  of the function.
10420 20 20 4e 6f 74 20 6e 75 6c 6c 2d 74 65 72 6d 69    Not null-termi
10430 6e 61 74 65 64 20 2a 2f 0a 20 20 69 6e 74 20 6e  nated */.  int n
10440 4e 61 6d 65 2c 20 20 20 20 20 20 20 20 20 2f 2a  Name,         /*
10450 20 4e 75 6d 62 65 72 20 6f 66 20 63 68 61 72 61   Number of chara
10460 63 74 65 72 73 20 69 6e 20 74 68 65 20 6e 61 6d  cters in the nam
10470 65 20 2a 2f 0a 20 20 69 6e 74 20 6e 41 72 67 2c  e */.  int nArg,
10480 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e 75 6d            /* Num
10490 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
104a0 2e 20 20 2d 31 20 6d 65 61 6e 73 20 61 6e 79 20  .  -1 means any 
104b0 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 75 38 20 65  number */.  u8 e
104c0 6e 63 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f  nc,            /
104d0 2a 20 50 72 65 66 65 72 72 65 64 20 74 65 78 74  * Preferred text
104e0 20 65 6e 63 6f 64 69 6e 67 20 2a 2f 0a 20 20 69   encoding */.  i
104f0 6e 74 20 63 72 65 61 74 65 46 6c 61 67 20 20 20  nt createFlag   
10500 20 20 2f 2a 20 43 72 65 61 74 65 20 6e 65 77 20    /* Create new 
10510 65 6e 74 72 79 20 69 66 20 74 72 75 65 20 61 6e  entry if true an
10520 64 20 64 6f 65 73 20 6e 6f 74 20 6f 74 68 65 72  d does not other
10530 77 69 73 65 20 65 78 69 73 74 20 2a 2f 0a 29 7b  wise exist */.){
10540 0a 20 20 46 75 6e 63 44 65 66 20 2a 70 3b 20 20  .  FuncDef *p;  
10550 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61 74         /* Iterat
10560 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a 20  or variable */. 
10570 20 46 75 6e 63 44 65 66 20 2a 70 46 69 72 73 74   FuncDef *pFirst
10580 3b 20 20 20 20 2f 2a 20 46 69 72 73 74 20 66 75  ;    /* First fu
10590 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 69 73  nction with this
105a0 20 6e 61 6d 65 20 2a 2f 0a 20 20 46 75 6e 63 44   name */.  FuncD
105b0 65 66 20 2a 70 42 65 73 74 20 3d 20 30 3b 20 2f  ef *pBest = 0; /
105c0 2a 20 42 65 73 74 20 6d 61 74 63 68 20 66 6f 75  * Best match fou
105d0 6e 64 20 73 6f 20 66 61 72 20 2a 2f 0a 20 20 69  nd so far */.  i
105e0 6e 74 20 62 65 73 74 6d 61 74 63 68 20 3d 20 30  nt bestmatch = 0
105f0 3b 20 20 0a 0a 0a 20 20 61 73 73 65 72 74 28 20  ;  ...  assert( 
10600 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 38  enc==SQLITE_UTF8
10610 20 7c 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f   || enc==SQLITE_
10620 55 54 46 31 36 4c 45 20 7c 7c 20 65 6e 63 3d 3d  UTF16LE || enc==
10630 53 51 4c 49 54 45 5f 55 54 46 31 36 42 45 20 29  SQLITE_UTF16BE )
10640 3b 0a 20 20 69 66 28 20 6e 41 72 67 3c 2d 31 20  ;.  if( nArg<-1 
10650 29 20 6e 41 72 67 20 3d 20 2d 31 3b 0a 0a 20 20  ) nArg = -1;..  
10660 70 46 69 72 73 74 20 3d 20 28 46 75 6e 63 44 65  pFirst = (FuncDe
10670 66 2a 29 73 71 6c 69 74 65 33 48 61 73 68 46 69  f*)sqlite3HashFi
10680 6e 64 28 26 64 62 2d 3e 61 46 75 6e 63 2c 20 7a  nd(&db->aFunc, z
10690 4e 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20  Name, nName);.  
106a0 66 6f 72 28 70 3d 70 46 69 72 73 74 3b 20 70 3b  for(p=pFirst; p;
106b0 20 70 3d 70 2d 3e 70 4e 65 78 74 29 7b 0a 20 20   p=p->pNext){.  
106c0 20 20 2f 2a 20 44 75 72 69 6e 67 20 74 68 65 20    /* During the 
106d0 73 65 61 72 63 68 20 66 6f 72 20 74 68 65 20 62  search for the b
106e0 65 73 74 20 66 75 6e 63 74 69 6f 6e 20 64 65 66  est function def
106f0 69 6e 69 74 69 6f 6e 2c 20 62 65 73 74 6d 61 74  inition, bestmat
10700 63 68 20 69 73 20 73 65 74 0a 20 20 20 20 2a 2a  ch is set.    **
10710 20 61 73 20 66 6f 6c 6c 6f 77 73 20 74 6f 20 69   as follows to i
10720 6e 64 69 63 61 74 65 20 74 68 65 20 71 75 61 6c  ndicate the qual
10730 69 74 79 20 6f 66 20 74 68 65 20 6d 61 74 63 68  ity of the match
10740 20 77 69 74 68 20 74 68 65 20 64 65 66 69 6e 69   with the defini
10750 74 69 6f 6e 0a 20 20 20 20 2a 2a 20 70 6f 69 6e  tion.    ** poin
10760 74 65 64 20 74 6f 20 62 79 20 70 42 65 73 74 3a  ted to by pBest:
10770 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 30  .    **.    ** 0
10780 3a 20 70 42 65 73 74 20 69 73 20 4e 55 4c 4c 2e  : pBest is NULL.
10790 20 4e 6f 20 6d 61 74 63 68 20 68 61 73 20 62 65   No match has be
107a0 65 6e 20 66 6f 75 6e 64 2e 0a 20 20 20 20 2a 2a  en found..    **
107b0 20 31 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   1: A variable a
107c0 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
107d0 6e 20 74 68 61 74 20 70 72 65 66 65 72 73 20 55  n that prefers U
107e0 54 46 2d 38 20 77 68 65 6e 20 61 20 55 54 46 2d  TF-8 when a UTF-
107f0 31 36 0a 20 20 20 20 2a 2a 20 20 20 20 65 6e 63  16.    **    enc
10800 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74  oding is request
10810 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
10820 61 2e 0a 20 20 20 20 2a 2a 20 32 3a 20 41 20 76  a..    ** 2: A v
10830 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
10840 73 20 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20  s function that 
10850 75 73 65 73 20 55 54 46 2d 31 36 42 45 20 77 68  uses UTF-16BE wh
10860 65 6e 20 55 54 46 2d 31 36 4c 45 20 69 73 0a 20  en UTF-16LE is. 
10870 20 20 20 2a 2a 20 20 20 20 72 65 71 75 65 73 74     **    request
10880 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
10890 61 2e 0a 20 20 20 20 2a 2a 20 33 3a 20 41 20 76  a..    ** 3: A v
108a0 61 72 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74  ariable argument
108b0 73 20 66 75 6e 63 74 69 6f 6e 20 75 73 69 6e 67  s function using
108c0 20 74 68 65 20 73 61 6d 65 20 74 65 78 74 20 65   the same text e
108d0 6e 63 6f 64 69 6e 67 2e 0a 20 20 20 20 2a 2a 20  ncoding..    ** 
108e0 34 3a 20 41 20 66 75 6e 63 74 69 6f 6e 20 77 69  4: A function wi
108f0 74 68 20 74 68 65 20 65 78 61 63 74 20 6e 75 6d  th the exact num
10900 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
10910 20 72 65 71 75 65 73 74 65 64 20 74 68 61 74 0a   requested that.
10920 20 20 20 20 2a 2a 20 20 20 20 70 72 65 66 65 72      **    prefer
10930 73 20 55 54 46 2d 38 20 77 68 65 6e 20 61 20 55  s UTF-8 when a U
10940 54 46 2d 31 36 20 65 6e 63 6f 64 69 6e 67 20 69  TF-16 encoding i
10950 73 20 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20  s requested, or 
10960 76 69 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20  vice versa..    
10970 2a 2a 20 35 3a 20 41 20 66 75 6e 63 74 69 6f 6e  ** 5: A function
10980 20 77 69 74 68 20 74 68 65 20 65 78 61 63 74 20   with the exact 
10990 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
109a0 6e 74 73 20 72 65 71 75 65 73 74 65 64 20 74 68  nts requested th
109b0 61 74 0a 20 20 20 20 2a 2a 20 20 20 20 70 72 65  at.    **    pre
109c0 66 65 72 73 20 55 54 46 2d 31 36 4c 45 20 77 68  fers UTF-16LE wh
109d0 65 6e 20 55 54 46 2d 31 36 42 45 20 69 73 20 72  en UTF-16BE is r
109e0 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69 63  equested, or vic
109f0 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a 20  e versa..    ** 
10a00 36 3a 20 41 6e 20 65 78 61 63 74 20 6d 61 74 63  6: An exact matc
10a10 68 2e 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  h..    **.    **
10a20 20 41 20 6c 61 72 67 65 72 20 76 61 6c 75 65 20   A larger value 
10a30 6f 66 20 27 6d 61 74 63 68 71 75 61 6c 27 20 69  of 'matchqual' i
10a40 6e 64 69 63 61 74 65 73 20 61 20 6d 6f 72 65 20  ndicates a more 
10a50 64 65 73 69 72 61 62 6c 65 20 6d 61 74 63 68 2e  desirable match.
10a60 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
10a70 70 2d 3e 6e 41 72 67 3d 3d 2d 31 20 7c 7c 20 70  p->nArg==-1 || p
10a80 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c 20  ->nArg==nArg || 
10a90 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20 20  nArg==-1 ){.    
10aa0 20 20 69 6e 74 20 6d 61 74 63 68 20 3d 20 31 3b    int match = 1;
10ab0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 51 75 61            /* Qua
10ac0 6c 69 74 79 20 6f 66 20 74 68 69 73 20 6d 61 74  lity of this mat
10ad0 63 68 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20  ch */.      if( 
10ae0 70 2d 3e 6e 41 72 67 3d 3d 6e 41 72 67 20 7c 7c  p->nArg==nArg ||
10af0 20 6e 41 72 67 3d 3d 2d 31 20 29 7b 0a 20 20 20   nArg==-1 ){.   
10b00 20 20 20 20 20 6d 61 74 63 68 20 3d 20 34 3b 0a       match = 4;.
10b10 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
10b20 28 20 65 6e 63 3d 3d 70 2d 3e 69 50 72 65 66 45  ( enc==p->iPrefE
10b30 6e 63 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61  nc ){.        ma
10b40 74 63 68 20 2b 3d 20 32 3b 0a 20 20 20 20 20 20  tch += 2;.      
10b50 7d 0a 20 20 20 20 20 20 65 6c 73 65 20 69 66 28  }.      else if(
10b60 20 28 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54   (enc==SQLITE_UT
10b70 46 31 36 4c 45 20 26 26 20 70 2d 3e 69 50 72 65  F16LE && p->iPre
10b80 66 45 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46  fEnc==SQLITE_UTF
10b90 31 36 42 45 29 20 7c 7c 0a 20 20 20 20 20 20 20  16BE) ||.       
10ba0 20 20 20 20 20 20 20 20 28 65 6e 63 3d 3d 53 51          (enc==SQ
10bb0 4c 49 54 45 5f 55 54 46 31 36 42 45 20 26 26 20  LITE_UTF16BE && 
10bc0 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c  p->iPrefEnc==SQL
10bd0 49 54 45 5f 55 54 46 31 36 4c 45 29 20 29 7b 0a  ITE_UTF16LE) ){.
10be0 20 20 20 20 20 20 20 20 6d 61 74 63 68 20 2b 3d          match +=
10bf0 20 31 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20   1;.      }..   
10c00 20 20 20 69 66 28 20 6d 61 74 63 68 3e 62 65 73     if( match>bes
10c10 74 6d 61 74 63 68 20 29 7b 0a 20 20 20 20 20 20  tmatch ){.      
10c20 20 20 70 42 65 73 74 20 3d 20 70 3b 0a 20 20 20    pBest = p;.   
10c30 20 20 20 20 20 62 65 73 74 6d 61 74 63 68 20 3d       bestmatch =
10c40 20 6d 61 74 63 68 3b 0a 20 20 20 20 20 20 7d 0a   match;.      }.
10c50 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20      }.  }..  /* 
10c60 49 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61  If the createFla
10c70 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 74  g parameter is t
10c80 72 75 65 2c 20 61 6e 64 20 74 68 65 20 73 65 61  rue, and the sea
10c90 63 68 20 64 69 64 20 6e 6f 74 20 72 65 76 65 61  ch did not revea
10ca0 6c 20 61 6e 0a 20 20 2a 2a 20 65 78 61 63 74 20  l an.  ** exact 
10cb0 6d 61 74 63 68 20 66 6f 72 20 74 68 65 20 6e 61  match for the na
10cc0 6d 65 2c 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  me, number of ar
10cd0 67 75 6d 65 6e 74 73 20 61 6e 64 20 65 6e 63 6f  guments and enco
10ce0 64 69 6e 67 2c 20 74 68 65 6e 20 61 64 64 20 61  ding, then add a
10cf0 0a 20 20 2a 2a 20 6e 65 77 20 65 6e 74 72 79 20  .  ** new entry 
10d00 74 6f 20 74 68 65 20 68 61 73 68 20 74 61 62 6c  to the hash tabl
10d10 65 20 61 6e 64 20 72 65 74 75 72 6e 20 69 74 2e  e and return it.
10d20 0a 20 20 2a 2f 0a 20 20 69 66 28 20 63 72 65 61  .  */.  if( crea
10d30 74 65 46 6c 61 67 20 26 26 20 62 65 73 74 6d 61  teFlag && bestma
10d40 74 63 68 3c 36 20 26 26 20 0a 20 20 20 20 20 20  tch<6 && .      
10d50 28 70 42 65 73 74 20 3d 20 73 71 6c 69 74 65 4d  (pBest = sqliteM
10d60 61 6c 6c 6f 63 28 73 69 7a 65 6f 66 28 2a 70 42  alloc(sizeof(*pB
10d70 65 73 74 29 2b 6e 4e 61 6d 65 2b 31 29 29 20 29  est)+nName+1)) )
10d80 7b 0a 20 20 20 20 70 42 65 73 74 2d 3e 6e 41 72  {.    pBest->nAr
10d90 67 20 3d 20 6e 41 72 67 3b 0a 20 20 20 20 70 42  g = nArg;.    pB
10da0 65 73 74 2d 3e 70 4e 65 78 74 20 3d 20 70 46 69  est->pNext = pFi
10db0 72 73 74 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e  rst;.    pBest->
10dc0 7a 4e 61 6d 65 20 3d 20 28 63 68 61 72 2a 29 26  zName = (char*)&
10dd0 70 42 65 73 74 5b 31 5d 3b 0a 20 20 20 20 70 42  pBest[1];.    pB
10de0 65 73 74 2d 3e 69 50 72 65 66 45 6e 63 20 3d 20  est->iPrefEnc = 
10df0 65 6e 63 3b 0a 20 20 20 20 6d 65 6d 63 70 79 28  enc;.    memcpy(
10e00 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 2c 20 7a 4e  pBest->zName, zN
10e10 61 6d 65 2c 20 6e 4e 61 6d 65 29 3b 0a 20 20 20  ame, nName);.   
10e20 20 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 5b 6e 4e   pBest->zName[nN
10e30 61 6d 65 5d 20 3d 20 30 3b 0a 20 20 20 20 69 66  ame] = 0;.    if
10e40 28 20 70 42 65 73 74 3d 3d 73 71 6c 69 74 65 33  ( pBest==sqlite3
10e50 48 61 73 68 49 6e 73 65 72 74 28 26 64 62 2d 3e  HashInsert(&db->
10e60 61 46 75 6e 63 2c 70 42 65 73 74 2d 3e 7a 4e 61  aFunc,pBest->zNa
10e70 6d 65 2c 6e 4e 61 6d 65 2c 28 76 6f 69 64 2a 29  me,nName,(void*)
10e80 70 42 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20  pBest) ){.      
10e90 73 71 6c 69 74 65 46 72 65 65 28 70 42 65 73 74  sqliteFree(pBest
10ea0 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
10eb0 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20 20  0;.    }.  }..  
10ec0 69 66 28 20 70 42 65 73 74 20 26 26 20 28 70 42  if( pBest && (pB
10ed0 65 73 74 2d 3e 78 53 74 65 70 20 7c 7c 20 70 42  est->xStep || pB
10ee0 65 73 74 2d 3e 78 46 75 6e 63 20 7c 7c 20 63 72  est->xFunc || cr
10ef0 65 61 74 65 46 6c 61 67 29 20 29 7b 0a 20 20 20  eateFlag) ){.   
10f00 20 72 65 74 75 72 6e 20 70 42 65 73 74 3b 0a 20   return pBest;. 
10f10 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
10f20 0a                                               .