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

Artifact 1b6b6b16bcb6a6dcc4a5df451d9e652f84b269ae:


0000: 2f 2a 0a 2a 2a 20 32 30 30 31 20 53 65 70 74 65  /*.** 2001 Septe
0010: 6d 62 65 72 20 31 35 0a 2a 2a 0a 2a 2a 20 54 68  mber 15.**.** Th
0020: 65 20 61 75 74 68 6f 72 20 64 69 73 63 6c 61 69  e author disclai
0030: 6d 73 20 63 6f 70 79 72 69 67 68 74 20 74 6f 20  ms copyright to 
0040: 74 68 69 73 20 73 6f 75 72 63 65 20 63 6f 64 65  this source code
0050: 2e 20 20 49 6e 20 70 6c 61 63 65 20 6f 66 0a 2a  .  In place of.*
0060: 2a 20 61 20 6c 65 67 61 6c 20 6e 6f 74 69 63 65  * a legal notice
0070: 2c 20 68 65 72 65 20 69 73 20 61 20 62 6c 65 73  , here is a bles
0080: 73 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 4d  sing:.**.**    M
0090: 61 79 20 79 6f 75 20 64 6f 20 67 6f 6f 64 20 61  ay you do good a
00a0: 6e 64 20 6e 6f 74 20 65 76 69 6c 2e 0a 2a 2a 20  nd not evil..** 
00b0: 20 20 20 4d 61 79 20 79 6f 75 20 66 69 6e 64 20     May you find 
00c0: 66 6f 72 67 69 76 65 6e 65 73 73 20 66 6f 72 20  forgiveness for 
00d0: 79 6f 75 72 73 65 6c 66 20 61 6e 64 20 66 6f 72  yourself and for
00e0: 67 69 76 65 20 6f 74 68 65 72 73 2e 0a 2a 2a 20  give others..** 
00f0: 20 20 20 4d 61 79 20 79 6f 75 20 73 68 61 72 65     May you share
0100: 20 66 72 65 65 6c 79 2c 20 6e 65 76 65 72 20 74   freely, never t
0110: 61 6b 69 6e 67 20 6d 6f 72 65 20 74 68 61 6e 20  aking more than 
0120: 79 6f 75 20 67 69 76 65 2e 0a 2a 2a 0a 2a 2a 2a  you give..**.***
0130: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0140: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0150: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0160: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
0170: 2a 2a 2a 2a 2a 2a 0a 2a 2a 20 54 68 69 73 20 66  ******.** This f
0180: 69 6c 65 20 63 6f 6e 74 61 69 6e 73 20 72 6f 75  ile contains rou
0190: 74 69 6e 65 73 20 75 73 65 64 20 66 6f 72 20 61  tines used for a
01a0: 6e 61 6c 79 7a 69 6e 67 20 65 78 70 72 65 73 73  nalyzing express
01b0: 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20  ions and.** for 
01c0: 67 65 6e 65 72 61 74 69 6e 67 20 56 44 42 45 20  generating VDBE 
01d0: 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c 75 61  code that evalua
01e0: 74 65 73 20 65 78 70 72 65 73 73 69 6f 6e 73 20  tes expressions 
01f0: 69 6e 20 53 51 4c 69 74 65 2e 0a 2a 2a 0a 2a 2a  in SQLite..**.**
0200: 20 24 49 64 3a 20 65 78 70 72 2e 63 2c 76 20 31   $Id: expr.c,v 1
0210: 2e 31 39 32 20 32 30 30 35 2f 30 32 2f 30 35 20  .192 2005/02/05 
0220: 31 32 3a 34 38 3a 34 38 20 64 61 6e 69 65 6c 6b  12:48:48 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 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
3860: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
3870: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
3880: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
3890: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
38a0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
38b0: 53 72 63 4c 69 73 74 44 75 70 28 53 72 63 4c 69  SrcListDup(SrcLi
38c0: 73 74 20 2a 70 29 7b 0a 20 20 53 72 63 4c 69 73  st *p){.  SrcLis
38d0: 74 20 2a 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69  t *pNew;.  int i
38e0: 3b 0a 20 20 69 6e 74 20 6e 42 79 74 65 3b 0a 20  ;.  int nByte;. 
38f0: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3900: 72 6e 20 30 3b 0a 20 20 6e 42 79 74 65 20 3d 20  rn 0;.  nByte = 
3910: 73 69 7a 65 6f 66 28 2a 70 29 20 2b 20 28 70 2d  sizeof(*p) + (p-
3920: 3e 6e 53 72 63 3e 30 20 3f 20 73 69 7a 65 6f 66  >nSrc>0 ? sizeof
3930: 28 70 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e  (p->a[0]) * (p->
3940: 6e 53 72 63 2d 31 29 20 3a 20 30 29 3b 0a 20 20  nSrc-1) : 0);.  
3950: 70 4e 65 77 20 3d 20 73 71 6c 69 74 65 4d 61 6c  pNew = sqliteMal
3960: 6c 6f 63 52 61 77 28 20 6e 42 79 74 65 20 29 3b  locRaw( nByte );
3970: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3980: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3990: 77 2d 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e  w->nSrc = pNew->
39a0: 6e 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63  nAlloc = p->nSrc
39b0: 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  ;.  for(i=0; i<p
39c0: 2d 3e 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20  ->nSrc; i++){.  
39d0: 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74    struct SrcList
39e0: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
39f0: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3a00: 20 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73     struct SrcLis
3a10: 74 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d  t_item *pOldItem
3a20: 20 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20   = &p->a[i];.   
3a30: 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 44 61 74 61   pNewItem->zData
3a40: 62 61 73 65 20 3d 20 73 71 6c 69 74 65 53 74 72  base = sqliteStr
3a50: 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 44  Dup(pOldItem->zD
3a60: 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70 4e  atabase);.    pN
3a70: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
3a80: 73 71 6c 69 74 65 53 74 72 44 75 70 28 70 4f 6c  sqliteStrDup(pOl
3a90: 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20  dItem->zName);. 
3aa0: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 7a 41 6c     pNewItem->zAl
3ab0: 69 61 73 20 3d 20 73 71 6c 69 74 65 53 74 72 44  ias = sqliteStrD
3ac0: 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c  up(pOldItem->zAl
3ad0: 69 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ias);.    pNewIt
3ae0: 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70  em->jointype = p
3af0: 4f 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70  OldItem->jointyp
3b00: 65 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  e;.    pNewItem-
3b10: 3e 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49  >iCursor = pOldI
3b20: 74 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20  tem->iCursor;.  
3b30: 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62    pNewItem->pTab
3b40: 20 3d 20 30 3b 0a 20 20 20 20 70 4e 65 77 49 74   = 0;.    pNewIt
3b50: 65 6d 2d 3e 70 53 65 6c 65 63 74 20 3d 20 73 71  em->pSelect = sq
3b60: 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70  lite3SelectDup(p
3b70: 4f 6c 64 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74  OldItem->pSelect
3b80: 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d  );.    pNewItem-
3b90: 3e 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78  >pOn = sqlite3Ex
3ba0: 70 72 44 75 70 28 70 4f 6c 64 49 74 65 6d 2d 3e  prDup(pOldItem->
3bb0: 70 4f 6e 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  pOn);.    pNewIt
3bc0: 65 6d 2d 3e 70 55 73 69 6e 67 20 3d 20 73 71 6c  em->pUsing = sql
3bd0: 69 74 65 33 49 64 4c 69 73 74 44 75 70 28 70 4f  ite3IdListDup(pO
3be0: 6c 64 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b  ldItem->pUsing);
3bf0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63  .    pNewItem->c
3c00: 6f 6c 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65  olUsed = pOldIte
3c10: 6d 2d 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a  m->colUsed;.  }.
3c20: 20 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d    return pNew;.}
3c30: 0a 49 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  .IdList *sqlite3
3c40: 49 64 4c 69 73 74 44 75 70 28 49 64 4c 69 73 74  IdListDup(IdList
3c50: 20 2a 70 29 7b 0a 20 20 49 64 4c 69 73 74 20 2a   *p){.  IdList *
3c60: 70 4e 65 77 3b 0a 20 20 69 6e 74 20 69 3b 0a 20  pNew;.  int i;. 
3c70: 20 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75   if( p==0 ) retu
3c80: 72 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73  rn 0;.  pNew = s
3c90: 71 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20  qliteMallocRaw( 
3ca0: 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29 3b  sizeof(*pNew) );
3cb0: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
3cc0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
3cd0: 77 2d 3e 6e 49 64 20 3d 20 70 4e 65 77 2d 3e 6e  w->nId = pNew->n
3ce0: 41 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 49 64 3b 0a  Alloc = p->nId;.
3cf0: 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71 6c 69    pNew->a = sqli
3d00: 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 70 2d 3e  teMallocRaw( p->
3d10: 6e 49 64 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b  nId*sizeof(p->a[
3d20: 30 5d 29 20 29 3b 0a 20 20 69 66 28 20 70 4e 65  0]) );.  if( pNe
3d30: 77 2d 3e 61 3d 3d 30 20 29 20 72 65 74 75 72 6e  w->a==0 ) return
3d40: 20 30 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69   0;.  for(i=0; i
3d50: 3c 70 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20  <p->nId; i++){. 
3d60: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3d70: 5f 69 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20  _item *pNewItem 
3d80: 3d 20 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20  = &pNew->a[i];. 
3d90: 20 20 20 73 74 72 75 63 74 20 49 64 4c 69 73 74     struct IdList
3da0: 5f 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20  _item *pOldItem 
3db0: 3d 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20  = &p->a[i];.    
3dc0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20  pNewItem->zName 
3dd0: 3d 20 73 71 6c 69 74 65 53 74 72 44 75 70 28 70  = sqliteStrDup(p
3de0: 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b  OldItem->zName);
3df0: 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69  .    pNewItem->i
3e00: 64 78 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  dx = pOldItem->i
3e10: 64 78 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  dx;.  }.  return
3e20: 20 70 4e 65 77 3b 0a 7d 0a 53 65 6c 65 63 74 20   pNew;.}.Select 
3e30: 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75  *sqlite3SelectDu
3e40: 70 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20  p(Select *p){.  
3e50: 53 65 6c 65 63 74 20 2a 70 4e 65 77 3b 0a 20 20  Select *pNew;.  
3e60: 69 66 28 20 70 3d 3d 30 20 29 20 72 65 74 75 72  if( p==0 ) retur
3e70: 6e 20 30 3b 0a 20 20 70 4e 65 77 20 3d 20 73 71  n 0;.  pNew = sq
3e80: 6c 69 74 65 4d 61 6c 6c 6f 63 52 61 77 28 20 73  liteMallocRaw( s
3e90: 69 7a 65 6f 66 28 2a 70 29 20 29 3b 0a 20 20 69  izeof(*p) );.  i
3ea0: 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74  f( pNew==0 ) ret
3eb0: 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69  urn 0;.  pNew->i
3ec0: 73 44 69 73 74 69 6e 63 74 20 3d 20 70 2d 3e 69  sDistinct = p->i
3ed0: 73 44 69 73 74 69 6e 63 74 3b 0a 20 20 70 4e 65  sDistinct;.  pNe
3ee0: 77 2d 3e 70 45 4c 69 73 74 20 3d 20 73 71 6c 69  w->pEList = sqli
3ef0: 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28 70  te3ExprListDup(p
3f00: 2d 3e 70 45 4c 69 73 74 29 3b 0a 20 20 70 4e 65  ->pEList);.  pNe
3f10: 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c 69 74 65  w->pSrc = sqlite
3f20: 33 53 72 63 4c 69 73 74 44 75 70 28 70 2d 3e 70  3SrcListDup(p->p
3f30: 53 72 63 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57  Src);.  pNew->pW
3f40: 68 65 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78  here = sqlite3Ex
3f50: 70 72 44 75 70 28 70 2d 3e 70 57 68 65 72 65 29  prDup(p->pWhere)
3f60: 3b 0a 20 20 70 4e 65 77 2d 3e 70 47 72 6f 75 70  ;.  pNew->pGroup
3f70: 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  By = sqlite3Expr
3f80: 4c 69 73 74 44 75 70 28 70 2d 3e 70 47 72 6f 75  ListDup(p->pGrou
3f90: 70 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 48  pBy);.  pNew->pH
3fa0: 61 76 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 45  aving = sqlite3E
3fb0: 78 70 72 44 75 70 28 70 2d 3e 70 48 61 76 69 6e  xprDup(p->pHavin
3fc0: 67 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64  g);.  pNew->pOrd
3fd0: 65 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78  erBy = sqlite3Ex
3fe0: 70 72 4c 69 73 74 44 75 70 28 70 2d 3e 70 4f 72  prListDup(p->pOr
3ff0: 64 65 72 42 79 29 3b 0a 20 20 70 4e 65 77 2d 3e  derBy);.  pNew->
4000: 6f 70 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 70 4e  op = p->op;.  pN
4010: 65 77 2d 3e 70 50 72 69 6f 72 20 3d 20 73 71 6c  ew->pPrior = sql
4020: 69 74 65 33 53 65 6c 65 63 74 44 75 70 28 70 2d  ite3SelectDup(p-
4030: 3e 70 50 72 69 6f 72 29 3b 0a 20 20 70 4e 65 77  >pPrior);.  pNew
4040: 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69 74  ->pLimit = sqlit
4050: 65 33 45 78 70 72 44 75 70 28 70 2d 3e 70 4c 69  e3ExprDup(p->pLi
4060: 6d 69 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f  mit);.  pNew->pO
4070: 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33 45  ffset = sqlite3E
4080: 78 70 72 44 75 70 28 70 2d 3e 70 4f 66 66 73 65  xprDup(p->pOffse
4090: 74 29 3b 0a 20 20 70 4e 65 77 2d 3e 69 4c 69 6d  t);.  pNew->iLim
40a0: 69 74 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  it = -1;.  pNew-
40b0: 3e 69 4f 66 66 73 65 74 20 3d 20 2d 31 3b 0a 20  >iOffset = -1;. 
40c0: 20 70 4e 65 77 2d 3e 70 70 4f 70 65 6e 54 65 6d   pNew->ppOpenTem
40d0: 70 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 70  p = 0;.  pNew->p
40e0: 46 65 74 63 68 20 3d 20 30 3b 0a 20 20 70 4e 65  Fetch = 0;.  pNe
40f0: 77 2d 3e 69 73 52 65 73 6f 6c 76 65 64 20 3d 20  w->isResolved = 
4100: 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 73 41 67 67  0;.  pNew->isAgg
4110: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 70   = 0;.  return p
4120: 4e 65 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c  New;.}.#else.Sel
4130: 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65  ect *sqlite3Sele
4140: 63 74 44 75 70 28 53 65 6c 65 63 74 20 2a 70 29  ctDup(Select *p)
4150: 7b 0a 20 20 61 73 73 65 72 74 28 20 70 3d 3d 30  {.  assert( p==0
4160: 20 29 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a   );.  return 0;.
4170: 7d 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a  }.#endif.../*.**
4180: 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65 6d 65   Add a new eleme
4190: 6e 74 20 74 6f 20 74 68 65 20 65 6e 64 20 6f 66  nt to the end of
41a0: 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c   an expression l
41b0: 69 73 74 2e 20 20 49 66 20 70 4c 69 73 74 20 69  ist.  If pList i
41c0: 73 0a 2a 2a 20 69 6e 69 74 69 61 6c 6c 79 20 4e  s.** initially N
41d0: 55 4c 4c 2c 20 74 68 65 6e 20 63 72 65 61 74 65  ULL, then create
41e0: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
41f0: 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 45 78 70 72 4c  n list..*/.ExprL
4200: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
4210: 4c 69 73 74 41 70 70 65 6e 64 28 45 78 70 72 4c  ListAppend(ExprL
4220: 69 73 74 20 2a 70 4c 69 73 74 2c 20 45 78 70 72  ist *pList, Expr
4230: 20 2a 70 45 78 70 72 2c 20 54 6f 6b 65 6e 20 2a   *pExpr, Token *
4240: 70 4e 61 6d 65 29 7b 0a 20 20 69 66 28 20 70 4c  pName){.  if( pL
4250: 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20 70 4c  ist==0 ){.    pL
4260: 69 73 74 20 3d 20 73 71 6c 69 74 65 4d 61 6c 6c  ist = sqliteMall
4270: 6f 63 28 20 73 69 7a 65 6f 66 28 45 78 70 72 4c  oc( sizeof(ExprL
4280: 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20  ist) );.    if( 
4290: 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pList==0 ){.    
42a0: 20 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72    /* sqlite3Expr
42b0: 44 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f  Delete(pExpr); /
42c0: 2f 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66  / Leak memory if
42d0: 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f   malloc fails */
42e0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30 3b  .      return 0;
42f0: 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73 65 72  .    }.    asser
4300: 74 28 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63  t( pList->nAlloc
4310: 3d 3d 30 20 29 3b 0a 20 20 7d 0a 20 20 69 66 28  ==0 );.  }.  if(
4320: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3c 3d   pList->nAlloc<=
4330: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 29 7b 0a  pList->nExpr ){.
4340: 20 20 20 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f      pList->nAllo
4350: 63 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f  c = pList->nAllo
4360: 63 2a 32 20 2b 20 34 3b 0a 20 20 20 20 70 4c 69  c*2 + 4;.    pLi
4370: 73 74 2d 3e 61 20 3d 20 73 71 6c 69 74 65 52 65  st->a = sqliteRe
4380: 61 6c 6c 6f 63 28 70 4c 69 73 74 2d 3e 61 2c 20  alloc(pList->a, 
4390: 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 2a 73 69  pList->nAlloc*si
43a0: 7a 65 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d  zeof(pList->a[0]
43b0: 29 29 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73  ));.    if( pLis
43c0: 74 2d 3e 61 3d 3d 30 20 29 7b 0a 20 20 20 20 20  t->a==0 ){.     
43d0: 20 2f 2a 20 73 71 6c 69 74 65 33 45 78 70 72 44   /* sqlite3ExprD
43e0: 65 6c 65 74 65 28 70 45 78 70 72 29 3b 20 2f 2f  elete(pExpr); //
43f0: 20 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 69 66 20   Leak memory if 
4400: 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a  malloc fails */.
4410: 20 20 20 20 20 20 70 4c 69 73 74 2d 3e 6e 45 78        pList->nEx
4420: 70 72 20 3d 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c  pr = pList->nAll
4430: 6f 63 20 3d 20 30 3b 0a 20 20 20 20 20 20 72 65  oc = 0;.      re
4440: 74 75 72 6e 20 70 4c 69 73 74 3b 0a 20 20 20 20  turn pList;.    
4450: 7d 0a 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20  }.  }.  assert( 
4460: 70 4c 69 73 74 2d 3e 61 21 3d 30 20 29 3b 0a 20  pList->a!=0 );. 
4470: 20 69 66 28 20 70 45 78 70 72 20 7c 7c 20 70 4e   if( pExpr || pN
4480: 61 6d 65 20 29 7b 0a 20 20 20 20 73 74 72 75 63  ame ){.    struc
4490: 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
44a0: 2a 70 49 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d  *pItem = &pList-
44b0: 3e 61 5b 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2b  >a[pList->nExpr+
44c0: 2b 5d 3b 0a 20 20 20 20 6d 65 6d 73 65 74 28 70  +];.    memset(p
44d0: 49 74 65 6d 2c 20 30 2c 20 73 69 7a 65 6f 66 28  Item, 0, sizeof(
44e0: 2a 70 49 74 65 6d 29 29 3b 0a 20 20 20 20 70 49  *pItem));.    pI
44f0: 74 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78  tem->pExpr = pEx
4500: 70 72 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a  pr;.    pItem->z
4510: 4e 61 6d 65 20 3d 20 73 71 6c 69 74 65 33 4e 61  Name = sqlite3Na
4520: 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 4e 61 6d  meFromToken(pNam
4530: 65 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  e);.  }.  return
4540: 20 70 4c 69 73 74 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a   pList;.}../*.**
4550: 20 44 65 6c 65 74 65 20 61 6e 20 65 6e 74 69 72   Delete an entir
4560: 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  e expression lis
4570: 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  t..*/.void sqlit
4580: 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74 65  e3ExprListDelete
4590: 28 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74  (ExprList *pList
45a0: 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
45b0: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
45c0: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69 66 28  em *pItem;.  if(
45d0: 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74 75   pList==0 ) retu
45e0: 72 6e 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c  rn;.  assert( pL
45f0: 69 73 74 2d 3e 61 21 3d 30 20 7c 7c 20 28 70 4c  ist->a!=0 || (pL
4600: 69 73 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 26 26  ist->nExpr==0 &&
4610: 20 70 4c 69 73 74 2d 3e 6e 41 6c 6c 6f 63 3d 3d   pList->nAlloc==
4620: 30 29 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  0) );.  assert( 
4630: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3c 3d 70 4c  pList->nExpr<=pL
4640: 69 73 74 2d 3e 6e 41 6c 6c 6f 63 20 29 3b 0a 20  ist->nAlloc );. 
4650: 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c 69 73 74   for(pItem=pList
4660: 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 70 4c 69 73  ->a, i=0; i<pLis
4670: 74 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 2c 20 70  t->nExpr; i++, p
4680: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c  Item++){.    sql
4690: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 70  ite3ExprDelete(p
46a0: 49 74 65 6d 2d 3e 70 45 78 70 72 29 3b 0a 20 20  Item->pExpr);.  
46b0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 49 74    sqliteFree(pIt
46c0: 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 7d 0a  em->zName);.  }.
46d0: 20 20 73 71 6c 69 74 65 46 72 65 65 28 70 4c 69    sqliteFree(pLi
46e0: 73 74 2d 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65  st->a);.  sqlite
46f0: 46 72 65 65 28 70 4c 69 73 74 29 3b 0a 7d 0a 0a  Free(pList);.}..
4700: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
4710: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
4720: 43 61 6c 6c 20 78 46 75 6e 63 20 66 6f 72 20 65  Call xFunc for e
4730: 61 63 68 20 6e 6f 64 65 20 76 69 73 69 74 65 64  ach node visited
4740: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72 65 74 75  ..**.** The retu
4750: 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d 20 78 46  rn value from xF
4760: 75 6e 63 20 64 65 74 65 72 6d 69 6e 65 73 20 77  unc determines w
4770: 68 65 74 68 65 72 20 74 68 65 20 74 72 65 65 20  hether the tree 
4780: 77 61 6c 6b 20 63 6f 6e 74 69 6e 75 65 73 2e 0a  walk continues..
4790: 2a 2a 20 30 20 6d 65 61 6e 73 20 63 6f 6e 74 69  ** 0 means conti
47a0: 6e 75 65 20 77 61 6c 6b 69 6e 67 20 74 68 65 20  nue walking the 
47b0: 74 72 65 65 2e 20 20 31 20 6d 65 61 6e 73 20 64  tree.  1 means d
47c0: 6f 20 6e 6f 74 20 77 61 6c 6b 20 63 68 69 6c 64  o not walk child
47d0: 72 65 6e 0a 2a 2a 20 6f 66 20 74 68 65 20 63 75  ren.** of the cu
47e0: 72 72 65 6e 74 20 6e 6f 64 65 20 62 75 74 20 63  rrent node but c
47f0: 6f 6e 74 69 6e 75 65 20 77 69 74 68 20 73 69 62  ontinue with sib
4800: 6c 69 6e 67 73 2e 20 20 32 20 6d 65 61 6e 73 20  lings.  2 means 
4810: 61 62 61 6e 64 6f 6e 0a 2a 2a 20 74 68 65 20 74  abandon.** the t
4820: 72 65 65 20 77 61 6c 6b 20 63 6f 6d 70 6c 65 74  ree walk complet
4830: 65 6c 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 72  ely..**.** The r
4840: 65 74 75 72 6e 20 76 61 6c 75 65 20 66 72 6f 6d  eturn value from
4850: 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   this routine is
4860: 20 31 20 74 6f 20 61 62 61 6e 64 6f 6e 20 74 68   1 to abandon th
4870: 65 20 74 72 65 65 20 77 61 6c 6b 0a 2a 2a 20 61  e tree walk.** a
4880: 6e 64 20 30 20 74 6f 20 63 6f 6e 74 69 6e 75 65  nd 0 to continue
4890: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
48a0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 45 78 70  walkExprTree(Exp
48b0: 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 28 2a  r *pExpr, int (*
48c0: 78 46 75 6e 63 29 28 76 6f 69 64 2a 2c 45 78 70  xFunc)(void*,Exp
48d0: 72 2a 29 2c 20 76 6f 69 64 20 2a 70 41 72 67 29  r*), void *pArg)
48e0: 7b 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  {.  ExprList *pL
48f0: 69 73 74 3b 0a 20 20 69 6e 74 20 72 63 3b 0a 20  ist;.  int rc;. 
4900: 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20   if( pExpr==0 ) 
4910: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 63 20 3d  return 0;.  rc =
4920: 20 28 2a 78 46 75 6e 63 29 28 70 41 72 67 2c 20   (*xFunc)(pArg, 
4930: 70 45 78 70 72 29 3b 0a 20 20 69 66 28 20 72 63  pExpr);.  if( rc
4940: 3d 3d 30 20 29 7b 0a 20 20 20 20 69 66 28 20 77  ==0 ){.    if( w
4950: 61 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70  alkExprTree(pExp
4960: 72 2d 3e 70 4c 65 66 74 2c 20 78 46 75 6e 63 2c  r->pLeft, xFunc,
4970: 20 70 41 72 67 29 20 29 20 72 65 74 75 72 6e 20   pArg) ) return 
4980: 31 3b 0a 20 20 20 20 69 66 28 20 77 61 6c 6b 45  1;.    if( walkE
4990: 78 70 72 54 72 65 65 28 70 45 78 70 72 2d 3e 70  xprTree(pExpr->p
49a0: 52 69 67 68 74 2c 20 78 46 75 6e 63 2c 20 70 41  Right, xFunc, pA
49b0: 72 67 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a  rg) ) return 1;.
49c0: 20 20 20 20 70 4c 69 73 74 20 3d 20 70 45 78 70      pList = pExp
49d0: 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20 69 66  r->pList;.    if
49e0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  ( pList ){.     
49f0: 20 69 6e 74 20 69 3b 0a 20 20 20 20 20 20 73 74   int i;.      st
4a00: 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74  ruct ExprList_it
4a10: 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20 20  em *pItem;.     
4a20: 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e 45   for(i=pList->nE
4a30: 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73 74  xpr, pItem=pList
4a40: 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20 70  ->a; i>0; i--, p
4a50: 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20 20  Item++){.       
4a60: 20 69 66 28 20 77 61 6c 6b 45 78 70 72 54 72 65   if( walkExprTre
4a70: 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20  e(pItem->pExpr, 
4a80: 78 46 75 6e 63 2c 20 70 41 72 67 29 20 29 20 72  xFunc, pArg) ) r
4a90: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
4aa0: 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
4ab0: 75 72 6e 20 72 63 3e 31 3b 0a 7d 0a 0a 2f 2a 0a  urn rc>1;.}../*.
4ac0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
4ad0: 69 73 20 64 65 73 69 67 6e 65 64 20 61 73 20 61  is designed as a
4ae0: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
4af0: 45 78 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a  ExprTree()..**.*
4b00: 2a 20 70 41 72 67 20 69 73 20 72 65 61 6c 6c 79  * pArg is really
4b10: 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 61 6e   a pointer to an
4b20: 20 69 6e 74 65 67 65 72 2e 20 20 49 66 20 77 65   integer.  If we
4b30: 20 63 61 6e 20 74 65 6c 6c 20 62 79 20 6c 6f 6f   can tell by loo
4b40: 6b 69 6e 67 0a 2a 2a 20 61 74 20 70 45 78 70 72  king.** at pExpr
4b50: 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65 73   that the expres
4b60: 73 69 6f 6e 20 74 68 61 74 20 63 6f 6e 74 61 69  sion that contai
4b70: 6e 73 20 70 45 78 70 72 20 69 73 20 6e 6f 74 20  ns pExpr is not 
4b80: 61 20 63 6f 6e 73 74 61 6e 74 0a 2a 2a 20 65 78  a constant.** ex
4b90: 70 72 65 73 73 69 6f 6e 2c 20 74 68 65 6e 20 73  pression, then s
4ba0: 65 74 20 2a 70 41 72 67 20 74 6f 20 30 20 61 6e  et *pArg to 0 an
4bb0: 64 20 72 65 74 75 72 6e 20 32 20 74 6f 20 61 62  d return 2 to ab
4bc0: 61 6e 64 6f 6e 20 74 68 65 20 74 72 65 65 20 77  andon the tree w
4bd0: 61 6c 6b 2e 0a 2a 2a 20 49 66 20 70 45 78 70 72  alk..** If pExpr
4be0: 20 64 6f 65 73 20 64 6f 65 73 20 6e 6f 74 20 64   does does not d
4bf0: 69 73 71 75 61 6c 69 66 79 20 74 68 65 20 65 78  isqualify the ex
4c00: 70 72 65 73 73 69 6f 6e 20 66 72 6f 6d 20 62 65  pression from be
4c10: 69 6e 67 20 61 20 63 6f 6e 73 74 61 6e 74 0a 2a  ing a constant.*
4c20: 2a 20 74 68 65 6e 20 64 6f 20 6e 6f 74 68 69 6e  * then do nothin
4c30: 67 2e 0a 2a 2a 0a 2a 2a 20 41 66 74 65 72 20 77  g..**.** After w
4c40: 61 6c 6b 69 6e 67 20 74 68 65 20 77 68 6f 6c 65  alking the whole
4c50: 20 74 72 65 65 2c 20 69 66 20 6e 6f 20 6e 6f 64   tree, if no nod
4c60: 65 73 20 61 72 65 20 66 6f 75 6e 64 20 74 68 61  es are found tha
4c70: 74 20 64 69 73 71 75 61 6c 69 66 79 0a 2a 2a 20  t disqualify.** 
4c80: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 61  the expression a
4c90: 73 20 63 6f 6e 73 74 61 6e 74 2c 20 74 68 65 6e  s constant, then
4ca0: 20 77 65 20 61 73 73 75 6d 65 20 74 68 65 20 77   we assume the w
4cb0: 68 6f 6c 65 20 65 78 70 72 65 73 73 69 6f 6e 0a  hole expression.
4cc0: 2a 2a 20 69 73 20 63 6f 6e 73 74 61 6e 74 2e 20  ** is constant. 
4cd0: 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70 72   See sqlite3Expr
4ce0: 49 73 43 6f 6e 73 74 61 6e 74 28 29 20 66 6f 72  IsConstant() for
4cf0: 20 61 64 64 69 74 69 6f 6e 61 6c 20 69 6e 66 6f   additional info
4d00: 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a 73 74 61 74  rmation..*/.stat
4d10: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
4d20: 73 43 6f 6e 73 74 61 6e 74 28 76 6f 69 64 20 2a  sConstant(void *
4d30: 70 41 72 67 2c 20 45 78 70 72 20 2a 70 45 78 70  pArg, Expr *pExp
4d40: 72 29 7b 0a 20 20 73 77 69 74 63 68 28 20 70 45  r){.  switch( pE
4d50: 78 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63  xpr->op ){.    c
4d60: 61 73 65 20 54 4b 5f 49 44 3a 0a 20 20 20 20 63  ase TK_ID:.    c
4d70: 61 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20  ase TK_COLUMN:. 
4d80: 20 20 20 63 61 73 65 20 54 4b 5f 44 4f 54 3a 0a     case TK_DOT:.
4d90: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f      case TK_AGG_
4da0: 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20 63 61  FUNCTION:.    ca
4db0: 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 0a  se TK_FUNCTION:.
4dc0: 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
4dd0: 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20  MIT_SUBQUERY.   
4de0: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
4df0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 58 49  .    case TK_EXI
4e00: 53 54 53 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20  STS:.#endif.    
4e10: 20 20 2a 28 28 69 6e 74 2a 29 70 41 72 67 29 20    *((int*)pArg) 
4e20: 3d 20 30 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = 0;.      retur
4e30: 6e 20 32 3b 0a 20 20 20 20 64 65 66 61 75 6c 74  n 2;.    default
4e40: 3a 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 30  :.      return 0
4e50: 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57  ;.  }.}../*.** W
4e60: 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f  alk an expressio
4e70: 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20  n tree.  Return 
4e80: 31 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73  1 if the express
4e90: 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a  ion is constant.
4ea0: 2a 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69  ** and 0 if it i
4eb0: 6e 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65  nvolves variable
4ec0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
4ed0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
4ee0: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
4ef0: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
4f00: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
4f10: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
4f20: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
4f30: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
4f40: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
4f50: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
4f60: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
4f70: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
4f80: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
4f90: 20 69 73 43 6f 6e 73 74 20 3d 20 31 3b 0a 20 20   isConst = 1;.  
4fa0: 77 61 6c 6b 45 78 70 72 54 72 65 65 28 70 2c 20  walkExprTree(p, 
4fb0: 65 78 70 72 4e 6f 64 65 49 73 43 6f 6e 73 74 61  exprNodeIsConsta
4fc0: 6e 74 2c 20 26 69 73 43 6f 6e 73 74 29 3b 0a 20  nt, &isConst);. 
4fd0: 20 72 65 74 75 72 6e 20 69 73 43 6f 6e 73 74 3b   return isConst;
4fe0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
4ff0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
5000: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
5010: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
5020: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
5030: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
5040: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
5050: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
5060: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
5070: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
5080: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
5090: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
50a0: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
50b0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
50c0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
50d0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
50e0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
50f0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
5100: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
5110: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
5120: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
5130: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 73 77  t *pValue){.  sw
5140: 69 74 63 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20  itch( p->op ){. 
5150: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
5160: 45 52 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20  ER: {.      if( 
5170: 73 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28  sqlite3GetInt32(
5180: 70 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 56 61 6c  p->token.z, pVal
5190: 75 65 29 20 29 7b 0a 20 20 20 20 20 20 20 20 72  ue) ){.        r
51a0: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 7d  eturn 1;.      }
51b0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
51c0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
51d0: 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 72  UPLUS: {.      r
51e0: 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70  eturn sqlite3Exp
51f0: 72 49 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c  rIsInteger(p->pL
5200: 65 66 74 2c 20 70 56 61 6c 75 65 29 3b 0a 20 20  eft, pValue);.  
5210: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
5220: 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20  UMINUS: {.      
5230: 69 6e 74 20 76 3b 0a 20 20 20 20 20 20 69 66 28  int v;.      if(
5240: 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e   sqlite3ExprIsIn
5250: 74 65 67 65 72 28 70 2d 3e 70 4c 65 66 74 2c 20  teger(p->pLeft, 
5260: 26 76 29 20 29 7b 0a 20 20 20 20 20 20 20 20 2a  &v) ){.        *
5270: 70 56 61 6c 75 65 20 3d 20 2d 76 3b 0a 20 20 20  pValue = -v;.   
5280: 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
5290: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
52a0: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65  ak;.    }.    de
52b0: 66 61 75 6c 74 3a 20 62 72 65 61 6b 3b 0a 20 20  fault: break;.  
52c0: 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a  }.  return 0;.}.
52d0: 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52  ./*.** Return TR
52e0: 55 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20  UE if the given 
52f0: 73 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d  string is a row-
5300: 69 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a  id column name..
5310: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73  */.int sqlite3Is
5320: 52 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72  Rowid(const char
5330: 20 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69   *z){.  if( sqli
5340: 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f  te3StrICmp(z, "_
5350: 52 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65  ROWID_")==0 ) re
5360: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
5370: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
5380: 22 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65  "ROWID")==0 ) re
5390: 74 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71  turn 1;.  if( sq
53a0: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20  lite3StrICmp(z, 
53b0: 22 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75  "OID")==0 ) retu
53c0: 72 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30  rn 1;.  return 0
53d0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 69 76 65 6e  ;.}../*.** Given
53e0: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 61 20 63   the name of a c
53f0: 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 66 6f 72  olumn of the for
5400: 6d 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20 6f  m X.Y.Z or Y.Z o
5410: 72 20 6a 75 73 74 20 5a 2c 20 6c 6f 6f 6b 20 75  r just Z, look u
5420: 70 0a 2a 2a 20 74 68 61 74 20 6e 61 6d 65 20 69  p.** that name i
5430: 6e 20 74 68 65 20 73 65 74 20 6f 66 20 73 6f 75  n the set of sou
5440: 72 63 65 20 74 61 62 6c 65 73 20 69 6e 20 70 53  rce tables in pS
5450: 72 63 4c 69 73 74 20 61 6e 64 20 6d 61 6b 65 20  rcList and make 
5460: 74 68 65 20 70 45 78 70 72 20 0a 2a 2a 20 65 78  the pExpr .** ex
5470: 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 72 65  pression node re
5480: 66 65 72 20 62 61 63 6b 20 74 6f 20 74 68 61 74  fer back to that
5490: 20 73 6f 75 72 63 65 20 63 6f 6c 75 6d 6e 2e 20   source column. 
54a0: 20 54 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 63   The following c
54b0: 68 61 6e 67 65 73 0a 2a 2a 20 61 72 65 20 6d 61  hanges.** are ma
54c0: 64 65 20 74 6f 20 70 45 78 70 72 3a 0a 2a 2a 0a  de to pExpr:.**.
54d0: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62  **    pExpr->iDb
54e0: 20 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74             Set t
54f0: 68 65 20 69 6e 64 65 78 20 69 6e 20 64 62 2d 3e  he index in db->
5500: 61 44 62 5b 5d 20 6f 66 20 74 68 65 20 64 61 74  aDb[] of the dat
5510: 61 62 61 73 65 20 68 6f 6c 64 69 6e 67 0a 2a 2a  abase holding.**
5520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
5530: 20 20 20 20 20 20 20 20 20 74 68 65 20 74 61 62           the tab
5540: 6c 65 2e 0a 2a 2a 20 20 20 20 70 45 78 70 72 2d  le..**    pExpr-
5550: 3e 69 54 61 62 6c 65 20 20 20 20 20 20 20 20 53  >iTable        S
5560: 65 74 20 74 6f 20 74 68 65 20 63 75 72 73 6f 72  et to the cursor
5570: 20 6e 75 6d 62 65 72 20 66 6f 72 20 74 68 65 20   number for the 
5580: 74 61 62 6c 65 20 6f 62 74 61 69 6e 65 64 0a 2a  table obtained.*
5590: 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  *               
55a0: 20 20 20 20 20 20 20 20 20 20 66 72 6f 6d 20 70            from p
55b0: 53 72 63 4c 69 73 74 2e 0a 2a 2a 20 20 20 20 70  SrcList..**    p
55c0: 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 20 20  Expr->iColumn   
55d0: 20 20 20 20 53 65 74 20 74 6f 20 74 68 65 20 63      Set to the c
55e0: 6f 6c 75 6d 6e 20 6e 75 6d 62 65 72 20 77 69 74  olumn number wit
55f0: 68 69 6e 20 74 68 65 20 74 61 62 6c 65 2e 0a 2a  hin the table..*
5600: 2a 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20  *    pExpr->op  
5610: 20 20 20 20 20 20 20 20 20 20 53 65 74 20 74 6f            Set to
5620: 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 0a 2a 2a 20 20   TK_COLUMN..**  
5630: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 20    pExpr->pLeft  
5640: 20 20 20 20 20 20 20 41 6e 79 20 65 78 70 72 65         Any expre
5650: 73 73 69 6f 6e 20 74 68 69 73 20 70 6f 69 6e 74  ssion this point
5660: 73 20 74 6f 20 69 73 20 64 65 6c 65 74 65 64 0a  s to is deleted.
5670: 2a 2a 20 20 20 20 70 45 78 70 72 2d 3e 70 52 69  **    pExpr->pRi
5680: 67 68 74 20 20 20 20 20 20 20 20 41 6e 79 20 65  ght        Any e
5690: 78 70 72 65 73 73 69 6f 6e 20 74 68 69 73 20 70  xpression this p
56a0: 6f 69 6e 74 73 20 74 6f 20 69 73 20 64 65 6c 65  oints to is dele
56b0: 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 70  ted..**.** The p
56c0: 44 62 54 6f 6b 65 6e 20 69 73 20 74 68 65 20 6e  DbToken is the n
56d0: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
56e0: 61 73 65 20 28 74 68 65 20 22 58 22 29 2e 20 20  ase (the "X").  
56f0: 54 68 69 73 20 76 61 6c 75 65 20 6d 61 79 20 62  This value may b
5700: 65 0a 2a 2a 20 4e 55 4c 4c 20 6d 65 61 6e 69 6e  e.** NULL meanin
5710: 67 20 74 68 61 74 20 6e 61 6d 65 20 69 73 20 6f  g that name is o
5720: 66 20 74 68 65 20 66 6f 72 6d 20 59 2e 5a 20 6f  f the form Y.Z o
5730: 72 20 5a 2e 20 20 41 6e 79 20 61 76 61 69 6c 61  r Z.  Any availa
5740: 62 6c 65 20 64 61 74 61 62 61 73 65 0a 2a 2a 20  ble database.** 
5750: 63 61 6e 20 62 65 20 75 73 65 64 2e 20 20 54 68  can be used.  Th
5760: 65 20 70 54 61 62 6c 65 54 6f 6b 65 6e 20 69 73  e pTableToken is
5770: 20 74 68 65 20 6e 61 6d 65 20 6f 66 20 74 68 65   the name of the
5780: 20 74 61 62 6c 65 20 28 74 68 65 20 22 59 22 29   table (the "Y")
5790: 2e 20 20 54 68 69 73 0a 2a 2a 20 76 61 6c 75 65  .  This.** value
57a0: 20 63 61 6e 20 62 65 20 4e 55 4c 4c 20 69 66 20   can be NULL if 
57b0: 70 44 62 54 6f 6b 65 6e 20 69 73 20 61 6c 73 6f  pDbToken is also
57c0: 20 4e 55 4c 4c 2e 20 20 49 66 20 70 54 61 62 6c   NULL.  If pTabl
57d0: 65 54 6f 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 69  eToken is NULL i
57e0: 74 0a 2a 2a 20 6d 65 61 6e 73 20 74 68 61 74 20  t.** means that 
57f0: 74 68 65 20 66 6f 72 6d 20 6f 66 20 74 68 65 20  the form of the 
5800: 6e 61 6d 65 20 69 73 20 5a 20 61 6e 64 20 74 68  name is Z and th
5810: 61 74 20 63 6f 6c 75 6d 6e 73 20 66 72 6f 6d 20  at columns from 
5820: 61 6e 79 20 74 61 62 6c 65 0a 2a 2a 20 63 61 6e  any table.** can
5830: 20 62 65 20 75 73 65 64 2e 0a 2a 2a 0a 2a 2a 20   be used..**.** 
5840: 49 66 20 74 68 65 20 6e 61 6d 65 20 63 61 6e 6e  If the name cann
5850: 6f 74 20 62 65 20 72 65 73 6f 6c 76 65 64 20 75  ot be resolved u
5860: 6e 61 6d 62 69 67 75 6f 75 73 6c 79 2c 20 6c 65  nambiguously, le
5870: 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65 73  ave an error mes
5880: 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50 61 72 73  sage.** in pPars
5890: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 6e 6f 6e  e and return non
58a0: 2d 7a 65 72 6f 2e 20 20 52 65 74 75 72 6e 20 7a  -zero.  Return z
58b0: 65 72 6f 20 6f 6e 20 73 75 63 63 65 73 73 2e 0a  ero on success..
58c0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 6c 6f  */.static int lo
58d0: 6f 6b 75 70 4e 61 6d 65 28 0a 20 20 50 61 72 73  okupName(.  Pars
58e0: 65 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20  e *pParse,      
58f0: 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20 63  /* The parsing c
5900: 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 54 6f 6b 65  ontext */.  Toke
5910: 6e 20 2a 70 44 62 54 6f 6b 65 6e 2c 20 20 20 20  n *pDbToken,    
5920: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5930: 64 61 74 61 62 61 73 65 20 63 6f 6e 74 61 69 6e  database contain
5940: 69 6e 67 20 74 61 62 6c 65 2c 20 6f 72 20 4e 55  ing table, or NU
5950: 4c 4c 20 2a 2f 0a 20 20 54 6f 6b 65 6e 20 2a 70  LL */.  Token *p
5960: 54 61 62 6c 65 54 6f 6b 65 6e 2c 20 20 2f 2a 20  TableToken,  /* 
5970: 4e 61 6d 65 20 6f 66 20 74 61 62 6c 65 20 63 6f  Name of table co
5980: 6e 74 61 69 6e 69 6e 67 20 63 6f 6c 75 6d 6e 2c  ntaining column,
5990: 20 6f 72 20 4e 55 4c 4c 20 2a 2f 0a 20 20 54 6f   or NULL */.  To
59a0: 6b 65 6e 20 2a 70 43 6f 6c 75 6d 6e 54 6f 6b 65  ken *pColumnToke
59b0: 6e 2c 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68  n, /* Name of th
59c0: 65 20 63 6f 6c 75 6d 6e 2e 20 2a 2f 0a 20 20 4e  e column. */.  N
59d0: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c  ameContext *pNC,
59e0: 20 20 20 20 2f 2a 20 54 68 65 20 6e 61 6d 65 20      /* The name 
59f0: 63 6f 6e 74 65 78 74 20 75 73 65 64 20 74 6f 20  context used to 
5a00: 72 65 73 6f 6c 76 65 20 74 68 65 20 6e 61 6d 65  resolve the name
5a10: 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70   */.  Expr *pExp
5a20: 72 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4d 61  r          /* Ma
5a30: 6b 65 20 74 68 69 73 20 45 58 50 52 20 6e 6f 64  ke this EXPR nod
5a40: 65 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20 73  e point to the s
5a50: 65 6c 65 63 74 65 64 20 63 6f 6c 75 6d 6e 20 2a  elected column *
5a60: 2f 0a 29 7b 0a 20 20 63 68 61 72 20 2a 7a 44 62  /.){.  char *zDb
5a70: 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a 20 4e   = 0;       /* N
5a80: 61 6d 65 20 6f 66 20 74 68 65 20 64 61 74 61 62  ame of the datab
5a90: 61 73 65 2e 20 20 54 68 65 20 22 58 22 20 69 6e  ase.  The "X" in
5aa0: 20 58 2e 59 2e 5a 20 2a 2f 0a 20 20 63 68 61 72   X.Y.Z */.  char
5ab0: 20 2a 7a 54 61 62 20 3d 20 30 3b 20 20 20 20 20   *zTab = 0;     
5ac0: 20 2f 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20   /* Name of the 
5ad0: 74 61 62 6c 65 2e 20 20 54 68 65 20 22 59 22 20  table.  The "Y" 
5ae0: 69 6e 20 58 2e 59 2e 5a 20 6f 72 20 59 2e 5a 20  in X.Y.Z or Y.Z 
5af0: 2a 2f 0a 20 20 63 68 61 72 20 2a 7a 43 6f 6c 20  */.  char *zCol 
5b00: 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e 61 6d  = 0;      /* Nam
5b10: 65 20 6f 66 20 74 68 65 20 63 6f 6c 75 6d 6e 2e  e of the column.
5b20: 20 20 54 68 65 20 22 5a 22 20 2a 2f 0a 20 20 69    The "Z" */.  i
5b30: 6e 74 20 69 2c 20 6a 3b 20 20 20 20 20 20 20 20  nt i, j;        
5b40: 20 20 20 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e      /* Loop coun
5b50: 74 65 72 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e  ters */.  int cn
5b60: 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 2f  t = 0;         /
5b70: 2a 20 4e 75 6d 62 65 72 20 6f 66 20 6d 61 74 63  * Number of matc
5b80: 68 69 6e 67 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65  hing column name
5b90: 73 20 2a 2f 0a 20 20 69 6e 74 20 63 6e 74 54 61  s */.  int cntTa
5ba0: 62 20 3d 20 30 3b 20 20 20 20 20 20 2f 2a 20 4e  b = 0;      /* N
5bb0: 75 6d 62 65 72 20 6f 66 20 6d 61 74 63 68 69 6e  umber of matchin
5bc0: 67 20 74 61 62 6c 65 20 6e 61 6d 65 73 20 2a 2f  g table names */
5bd0: 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20 3d  .  sqlite3 *db =
5be0: 20 70 50 61 72 73 65 2d 3e 64 62 3b 20 20 2f 2a   pParse->db;  /*
5bf0: 20 54 68 65 20 64 61 74 61 62 61 73 65 20 2a 2f   The database */
5c00: 0a 20 20 73 74 72 75 63 74 20 53 72 63 4c 69 73  .  struct SrcLis
5c10: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 20 20  t_item *pItem;  
5c20: 20 20 20 20 20 2f 2a 20 55 73 65 20 66 6f 72 20       /* Use for 
5c30: 6c 6f 6f 70 69 6e 67 20 6f 76 65 72 20 70 53 72  looping over pSr
5c40: 63 4c 69 73 74 20 69 74 65 6d 73 20 2a 2f 0a 20  cList items */. 
5c50: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
5c60: 69 74 65 6d 20 2a 70 4d 61 74 63 68 20 3d 20 30  item *pMatch = 0
5c70: 3b 20 20 2f 2a 20 54 68 65 20 6d 61 74 63 68 69  ;  /* The matchi
5c80: 6e 67 20 70 53 72 63 4c 69 73 74 20 69 74 65 6d  ng pSrcList item
5c90: 20 2a 2f 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   */.  NameContex
5ca0: 74 20 2a 70 54 6f 70 4e 43 20 3d 20 70 4e 43 3b  t *pTopNC = pNC;
5cb0: 20 20 20 20 20 20 20 20 2f 2a 20 46 69 72 73 74          /* First
5cc0: 20 6e 61 6d 65 63 6f 6e 74 65 78 74 20 69 6e 20   namecontext in 
5cd0: 74 68 65 20 6c 69 73 74 20 2a 2f 0a 0a 20 20 61  the list */..  a
5ce0: 73 73 65 72 74 28 20 70 43 6f 6c 75 6d 6e 54 6f  ssert( pColumnTo
5cf0: 6b 65 6e 20 26 26 20 70 43 6f 6c 75 6d 6e 54 6f  ken && pColumnTo
5d00: 6b 65 6e 2d 3e 7a 20 29 3b 20 2f 2a 20 54 68 65  ken->z ); /* The
5d10: 20 5a 20 69 6e 20 58 2e 59 2e 5a 20 63 61 6e 6e   Z in X.Y.Z cann
5d20: 6f 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 20 20  ot be NULL */.  
5d30: 7a 44 62 20 3d 20 73 71 6c 69 74 65 33 4e 61 6d  zDb = sqlite3Nam
5d40: 65 46 72 6f 6d 54 6f 6b 65 6e 28 70 44 62 54 6f  eFromToken(pDbTo
5d50: 6b 65 6e 29 3b 0a 20 20 7a 54 61 62 20 3d 20 73  ken);.  zTab = s
5d60: 71 6c 69 74 65 33 4e 61 6d 65 46 72 6f 6d 54 6f  qlite3NameFromTo
5d70: 6b 65 6e 28 70 54 61 62 6c 65 54 6f 6b 65 6e 29  ken(pTableToken)
5d80: 3b 0a 20 20 7a 43 6f 6c 20 3d 20 73 71 6c 69 74  ;.  zCol = sqlit
5d90: 65 33 4e 61 6d 65 46 72 6f 6d 54 6f 6b 65 6e 28  e3NameFromToken(
5da0: 70 43 6f 6c 75 6d 6e 54 6f 6b 65 6e 29 3b 0a 20  pColumnToken);. 
5db0: 20 69 66 28 20 73 71 6c 69 74 65 33 5f 6d 61 6c   if( sqlite3_mal
5dc0: 6c 6f 63 5f 66 61 69 6c 65 64 20 29 7b 0a 20 20  loc_failed ){.  
5dd0: 20 20 72 65 74 75 72 6e 20 31 3b 20 20 2f 2a 20    return 1;  /* 
5de0: 4c 65 61 6b 20 6d 65 6d 6f 72 79 20 28 7a 44 62  Leak memory (zDb
5df0: 20 61 6e 64 20 7a 54 61 62 29 20 69 66 20 6d 61   and zTab) if ma
5e00: 6c 6c 6f 63 20 66 61 69 6c 73 20 2a 2f 0a 20 20  lloc fails */.  
5e10: 7d 0a 0a 20 20 70 45 78 70 72 2d 3e 69 54 61 62  }..  pExpr->iTab
5e20: 6c 65 20 3d 20 2d 31 3b 0a 20 20 77 68 69 6c 65  le = -1;.  while
5e30: 28 20 70 4e 43 20 26 26 20 63 6e 74 3d 3d 30 20  ( pNC && cnt==0 
5e40: 29 7b 0a 20 20 20 20 53 72 63 4c 69 73 74 20 2a  ){.    SrcList *
5e50: 70 53 72 63 4c 69 73 74 20 3d 20 70 4e 43 2d 3e  pSrcList = pNC->
5e60: 70 53 72 63 4c 69 73 74 3b 0a 20 20 20 20 45 78  pSrcList;.    Ex
5e70: 70 72 4c 69 73 74 20 2a 70 45 4c 69 73 74 20 3d  prList *pEList =
5e80: 20 70 4e 43 2d 3e 70 45 4c 69 73 74 3b 0a 0a 20   pNC->pEList;.. 
5e90: 20 20 20 70 4e 43 2d 3e 6e 52 65 66 2b 2b 3b 0a     pNC->nRef++;.
5ea0: 20 20 20 20 2f 2a 20 61 73 73 65 72 74 28 20 7a      /* assert( z
5eb0: 54 61 62 3d 3d 30 20 7c 7c 20 70 45 4c 69 73 74  Tab==0 || pEList
5ec0: 3d 3d 30 20 29 3b 20 2a 2f 0a 20 20 20 20 69 66  ==0 ); */.    if
5ed0: 28 20 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20  ( pSrcList ){.  
5ee0: 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70 49 74      for(i=0, pIt
5ef0: 65 6d 3d 70 53 72 63 4c 69 73 74 2d 3e 61 3b 20  em=pSrcList->a; 
5f00: 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53 72 63  i<pSrcList->nSrc
5f10: 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
5f20: 0a 20 20 20 20 20 20 20 20 54 61 62 6c 65 20 2a  .        Table *
5f30: 70 54 61 62 20 3d 20 70 49 74 65 6d 2d 3e 70 54  pTab = pItem->pT
5f40: 61 62 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75  ab;.        Colu
5f50: 6d 6e 20 2a 70 43 6f 6c 3b 0a 20 20 0a 20 20 20  mn *pCol;.  .   
5f60: 20 20 20 20 20 69 66 28 20 70 54 61 62 3d 3d 30       if( pTab==0
5f70: 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20   ) continue;.   
5f80: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54 61       assert( pTa
5f90: 62 2d 3e 6e 43 6f 6c 3e 30 20 29 3b 0a 20 20 20  b->nCol>0 );.   
5fa0: 20 20 20 20 20 69 66 28 20 7a 54 61 62 20 29 7b       if( zTab ){
5fb0: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 70  .          if( p
5fc0: 49 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 29 7b 0a  Item->zAlias ){.
5fd0: 20 20 20 20 20 20 20 20 20 20 20 20 63 68 61 72              char
5fe0: 20 2a 7a 54 61 62 4e 61 6d 65 20 3d 20 70 49 74   *zTabName = pIt
5ff0: 65 6d 2d 3e 7a 41 6c 69 61 73 3b 0a 20 20 20 20  em->zAlias;.    
6000: 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
6010: 74 65 33 53 74 72 49 43 6d 70 28 7a 54 61 62 4e  te3StrICmp(zTabN
6020: 61 6d 65 2c 20 7a 54 61 62 29 21 3d 30 20 29 20  ame, zTab)!=0 ) 
6030: 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20  continue;.      
6040: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
6050: 20 20 20 20 20 20 20 63 68 61 72 20 2a 7a 54 61         char *zTa
6060: 62 4e 61 6d 65 20 3d 20 70 54 61 62 2d 3e 7a 4e  bName = pTab->zN
6070: 61 6d 65 3b 0a 20 20 20 20 20 20 20 20 20 20 20  ame;.           
6080: 20 69 66 28 20 7a 54 61 62 4e 61 6d 65 3d 3d 30   if( zTabName==0
6090: 20 7c 7c 20 73 71 6c 69 74 65 33 53 74 72 49 43   || sqlite3StrIC
60a0: 6d 70 28 7a 54 61 62 4e 61 6d 65 2c 20 7a 54 61  mp(zTabName, zTa
60b0: 62 29 21 3d 30 20 29 20 63 6f 6e 74 69 6e 75 65  b)!=0 ) continue
60c0: 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
60d0: 28 20 7a 44 62 21 3d 30 20 26 26 20 73 71 6c 69  ( zDb!=0 && sqli
60e0: 74 65 33 53 74 72 49 43 6d 70 28 64 62 2d 3e 61  te3StrICmp(db->a
60f0: 44 62 5b 70 54 61 62 2d 3e 69 44 62 5d 2e 7a 4e  Db[pTab->iDb].zN
6100: 61 6d 65 2c 20 7a 44 62 29 21 3d 30 20 29 7b 0a  ame, zDb)!=0 ){.
6110: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 63 6f                co
6120: 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20  ntinue;.        
6130: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20 20      }.          
6140: 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  }.        }.    
6150: 20 20 20 20 69 66 28 20 30 3d 3d 28 63 6e 74 54      if( 0==(cntT
6160: 61 62 2b 2b 29 20 29 7b 0a 20 20 20 20 20 20 20  ab++) ){.       
6170: 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
6180: 20 3d 20 70 49 74 65 6d 2d 3e 69 43 75 72 73 6f   = pItem->iCurso
6190: 72 3b 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  r;.          pEx
61a0: 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d 3e  pr->iDb = pTab->
61b0: 69 44 62 3b 0a 20 20 20 20 20 20 20 20 20 20 70  iDb;.          p
61c0: 4d 61 74 63 68 20 3d 20 70 49 74 65 6d 3b 0a 20  Match = pItem;. 
61d0: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
61e0: 20 66 6f 72 28 6a 3d 30 2c 20 70 43 6f 6c 3d 70   for(j=0, pCol=p
61f0: 54 61 62 2d 3e 61 43 6f 6c 3b 20 6a 3c 70 54 61  Tab->aCol; j<pTa
6200: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
6210: 6f 6c 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 20  ol++){.         
6220: 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72 49   if( sqlite3StrI
6230: 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65 2c  Cmp(pCol->zName,
6240: 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20 20   zCol)==0 ){.   
6250: 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b 0a           cnt++;.
6260: 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70              pExp
6270: 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 49 74 65  r->iTable = pIte
6280: 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20 20  m->iCursor;.    
6290: 20 20 20 20 20 20 20 20 70 4d 61 74 63 68 20 3d          pMatch =
62a0: 20 70 49 74 65 6d 3b 0a 20 20 20 20 20 20 20 20   pItem;.        
62b0: 20 20 20 20 70 45 78 70 72 2d 3e 69 44 62 20 3d      pExpr->iDb =
62c0: 20 70 54 61 62 2d 3e 69 44 62 3b 0a 20 20 20 20   pTab->iDb;.    
62d0: 20 20 20 20 20 20 20 20 2f 2a 20 53 75 62 73 74          /* Subst
62e0: 69 74 75 74 65 20 74 68 65 20 72 6f 77 69 64 20  itute the rowid 
62f0: 28 63 6f 6c 75 6d 6e 20 2d 31 29 20 66 6f 72 20  (column -1) for 
6300: 74 68 65 20 49 4e 54 45 47 45 52 20 50 52 49 4d  the INTEGER PRIM
6310: 41 52 59 20 4b 45 59 20 2a 2f 0a 20 20 20 20 20  ARY KEY */.     
6320: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43         pExpr->iC
6330: 6f 6c 75 6d 6e 20 3d 20 6a 3d 3d 70 54 61 62 2d  olumn = j==pTab-
6340: 3e 69 50 4b 65 79 20 3f 20 2d 31 20 3a 20 6a 3b  >iPKey ? -1 : j;
6350: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
6360: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 3d 20 70  pr->affinity = p
6370: 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66 66  Tab->aCol[j].aff
6380: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 20 20 20  inity;.         
6390: 20 20 20 70 45 78 70 72 2d 3e 70 43 6f 6c 6c 20     pExpr->pColl 
63a0: 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e  = pTab->aCol[j].
63b0: 70 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20 20  pColl;.         
63c0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
63d0: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a      }.        }.
63e0: 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 0a 23        }.    }..#
63f0: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
6400: 49 54 5f 54 52 49 47 47 45 52 0a 20 20 20 20 2f  IT_TRIGGER.    /
6410: 2a 20 49 66 20 77 65 20 68 61 76 65 20 6e 6f 74  * If we have not
6420: 20 61 6c 72 65 61 64 79 20 72 65 73 6f 6c 76 65   already resolve
6430: 64 20 74 68 65 20 6e 61 6d 65 2c 20 74 68 65 6e  d the name, then
6440: 20 6d 61 79 62 65 20 0a 20 20 20 20 2a 2a 20 69   maybe .    ** i
6450: 74 20 69 73 20 61 20 6e 65 77 2e 2a 20 6f 72 20  t is a new.* or 
6460: 6f 6c 64 2e 2a 20 74 72 69 67 67 65 72 20 61 72  old.* trigger ar
6470: 67 75 6d 65 6e 74 20 72 65 66 65 72 65 6e 63 65  gument reference
6480: 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20  .    */.    if( 
6490: 7a 44 62 3d 3d 30 20 26 26 20 7a 54 61 62 21 3d  zDb==0 && zTab!=
64a0: 30 20 26 26 20 63 6e 74 3d 3d 30 20 26 26 20 70  0 && cnt==0 && p
64b0: 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b  Parse->trigStack
64c0: 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 54 72 69  !=0 ){.      Tri
64d0: 67 67 65 72 53 74 61 63 6b 20 2a 70 54 72 69 67  ggerStack *pTrig
64e0: 67 65 72 53 74 61 63 6b 20 3d 20 70 50 61 72 73  gerStack = pPars
64f0: 65 2d 3e 74 72 69 67 53 74 61 63 6b 3b 0a 20 20  e->trigStack;.  
6500: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 20      Table *pTab 
6510: 3d 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 70  = 0;.      if( p
6520: 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e 6e 65  TriggerStack->ne
6530: 77 49 64 78 20 21 3d 20 2d 31 20 26 26 20 73 71  wIdx != -1 && sq
6540: 6c 69 74 65 33 53 74 72 49 43 6d 70 28 22 6e 65  lite3StrICmp("ne
6550: 77 22 2c 20 7a 54 61 62 29 20 3d 3d 20 30 20 29  w", zTab) == 0 )
6560: 7b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d  {.        pExpr-
6570: 3e 69 54 61 62 6c 65 20 3d 20 70 54 72 69 67 67  >iTable = pTrigg
6580: 65 72 53 74 61 63 6b 2d 3e 6e 65 77 49 64 78 3b  erStack->newIdx;
6590: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
65a0: 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d 3e   pTriggerStack->
65b0: 70 54 61 62 20 29 3b 0a 20 20 20 20 20 20 20 20  pTab );.        
65c0: 70 54 61 62 20 3d 20 70 54 72 69 67 67 65 72 53  pTab = pTriggerS
65d0: 74 61 63 6b 2d 3e 70 54 61 62 3b 0a 20 20 20 20  tack->pTab;.    
65e0: 20 20 7d 65 6c 73 65 20 69 66 28 20 70 54 72 69    }else if( pTri
65f0: 67 67 65 72 53 74 61 63 6b 2d 3e 6f 6c 64 49 64  ggerStack->oldId
6600: 78 20 21 3d 20 2d 31 20 26 26 20 73 71 6c 69 74  x != -1 && sqlit
6610: 65 33 53 74 72 49 43 6d 70 28 22 6f 6c 64 22 2c  e3StrICmp("old",
6620: 20 7a 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   zTab)==0 ){.   
6630: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62       pExpr->iTab
6640: 6c 65 20 3d 20 70 54 72 69 67 67 65 72 53 74 61  le = pTriggerSta
6650: 63 6b 2d 3e 6f 6c 64 49 64 78 3b 0a 20 20 20 20  ck->oldIdx;.    
6660: 20 20 20 20 61 73 73 65 72 74 28 20 70 54 72 69      assert( pTri
6670: 67 67 65 72 53 74 61 63 6b 2d 3e 70 54 61 62 20  ggerStack->pTab 
6680: 29 3b 0a 20 20 20 20 20 20 20 20 70 54 61 62 20  );.        pTab 
6690: 3d 20 70 54 72 69 67 67 65 72 53 74 61 63 6b 2d  = pTriggerStack-
66a0: 3e 70 54 61 62 3b 0a 20 20 20 20 20 20 7d 0a 0a  >pTab;.      }..
66b0: 20 20 20 20 20 20 69 66 28 20 70 54 61 62 20 29        if( pTab )
66c0: 7b 20 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a  { .        int j
66d0: 3b 0a 20 20 20 20 20 20 20 20 43 6f 6c 75 6d 6e  ;.        Column
66e0: 20 2a 70 43 6f 6c 20 3d 20 70 54 61 62 2d 3e 61   *pCol = pTab->a
66f0: 43 6f 6c 3b 0a 0a 20 20 20 20 20 20 20 20 70 45  Col;..        pE
6700: 78 70 72 2d 3e 69 44 62 20 3d 20 70 54 61 62 2d  xpr->iDb = pTab-
6710: 3e 69 44 62 3b 0a 20 20 20 20 20 20 20 20 63 6e  >iDb;.        cn
6720: 74 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 20 20  tTab++;.        
6730: 66 6f 72 28 6a 3d 30 3b 20 6a 20 3c 20 70 54 61  for(j=0; j < pTa
6740: 62 2d 3e 6e 43 6f 6c 3b 20 6a 2b 2b 2c 20 70 43  b->nCol; j++, pC
6750: 6f 6c 2b 2b 29 20 7b 0a 20 20 20 20 20 20 20 20  ol++) {.        
6760: 20 20 69 66 28 20 73 71 6c 69 74 65 33 53 74 72    if( sqlite3Str
6770: 49 43 6d 70 28 70 43 6f 6c 2d 3e 7a 4e 61 6d 65  ICmp(pCol->zName
6780: 2c 20 7a 43 6f 6c 29 3d 3d 30 20 29 7b 0a 20 20  , zCol)==0 ){.  
6790: 20 20 20 20 20 20 20 20 20 20 63 6e 74 2b 2b 3b            cnt++;
67a0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78  .            pEx
67b0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 6a 3d  pr->iColumn = j=
67c0: 3d 70 54 61 62 2d 3e 69 50 4b 65 79 20 3f 20 2d  =pTab->iPKey ? -
67d0: 31 20 3a 20 6a 3b 0a 20 20 20 20 20 20 20 20 20  1 : j;.         
67e0: 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69     pExpr->affini
67f0: 74 79 20 3d 20 70 54 61 62 2d 3e 61 43 6f 6c 5b  ty = pTab->aCol[
6800: 6a 5d 2e 61 66 66 69 6e 69 74 79 3b 0a 20 20 20  j].affinity;.   
6810: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
6820: 70 43 6f 6c 6c 20 3d 20 70 54 61 62 2d 3e 61 43  pColl = pTab->aC
6830: 6f 6c 5b 6a 5d 2e 70 43 6f 6c 6c 3b 0a 20 20 20  ol[j].pColl;.   
6840: 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a           break;.
6850: 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20            }.    
6860: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
6870: 20 20 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 21 64    }.#endif /* !d
6880: 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d  efined(SQLITE_OM
6890: 49 54 5f 54 52 49 47 47 45 52 29 20 2a 2f 0a 0a  IT_TRIGGER) */..
68a0: 20 20 20 20 2f 2a 0a 20 20 20 20 2a 2a 20 50 65      /*.    ** Pe
68b0: 72 68 61 70 73 20 74 68 65 20 6e 61 6d 65 20 69  rhaps the name i
68c0: 73 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f  s a reference to
68d0: 20 74 68 65 20 52 4f 57 49 44 0a 20 20 20 20 2a   the ROWID.    *
68e0: 2f 0a 20 20 20 20 69 66 28 20 63 6e 74 3d 3d 30  /.    if( cnt==0
68f0: 20 26 26 20 63 6e 74 54 61 62 3d 3d 31 20 26 26   && cntTab==1 &&
6900: 20 73 71 6c 69 74 65 33 49 73 52 6f 77 69 64 28   sqlite3IsRowid(
6910: 7a 43 6f 6c 29 20 29 7b 0a 20 20 20 20 20 20 63  zCol) ){.      c
6920: 6e 74 20 3d 20 31 3b 0a 20 20 20 20 20 20 70 45  nt = 1;.      pE
6930: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 2d  xpr->iColumn = -
6940: 31 3b 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e  1;.      pExpr->
6950: 61 66 66 69 6e 69 74 79 20 3d 20 53 51 4c 49 54  affinity = SQLIT
6960: 45 5f 41 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20  E_AFF_INTEGER;. 
6970: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 0a 20 20 20     }..    /*.   
6980: 20 2a 2a 20 49 66 20 74 68 65 20 69 6e 70 75 74   ** If the input
6990: 20 69 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20   is of the form 
69a0: 5a 20 28 6e 6f 74 20 59 2e 5a 20 6f 72 20 58 2e  Z (not Y.Z or X.
69b0: 59 2e 5a 29 20 74 68 65 6e 20 74 68 65 20 6e 61  Y.Z) then the na
69c0: 6d 65 20 5a 0a 20 20 20 20 2a 2a 20 6d 69 67 68  me Z.    ** migh
69d0: 74 20 72 65 66 65 72 20 74 6f 20 61 6e 20 72 65  t refer to an re
69e0: 73 75 6c 74 2d 73 65 74 20 61 6c 69 61 73 2e 20  sult-set alias. 
69f0: 20 54 68 69 73 20 68 61 70 70 65 6e 73 2c 20 66   This happens, f
6a00: 6f 72 20 65 78 61 6d 70 6c 65 2c 20 77 68 65 6e  or example, when
6a10: 0a 20 20 20 20 2a 2a 20 77 65 20 61 72 65 20 72  .    ** we are r
6a20: 65 73 6f 6c 76 69 6e 67 20 6e 61 6d 65 73 20 69  esolving names i
6a30: 6e 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75  n the WHERE clau
6a40: 73 65 20 6f 66 20 74 68 65 20 66 6f 6c 6c 6f 77  se of the follow
6a50: 69 6e 67 20 63 6f 6d 6d 61 6e 64 3a 0a 20 20 20  ing command:.   
6a60: 20 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 20 53   **.    **     S
6a70: 45 4c 45 43 54 20 61 2b 62 20 41 53 20 78 20 46  ELECT a+b AS x F
6a80: 52 4f 4d 20 74 61 62 6c 65 20 57 48 45 52 45 20  ROM table WHERE 
6a90: 78 3c 31 30 3b 0a 20 20 20 20 2a 2a 0a 20 20 20  x<10;.    **.   
6aa0: 20 2a 2a 20 49 6e 20 63 61 73 65 73 20 6c 69 6b   ** In cases lik
6ab0: 65 20 74 68 69 73 2c 20 72 65 70 6c 61 63 65 20  e this, replace 
6ac0: 70 45 78 70 72 20 77 69 74 68 20 61 20 63 6f 70  pExpr with a cop
6ad0: 79 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  y of the express
6ae0: 69 6f 6e 20 74 68 61 74 0a 20 20 20 20 2a 2a 20  ion that.    ** 
6af0: 66 6f 72 6d 73 20 74 68 65 20 72 65 73 75 6c 74  forms the result
6b00: 20 73 65 74 20 65 6e 74 72 79 20 28 22 61 2b 62   set entry ("a+b
6b10: 22 20 69 6e 20 74 68 65 20 65 78 61 6d 70 6c 65  " in the example
6b20: 29 20 61 6e 64 20 72 65 74 75 72 6e 20 69 6d 6d  ) and return imm
6b30: 65 64 69 61 74 65 6c 79 2e 0a 20 20 20 20 2a 2a  ediately..    **
6b40: 20 4e 6f 74 65 20 74 68 61 74 20 74 68 65 20 65   Note that the e
6b50: 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 74 68 65  xpression in the
6b60: 20 72 65 73 75 6c 74 20 73 65 74 20 73 68 6f 75   result set shou
6b70: 6c 64 20 68 61 76 65 20 61 6c 72 65 61 64 79 20  ld have already 
6b80: 62 65 65 6e 0a 20 20 20 20 2a 2a 20 72 65 73 6f  been.    ** reso
6b90: 6c 76 65 64 20 62 79 20 74 68 65 20 74 69 6d 65  lved by the time
6ba0: 20 74 68 65 20 57 48 45 52 45 20 63 6c 61 75 73   the WHERE claus
6bb0: 65 20 69 73 20 72 65 73 6f 6c 76 65 64 2e 0a 20  e is resolved.. 
6bc0: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 63 6e     */.    if( cn
6bd0: 74 3d 3d 30 20 26 26 20 70 45 4c 69 73 74 21 3d  t==0 && pEList!=
6be0: 30 20 26 26 20 7a 54 61 62 3d 3d 30 20 29 7b 0a  0 && zTab==0 ){.
6bf0: 20 20 20 20 20 20 66 6f 72 28 6a 3d 30 3b 20 6a        for(j=0; j
6c00: 3c 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  <pEList->nExpr; 
6c10: 6a 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 63 68  j++){.        ch
6c20: 61 72 20 2a 7a 41 73 20 3d 20 70 45 4c 69 73 74  ar *zAs = pEList
6c30: 2d 3e 61 5b 6a 5d 2e 7a 4e 61 6d 65 3b 0a 20 20  ->a[j].zName;.  
6c40: 20 20 20 20 20 20 69 66 28 20 7a 41 73 21 3d 30        if( zAs!=0
6c50: 20 26 26 20 73 71 6c 69 74 65 33 53 74 72 49 43   && sqlite3StrIC
6c60: 6d 70 28 7a 41 73 2c 20 7a 43 6f 6c 29 3d 3d 30  mp(zAs, zCol)==0
6c70: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61 73   ){.          as
6c80: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70 4c 65  sert( pExpr->pLe
6c90: 66 74 3d 3d 30 20 26 26 20 70 45 78 70 72 2d 3e  ft==0 && pExpr->
6ca0: 70 52 69 67 68 74 3d 3d 30 20 29 3b 0a 20 20 20  pRight==0 );.   
6cb0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
6cc0: 20 3d 20 54 4b 5f 41 53 3b 0a 20 20 20 20 20 20   = TK_AS;.      
6cd0: 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75      pExpr->iColu
6ce0: 6d 6e 20 3d 20 6a 3b 0a 20 20 20 20 20 20 20 20  mn = j;.        
6cf0: 20 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 3d    pExpr->pLeft =
6d00: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
6d10: 70 45 4c 69 73 74 2d 3e 61 5b 6a 5d 2e 70 45 78  pEList->a[j].pEx
6d20: 70 72 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73  pr);.          s
6d30: 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29 3b  qliteFree(zCol);
6d40: 0a 20 20 20 20 20 20 20 20 20 20 61 73 73 65 72  .          asser
6d50: 74 28 20 7a 54 61 62 3d 3d 30 20 26 26 20 7a 44  t( zTab==0 && zD
6d60: 62 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20  b==0 );.        
6d70: 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20    return 0;.    
6d80: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 20 0a 20      }.      } . 
6d90: 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20 41 64 76     }..    /* Adv
6da0: 61 6e 63 65 20 74 6f 20 74 68 65 20 6e 65 78 74  ance to the next
6db0: 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74 2e 20 20   name context.  
6dc0: 54 68 65 20 6c 6f 6f 70 20 77 69 6c 6c 20 65 78  The loop will ex
6dd0: 69 74 20 77 68 65 6e 20 65 69 74 68 65 72 0a 20  it when either. 
6de0: 20 20 20 2a 2a 20 77 65 20 68 61 76 65 20 61 20     ** we have a 
6df0: 6d 61 74 63 68 20 28 63 6e 74 3e 30 29 20 6f 72  match (cnt>0) or
6e00: 20 77 68 65 6e 20 77 65 20 72 75 6e 20 6f 75 74   when we run out
6e10: 20 6f 66 20 6e 61 6d 65 20 63 6f 6e 74 65 78 74   of name context
6e20: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 69 66  s..    */.    if
6e30: 28 20 63 6e 74 3d 3d 30 20 29 7b 0a 20 20 20 20  ( cnt==0 ){.    
6e40: 20 20 70 4e 43 20 3d 20 70 4e 43 2d 3e 70 4e 65    pNC = pNC->pNe
6e50: 78 74 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  xt;.    }.  }.. 
6e60: 20 2f 2a 0a 20 20 2a 2a 20 49 66 20 58 20 61 6e   /*.  ** If X an
6e70: 64 20 59 20 61 72 65 20 4e 55 4c 4c 20 28 69 6e  d Y are NULL (in
6e80: 20 6f 74 68 65 72 20 77 6f 72 64 73 20 69 66 20   other words if 
6e90: 6f 6e 6c 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20  only the column 
6ea0: 6e 61 6d 65 20 5a 20 69 73 0a 20 20 2a 2a 20 73  name Z is.  ** s
6eb0: 75 70 70 6c 69 65 64 29 20 61 6e 64 20 74 68 65  upplied) and the
6ec0: 20 76 61 6c 75 65 20 6f 66 20 5a 20 69 73 20 65   value of Z is e
6ed0: 6e 63 6c 6f 73 65 64 20 69 6e 20 64 6f 75 62 6c  nclosed in doubl
6ee0: 65 2d 71 75 6f 74 65 73 2c 20 74 68 65 6e 0a 20  e-quotes, then. 
6ef0: 20 2a 2a 20 5a 20 69 73 20 61 20 73 74 72 69 6e   ** Z is a strin
6f00: 67 20 6c 69 74 65 72 61 6c 20 69 66 20 69 74 20  g literal if it 
6f10: 64 6f 65 73 6e 27 74 20 6d 61 74 63 68 20 61 6e  doesn't match an
6f20: 79 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 73 2e 20  y column names. 
6f30: 20 49 6e 20 74 68 61 74 0a 20 20 2a 2a 20 63 61   In that.  ** ca
6f40: 73 65 2c 20 77 65 20 6e 65 65 64 20 74 6f 20 72  se, we need to r
6f50: 65 74 75 72 6e 20 72 69 67 68 74 20 61 77 61 79  eturn right away
6f60: 20 61 6e 64 20 6e 6f 74 20 6d 61 6b 65 20 61 6e   and not make an
6f70: 79 20 63 68 61 6e 67 65 73 20 74 6f 0a 20 20 2a  y changes to.  *
6f80: 2a 20 70 45 78 70 72 2e 0a 20 20 2a 2f 0a 20 20  * pExpr..  */.  
6f90: 69 66 28 20 63 6e 74 3d 3d 30 20 26 26 20 7a 54  if( cnt==0 && zT
6fa0: 61 62 3d 3d 30 20 26 26 20 70 43 6f 6c 75 6d 6e  ab==0 && pColumn
6fb0: 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 3d 3d 27 22 27  Token->z[0]=='"'
6fc0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 46 72   ){.    sqliteFr
6fd0: 65 65 28 7a 43 6f 6c 29 3b 0a 20 20 20 20 72 65  ee(zCol);.    re
6fe0: 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 0a 20 20 2f  turn 0;.  }..  /
6ff0: 2a 0a 20 20 2a 2a 20 63 6e 74 3d 3d 30 20 6d 65  *.  ** cnt==0 me
7000: 61 6e 73 20 74 68 65 72 65 20 77 61 73 20 6e 6f  ans there was no
7010: 74 20 6d 61 74 63 68 2e 20 20 63 6e 74 3e 31 20  t match.  cnt>1 
7020: 6d 65 61 6e 73 20 74 68 65 72 65 20 77 65 72 65  means there were
7030: 20 74 77 6f 20 6f 72 0a 20 20 2a 2a 20 6d 6f 72   two or.  ** mor
7040: 65 20 6d 61 74 63 68 65 73 2e 20 20 45 69 74 68  e matches.  Eith
7050: 65 72 20 77 61 79 2c 20 77 65 20 68 61 76 65 20  er way, we have 
7060: 61 6e 20 65 72 72 6f 72 2e 0a 20 20 2a 2f 0a 20  an error..  */. 
7070: 20 69 66 28 20 63 6e 74 21 3d 31 20 29 7b 0a 20   if( cnt!=1 ){. 
7080: 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 30 3b 0a     char *z = 0;.
7090: 20 20 20 20 63 68 61 72 20 2a 7a 45 72 72 3b 0a      char *zErr;.
70a0: 20 20 20 20 7a 45 72 72 20 3d 20 63 6e 74 3d 3d      zErr = cnt==
70b0: 30 20 3f 20 22 6e 6f 20 73 75 63 68 20 63 6f 6c  0 ? "no such col
70c0: 75 6d 6e 3a 20 25 73 22 20 3a 20 22 61 6d 62 69  umn: %s" : "ambi
70d0: 67 75 6f 75 73 20 63 6f 6c 75 6d 6e 20 6e 61 6d  guous column nam
70e0: 65 3a 20 25 73 22 3b 0a 20 20 20 20 69 66 28 20  e: %s";.    if( 
70f0: 7a 44 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  zDb ){.      sql
7100: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7110: 2c 20 7a 44 62 2c 20 22 2e 22 2c 20 7a 54 61 62  , zDb, ".", zTab
7120: 2c 20 22 2e 22 2c 20 7a 43 6f 6c 2c 20 30 29 3b  , ".", zCol, 0);
7130: 0a 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 7a  .    }else if( z
7140: 54 61 62 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  Tab ){.      sql
7150: 69 74 65 33 53 65 74 53 74 72 69 6e 67 28 26 7a  ite3SetString(&z
7160: 2c 20 7a 54 61 62 2c 20 22 2e 22 2c 20 7a 43 6f  , zTab, ".", zCo
7170: 6c 2c 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65  l, 0);.    }else
7180: 7b 0a 20 20 20 20 20 20 7a 20 3d 20 73 71 6c 69  {.      z = sqli
7190: 74 65 53 74 72 44 75 70 28 7a 43 6f 6c 29 3b 0a  teStrDup(zCol);.
71a0: 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69 74 65      }.    sqlite
71b0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
71c0: 2c 20 7a 45 72 72 2c 20 7a 29 3b 0a 20 20 20 20  , zErr, z);.    
71d0: 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a 20  sqliteFree(z);. 
71e0: 20 20 20 70 54 6f 70 4e 43 2d 3e 6e 45 72 72 2b     pTopNC->nErr+
71f0: 2b 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20  +;.  }..  /* If 
7200: 61 20 63 6f 6c 75 6d 6e 20 66 72 6f 6d 20 61 20  a column from a 
7210: 74 61 62 6c 65 20 69 6e 20 70 53 72 63 4c 69 73  table in pSrcLis
7220: 74 20 69 73 20 72 65 66 65 72 65 6e 63 65 64 2c  t is referenced,
7230: 20 74 68 65 6e 20 72 65 63 6f 72 64 0a 20 20 2a   then record.  *
7240: 2a 20 74 68 69 73 20 66 61 63 74 20 69 6e 20 74  * this fact in t
7250: 68 65 20 70 53 72 63 4c 69 73 74 2e 61 5b 5d 2e  he pSrcList.a[].
7260: 63 6f 6c 55 73 65 64 20 62 69 74 6d 61 73 6b 2e  colUsed bitmask.
7270: 20 20 43 6f 6c 75 6d 6e 20 30 20 63 61 75 73 65    Column 0 cause
7280: 73 0a 20 20 2a 2a 20 62 69 74 20 30 20 74 6f 20  s.  ** bit 0 to 
7290: 62 65 20 73 65 74 2e 20 20 43 6f 6c 75 6d 6e 20  be set.  Column 
72a0: 31 20 73 65 74 73 20 62 69 74 20 31 2e 20 20 41  1 sets bit 1.  A
72b0: 6e 64 20 73 6f 20 66 6f 72 74 68 2e 20 20 49 66  nd so forth.  If
72c0: 20 74 68 65 0a 20 20 2a 2a 20 63 6f 6c 75 6d 6e   the.  ** column
72d0: 20 6e 75 6d 62 65 72 20 69 73 20 67 72 65 61 74   number is great
72e0: 65 72 20 74 68 61 6e 20 74 68 65 20 6e 75 6d 62  er than the numb
72f0: 65 72 20 6f 66 20 62 69 74 73 20 69 6e 20 74 68  er of bits in th
7300: 65 20 62 69 74 6d 61 73 6b 0a 20 20 2a 2a 20 74  e bitmask.  ** t
7310: 68 65 6e 20 73 65 74 20 74 68 65 20 68 69 67 68  hen set the high
7320: 2d 6f 72 64 65 72 20 62 69 74 20 6f 66 20 74 68  -order bit of th
7330: 65 20 62 69 74 6d 61 73 6b 2e 0a 20 20 2a 2f 0a  e bitmask..  */.
7340: 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43 6f    if( pExpr->iCo
7350: 6c 75 6d 6e 3e 3d 30 20 26 26 20 70 4d 61 74 63  lumn>=0 && pMatc
7360: 68 21 3d 30 20 29 7b 0a 20 20 20 20 69 6e 74 20  h!=0 ){.    int 
7370: 6e 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  n = pExpr->iColu
7380: 6d 6e 3b 0a 20 20 20 20 69 66 28 20 6e 3e 3d 73  mn;.    if( n>=s
7390: 69 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38  izeof(Bitmask)*8
73a0: 20 29 7b 0a 20 20 20 20 20 20 6e 20 3d 20 73 69   ){.      n = si
73b0: 7a 65 6f 66 28 42 69 74 6d 61 73 6b 29 2a 38 2d  zeof(Bitmask)*8-
73c0: 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 61 73 73  1;.    }.    ass
73d0: 65 72 74 28 20 70 4d 61 74 63 68 2d 3e 69 43 75  ert( pMatch->iCu
73e0: 72 73 6f 72 3d 3d 70 45 78 70 72 2d 3e 69 54 61  rsor==pExpr->iTa
73f0: 62 6c 65 20 29 3b 0a 20 20 20 20 70 4d 61 74 63  ble );.    pMatc
7400: 68 2d 3e 63 6f 6c 55 73 65 64 20 7c 3d 20 31 3c  h->colUsed |= 1<
7410: 3c 6e 3b 0a 20 20 7d 0a 0a 20 20 2f 2a 20 43 6c  <n;.  }..  /* Cl
7420: 65 61 6e 20 75 70 20 61 6e 64 20 72 65 74 75 72  ean up and retur
7430: 6e 0a 20 20 2a 2f 0a 20 20 73 71 6c 69 74 65 46  n.  */.  sqliteF
7440: 72 65 65 28 7a 44 62 29 3b 0a 20 20 73 71 6c 69  ree(zDb);.  sqli
7450: 74 65 46 72 65 65 28 7a 54 61 62 29 3b 0a 20 20  teFree(zTab);.  
7460: 73 71 6c 69 74 65 46 72 65 65 28 7a 43 6f 6c 29  sqliteFree(zCol)
7470: 3b 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 44  ;.  sqlite3ExprD
7480: 65 6c 65 74 65 28 70 45 78 70 72 2d 3e 70 4c 65  elete(pExpr->pLe
7490: 66 74 29 3b 0a 20 20 70 45 78 70 72 2d 3e 70 4c  ft);.  pExpr->pL
74a0: 65 66 74 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  eft = 0;.  sqlit
74b0: 65 33 45 78 70 72 44 65 6c 65 74 65 28 70 45 78  e3ExprDelete(pEx
74c0: 70 72 2d 3e 70 52 69 67 68 74 29 3b 0a 20 20 70  pr->pRight);.  p
74d0: 45 78 70 72 2d 3e 70 52 69 67 68 74 20 3d 20 30  Expr->pRight = 0
74e0: 3b 0a 20 20 70 45 78 70 72 2d 3e 6f 70 20 3d 20  ;.  pExpr->op = 
74f0: 54 4b 5f 43 4f 4c 55 4d 4e 3b 0a 20 20 69 66 28  TK_COLUMN;.  if(
7500: 20 63 6e 74 3d 3d 31 20 29 7b 0a 20 20 20 20 61   cnt==1 ){.    a
7510: 73 73 65 72 74 28 20 70 4e 43 21 3d 30 20 29 3b  ssert( pNC!=0 );
7520: 0a 20 20 20 20 73 71 6c 69 74 65 33 41 75 74 68  .    sqlite3Auth
7530: 52 65 61 64 28 70 50 61 72 73 65 2c 20 70 45 78  Read(pParse, pEx
7540: 70 72 2c 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73  pr, pNC->pSrcLis
7550: 74 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e  t);.  }.  return
7560: 20 63 6e 74 21 3d 31 3b 0a 7d 0a 0a 2f 2a 0a 2a   cnt!=1;.}../*.*
7570: 2a 20 70 45 78 70 72 20 69 73 20 61 20 6e 6f 64  * pExpr is a nod
7580: 65 20 74 68 61 74 20 64 65 66 69 6e 65 73 20 61  e that defines a
7590: 20 66 75 6e 63 74 69 6f 6e 20 6f 66 20 73 6f 6d   function of som
75a0: 65 20 6b 69 6e 64 2e 20 20 49 74 20 6d 69 67 68  e kind.  It migh
75b0: 74 0a 2a 2a 20 62 65 20 61 20 73 79 6e 74 61 63  t.** be a syntac
75c0: 74 69 63 20 66 75 6e 63 74 69 6f 6e 20 6c 69 6b  tic function lik
75d0: 65 20 22 63 6f 75 6e 74 28 78 29 22 20 6f 72 20  e "count(x)" or 
75e0: 69 74 20 6d 69 67 68 74 20 62 65 20 61 20 66 75  it might be a fu
75f0: 6e 63 74 69 6f 6e 0a 2a 2a 20 74 68 61 74 20 69  nction.** that i
7600: 6d 70 6c 65 6d 65 6e 74 73 20 61 6e 20 6f 70 65  mplements an ope
7610: 72 61 74 6f 72 2c 20 6c 69 6b 65 20 22 61 20 4c  rator, like "a L
7620: 49 4b 45 20 62 22 2e 20 20 0a 2a 2a 0a 2a 2a 20  IKE b".  .**.** 
7630: 54 68 69 73 20 72 6f 75 74 69 6e 65 20 6d 61 6b  This routine mak
7640: 65 73 20 2a 70 7a 4e 61 6d 65 20 70 6f 69 6e 74  es *pzName point
7650: 20 74 6f 20 74 68 65 20 6e 61 6d 65 20 6f 66 20   to the name of 
7660: 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 61 6e 64  the function and
7670: 20 0a 2a 2a 20 2a 70 6e 4e 61 6d 65 20 68 6f 6c   .** *pnName hol
7680: 64 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  d the number of 
7690: 63 68 61 72 61 63 74 65 72 73 20 69 6e 20 74 68  characters in th
76a0: 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 2e  e function name.
76b0: 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64 20  .*/.static void 
76c0: 67 65 74 46 75 6e 63 74 69 6f 6e 4e 61 6d 65 28  getFunctionName(
76d0: 45 78 70 72 20 2a 70 45 78 70 72 2c 20 63 6f 6e  Expr *pExpr, con
76e0: 73 74 20 63 68 61 72 20 2a 2a 70 7a 4e 61 6d 65  st char **pzName
76f0: 2c 20 69 6e 74 20 2a 70 6e 4e 61 6d 65 29 7b 0a  , int *pnName){.
7700: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
7710: 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65 20  >op ){.    case 
7720: 54 4b 5f 46 55 4e 43 54 49 4f 4e 3a 20 7b 0a 20  TK_FUNCTION: {. 
7730: 20 20 20 20 20 2a 70 7a 4e 61 6d 65 20 3d 20 70       *pzName = p
7740: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 3b 0a 20  Expr->token.z;. 
7750: 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 70       *pnName = p
7760: 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 3b 0a 20  Expr->token.n;. 
7770: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7780: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49  }.    case TK_LI
7790: 4b 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a 4e  KE: {.      *pzN
77a0: 61 6d 65 20 3d 20 22 6c 69 6b 65 22 3b 0a 20 20  ame = "like";.  
77b0: 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 34 3b      *pnName = 4;
77c0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
77d0: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
77e0: 47 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 2a 70  GLOB: {.      *p
77f0: 7a 4e 61 6d 65 20 3d 20 22 67 6c 6f 62 22 3b 0a  zName = "glob";.
7800: 20 20 20 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20        *pnName = 
7810: 34 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  4;.      break;.
7820: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
7830: 4b 5f 43 54 49 4d 45 3a 20 7b 0a 20 20 20 20 20  K_CTIME: {.     
7840: 20 2a 70 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72   *pzName = "curr
7850: 65 6e 74 5f 74 69 6d 65 22 3b 0a 20 20 20 20 20  ent_time";.     
7860: 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 32 3b 0a 20   *pnName = 12;. 
7870: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
7880: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44  }.    case TK_CD
7890: 41 54 45 3a 20 7b 0a 20 20 20 20 20 20 2a 70 7a  ATE: {.      *pz
78a0: 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74 5f  Name = "current_
78b0: 64 61 74 65 22 3b 0a 20 20 20 20 20 20 2a 70 6e  date";.      *pn
78c0: 4e 61 6d 65 20 3d 20 31 32 3b 0a 20 20 20 20 20  Name = 12;.     
78d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
78e0: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 53    case TK_CTIMES
78f0: 54 41 4d 50 3a 20 7b 0a 20 20 20 20 20 20 2a 70  TAMP: {.      *p
7900: 7a 4e 61 6d 65 20 3d 20 22 63 75 72 72 65 6e 74  zName = "current
7910: 5f 74 69 6d 65 73 74 61 6d 70 22 3b 0a 20 20 20  _timestamp";.   
7920: 20 20 20 2a 70 6e 4e 61 6d 65 20 3d 20 31 37 3b     *pnName = 17;
7930: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
7940: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
7950: 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 69 73   This routine is
7960: 20 64 65 73 69 67 6e 65 64 20 61 73 20 61 6e 20   designed as an 
7970: 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b 45 78  xFunc for walkEx
7980: 70 72 54 72 65 65 28 29 2e 0a 2a 2a 0a 2a 2a 20  prTree()..**.** 
7990: 52 65 73 6f 6c 76 65 20 73 79 6d 62 6f 6c 69 63  Resolve symbolic
79a0: 20 6e 61 6d 65 73 20 69 6e 74 6f 20 54 4b 5f 43   names into TK_C
79b0: 4f 4c 55 4d 4e 20 6f 70 65 72 61 74 6f 72 73 20  OLUMN operators 
79c0: 66 6f 72 20 74 68 65 20 63 75 72 72 65 6e 74 0a  for the current.
79d0: 2a 2a 20 6e 6f 64 65 20 69 6e 20 74 68 65 20 65  ** node in the e
79e0: 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20  xpression tree. 
79f0: 20 52 65 74 75 72 6e 20 30 20 74 6f 20 63 6f 6e   Return 0 to con
7a00: 74 69 6e 75 65 20 74 68 65 20 73 65 61 72 63 68  tinue the search
7a10: 20 64 6f 77 6e 0a 2a 2a 20 74 68 65 20 74 72 65   down.** the tre
7a20: 65 20 6f 72 20 32 20 74 6f 20 61 62 6f 72 74 20  e or 2 to abort 
7a30: 74 68 65 20 74 72 65 65 20 77 61 6c 6b 2e 0a 2a  the tree walk..*
7a40: 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e  *.** This routin
7a50: 65 20 61 6c 73 6f 20 64 6f 65 73 20 65 72 72 6f  e also does erro
7a60: 72 20 63 68 65 63 6b 69 6e 67 20 61 6e 64 20 6e  r checking and n
7a70: 61 6d 65 20 72 65 73 6f 6c 75 74 69 6f 6e 20 66  ame resolution f
7a80: 6f 72 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20 6e  or.** function n
7a90: 61 6d 65 73 2e 20 20 54 68 65 20 6f 70 65 72 61  ames.  The opera
7aa0: 74 6f 72 20 66 6f 72 20 61 67 67 72 65 67 61 74  tor for aggregat
7ab0: 65 20 66 75 6e 63 74 69 6f 6e 73 20 69 73 20 63  e functions is c
7ac0: 68 61 6e 67 65 64 0a 2a 2a 20 74 6f 20 54 4b 5f  hanged.** to TK_
7ad0: 41 47 47 5f 46 55 4e 43 54 49 4f 4e 2e 0a 2a 2f  AGG_FUNCTION..*/
7ae0: 0a 73 74 61 74 69 63 20 69 6e 74 20 6e 61 6d 65  .static int name
7af0: 52 65 73 6f 6c 76 65 72 53 74 65 70 28 76 6f 69  ResolverStep(voi
7b00: 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a 70  d *pArg, Expr *p
7b10: 45 78 70 72 29 7b 0a 20 20 4e 61 6d 65 43 6f 6e  Expr){.  NameCon
7b20: 74 65 78 74 20 2a 70 4e 43 20 3d 20 28 4e 61 6d  text *pNC = (Nam
7b30: 65 43 6f 6e 74 65 78 74 2a 29 70 41 72 67 3b 0a  eContext*)pArg;.
7b40: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 4c    SrcList *pSrcL
7b50: 69 73 74 3b 0a 20 20 50 61 72 73 65 20 2a 70 50  ist;.  Parse *pP
7b60: 61 72 73 65 3b 0a 0a 20 20 69 66 28 20 70 45 78  arse;..  if( pEx
7b70: 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 31  pr==0 ) return 1
7b80: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4e 43 21  ;.  assert( pNC!
7b90: 3d 30 20 29 3b 0a 20 20 70 53 72 63 4c 69 73 74  =0 );.  pSrcList
7ba0: 20 3d 20 70 4e 43 2d 3e 70 53 72 63 4c 69 73 74   = pNC->pSrcList
7bb0: 3b 0a 20 20 70 50 61 72 73 65 20 3d 20 70 4e 43  ;.  pParse = pNC
7bc0: 2d 3e 70 50 61 72 73 65 3b 0a 0a 20 20 69 66 28  ->pParse;..  if(
7bd0: 20 45 78 70 72 48 61 73 41 6e 79 50 72 6f 70 65   ExprHasAnyPrope
7be0: 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 52 65  rty(pExpr, EP_Re
7bf0: 73 6f 6c 76 65 64 29 20 29 20 72 65 74 75 72 6e  solved) ) return
7c00: 20 31 3b 0a 20 20 45 78 70 72 53 65 74 50 72 6f   1;.  ExprSetPro
7c10: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
7c20: 52 65 73 6f 6c 76 65 64 29 3b 0a 23 69 66 6e 64  Resolved);.#ifnd
7c30: 65 66 20 4e 44 45 42 55 47 0a 20 20 69 66 28 20  ef NDEBUG.  if( 
7c40: 70 53 72 63 4c 69 73 74 20 29 7b 0a 20 20 20 20  pSrcList ){.    
7c50: 69 6e 74 20 69 3b 0a 20 20 20 20 66 6f 72 28 69  int i;.    for(i
7c60: 3d 30 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e  =0; i<pSrcList->
7c70: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
7c80: 20 20 61 73 73 65 72 74 28 20 70 53 72 63 4c 69    assert( pSrcLi
7c90: 73 74 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72  st->a[i].iCursor
7ca0: 3e 3d 30 20 26 26 20 70 53 72 63 4c 69 73 74 2d  >=0 && pSrcList-
7cb0: 3e 61 5b 69 5d 2e 69 43 75 72 73 6f 72 3c 70 50  >a[i].iCursor<pP
7cc0: 61 72 73 65 2d 3e 6e 54 61 62 29 3b 0a 20 20 20  arse->nTab);.   
7cd0: 20 7d 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20   }.  }.#endif.  
7ce0: 73 77 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f  switch( pExpr->o
7cf0: 70 20 29 7b 0a 20 20 20 20 2f 2a 20 44 6f 75 62  p ){.    /* Doub
7d00: 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69 6e 67  le-quoted string
7d10: 73 20 28 65 78 3a 20 22 61 62 63 22 29 20 61 72  s (ex: "abc") ar
7d20: 65 20 75 73 65 64 20 61 73 20 69 64 65 6e 74 69  e used as identi
7d30: 66 69 65 72 73 20 69 66 0a 20 20 20 20 2a 2a 20  fiers if.    ** 
7d40: 70 6f 73 73 69 62 6c 65 2e 20 20 4f 74 68 65 72  possible.  Other
7d50: 77 69 73 65 20 74 68 65 79 20 72 65 6d 61 69 6e  wise they remain
7d60: 20 61 73 20 73 74 72 69 6e 67 73 2e 20 20 53 69   as strings.  Si
7d70: 6e 67 6c 65 2d 71 75 6f 74 65 64 0a 20 20 20 20  ngle-quoted.    
7d80: 2a 2a 20 73 74 72 69 6e 67 73 20 28 65 78 3a 20  ** strings (ex: 
7d90: 27 61 62 63 27 29 20 61 72 65 20 61 6c 77 61 79  'abc') are alway
7da0: 73 20 73 74 72 69 6e 67 20 6c 69 74 65 72 61 6c  s string literal
7db0: 73 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 63 61  s..    */.    ca
7dc0: 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a  se TK_STRING: {.
7dd0: 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72 2d        if( pExpr-
7de0: 3e 74 6f 6b 65 6e 2e 7a 5b 30 5d 3d 3d 27 5c 27  >token.z[0]=='\'
7df0: 27 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 20  ' ) break;.     
7e00: 20 2f 2a 20 46 61 6c 6c 20 74 68 72 75 20 69 6e   /* Fall thru in
7e10: 74 6f 20 74 68 65 20 54 4b 5f 49 44 20 63 61 73  to the TK_ID cas
7e20: 65 20 69 66 20 74 68 69 73 20 69 73 20 61 20 64  e if this is a d
7e30: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
7e40: 69 6e 67 20 2a 2f 0a 20 20 20 20 7d 0a 20 20 20  ing */.    }.   
7e50: 20 2f 2a 20 41 20 6c 6f 6e 65 20 69 64 65 6e 74   /* A lone ident
7e60: 69 66 69 65 72 20 69 73 20 74 68 65 20 6e 61 6d  ifier is the nam
7e70: 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 2e 0a 20  e of a column.. 
7e80: 20 20 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54     */.    case T
7e90: 4b 5f 49 44 3a 20 7b 0a 20 20 20 20 20 20 6c 6f  K_ID: {.      lo
7ea0: 6f 6b 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c  okupName(pParse,
7eb0: 20 30 2c 20 30 2c 20 26 70 45 78 70 72 2d 3e 74   0, 0, &pExpr->t
7ec0: 6f 6b 65 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72  oken, pNC, pExpr
7ed0: 29 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20  );.      return 
7ee0: 31 3b 0a 20 20 20 20 7d 0a 20 20 0a 20 20 20 20  1;.    }.  .    
7ef0: 2f 2a 20 41 20 74 61 62 6c 65 20 6e 61 6d 65 20  /* A table name 
7f00: 61 6e 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 3a  and column name:
7f10: 20 20 20 20 20 49 44 2e 49 44 0a 20 20 20 20 2a       ID.ID.    *
7f20: 2a 20 4f 72 20 61 20 64 61 74 61 62 61 73 65 2c  * Or a database,
7f30: 20 74 61 62 6c 65 20 61 6e 64 20 63 6f 6c 75 6d   table and colum
7f40: 6e 3a 20 20 49 44 2e 49 44 2e 49 44 0a 20 20 20  n:  ID.ID.ID.   
7f50: 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
7f60: 44 4f 54 3a 20 7b 0a 20 20 20 20 20 20 54 6f 6b  DOT: {.      Tok
7f70: 65 6e 20 2a 70 43 6f 6c 75 6d 6e 3b 0a 20 20 20  en *pColumn;.   
7f80: 20 20 20 54 6f 6b 65 6e 20 2a 70 54 61 62 6c 65     Token *pTable
7f90: 3b 0a 20 20 20 20 20 20 54 6f 6b 65 6e 20 2a 70  ;.      Token *p
7fa0: 44 62 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  Db;.      Expr *
7fb0: 70 52 69 67 68 74 3b 0a 0a 20 20 20 20 20 20 2f  pRight;..      /
7fc0: 2a 20 69 66 28 20 70 53 72 63 4c 69 73 74 3d 3d  * if( pSrcList==
7fd0: 30 20 29 20 62 72 65 61 6b 3b 20 2a 2f 0a 20 20  0 ) break; */.  
7fe0: 20 20 20 20 70 52 69 67 68 74 20 3d 20 70 45 78      pRight = pEx
7ff0: 70 72 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20  pr->pRight;.    
8000: 20 20 69 66 28 20 70 52 69 67 68 74 2d 3e 6f 70    if( pRight->op
8010: 3d 3d 54 4b 5f 49 44 20 29 7b 0a 20 20 20 20 20  ==TK_ID ){.     
8020: 20 20 20 70 44 62 20 3d 20 30 3b 0a 20 20 20 20     pDb = 0;.    
8030: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 45      pTable = &pE
8040: 78 70 72 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b 65  xpr->pLeft->toke
8050: 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c 75  n;.        pColu
8060: 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 74 6f  mn = &pRight->to
8070: 6b 65 6e 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  ken;.      }else
8080: 7b 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74  {.        assert
8090: 28 20 70 52 69 67 68 74 2d 3e 6f 70 3d 3d 54 4b  ( pRight->op==TK
80a0: 5f 44 4f 54 20 29 3b 0a 20 20 20 20 20 20 20 20  _DOT );.        
80b0: 70 44 62 20 3d 20 26 70 45 78 70 72 2d 3e 70 4c  pDb = &pExpr->pL
80c0: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
80d0: 20 20 20 20 70 54 61 62 6c 65 20 3d 20 26 70 52      pTable = &pR
80e0: 69 67 68 74 2d 3e 70 4c 65 66 74 2d 3e 74 6f 6b  ight->pLeft->tok
80f0: 65 6e 3b 0a 20 20 20 20 20 20 20 20 70 43 6f 6c  en;.        pCol
8100: 75 6d 6e 20 3d 20 26 70 52 69 67 68 74 2d 3e 70  umn = &pRight->p
8110: 52 69 67 68 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20  Right->token;.  
8120: 20 20 20 20 7d 0a 20 20 20 20 20 20 6c 6f 6f 6b      }.      look
8130: 75 70 4e 61 6d 65 28 70 50 61 72 73 65 2c 20 70  upName(pParse, p
8140: 44 62 2c 20 70 54 61 62 6c 65 2c 20 70 43 6f 6c  Db, pTable, pCol
8150: 75 6d 6e 2c 20 70 4e 43 2c 20 70 45 78 70 72 29  umn, pNC, pExpr)
8160: 3b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 31  ;.      return 1
8170: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 2f 2a 20  ;.    }..    /* 
8180: 52 65 73 6f 6c 76 65 20 66 75 6e 63 74 69 6f 6e  Resolve function
8190: 20 6e 61 6d 65 73 0a 20 20 20 20 2a 2f 0a 20 20   names.    */.  
81a0: 20 20 63 61 73 65 20 54 4b 5f 43 54 49 4d 45 3a    case TK_CTIME:
81b0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 54 49  .    case TK_CTI
81c0: 4d 45 53 54 41 4d 50 3a 0a 20 20 20 20 63 61 73  MESTAMP:.    cas
81d0: 65 20 54 4b 5f 43 44 41 54 45 3a 0a 20 20 20 20  e TK_CDATE:.    
81e0: 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a 20 20  case TK_GLOB:.  
81f0: 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45 3a 0a    case TK_LIKE:.
8200: 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43      case TK_FUNC
8210: 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78  TION: {.      Ex
8220: 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20  prList *pList = 
8230: 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 20 20 20  pExpr->pList;   
8240: 20 2f 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74   /* The argument
8250: 20 6c 69 73 74 20 2a 2f 0a 20 20 20 20 20 20 69   list */.      i
8260: 6e 74 20 6e 20 3d 20 70 4c 69 73 74 20 3f 20 70  nt n = pList ? p
8270: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  List->nExpr : 0;
8280: 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61    /* Number of a
8290: 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20 20 20  rguments */.    
82a0: 20 20 69 6e 74 20 6e 6f 5f 73 75 63 68 5f 66 75    int no_such_fu
82b0: 6e 63 20 3d 20 30 3b 20 20 20 20 20 20 20 2f 2a  nc = 0;       /*
82c0: 20 54 72 75 65 20 69 66 20 6e 6f 20 73 75 63 68   True if no such
82d0: 20 66 75 6e 63 74 69 6f 6e 20 65 78 69 73 74 73   function exists
82e0: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 77 72   */.      int wr
82f0: 6f 6e 67 5f 6e 75 6d 5f 61 72 67 73 20 3d 20 30  ong_num_args = 0
8300: 3b 20 20 20 20 20 2f 2a 20 54 72 75 65 20 69 66  ;     /* True if
8310: 20 77 72 6f 6e 67 20 6e 75 6d 62 65 72 20 6f 66   wrong number of
8320: 20 61 72 67 75 6d 65 6e 74 73 20 2a 2f 0a 20 20   arguments */.  
8330: 20 20 20 20 69 6e 74 20 69 73 5f 61 67 67 20 3d      int is_agg =
8340: 20 30 3b 20 20 20 20 20 20 20 20 20 20 20 20 20   0;             
8350: 2f 2a 20 54 72 75 65 20 69 66 20 69 73 20 61 6e  /* True if is an
8360: 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63 74   aggregate funct
8370: 69 6f 6e 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ion */.      int
8380: 20 69 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 49   i;.      int nI
8390: 64 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  d;              
83a0: 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20        /* Number 
83b0: 6f 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e  of characters in
83c0: 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65 20 2a   function name *
83d0: 2f 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68  /.      const ch
83e0: 61 72 20 2a 7a 49 64 3b 20 20 20 20 20 20 20 20  ar *zId;        
83f0: 20 20 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74      /* The funct
8400: 69 6f 6e 20 6e 61 6d 65 2e 20 2a 2f 0a 20 20 20  ion name. */.   
8410: 20 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66     FuncDef *pDef
8420: 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  ;              /
8430: 2a 20 49 6e 66 6f 72 6d 61 74 69 6f 6e 20 61 62  * Information ab
8440: 6f 75 74 20 74 68 65 20 66 75 6e 63 74 69 6f 6e  out the function
8450: 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 65 6e   */.      int en
8460: 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  c = pParse->db->
8470: 65 6e 63 3b 20 20 2f 2a 20 54 68 65 20 64 61 74  enc;  /* The dat
8480: 61 62 61 73 65 20 65 6e 63 6f 64 69 6e 67 20 2a  abase encoding *
8490: 2f 0a 0a 20 20 20 20 20 20 67 65 74 46 75 6e 63  /..      getFunc
84a0: 74 69 6f 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20  tionName(pExpr, 
84b0: 26 7a 49 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20  &zId, &nId);.   
84c0: 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69 74 65     pDef = sqlite
84d0: 33 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50  3FindFunction(pP
84e0: 61 72 73 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e  arse->db, zId, n
84f0: 49 64 2c 20 6e 2c 20 65 6e 63 2c 20 30 29 3b 0a  Id, n, enc, 0);.
8500: 20 20 20 20 20 20 69 66 28 20 70 44 65 66 3d 3d        if( pDef==
8510: 30 20 29 7b 0a 20 20 20 20 20 20 20 20 70 44 65  0 ){.        pDe
8520: 66 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  f = sqlite3FindF
8530: 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
8540: 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c 20 2d 31  db, zId, nId, -1
8550: 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20 20  , enc, 0);.     
8560: 20 20 20 69 66 28 20 70 44 65 66 3d 3d 30 20 29     if( pDef==0 )
8570: 7b 0a 20 20 20 20 20 20 20 20 20 20 6e 6f 5f 73  {.          no_s
8580: 75 63 68 5f 66 75 6e 63 20 3d 20 31 3b 0a 20 20  uch_func = 1;.  
8590: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
85a0: 20 20 20 20 20 20 20 77 72 6f 6e 67 5f 6e 75 6d         wrong_num
85b0: 5f 61 72 67 73 20 3d 20 31 3b 0a 20 20 20 20 20  _args = 1;.     
85c0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73 65     }.      }else
85d0: 7b 0a 20 20 20 20 20 20 20 20 69 73 5f 61 67 67  {.        is_agg
85e0: 20 3d 20 70 44 65 66 2d 3e 78 46 75 6e 63 3d 3d   = pDef->xFunc==
85f0: 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
8600: 20 69 66 28 20 69 73 5f 61 67 67 20 26 26 20 21   if( is_agg && !
8610: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 29 7b  pNC->allowAgg ){
8620: 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
8630: 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c  ErrorMsg(pParse,
8640: 20 22 6d 69 73 75 73 65 20 6f 66 20 61 67 67 72   "misuse of aggr
8650: 65 67 61 74 65 20 66 75 6e 63 74 69 6f 6e 20 25  egate function %
8660: 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 7a 49 64 29  .*s()", nId,zId)
8670: 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e  ;.        pNC->n
8680: 45 72 72 2b 2b 3b 0a 20 20 20 20 20 20 20 20 69  Err++;.        i
8690: 73 5f 61 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  s_agg = 0;.     
86a0: 20 7d 65 6c 73 65 20 69 66 28 20 6e 6f 5f 73 75   }else if( no_su
86b0: 63 68 5f 66 75 6e 63 20 29 7b 0a 20 20 20 20 20  ch_func ){.     
86c0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
86d0: 73 67 28 70 50 61 72 73 65 2c 20 22 6e 6f 20 73  sg(pParse, "no s
86e0: 75 63 68 20 66 75 6e 63 74 69 6f 6e 3a 20 25 2e  uch function: %.
86f0: 2a 73 22 2c 20 6e 49 64 2c 20 7a 49 64 29 3b 0a  *s", nId, zId);.
8700: 20 20 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72          pNC->nEr
8710: 72 2b 2b 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  r++;.      }else
8720: 20 69 66 28 20 77 72 6f 6e 67 5f 6e 75 6d 5f 61   if( wrong_num_a
8730: 72 67 73 20 29 7b 0a 20 20 20 20 20 20 20 20 73  rgs ){.        s
8740: 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28 70  qlite3ErrorMsg(p
8750: 50 61 72 73 65 2c 22 77 72 6f 6e 67 20 6e 75 6d  Parse,"wrong num
8760: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
8770: 20 74 6f 20 66 75 6e 63 74 69 6f 6e 20 25 2e 2a   to function %.*
8780: 73 28 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  s()",.          
8790: 20 20 20 6e 49 64 2c 20 7a 49 64 29 3b 0a 20 20     nId, zId);.  
87a0: 20 20 20 20 20 20 70 4e 43 2d 3e 6e 45 72 72 2b        pNC->nErr+
87b0: 2b 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  +;.      }.     
87c0: 20 69 66 28 20 69 73 5f 61 67 67 20 29 7b 0a 20   if( is_agg ){. 
87d0: 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
87e0: 20 3d 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49   = TK_AGG_FUNCTI
87f0: 4f 4e 3b 0a 20 20 20 20 20 20 20 20 70 4e 43 2d  ON;.        pNC-
8800: 3e 68 61 73 41 67 67 20 3d 20 31 3b 0a 20 20 20  >hasAgg = 1;.   
8810: 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69     }.      if( i
8820: 73 5f 61 67 67 20 29 20 70 4e 43 2d 3e 61 6c 6c  s_agg ) pNC->all
8830: 6f 77 41 67 67 20 3d 20 30 3b 0a 20 20 20 20 20  owAgg = 0;.     
8840: 20 66 6f 72 28 69 3d 30 3b 20 70 4e 43 2d 3e 6e   for(i=0; pNC->n
8850: 45 72 72 3d 3d 30 20 26 26 20 69 3c 6e 3b 20 69  Err==0 && i<n; i
8860: 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 77 61 6c  ++){.        wal
8870: 6b 45 78 70 72 54 72 65 65 28 70 4c 69 73 74 2d  kExprTree(pList-
8880: 3e 61 5b 69 5d 2e 70 45 78 70 72 2c 20 6e 61 6d  >a[i].pExpr, nam
8890: 65 52 65 73 6f 6c 76 65 72 53 74 65 70 2c 20 70  eResolverStep, p
88a0: 4e 43 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  NC);.      }.   
88b0: 20 20 20 69 66 28 20 69 73 5f 61 67 67 20 29 20     if( is_agg ) 
88c0: 70 4e 43 2d 3e 61 6c 6c 6f 77 41 67 67 20 3d 20  pNC->allowAgg = 
88d0: 31 3b 0a 20 20 20 20 20 20 2f 2a 20 46 49 58 20  1;.      /* FIX 
88e0: 4d 45 3a 20 20 43 6f 6d 70 75 74 65 20 70 45 78  ME:  Compute pEx
88f0: 70 72 2d 3e 61 66 66 69 6e 69 74 79 20 62 61 73  pr->affinity bas
8900: 65 64 20 6f 6e 20 74 68 65 20 65 78 70 65 63 74  ed on the expect
8910: 65 64 20 72 65 74 75 72 6e 0a 20 20 20 20 20 20  ed return.      
8920: 2a 2a 20 74 79 70 65 20 6f 66 20 74 68 65 20 66  ** type of the f
8930: 75 6e 63 74 69 6f 6e 20 0a 20 20 20 20 20 20 2a  unction .      *
8940: 2f 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 69  /.      return i
8950: 73 5f 61 67 67 3b 0a 20 20 20 20 7d 0a 23 69 66  s_agg;.    }.#if
8960: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
8970: 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
8980: 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20 20  se TK_SELECT:.  
8990: 20 20 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53    case TK_EXISTS
89a0: 3a 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73  :.#endif.    cas
89b0: 65 20 54 4b 5f 49 4e 3a 20 7b 0a 20 20 20 20 20  e TK_IN: {.     
89c0: 20 69 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c   if( pExpr->pSel
89d0: 65 63 74 20 29 7b 0a 20 20 20 20 20 20 20 20 69  ect ){.        i
89e0: 6e 74 20 6e 52 65 66 20 3d 20 70 4e 43 2d 3e 6e  nt nRef = pNC->n
89f0: 52 65 66 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  Ref;.        sql
8a00: 69 74 65 33 53 65 6c 65 63 74 52 65 73 6f 6c 76  ite3SelectResolv
8a10: 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
8a20: 3e 70 53 65 6c 65 63 74 2c 20 70 4e 43 29 3b 0a  >pSelect, pNC);.
8a30: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
8a40: 70 4e 43 2d 3e 6e 52 65 66 3e 3d 6e 52 65 66 20  pNC->nRef>=nRef 
8a50: 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 6e  );.        if( n
8a60: 52 65 66 21 3d 70 4e 43 2d 3e 6e 52 65 66 20 29  Ref!=pNC->nRef )
8a70: 7b 0a 20 20 20 20 20 20 20 20 20 20 45 78 70 72  {.          Expr
8a80: 53 65 74 50 72 6f 70 65 72 74 79 28 70 45 78 70  SetProperty(pExp
8a90: 72 2c 20 45 50 5f 56 61 72 53 65 6c 65 63 74 29  r, EP_VarSelect)
8aa0: 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20  ;.        }.    
8ab0: 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20    }.    }.  }.  
8ac0: 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a  return 0;.}../*.
8ad0: 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
8ae0: 77 61 6c 6b 73 20 61 6e 20 65 78 70 72 65 73 73  walks an express
8af0: 69 6f 6e 20 74 72 65 65 20 61 6e 64 20 72 65 73  ion tree and res
8b00: 6f 6c 76 65 73 20 72 65 66 65 72 65 6e 63 65 73  olves references
8b10: 20 74 6f 0a 2a 2a 20 74 61 62 6c 65 20 63 6f 6c   to.** table col
8b20: 75 6d 6e 73 2e 20 20 4e 6f 64 65 73 20 6f 66 20  umns.  Nodes of 
8b30: 74 68 65 20 66 6f 72 6d 20 49 44 2e 49 44 20 6f  the form ID.ID o
8b40: 72 20 49 44 20 72 65 73 6f 6c 76 65 20 69 6e 74  r ID resolve int
8b50: 6f 20 61 6e 0a 2a 2a 20 69 6e 64 65 78 20 74 6f  o an.** index to
8b60: 20 74 68 65 20 74 61 62 6c 65 20 69 6e 20 74 68   the table in th
8b70: 65 20 74 61 62 6c 65 20 6c 69 73 74 20 61 6e 64  e table list and
8b80: 20 61 20 63 6f 6c 75 6d 6e 20 6f 66 66 73 65 74   a column offset
8b90: 2e 20 20 54 68 65 20 0a 2a 2a 20 45 78 70 72 2e  .  The .** Expr.
8ba0: 6f 70 63 6f 64 65 20 66 6f 72 20 73 75 63 68 20  opcode for such 
8bb0: 6e 6f 64 65 73 20 69 73 20 63 68 61 6e 67 65 64  nodes is changed
8bc0: 20 74 6f 20 54 4b 5f 43 4f 4c 55 4d 4e 2e 20 20   to TK_COLUMN.  
8bd0: 54 68 65 20 45 78 70 72 2e 69 54 61 62 6c 65 0a  The Expr.iTable.
8be0: 2a 2a 20 76 61 6c 75 65 20 69 73 20 63 68 61 6e  ** value is chan
8bf0: 67 65 64 20 74 6f 20 74 68 65 20 69 6e 64 65 78  ged to the index
8c00: 20 6f 66 20 74 68 65 20 72 65 66 65 72 65 6e 63   of the referenc
8c10: 65 64 20 74 61 62 6c 65 20 69 6e 20 70 54 61 62  ed table in pTab
8c20: 4c 69 73 74 0a 2a 2a 20 70 6c 75 73 20 74 68 65  List.** plus the
8c30: 20 22 62 61 73 65 22 20 76 61 6c 75 65 2e 20 20   "base" value.  
8c40: 54 68 65 20 62 61 73 65 20 76 61 6c 75 65 20 77  The base value w
8c50: 69 6c 6c 20 75 6c 74 69 6d 61 74 65 6c 79 20 62  ill ultimately b
8c60: 65 63 6f 6d 65 20 74 68 65 0a 2a 2a 20 56 44 42  ecome the.** VDB
8c70: 45 20 63 75 72 73 6f 72 20 6e 75 6d 62 65 72 20  E cursor number 
8c80: 66 6f 72 20 61 20 63 75 72 73 6f 72 20 74 68 61  for a cursor tha
8c90: 74 20 69 73 20 70 6f 69 6e 74 69 6e 67 20 69 6e  t is pointing in
8ca0: 74 6f 20 74 68 65 20 72 65 66 65 72 65 6e 63 65  to the reference
8cb0: 64 0a 2a 2a 20 74 61 62 6c 65 2e 20 20 54 68 65  d.** table.  The
8cc0: 20 45 78 70 72 2e 69 43 6f 6c 75 6d 6e 20 76 61   Expr.iColumn va
8cd0: 6c 75 65 20 69 73 20 63 68 61 6e 67 65 64 20 74  lue is changed t
8ce0: 6f 20 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74  o the index of t
8cf0: 68 65 20 63 6f 6c 75 6d 6e 20 0a 2a 2a 20 6f 66  he column .** of
8d00: 20 74 68 65 20 72 65 66 65 72 65 6e 63 65 64 20   the referenced 
8d10: 74 61 62 6c 65 2e 20 20 54 68 65 20 45 78 70 72  table.  The Expr
8d20: 2e 69 43 6f 6c 75 6d 6e 20 76 61 6c 75 65 20 66  .iColumn value f
8d30: 6f 72 20 74 68 65 20 73 70 65 63 69 61 6c 0a 2a  or the special.*
8d40: 2a 20 52 4f 57 49 44 20 63 6f 6c 75 6d 6e 20 69  * ROWID column i
8d50: 73 20 2d 31 2e 20 20 41 6e 79 20 49 4e 54 45 47  s -1.  Any INTEG
8d60: 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20 63  ER PRIMARY KEY c
8d70: 6f 6c 75 6d 6e 20 69 73 20 74 72 69 65 64 20 61  olumn is tried a
8d80: 73 20 61 6e 0a 2a 2a 20 61 6c 69 61 73 20 66 6f  s an.** alias fo
8d90: 72 20 52 4f 57 49 44 2e 0a 2a 2a 0a 2a 2a 20 41  r ROWID..**.** A
8da0: 6c 73 6f 20 72 65 73 6f 6c 76 65 20 66 75 6e 63  lso resolve func
8db0: 74 69 6f 6e 20 6e 61 6d 65 73 20 61 6e 64 20 63  tion names and c
8dc0: 68 65 63 6b 20 74 68 65 20 66 75 6e 63 74 69 6f  heck the functio
8dd0: 6e 73 20 66 6f 72 20 70 72 6f 70 65 72 0a 2a 2a  ns for proper.**
8de0: 20 75 73 61 67 65 2e 20 20 4d 61 6b 65 20 73 75   usage.  Make su
8df0: 72 65 20 61 6c 6c 20 66 75 6e 63 74 69 6f 6e 20  re all function 
8e00: 6e 61 6d 65 73 20 61 72 65 20 72 65 63 6f 67 6e  names are recogn
8e10: 69 7a 65 64 20 61 6e 64 20 61 6c 6c 20 66 75 6e  ized and all fun
8e20: 63 74 69 6f 6e 73 0a 2a 2a 20 68 61 76 65 20 74  ctions.** have t
8e30: 68 65 20 63 6f 72 72 65 63 74 20 6e 75 6d 62 65  he correct numbe
8e40: 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 2e 20  r of arguments. 
8e50: 20 4c 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20   Leave an error 
8e60: 6d 65 73 73 61 67 65 0a 2a 2a 20 69 6e 20 70 50  message.** in pP
8e70: 61 72 73 65 2d 3e 7a 45 72 72 4d 73 67 20 69 66  arse->zErrMsg if
8e80: 20 61 6e 79 74 68 69 6e 67 20 69 73 20 61 6d 69   anything is ami
8e90: 73 73 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  ss.  Return the 
8ea0: 6e 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73  number of errors
8eb0: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
8ec0: 78 70 72 65 73 73 69 6f 6e 20 63 6f 6e 74 61 69  xpression contai
8ed0: 6e 73 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ns aggregate fun
8ee0: 63 74 69 6f 6e 73 20 74 68 65 6e 20 73 65 74 20  ctions then set 
8ef0: 74 68 65 20 45 50 5f 41 67 67 0a 2a 2a 20 70 72  the EP_Agg.** pr
8f00: 6f 70 65 72 74 79 20 6f 6e 20 74 68 65 20 65 78  operty on the ex
8f10: 70 72 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 69 6e 74  pression..*/.int
8f20: 20 73 71 6c 69 74 65 33 45 78 70 72 52 65 73 6f   sqlite3ExprReso
8f30: 6c 76 65 4e 61 6d 65 73 28 0a 20 20 4e 61 6d 65  lveNames(.  Name
8f40: 43 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 20 20  Context *pNC,   
8f50: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
8f60: 20 74 6f 20 72 65 73 6f 6c 76 65 20 65 78 70 72   to resolve expr
8f70: 65 73 73 69 6f 6e 73 20 69 6e 2e 20 2a 2f 0a 20  essions in. */. 
8f80: 20 45 78 70 72 20 2a 70 45 78 70 72 20 20 20 20   Expr *pExpr    
8f90: 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
8fa0: 65 78 70 72 65 73 73 69 6f 6e 20 74 6f 20 62 65  expression to be
8fb0: 20 61 6e 61 6c 79 7a 65 64 2e 20 2a 2f 0a 29 7b   analyzed. */.){
8fc0: 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d 30 20  .  if( pExpr==0 
8fd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 77 61  ) return 0;.  wa
8fe0: 6c 6b 45 78 70 72 54 72 65 65 28 70 45 78 70 72  lkExprTree(pExpr
8ff0: 2c 20 6e 61 6d 65 52 65 73 6f 6c 76 65 72 53 74  , nameResolverSt
9000: 65 70 2c 20 70 4e 43 29 3b 0a 20 20 69 66 28 20  ep, pNC);.  if( 
9010: 70 4e 43 2d 3e 6e 45 72 72 3e 30 20 29 7b 0a 20  pNC->nErr>0 ){. 
9020: 20 20 20 45 78 70 72 53 65 74 50 72 6f 70 65 72     ExprSetProper
9030: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72  ty(pExpr, EP_Err
9040: 6f 72 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  or);.  }.  retur
9050: 6e 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  n ExprHasPropert
9060: 79 28 70 45 78 70 72 2c 20 45 50 5f 45 72 72 6f  y(pExpr, EP_Erro
9070: 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 20 70  r);.}../*.** A p
9080: 6f 69 6e 74 65 72 20 69 6e 73 74 61 6e 63 65 20  ointer instance 
9090: 6f 66 20 74 68 69 73 20 73 74 72 75 63 74 75 72  of this structur
90a0: 65 20 69 73 20 75 73 65 64 20 74 6f 20 70 61 73  e is used to pas
90b0: 73 20 69 6e 66 6f 72 6d 61 74 69 6f 6e 0a 2a 2a  s information.**
90c0: 20 74 68 72 6f 75 67 68 20 77 61 6c 6b 45 78 70   through walkExp
90d0: 72 54 72 65 65 20 69 6e 74 6f 20 63 6f 64 65 53  rTree into codeS
90e0: 75 62 71 75 65 72 79 53 74 65 70 28 29 2e 0a 2a  ubqueryStep()..*
90f0: 2f 0a 74 79 70 65 64 65 66 20 73 74 72 75 63 74  /.typedef struct
9100: 20 51 75 65 72 79 43 6f 64 65 72 20 51 75 65 72   QueryCoder Quer
9110: 79 43 6f 64 65 72 3b 0a 73 74 72 75 63 74 20 51  yCoder;.struct Q
9120: 75 65 72 79 43 6f 64 65 72 20 7b 0a 20 20 50 61  ueryCoder {.  Pa
9130: 72 73 65 20 2a 70 50 61 72 73 65 3b 20 20 20 20  rse *pParse;    
9140: 20 20 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e     /* The parsin
9150: 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 4e  g context */.  N
9160: 61 6d 65 43 6f 6e 74 65 78 74 20 2a 70 4e 43 3b  ameContext *pNC;
9170: 20 20 20 20 2f 2a 20 4e 61 6d 65 73 70 61 63 65      /* Namespace
9180: 20 6f 66 20 66 69 72 73 74 20 65 6e 63 6c 6f 73   of first enclos
9190: 69 6e 67 20 71 75 65 72 79 20 2a 2f 0a 7d 3b 0a  ing query */.};.
91a0: 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65  ../*.** Generate
91b0: 20 63 6f 64 65 20 66 6f 72 20 73 75 62 71 75 65   code for subque
91c0: 72 69 65 73 20 61 6e 64 20 49 4e 20 6f 70 65 72  ries and IN oper
91d0: 61 74 6f 72 73 2e 0a 2a 2a 0a 2a 2a 20 49 4e 20  ators..**.** IN 
91e0: 6f 70 65 72 61 74 6f 72 73 20 63 6f 6d 65 73 20  operators comes 
91f0: 69 6e 20 74 77 6f 20 66 6f 72 6d 73 3a 0a 2a 2a  in two forms:.**
9200: 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20 65 78  .**           ex
9210: 70 72 20 49 4e 20 28 65 78 70 72 6c 69 73 74 29  pr IN (exprlist)
9220: 0a 2a 2a 20 61 6e 64 0a 2a 2a 20 20 20 20 20 20  .** and.**      
9230: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
9240: 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20  LECT ...).**.** 
9250: 54 68 65 20 66 69 72 73 74 20 66 6f 72 6d 20 69  The first form i
9260: 73 20 68 61 6e 64 6c 65 64 20 62 79 20 63 72 65  s handled by cre
9270: 61 74 69 6e 67 20 61 20 73 65 74 20 68 6f 6c 64  ating a set hold
9280: 69 6e 67 20 74 68 65 20 6c 69 73 74 0a 2a 2a 20  ing the list.** 
9290: 6f 66 20 61 6c 6c 6f 77 65 64 20 76 61 6c 75 65  of allowed value
92a0: 73 2e 20 20 54 68 65 20 73 65 63 6f 6e 64 20 66  s.  The second f
92b0: 6f 72 6d 20 63 61 75 73 65 73 20 74 68 65 20 53  orm causes the S
92c0: 45 4c 45 43 54 20 74 6f 20 67 65 6e 65 72 61 74  ELECT to generat
92d0: 65 20 0a 2a 2a 20 61 20 74 65 6d 70 6f 72 61 72  e .** a temporar
92e0: 79 20 74 61 62 6c 65 2e 0a 2a 2f 0a 23 69 66 6e  y table..*/.#ifn
92f0: 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f  def SQLITE_OMIT_
9300: 53 55 42 51 55 45 52 59 0a 76 6f 69 64 20 73 71  SUBQUERY.void sq
9310: 6c 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65  lite3CodeSubsele
9320: 63 74 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ct(Parse *pParse
9330: 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a  , Expr *pExpr){.
9340: 20 20 69 6e 74 20 6c 61 62 65 6c 20 3d 20 30 3b    int label = 0;
9350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9360: 20 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72           /* Addr
9370: 65 73 73 20 61 66 74 65 72 20 73 75 62 2d 73 65  ess after sub-se
9380: 6c 65 63 74 20 63 6f 64 65 20 2a 2f 0a 20 20 56  lect code */.  V
9390: 64 62 65 20 2a 76 20 3d 20 73 71 6c 69 74 65 33  dbe *v = sqlite3
93a0: 47 65 74 56 64 62 65 28 70 50 61 72 73 65 29 3b  GetVdbe(pParse);
93b0: 0a 20 20 69 66 28 20 76 3d 3d 30 20 29 20 72 65  .  if( v==0 ) re
93c0: 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 49 66 20 74  turn;..  /* If t
93d0: 68 69 73 20 69 73 20 6e 6f 74 20 61 20 76 61 72  his is not a var
93e0: 69 61 62 6c 65 20 28 63 6f 72 72 65 6c 61 74 65  iable (correlate
93f0: 64 29 20 73 65 6c 65 63 74 2c 20 74 68 65 6e 20  d) select, then 
9400: 65 78 65 63 75 74 65 0a 20 20 2a 2a 20 69 74 20  execute.  ** it 
9410: 6f 6e 6c 79 20 6f 6e 63 65 2e 20 55 6e 6c 65 73  only once. Unles
9420: 73 20 74 68 69 73 20 69 73 20 70 61 72 74 20 6f  s this is part o
9430: 66 20 61 20 74 72 69 67 67 65 72 20 70 72 6f 67  f a trigger prog
9440: 72 61 6d 2e 20 49 6e 0a 20 20 2a 2a 20 74 68 61  ram. In.  ** tha
9450: 74 20 63 61 73 65 20 72 65 2d 65 78 65 63 75 74  t case re-execut
9460: 65 20 65 76 65 72 79 20 74 69 6d 65 20 28 74 68  e every time (th
9470: 69 73 20 63 6f 75 6c 64 20 62 65 20 6f 70 74 69  is could be opti
9480: 6d 69 7a 65 64 29 2e 0a 20 20 2a 2f 0a 20 20 69  mized)..  */.  i
9490: 66 28 20 21 45 78 70 72 48 61 73 41 6e 79 50 72  f( !ExprHasAnyPr
94a0: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
94b0: 5f 56 61 72 53 65 6c 65 63 74 29 20 26 26 20 21  _VarSelect) && !
94c0: 70 50 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63  pParse->trigStac
94d0: 6b 20 29 7b 0a 20 20 20 20 69 6e 74 20 6d 65 6d  k ){.    int mem
94e0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 2b   = pParse->nMem+
94f0: 2b 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64  +;.    sqlite3Vd
9500: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
9510: 6d 4c 6f 61 64 2c 20 6d 65 6d 2c 20 30 29 3b 0a  mLoad, mem, 0);.
9520: 20 20 20 20 6c 61 62 65 6c 20 3d 20 73 71 6c 69      label = sqli
9530: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
9540: 28 76 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33  (v);.    sqlite3
9550: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9560: 49 66 2c 20 30 2c 20 6c 61 62 65 6c 29 3b 0a 20  If, 0, label);. 
9570: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
9580: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
9590: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 73 71  r, 1, 0);.    sq
95a0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
95b0: 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65 2c 20 6d  , OP_MemStore, m
95c0: 65 6d 2c 20 31 29 3b 0a 20 20 7d 0a 0a 20 20 69  em, 1);.  }..  i
95d0: 66 28 20 70 45 78 70 72 2d 3e 70 53 65 6c 65 63  f( pExpr->pSelec
95e0: 74 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  t ){.    sqlite3
95f0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
9600: 41 67 67 43 6f 6e 74 65 78 74 50 75 73 68 2c 20  AggContextPush, 
9610: 30 2c 20 30 29 3b 0a 20 20 7d 0a 0a 20 20 73 77  0, 0);.  }..  sw
9620: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
9630: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
9640: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
9650: 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20 20  affinity;.      
9660: 4b 65 79 49 6e 66 6f 20 6b 65 79 49 6e 66 6f 3b  KeyInfo keyInfo;
9670: 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b  .      int addr;
9680: 20 20 20 20 20 20 20 20 2f 2a 20 41 64 64 72 65          /* Addre
9690: 73 73 20 6f 66 20 4f 50 5f 4f 70 65 6e 54 65 6d  ss of OP_OpenTem
96a0: 70 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f  p instruction */
96b0: 0a 0a 20 20 20 20 20 20 61 66 66 69 6e 69 74 79  ..      affinity
96c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
96d0: 66 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c  finity(pExpr->pL
96e0: 65 66 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20  eft);..      /* 
96f0: 57 68 65 74 68 65 72 20 74 68 69 73 20 69 73 20  Whether this is 
9700: 61 6e 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e  an 'x IN(SELECT.
9710: 2e 2e 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e  ..)' or an 'x IN
9720: 28 3c 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20  (<exprlist>)'.  
9730: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
9740: 6e 20 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20  n it is handled 
9750: 74 68 65 20 73 61 6d 65 20 77 61 79 2e 20 41 20  the same way. A 
9760: 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 20  temporary table 
9770: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
9780: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
9790: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
97a0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
97b0: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
97c0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
97d0: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
97e0: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
97f0: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
9800: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
9810: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
9820: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
9830: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
9840: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
9850: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
9860: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
9870: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
9880: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
9890: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
98a0: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
98b0: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
98c0: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
98d0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
98e0: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
98f0: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
9900: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
9910: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
9920: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
9930: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
9940: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
9950: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
9960: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
9970: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
9980: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
9990: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
99a0: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
99b0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
99c0: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
99d0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
99e0: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
99f0: 64 64 4f 70 28 76 2c 20 4f 50 5f 4f 70 65 6e 54  ddOp(v, OP_OpenT
9a00: 65 6d 70 2c 20 70 45 78 70 72 2d 3e 69 54 61 62  emp, pExpr->iTab
9a10: 6c 65 2c 20 30 29 3b 0a 20 20 20 20 20 20 6d 65  le, 0);.      me
9a20: 6d 73 65 74 28 26 6b 65 79 49 6e 66 6f 2c 20 30  mset(&keyInfo, 0
9a30: 2c 20 73 69 7a 65 6f 66 28 6b 65 79 49 6e 66 6f  , sizeof(keyInfo
9a40: 29 29 3b 0a 20 20 20 20 20 20 6b 65 79 49 6e 66  ));.      keyInf
9a50: 6f 2e 6e 46 69 65 6c 64 20 3d 20 31 3b 0a 20 20  o.nField = 1;.  
9a60: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
9a70: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 65 74 4e 75  ddOp(v, OP_SetNu
9a80: 6d 43 6f 6c 75 6d 6e 73 2c 20 70 45 78 70 72 2d  mColumns, pExpr-
9a90: 3e 69 54 61 62 6c 65 2c 20 31 29 3b 0a 0a 20 20  >iTable, 1);..  
9aa0: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
9ab0: 53 65 6c 65 63 74 20 29 7b 0a 20 20 20 20 20 20  Select ){.      
9ac0: 20 20 2f 2a 20 43 61 73 65 20 31 3a 20 20 20 20    /* Case 1:    
9ad0: 20 65 78 70 72 20 49 4e 20 28 53 45 4c 45 43 54   expr IN (SELECT
9ae0: 20 2e 2e 2e 29 0a 20 20 20 20 20 20 20 20 2a 2a   ...).        **
9af0: 0a 20 20 20 20 20 20 20 20 2a 2a 20 47 65 6e 65  .        ** Gene
9b00: 72 61 74 65 20 63 6f 64 65 20 74 6f 20 77 72 69  rate code to wri
9b10: 74 65 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f  te the results o
9b20: 66 20 74 68 65 20 73 65 6c 65 63 74 20 69 6e 74  f the select int
9b30: 6f 20 74 68 65 20 74 65 6d 70 6f 72 61 72 79 0a  o the temporary.
9b40: 20 20 20 20 20 20 20 20 2a 2a 20 74 61 62 6c 65          ** table
9b50: 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 6f   allocated and o
9b60: 70 65 6e 65 64 20 61 62 6f 76 65 2e 0a 20 20 20  pened above..   
9b70: 20 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 20 20       */.        
9b80: 69 6e 74 20 69 50 61 72 6d 20 3d 20 70 45 78 70  int iParm = pExp
9b90: 72 2d 3e 69 54 61 62 6c 65 20 2b 20 20 28 28 28  r->iTable +  (((
9ba0: 69 6e 74 29 61 66 66 69 6e 69 74 79 29 3c 3c 31  int)affinity)<<1
9bb0: 36 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72  6);.        Expr
9bc0: 4c 69 73 74 20 2a 70 45 4c 69 73 74 3b 0a 20 20  List *pEList;.  
9bd0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 28 70        assert( (p
9be0: 45 78 70 72 2d 3e 69 54 61 62 6c 65 26 30 78 30  Expr->iTable&0x0
9bf0: 30 30 30 46 46 46 46 29 3d 3d 70 45 78 70 72 2d  000FFFF)==pExpr-
9c00: 3e 69 54 61 62 6c 65 20 29 3b 0a 20 20 20 20 20  >iTable );.     
9c10: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
9c20: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
9c30: 70 53 65 6c 65 63 74 2c 20 53 52 54 5f 53 65 74  pSelect, SRT_Set
9c40: 2c 20 69 50 61 72 6d 2c 20 30 2c 20 30 2c 20 30  , iParm, 0, 0, 0
9c50: 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70 45  , 0);.        pE
9c60: 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 70 53  List = pExpr->pS
9c70: 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b 0a 20  elect->pEList;. 
9c80: 20 20 20 20 20 20 20 69 66 28 20 70 45 4c 69 73         if( pELis
9c90: 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45 78  t && pEList->nEx
9ca0: 70 72 3e 30 20 29 7b 20 0a 20 20 20 20 20 20 20  pr>0 ){ .       
9cb0: 20 20 20 6b 65 79 49 6e 66 6f 2e 61 43 6f 6c 6c     keyInfo.aColl
9cc0: 5b 30 5d 20 3d 20 62 69 6e 61 72 79 43 6f 6d 70  [0] = binaryComp
9cd0: 61 72 65 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  areCollSeq(pPars
9ce0: 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
9cf0: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
9d00: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
9d10: 72 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20 20  r);.        }.  
9d20: 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45      }else if( pE
9d30: 78 70 72 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20  xpr->pList ){.  
9d40: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 32 3a        /* Case 2:
9d50: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 65 78       expr IN (ex
9d60: 70 72 6c 69 73 74 29 0a 20 20 20 20 20 20 20 20  prlist).        
9d70: 2a 2a 0a 09 2a 2a 20 46 6f 72 20 65 61 63 68 20  **..** For each 
9d80: 65 78 70 72 65 73 73 69 6f 6e 2c 20 62 75 69 6c  expression, buil
9d90: 64 20 61 6e 20 69 6e 64 65 78 20 6b 65 79 20 66  d an index key f
9da0: 72 6f 6d 20 74 68 65 20 65 76 61 6c 75 61 74 69  rom the evaluati
9db0: 6f 6e 20 61 6e 64 0a 20 20 20 20 20 20 20 20 2a  on and.        *
9dc0: 2a 20 73 74 6f 72 65 20 69 74 20 69 6e 20 74 68  * store it in th
9dd0: 65 20 74 65 6d 70 6f 72 61 72 79 20 74 61 62 6c  e temporary tabl
9de0: 65 2e 20 49 66 20 3c 65 78 70 72 3e 20 69 73 20  e. If <expr> is 
9df0: 61 20 63 6f 6c 75 6d 6e 2c 20 74 68 65 6e 20 75  a column, then u
9e00: 73 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68  se.        ** th
9e10: 61 74 20 63 6f 6c 75 6d 6e 73 20 61 66 66 69 6e  at columns affin
9e20: 69 74 79 20 77 68 65 6e 20 62 75 69 6c 64 69 6e  ity when buildin
9e30: 67 20 69 6e 64 65 78 20 6b 65 79 73 2e 20 49 66  g index keys. If
9e40: 20 3c 65 78 70 72 3e 20 69 73 20 6e 6f 74 0a 20   <expr> is not. 
9e50: 20 20 20 20 20 20 20 2a 2a 20 61 20 63 6f 6c 75         ** a colu
9e60: 6d 6e 2c 20 75 73 65 20 6e 75 6d 65 72 69 63 20  mn, use numeric 
9e70: 61 66 66 69 6e 69 74 79 2e 0a 20 20 20 20 20 20  affinity..      
9e80: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 6e 74    */.        int
9e90: 20 69 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20   i;.        if( 
9ea0: 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20 20  !affinity ){.   
9eb0: 20 20 20 20 20 20 20 61 66 66 69 6e 69 74 79 20         affinity 
9ec0: 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d  = SQLITE_AFF_NUM
9ed0: 45 52 49 43 3b 0a 20 20 20 20 20 20 20 20 7d 0a  ERIC;.        }.
9ee0: 20 20 20 20 20 20 20 20 6b 65 79 49 6e 66 6f 2e          keyInfo.
9ef0: 61 43 6f 6c 6c 5b 30 5d 20 3d 20 70 45 78 70 72  aColl[0] = pExpr
9f00: 2d 3e 70 4c 65 66 74 2d 3e 70 43 6f 6c 6c 3b 0a  ->pLeft->pColl;.
9f10: 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70  .        /* Loop
9f20: 20 74 68 72 6f 75 67 68 20 65 61 63 68 20 65 78   through each ex
9f30: 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c 65 78 70  pression in <exp
9f40: 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20 20 20 20  rlist>. */.     
9f50: 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 45     for(i=0; i<pE
9f60: 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  xpr->pList->nExp
9f70: 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20  r; i++){.       
9f80: 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20 70     Expr *pE2 = p
9f90: 45 78 70 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 69  Expr->pList->a[i
9fa0: 5d 2e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ].pExpr;..      
9fb0: 20 20 20 20 2f 2a 20 43 68 65 63 6b 20 74 68 61      /* Check tha
9fc0: 74 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  t the expression
9fd0: 20 69 73 20 63 6f 6e 73 74 61 6e 74 20 61 6e 64   is constant and
9fe0: 20 76 61 6c 69 64 2e 20 2a 2f 0a 20 20 20 20 20   valid. */.     
9ff0: 20 20 20 20 20 69 66 28 20 21 73 71 6c 69 74 65       if( !sqlite
a000: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28  3ExprIsConstant(
a010: 70 45 32 29 20 29 7b 0a 20 20 20 20 20 20 20 20  pE2) ){.        
a020: 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
a030: 4d 73 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20  Msg(pParse,.    
a040: 20 20 20 20 20 20 20 20 20 20 22 72 69 67 68 74            "right
a050: 2d 68 61 6e 64 20 73 69 64 65 20 6f 66 20 49 4e  -hand side of IN
a060: 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20 62   operator must b
a070: 65 20 63 6f 6e 73 74 61 6e 74 22 29 3b 0a 20 20  e constant");.  
a080: 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72 6e            return
a090: 3b 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 0a 20  ;.          }.. 
a0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 45 76 61 6c           /* Eval
a0b0: 75 61 74 65 20 74 68 65 20 65 78 70 72 65 73 73  uate the express
a0c0: 69 6f 6e 20 61 6e 64 20 69 6e 73 65 72 74 20 69  ion and insert i
a0d0: 74 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 20  t into the temp 
a0e0: 74 61 62 6c 65 20 2a 2f 0a 20 20 20 20 20 20 20  table */.       
a0f0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
a100: 64 65 28 70 50 61 72 73 65 2c 20 70 45 32 29 3b  de(pParse, pE2);
a110: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a120: 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f  e3VdbeOp3(v, OP_
a130: 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20 30  MakeRecord, 1, 0
a140: 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29 3b  , &affinity, 1);
a150: 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74  .          sqlit
a160: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
a170: 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c 20 30 29  P_String8, 0, 0)
a180: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
a190: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
a1a0: 4f 50 5f 50 75 74 53 74 72 4b 65 79 2c 20 70 45  OP_PutStrKey, pE
a1b0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
a1c0: 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
a1d0: 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
a1e0: 56 64 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20  VdbeChangeP3(v, 
a1f0: 61 64 64 72 2c 20 28 76 6f 69 64 20 2a 29 26 6b  addr, (void *)&k
a200: 65 79 49 6e 66 6f 2c 20 50 33 5f 4b 45 59 49 4e  eyInfo, P3_KEYIN
a210: 46 4f 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  FO);.      break
a220: 3b 0a 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73  ;.    }..    cas
a230: 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20  e TK_EXISTS:.   
a240: 20 63 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a   case TK_SELECT:
a250: 20 7b 0a 20 20 20 20 20 20 2f 2a 20 54 68 69 73   {.      /* This
a260: 20 68 61 73 20 74 6f 20 62 65 20 61 20 73 63 61   has to be a sca
a270: 6c 61 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e  lar SELECT.  Gen
a280: 65 72 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75  erate code to pu
a290: 74 20 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76  t the.      ** v
a2a0: 61 6c 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c  alue of this sel
a2b0: 65 63 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20  ect in a memory 
a2c0: 63 65 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20  cell and record 
a2d0: 74 68 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20  the number.     
a2e0: 20 2a 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72   ** of the memor
a2f0: 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
a300: 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
a310: 20 20 69 6e 74 20 73 6f 70 3b 0a 20 20 20 20 20    int sop;.     
a320: 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 0a 0a   Select *pSel;..
a330: 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f        pExpr->iCo
a340: 6c 75 6d 6e 20 3d 20 70 50 61 72 73 65 2d 3e 6e  lumn = pParse->n
a350: 4d 65 6d 2b 2b 3b 0a 20 20 20 20 20 20 70 53 65  Mem++;.      pSe
a360: 6c 20 3d 20 70 45 78 70 72 2d 3e 70 53 65 6c 65  l = pExpr->pSele
a370: 63 74 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  ct;.      if( pE
a380: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c 45  xpr->op==TK_SELE
a390: 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20 73 6f  CT ){.        so
a3a0: 70 20 3d 20 53 52 54 5f 4d 65 6d 3b 0a 20 20 20  p = SRT_Mem;.   
a3b0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
a3c0: 20 20 73 74 61 74 69 63 20 63 6f 6e 73 74 20 54    static const T
a3d0: 6f 6b 65 6e 20 6f 6e 65 20 3d 20 7b 20 22 31 22  oken one = { "1"
a3e0: 2c 20 30 2c 20 31 20 7d 3b 0a 20 20 20 20 20 20  , 0, 1 };.      
a3f0: 20 20 73 6f 70 20 3d 20 53 52 54 5f 45 78 69 73    sop = SRT_Exis
a400: 74 73 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  ts;.        sqli
a410: 74 65 33 45 78 70 72 4c 69 73 74 44 65 6c 65 74  te3ExprListDelet
a420: 65 28 70 53 65 6c 2d 3e 70 45 4c 69 73 74 29 3b  e(pSel->pEList);
a430: 0a 20 20 20 20 20 20 20 20 70 53 65 6c 2d 3e 70  .        pSel->p
a440: 45 4c 69 73 74 20 3d 20 73 71 6c 69 74 65 33 45  EList = sqlite3E
a450: 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 30 2c  xprListAppend(0,
a460: 20 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20   .              
a470: 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
a480: 74 65 33 45 78 70 72 28 54 4b 5f 49 4e 54 45 47  te3Expr(TK_INTEG
a490: 45 52 2c 20 30 2c 20 30 2c 20 26 6f 6e 65 29 2c  ER, 0, 0, &one),
a4a0: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
a4b0: 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74     sqlite3Select
a4c0: 28 70 50 61 72 73 65 2c 20 70 53 65 6c 2c 20 73  (pParse, pSel, s
a4d0: 6f 70 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75  op, pExpr->iColu
a4e0: 6d 6e 2c 20 30 2c 20 30 2c 20 30 2c 20 30 29 3b  mn, 0, 0, 0, 0);
a4f0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
a500: 20 20 7d 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70    }.  }..  if( p
a510: 45 78 70 72 2d 3e 70 53 65 6c 65 63 74 20 29 7b  Expr->pSelect ){
a520: 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65  .    sqlite3Vdbe
a530: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 67 67 43  AddOp(v, OP_AggC
a540: 6f 6e 74 65 78 74 50 6f 70 2c 20 30 2c 20 30 29  ontextPop, 0, 0)
a550: 3b 0a 20 20 7d 0a 20 20 69 66 28 20 6c 61 62 65  ;.  }.  if( labe
a560: 6c 3c 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  l<0 ){.    sqlit
a570: 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62  e3VdbeResolveLab
a580: 65 6c 28 76 2c 20 6c 61 62 65 6c 29 3b 0a 20 20  el(v, label);.  
a590: 7d 0a 20 20 72 65 74 75 72 6e 3b 0a 7d 0a 23 65  }.  return;.}.#e
a5a0: 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f  ndif /* SQLITE_O
a5b0: 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a  MIT_SUBQUERY */.
a5c0: 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
a5d0: 61 6e 20 69 6e 73 74 72 75 63 74 69 6f 6e 20 74  an instruction t
a5e0: 68 61 74 20 77 69 6c 6c 20 70 75 74 20 74 68 65  hat will put the
a5f0: 20 69 6e 74 65 67 65 72 20 64 65 73 63 72 69 62   integer describ
a600: 65 20 62 79 0a 2a 2a 20 74 65 78 74 20 7a 5b 30  e by.** text z[0
a610: 2e 2e 6e 2d 31 5d 20 6f 6e 20 74 68 65 20 73 74  ..n-1] on the st
a620: 61 63 6b 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76  ack..*/.static v
a630: 6f 69 64 20 63 6f 64 65 49 6e 74 65 67 65 72 28  oid codeInteger(
a640: 56 64 62 65 20 2a 76 2c 20 63 6f 6e 73 74 20 63  Vdbe *v, const c
a650: 68 61 72 20 2a 7a 2c 20 69 6e 74 20 6e 29 7b 0a  har *z, int n){.
a660: 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20 73    int i;.  if( s
a670: 71 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 7a  qlite3GetInt32(z
a680: 2c 20 26 69 29 20 29 7b 0a 20 20 20 20 73 71 6c  , &i) ){.    sql
a690: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
a6a0: 20 4f 50 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20   OP_Integer, i, 
a6b0: 30 29 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  0);.  }else if( 
a6c0: 73 71 6c 69 74 65 33 46 69 74 73 49 6e 36 34 42  sqlite3FitsIn64B
a6d0: 69 74 73 28 7a 29 20 29 7b 0a 20 20 20 20 73 71  its(z) ){.    sq
a6e0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
a6f0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 30  OP_Integer, 0, 0
a700: 2c 20 7a 2c 20 6e 29 3b 0a 20 20 7d 65 6c 73 65  , z, n);.  }else
a710: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 56 64 62  {.    sqlite3Vdb
a720: 65 4f 70 33 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  eOp3(v, OP_Real,
a730: 20 30 2c 20 30 2c 20 7a 2c 20 6e 29 3b 0a 20 20   0, 0, z, n);.  
a740: 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
a750: 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74 68  ate code into th
a760: 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20 74  e current Vdbe t
a770: 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20 67  o evaluate the g
a780: 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73 69  iven.** expressi
a790: 6f 6e 20 61 6e 64 20 6c 65 61 76 65 20 74 68 65  on and leave the
a7a0: 20 72 65 73 75 6c 74 20 6f 6e 20 74 68 65 20 74   result on the t
a7b0: 6f 70 20 6f 66 20 73 74 61 63 6b 2e 0a 2a 2a 0a  op of stack..**.
a7c0: 2a 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70  ** This code dep
a7d0: 65 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74  ends on the fact
a7e0: 20 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f   that certain to
a7f0: 6b 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20  ken values (ex: 
a800: 54 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68  TK_EQ).** are th
a810: 65 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65  e same as opcode
a820: 20 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f   values (ex: OP_
a830: 45 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65  Eq) that impleme
a840: 6e 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e  nt the correspon
a850: 64 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f  ding.** operatio
a860: 6e 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d  n.  Special comm
a870: 65 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61  ents in vdbe.c a
a880: 6e 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68  nd the mkopcodeh
a890: 2e 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a  .awk script in.*
a8a0: 2a 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65  * the make proce
a8b0: 73 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76  ss cause these v
a8c0: 61 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20  alues to align. 
a8d0: 20 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68   Assert()s in th
a8e0: 65 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20  e code.** below 
a8f0: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
a900: 6e 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67  numbers are alig
a910: 6e 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a  ned correctly..*
a920: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
a930: 70 72 43 6f 64 65 28 50 61 72 73 65 20 2a 70 50  prCode(Parse *pP
a940: 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
a950: 72 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20  r){.  Vdbe *v = 
a960: 70 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20  pParse->pVdbe;. 
a970: 20 69 6e 74 20 6f 70 3b 0a 20 20 69 66 28 20 76   int op;.  if( v
a980: 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20  ==0 ) return;.  
a990: 69 66 28 20 70 45 78 70 72 3d 3d 30 20 29 7b 0a  if( pExpr==0 ){.
a9a0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
a9b0: 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69 6e  ddOp(v, OP_Strin
a9c0: 67 38 2c 20 30 2c 20 30 29 3b 20 20 2f 2a 20 45  g8, 0, 0);  /* E
a9d0: 6d 70 74 79 20 65 78 70 72 65 73 73 69 6f 6e 20  mpty expression 
a9e0: 65 76 61 6c 73 20 74 6f 20 4e 55 4c 4c 20 2a 2f  evals to NULL */
a9f0: 0a 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d  .    return;.  }
aa00: 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
aa10: 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
aa20: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ){.    case TK_C
aa30: 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 69  OLUMN: {.      i
aa40: 66 28 20 70 50 61 72 73 65 2d 3e 75 73 65 41 67  f( pParse->useAg
aa50: 67 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  g ){.        sql
aa60: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aa70: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
aa80: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
aa90: 20 20 20 7d 65 6c 73 65 20 69 66 28 20 70 45 78     }else if( pEx
aaa0: 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30 20 29  pr->iColumn>=0 )
aab0: 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
aac0: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
aad0: 5f 43 6f 6c 75 6d 6e 2c 20 70 45 78 70 72 2d 3e  _Column, pExpr->
aae0: 69 54 61 62 6c 65 2c 20 70 45 78 70 72 2d 3e 69  iTable, pExpr->i
aaf0: 43 6f 6c 75 6d 6e 29 3b 0a 23 69 66 6e 64 65 66  Column);.#ifndef
ab00: 20 4e 44 45 42 55 47 0a 20 20 20 20 20 20 20 20   NDEBUG.        
ab10: 69 66 28 20 70 45 78 70 72 2d 3e 73 70 61 6e 2e  if( pExpr->span.
ab20: 7a 20 26 26 20 70 45 78 70 72 2d 3e 73 70 61 6e  z && pExpr->span
ab30: 2e 6e 3e 30 20 26 26 20 70 45 78 70 72 2d 3e 73  .n>0 && pExpr->s
ab40: 70 61 6e 2e 6e 3c 31 30 30 20 29 7b 0a 20 20 20  pan.n<100 ){.   
ab50: 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d 6d 65         VdbeComme
ab60: 6e 74 28 28 76 2c 20 22 23 20 25 54 22 2c 20 26  nt((v, "# %T", &
ab70: 70 45 78 70 72 2d 3e 73 70 61 6e 29 29 3b 0a 20  pExpr->span));. 
ab80: 20 20 20 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a         }.#endif.
ab90: 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
aba0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
abb0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 52 65 63 6e  AddOp(v, OP_Recn
abc0: 6f 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  o, pExpr->iTable
abd0: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
abe0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abf0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54  .    case TK_INT
ac00: 45 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 63 6f  EGER: {.      co
ac10: 64 65 49 6e 74 65 67 65 72 28 76 2c 20 70 45 78  deInteger(v, pEx
ac20: 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45 78  pr->token.z, pEx
ac30: 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 29 3b 0a 20 20  pr->token.n);.  
ac40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ac50: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
ac60: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
ac70: 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20  STRING: {.      
ac80: 61 73 73 65 72 74 28 20 54 4b 5f 46 4c 4f 41 54  assert( TK_FLOAT
ac90: 3d 3d 4f 50 5f 52 65 61 6c 20 29 3b 0a 20 20 20  ==OP_Real );.   
aca0: 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 53 54     assert( TK_ST
acb0: 52 49 4e 47 3d 3d 4f 50 5f 53 74 72 69 6e 67 38  RING==OP_String8
acc0: 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65   );.      sqlite
acd0: 33 56 64 62 65 4f 70 33 28 76 2c 20 6f 70 2c 20  3VdbeOp3(v, op, 
ace0: 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  0, 0, pExpr->tok
acf0: 65 6e 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b  en.z, pExpr->tok
ad00: 65 6e 2e 6e 29 3b 0a 20 20 20 20 20 20 73 71 6c  en.n);.      sql
ad10: 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65 50  ite3VdbeDequoteP
ad20: 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20 20  3(v, -1);.      
ad30: 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
ad40: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ad50: 5f 42 4c 4f 42 5f 4c 49 54 45 52 41 4c 0a 20 20  _BLOB_LITERAL.  
ad60: 20 20 63 61 73 65 20 54 4b 5f 42 4c 4f 42 3a 20    case TK_BLOB: 
ad70: 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
ad80: 54 4b 5f 42 4c 4f 42 3d 3d 4f 50 5f 48 65 78 42  TK_BLOB==OP_HexB
ad90: 6c 6f 62 20 29 3b 0a 20 20 20 20 20 20 73 71 6c  lob );.      sql
ada0: 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 6f  ite3VdbeOp3(v, o
adb0: 70 2c 20 30 2c 20 30 2c 20 70 45 78 70 72 2d 3e  p, 0, 0, pExpr->
adc0: 74 6f 6b 65 6e 2e 7a 2b 31 2c 20 70 45 78 70 72  token.z+1, pExpr
add0: 2d 3e 74 6f 6b 65 6e 2e 6e 2d 31 29 3b 0a 20 20  ->token.n-1);.  
ade0: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 44      sqlite3VdbeD
adf0: 65 71 75 6f 74 65 50 33 28 76 2c 20 2d 31 29 3b  equoteP3(v, -1);
ae00: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
ae10: 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
ae20: 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20 7b 0a 20  ase TK_NULL: {. 
ae30: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
ae40: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 53 74 72 69  AddOp(v, OP_Stri
ae50: 6e 67 38 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  ng8, 0, 0);.    
ae60: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
ae70: 20 20 20 63 61 73 65 20 54 4b 5f 56 41 52 49 41     case TK_VARIA
ae80: 42 4c 45 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  BLE: {.      sql
ae90: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
aea0: 20 4f 50 5f 56 61 72 69 61 62 6c 65 2c 20 70 45   OP_Variable, pE
aeb0: 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b  xpr->iTable, 0);
aec0: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
aed0: 2d 3e 74 6f 6b 65 6e 2e 6e 3e 31 20 29 7b 0a 20  ->token.n>1 ){. 
aee0: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
aef0: 62 65 43 68 61 6e 67 65 50 33 28 76 2c 20 2d 31  beChangeP3(v, -1
af00: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a  , pExpr->token.z
af10: 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e  , pExpr->token.n
af20: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
af30: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
af40: 20 20 63 61 73 65 20 54 4b 5f 52 45 47 49 53 54    case TK_REGIST
af50: 45 52 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  ER: {.      sqli
af60: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
af70: 4f 50 5f 4d 65 6d 4c 6f 61 64 2c 20 70 45 78 70  OP_MemLoad, pExp
af80: 72 2d 3e 69 54 61 62 6c 65 2c 20 30 29 3b 0a 20  r->iTable, 0);. 
af90: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
afa0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
afb0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
afc0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
afd0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
afe0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
aff0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
b000: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
b010: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
b020: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
b030: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
b040: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b050: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
b060: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
b070: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
b080: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
b090: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
b0a0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
b0b0: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
b0c0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
b0d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
b0e0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
b0f0: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
b100: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
b110: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
b120: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
b130: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
b140: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 30 2c  ->pRight, op, 0,
b150: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
b160: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
b170: 20 54 4b 5f 41 4e 44 3a 0a 20 20 20 20 63 61 73   TK_AND:.    cas
b180: 65 20 54 4b 5f 4f 52 3a 0a 20 20 20 20 63 61 73  e TK_OR:.    cas
b190: 65 20 54 4b 5f 50 4c 55 53 3a 0a 20 20 20 20 63  e TK_PLUS:.    c
b1a0: 61 73 65 20 54 4b 5f 53 54 41 52 3a 0a 20 20 20  ase TK_STAR:.   
b1b0: 20 63 61 73 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a   case TK_MINUS:.
b1c0: 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45 4d 3a      case TK_REM:
b1d0: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
b1e0: 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
b1f0: 5f 42 49 54 4f 52 3a 0a 20 20 20 20 63 61 73 65  _BITOR:.    case
b200: 20 54 4b 5f 53 4c 41 53 48 3a 0a 20 20 20 20 63   TK_SLASH:.    c
b210: 61 73 65 20 54 4b 5f 4c 53 48 49 46 54 3a 0a 20  ase TK_LSHIFT:. 
b220: 20 20 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46     case TK_RSHIF
b230: 54 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  T: .    case TK_
b240: 43 4f 4e 43 41 54 3a 20 7b 0a 20 20 20 20 20 20  CONCAT: {.      
b250: 61 73 73 65 72 74 28 20 54 4b 5f 41 4e 44 3d 3d  assert( TK_AND==
b260: 4f 50 5f 41 6e 64 20 29 3b 0a 20 20 20 20 20 20  OP_And );.      
b270: 61 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f  assert( TK_OR==O
b280: 50 5f 4f 72 20 29 3b 0a 20 20 20 20 20 20 61 73  P_Or );.      as
b290: 73 65 72 74 28 20 54 4b 5f 50 4c 55 53 3d 3d 4f  sert( TK_PLUS==O
b2a0: 50 5f 41 64 64 20 29 3b 0a 20 20 20 20 20 20 61  P_Add );.      a
b2b0: 73 73 65 72 74 28 20 54 4b 5f 4d 49 4e 55 53 3d  ssert( TK_MINUS=
b2c0: 3d 4f 50 5f 53 75 62 74 72 61 63 74 20 29 3b 0a  =OP_Subtract );.
b2d0: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b2e0: 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d 61 69 6e 64  _REM==OP_Remaind
b2f0: 65 72 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65  er );.      asse
b300: 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d 4f  rt( TK_BITAND==O
b310: 50 5f 42 69 74 41 6e 64 20 29 3b 0a 20 20 20 20  P_BitAnd );.    
b320: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49 54    assert( TK_BIT
b330: 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b 0a  OR==OP_BitOr );.
b340: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
b350: 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76 69 64  _SLASH==OP_Divid
b360: 65 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  e );.      asser
b370: 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d 4f 50  t( TK_LSHIFT==OP
b380: 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 0a 20 20  _ShiftLeft );.  
b390: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52      assert( TK_R
b3a0: 53 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52  SHIFT==OP_ShiftR
b3b0: 69 67 68 74 20 29 3b 0a 20 20 20 20 20 20 61 73  ight );.      as
b3c0: 73 65 72 74 28 20 54 4b 5f 43 4f 4e 43 41 54 3d  sert( TK_CONCAT=
b3d0: 3d 4f 50 5f 43 6f 6e 63 61 74 20 29 3b 0a 20 20  =OP_Concat );.  
b3e0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
b3f0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
b400: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
b410: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
b420: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
b430: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 73  pRight);.      s
b440: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28  qlite3VdbeAddOp(
b450: 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20  v, op, 0, 0);.  
b460: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
b470: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 55 4d 49  .    case TK_UMI
b480: 4e 55 53 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  NUS: {.      Exp
b490: 72 20 2a 70 4c 65 66 74 20 3d 20 70 45 78 70 72  r *pLeft = pExpr
b4a0: 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 61  ->pLeft;.      a
b4b0: 73 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a  ssert( pLeft );.
b4c0: 20 20 20 20 20 20 69 66 28 20 70 4c 65 66 74 2d        if( pLeft-
b4d0: 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54 20 7c 7c  >op==TK_FLOAT ||
b4e0: 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 49   pLeft->op==TK_I
b4f0: 4e 54 45 47 45 52 20 29 7b 0a 20 20 20 20 20 20  NTEGER ){.      
b500: 20 20 54 6f 6b 65 6e 20 2a 70 20 3d 20 26 70 4c    Token *p = &pL
b510: 65 66 74 2d 3e 74 6f 6b 65 6e 3b 0a 20 20 20 20  eft->token;.    
b520: 20 20 20 20 63 68 61 72 20 2a 7a 20 3d 20 73 71      char *z = sq
b530: 6c 69 74 65 4d 61 6c 6c 6f 63 28 20 70 2d 3e 6e  liteMalloc( p->n
b540: 20 2b 20 32 20 29 3b 0a 20 20 20 20 20 20 20 20   + 2 );.        
b550: 73 70 72 69 6e 74 66 28 7a 2c 20 22 2d 25 2e 2a  sprintf(z, "-%.*
b560: 73 22 2c 20 70 2d 3e 6e 2c 20 70 2d 3e 7a 29 3b  s", p->n, p->z);
b570: 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 4c 65  .        if( pLe
b580: 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46 4c 4f 41 54  ft->op==TK_FLOAT
b590: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71   ){.          sq
b5a0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
b5b0: 4f 50 5f 52 65 61 6c 2c 20 30 2c 20 30 2c 20 7a  OP_Real, 0, 0, z
b5c0: 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20 20 20 20 20  , p->n+1);.     
b5d0: 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
b5e0: 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
b5f0: 76 2c 20 7a 2c 20 70 2d 3e 6e 2b 31 29 3b 0a 20  v, z, p->n+1);. 
b600: 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
b610: 20 73 71 6c 69 74 65 46 72 65 65 28 7a 29 3b 0a   sqliteFree(z);.
b620: 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20          break;. 
b630: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 2f 2a 20       }.      /* 
b640: 46 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 6e 74  Fall through int
b650: 6f 20 54 4b 5f 4e 4f 54 20 2a 2f 0a 20 20 20 20  o TK_NOT */.    
b660: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49  }.    case TK_BI
b670: 54 4e 4f 54 3a 0a 20 20 20 20 63 61 73 65 20 54  TNOT:.    case T
b680: 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20 61  K_NOT: {.      a
b690: 73 73 65 72 74 28 20 54 4b 5f 42 49 54 4e 4f 54  ssert( TK_BITNOT
b6a0: 3d 3d 4f 50 5f 42 69 74 4e 6f 74 20 29 3b 0a 20  ==OP_BitNot );. 
b6b0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b6c0: 4e 4f 54 3d 3d 4f 50 5f 4e 6f 74 20 29 3b 0a 20  NOT==OP_Not );. 
b6d0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
b6e0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
b6f0: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
b700: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
b710: 4f 70 28 76 2c 20 6f 70 2c 20 30 2c 20 30 29 3b  Op(v, op, 0, 0);
b720: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
b730: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
b740: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
b750: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
b760: 20 20 20 20 20 69 6e 74 20 64 65 73 74 3b 0a 20       int dest;. 
b770: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
b780: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
b790: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
b7a0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
b7b0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
b7c0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
b7d0: 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  dOp(v, OP_Intege
b7e0: 72 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20 20 20  r, 1, 0);.      
b7f0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
b800: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
b810: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 64 65 73  Left);.      des
b820: 74 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43  t = sqlite3VdbeC
b830: 75 72 72 65 6e 74 41 64 64 72 28 76 29 20 2b 20  urrentAddr(v) + 
b840: 32 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  2;.      sqlite3
b850: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 6f 70 2c  VdbeAddOp(v, op,
b860: 20 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   1, dest);.     
b870: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
b880: 70 28 76 2c 20 4f 50 5f 41 64 64 49 6d 6d 2c 20  p(v, OP_AddImm, 
b890: 2d 31 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72  -1, 0);.      br
b8a0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
b8b0: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
b8c0: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ION: {.      sql
b8d0: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
b8e0: 20 4f 50 5f 41 67 67 47 65 74 2c 20 30 2c 20 70   OP_AggGet, 0, p
b8f0: 45 78 70 72 2d 3e 69 41 67 67 29 3b 0a 20 20 20  Expr->iAgg);.   
b900: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
b910: 20 20 20 20 63 61 73 65 20 54 4b 5f 43 44 41 54      case TK_CDAT
b920: 45 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  E:.    case TK_C
b930: 54 49 4d 45 3a 0a 20 20 20 20 63 61 73 65 20 54  TIME:.    case T
b940: 4b 5f 43 54 49 4d 45 53 54 41 4d 50 3a 0a 20 20  K_CTIMESTAMP:.  
b950: 20 20 63 61 73 65 20 54 4b 5f 47 4c 4f 42 3a 0a    case TK_GLOB:.
b960: 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 49 4b 45      case TK_LIKE
b970: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 55  :.    case TK_FU
b980: 4e 43 54 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20  NCTION: {.      
b990: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 20  ExprList *pList 
b9a0: 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 3b 0a  = pExpr->pList;.
b9b0: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 20        int nExpr 
b9c0: 3d 20 70 4c 69 73 74 20 3f 20 70 4c 69 73 74 2d  = pList ? pList-
b9d0: 3e 6e 45 78 70 72 20 3a 20 30 3b 0a 20 20 20 20  >nExpr : 0;.    
b9e0: 20 20 46 75 6e 63 44 65 66 20 2a 70 44 65 66 3b    FuncDef *pDef;
b9f0: 0a 20 20 20 20 20 20 69 6e 74 20 6e 49 64 3b 0a  .      int nId;.
ba00: 20 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72        const char
ba10: 20 2a 7a 49 64 3b 0a 20 20 20 20 20 20 69 6e 74   *zId;.      int
ba20: 20 70 32 20 3d 20 30 3b 0a 20 20 20 20 20 20 69   p2 = 0;.      i
ba30: 6e 74 20 69 3b 0a 20 20 20 20 20 20 75 38 20 65  nt i;.      u8 e
ba40: 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 2d  nc = pParse->db-
ba50: 3e 65 6e 63 3b 0a 20 20 20 20 20 20 43 6f 6c 6c  >enc;.      Coll
ba60: 53 65 71 20 2a 70 43 6f 6c 6c 20 3d 20 30 3b 0a  Seq *pColl = 0;.
ba70: 20 20 20 20 20 20 67 65 74 46 75 6e 63 74 69 6f        getFunctio
ba80: 6e 4e 61 6d 65 28 70 45 78 70 72 2c 20 26 7a 49  nName(pExpr, &zI
ba90: 64 2c 20 26 6e 49 64 29 3b 0a 20 20 20 20 20 20  d, &nId);.      
baa0: 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 46 69  pDef = sqlite3Fi
bab0: 6e 64 46 75 6e 63 74 69 6f 6e 28 70 50 61 72 73  ndFunction(pPars
bac0: 65 2d 3e 64 62 2c 20 7a 49 64 2c 20 6e 49 64 2c  e->db, zId, nId,
bad0: 20 6e 45 78 70 72 2c 20 65 6e 63 2c 20 30 29 3b   nExpr, enc, 0);
bae0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
baf0: 44 65 66 21 3d 30 20 29 3b 0a 20 20 20 20 20 20  Def!=0 );.      
bb00: 6e 45 78 70 72 20 3d 20 73 71 6c 69 74 65 33 45  nExpr = sqlite3E
bb10: 78 70 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28  xprCodeExprList(
bb20: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 29 3b 0a  pParse, pList);.
bb30: 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69        for(i=0; i
bb40: 3c 6e 45 78 70 72 20 26 26 20 69 3c 33 32 3b 20  <nExpr && i<32; 
bb50: 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66  i++){.        if
bb60: 28 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  ( sqlite3ExprIsC
bb70: 6f 6e 73 74 61 6e 74 28 70 4c 69 73 74 2d 3e 61  onstant(pList->a
bb80: 5b 69 5d 2e 70 45 78 70 72 29 20 29 7b 0a 20 20  [i].pExpr) ){.  
bb90: 20 20 20 20 20 20 20 20 70 32 20 7c 3d 20 28 31          p2 |= (1
bba0: 3c 3c 69 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a  <<i);.        }.
bbb0: 20 20 20 20 20 20 20 20 69 66 28 20 70 44 65 66          if( pDef
bbc0: 2d 3e 6e 65 65 64 43 6f 6c 6c 53 65 71 20 26 26  ->needCollSeq &&
bbd0: 20 21 70 43 6f 6c 6c 20 29 7b 0a 20 20 20 20 20   !pColl ){.     
bbe0: 20 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71 6c       pColl = sql
bbf0: 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71 28  ite3ExprCollSeq(
bc00: 70 50 61 72 73 65 2c 20 70 4c 69 73 74 2d 3e 61  pParse, pList->a
bc10: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
bc20: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20      }.      }.  
bc30: 20 20 20 20 69 66 28 20 70 44 65 66 2d 3e 6e 65      if( pDef->ne
bc40: 65 64 43 6f 6c 6c 53 65 71 20 29 7b 0a 20 20 20  edCollSeq ){.   
bc50: 20 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20       if( !pColl 
bc60: 29 20 70 43 6f 6c 6c 20 3d 20 70 50 61 72 73 65  ) pColl = pParse
bc70: 2d 3e 64 62 2d 3e 70 44 66 6c 74 43 6f 6c 6c 3b  ->db->pDfltColl;
bc80: 20 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65   .        sqlite
bc90: 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 43  3VdbeOp3(v, OP_C
bca0: 6f 6c 6c 53 65 71 2c 20 30 2c 20 30 2c 20 28 63  ollSeq, 0, 0, (c
bcb0: 68 61 72 20 2a 29 70 43 6f 6c 6c 2c 20 50 33 5f  har *)pColl, P3_
bcc0: 43 4f 4c 4c 53 45 51 29 3b 0a 20 20 20 20 20 20  COLLSEQ);.      
bcd0: 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  }.      sqlite3V
bce0: 64 62 65 4f 70 33 28 76 2c 20 4f 50 5f 46 75 6e  dbeOp3(v, OP_Fun
bcf0: 63 74 69 6f 6e 2c 20 6e 45 78 70 72 2c 20 70 32  ction, nExpr, p2
bd00: 2c 20 28 63 68 61 72 2a 29 70 44 65 66 2c 20 50  , (char*)pDef, P
bd10: 33 5f 46 55 4e 43 44 45 46 29 3b 0a 20 20 20 20  3_FUNCDEF);.    
bd20: 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23    break;.    }.#
bd30: 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  ifndef SQLITE_OM
bd40: 49 54 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20  IT_SUBQUERY.    
bd50: 63 61 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 0a  case TK_EXISTS:.
bd60: 20 20 20 20 63 61 73 65 20 54 4b 5f 53 45 4c 45      case TK_SELE
bd70: 43 54 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69  CT: {.      sqli
bd80: 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74  te3CodeSubselect
bd90: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29 3b  (pParse, pExpr);
bda0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
bdb0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 4d 65  beAddOp(v, OP_Me
bdc0: 6d 4c 6f 61 64 2c 20 70 45 78 70 72 2d 3e 69 43  mLoad, pExpr->iC
bdd0: 6f 6c 75 6d 6e 2c 20 30 29 3b 0a 20 20 20 20 20  olumn, 0);.     
bde0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
bdf0: 20 22 23 20 6c 6f 61 64 20 73 75 62 71 75 65 72   "# load subquer
be00: 79 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20  y result"));.   
be10: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
be20: 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20      case TK_IN: 
be30: 7b 0a 20 20 20 20 20 20 69 6e 74 20 61 64 64 72  {.      int addr
be40: 3b 0a 20 20 20 20 20 20 63 68 61 72 20 61 66 66  ;.      char aff
be50: 69 6e 69 74 79 3b 0a 20 20 20 20 20 20 73 71 6c  inity;.      sql
be60: 69 74 65 33 43 6f 64 65 53 75 62 73 65 6c 65 63  ite3CodeSubselec
be70: 74 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 29  t(pParse, pExpr)
be80: 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 46 69 67 75  ;..      /* Figu
be90: 72 65 20 6f 75 74 20 74 68 65 20 61 66 66 69 6e  re out the affin
bea0: 69 74 79 20 74 6f 20 75 73 65 20 74 6f 20 63 72  ity to use to cr
beb0: 65 61 74 65 20 61 20 6b 65 79 20 66 72 6f 6d 20  eate a key from 
bec0: 74 68 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20  the results.    
bed0: 20 20 2a 2a 20 6f 66 20 74 68 65 20 65 78 70 72    ** of the expr
bee0: 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e 69 74 79  ession. affinity
bef0: 53 74 72 20 73 74 6f 72 65 73 20 61 20 73 74 61  Str stores a sta
bf00: 74 69 63 20 73 74 72 69 6e 67 20 73 75 69 74 61  tic string suita
bf10: 62 6c 65 20 66 6f 72 0a 20 20 20 20 20 20 2a 2a  ble for.      **
bf20: 20 50 33 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65   P3 of OP_MakeRe
bf30: 63 6f 72 64 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  cord..      */. 
bf40: 20 20 20 20 20 61 66 66 69 6e 69 74 79 20 3d 20       affinity = 
bf50: 63 6f 6d 70 61 72 69 73 6f 6e 41 66 66 69 6e 69  comparisonAffini
bf60: 74 79 28 70 45 78 70 72 29 3b 0a 0a 20 20 20 20  ty(pExpr);..    
bf70: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
bf80: 4f 70 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65 72  Op(v, OP_Integer
bf90: 2c 20 31 2c 20 30 29 3b 0a 0a 20 20 20 20 20 20  , 1, 0);..      
bfa0: 2f 2a 20 43 6f 64 65 20 74 68 65 20 3c 65 78 70  /* Code the <exp
bfb0: 72 3e 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20  r> from "<expr> 
bfc0: 49 4e 20 28 2e 2e 2e 29 22 2e 20 54 68 65 20 74  IN (...)". The t
bfd0: 65 6d 70 6f 72 61 72 79 20 74 61 62 6c 65 0a 20  emporary table. 
bfe0: 20 20 20 20 20 2a 2a 20 70 45 78 70 72 2d 3e 69       ** pExpr->i
bff0: 54 61 62 6c 65 20 63 6f 6e 74 61 69 6e 73 20 74  Table contains t
c000: 68 65 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d  he values that m
c010: 61 6b 65 20 75 70 20 74 68 65 20 28 2e 2e 2e 29  ake up the (...)
c020: 20 73 65 74 2e 0a 20 20 20 20 20 20 2a 2f 0a 20   set..      */. 
c030: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c040: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78  Code(pParse, pEx
c050: 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20  pr->pLeft);.    
c060: 20 20 61 64 64 72 20 3d 20 73 71 6c 69 74 65 33    addr = sqlite3
c070: 56 64 62 65 43 75 72 72 65 6e 74 41 64 64 72 28  VdbeCurrentAddr(
c080: 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  v);.      sqlite
c090: 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50  3VdbeAddOp(v, OP
c0a0: 5f 4e 6f 74 4e 75 6c 6c 2c 20 2d 31 2c 20 61 64  _NotNull, -1, ad
c0b0: 64 72 2b 34 29 3b 20 20 20 20 20 20 20 20 20 20  dr+4);          
c0c0: 20 20 2f 2a 20 61 64 64 72 20 2b 20 30 20 2a 2f    /* addr + 0 */
c0d0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
c0e0: 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 50 6f  beAddOp(v, OP_Po
c0f0: 70 2c 20 32 2c 20 30 29 3b 0a 20 20 20 20 20 20  p, 2, 0);.      
c100: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c110: 28 76 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20  (v, OP_String8, 
c120: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
c130: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c140: 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 61 64 64   OP_Goto, 0, add
c150: 72 2b 37 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  r+7);.      sqli
c160: 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20 4f 50  te3VdbeOp3(v, OP
c170: 5f 4d 61 6b 65 52 65 63 6f 72 64 2c 20 31 2c 20  _MakeRecord, 1, 
c180: 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
c190: 3b 20 20 20 2f 2a 20 61 64 64 72 20 2b 20 34 20  ;   /* addr + 4 
c1a0: 2a 2f 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  */.      sqlite3
c1b0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c1c0: 46 6f 75 6e 64 2c 20 70 45 78 70 72 2d 3e 69 54  Found, pExpr->iT
c1d0: 61 62 6c 65 2c 20 61 64 64 72 2b 37 29 3b 0a 20  able, addr+7);. 
c1e0: 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
c1f0: 41 64 64 4f 70 28 76 2c 20 4f 50 5f 41 64 64 49  AddOp(v, OP_AddI
c200: 6d 6d 2c 20 2d 31 2c 20 30 29 3b 20 20 20 20 20  mm, -1, 0);     
c210: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
c220: 61 64 64 72 20 2b 20 36 20 2a 2f 0a 0a 20 20 20  addr + 6 */..   
c230: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
c240: 23 65 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20  #endif.    case 
c250: 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20  TK_BETWEEN: {.  
c260: 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20      Expr *pLeft 
c270: 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a  = pExpr->pLeft;.
c280: 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78 70        struct Exp
c290: 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74  rList_item *pLIt
c2a0: 65 6d 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73  em = pExpr->pLis
c2b0: 74 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72  t->a;.      Expr
c2c0: 20 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65   *pRight = pLIte
c2d0: 6d 2d 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20  m->pExpr;.      
c2e0: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
c2f0: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b 0a  pParse, pLeft);.
c300: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
c310: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 44 75 70  eAddOp(v, OP_Dup
c320: 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73  , 0, 0);.      s
c330: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c340: 50 61 72 73 65 2c 20 70 52 69 67 68 74 29 3b 0a  Parse, pRight);.
c350: 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72        codeCompar
c360: 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c  e(pParse, pLeft,
c370: 20 70 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20   pRight, OP_Ge, 
c380: 30 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  0, 0);.      sql
c390: 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c  ite3VdbeAddOp(v,
c3a0: 20 4f 50 5f 50 75 6c 6c 2c 20 31 2c 20 30 29 3b   OP_Pull, 1, 0);
c3b0: 0a 20 20 20 20 20 20 70 4c 49 74 65 6d 2b 2b 3b  .      pLItem++;
c3c0: 0a 20 20 20 20 20 20 70 52 69 67 68 74 20 3d 20  .      pRight = 
c3d0: 70 4c 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20  pLItem->pExpr;. 
c3e0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
c3f0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
c400: 67 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65  ght);.      code
c410: 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20  Compare(pParse, 
c420: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 2c 20 4f  pLeft, pRight, O
c430: 50 5f 4c 65 2c 20 30 2c 20 30 29 3b 0a 20 20 20  P_Le, 0, 0);.   
c440: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c450: 64 4f 70 28 76 2c 20 4f 50 5f 41 6e 64 2c 20 30  dOp(v, OP_And, 0
c460: 2c 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61  , 0);.      brea
c470: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
c480: 65 20 54 4b 5f 55 50 4c 55 53 3a 0a 20 20 20 20  e TK_UPLUS:.    
c490: 63 61 73 65 20 54 4b 5f 41 53 3a 20 7b 0a 20 20  case TK_AS: {.  
c4a0: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
c4b0: 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
c4c0: 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20  r->pLeft);.     
c4d0: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
c4e0: 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45 3a 20    case TK_CASE: 
c4f0: 7b 0a 20 20 20 20 20 20 69 6e 74 20 65 78 70 72  {.      int expr
c500: 5f 65 6e 64 5f 6c 61 62 65 6c 3b 0a 20 20 20 20  _end_label;.    
c510: 20 20 69 6e 74 20 6a 75 6d 70 49 6e 73 74 3b 0a    int jumpInst;.
c520: 20 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a        int addr;.
c530: 20 20 20 20 20 20 69 6e 74 20 6e 45 78 70 72 3b        int nExpr;
c540: 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20  .      int i;.  
c550: 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45      ExprList *pE
c560: 4c 69 73 74 3b 0a 20 20 20 20 20 20 73 74 72 75  List;.      stru
c570: 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d  ct ExprList_item
c580: 20 2a 61 4c 69 73 74 65 6c 65 6d 3b 0a 0a 20 20   *aListelem;..  
c590: 20 20 20 20 61 73 73 65 72 74 28 70 45 78 70 72      assert(pExpr
c5a0: 2d 3e 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20  ->pList);.      
c5b0: 61 73 73 65 72 74 28 28 70 45 78 70 72 2d 3e 70  assert((pExpr->p
c5c0: 4c 69 73 74 2d 3e 6e 45 78 70 72 20 25 20 32 29  List->nExpr % 2)
c5d0: 20 3d 3d 20 30 29 3b 0a 20 20 20 20 20 20 61 73   == 0);.      as
c5e0: 73 65 72 74 28 70 45 78 70 72 2d 3e 70 4c 69 73  sert(pExpr->pLis
c5f0: 74 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20  t->nExpr > 0);. 
c600: 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45       pEList = pE
c610: 78 70 72 2d 3e 70 4c 69 73 74 3b 0a 20 20 20 20  xpr->pList;.    
c620: 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70 45    aListelem = pE
c630: 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20 6e  List->a;.      n
c640: 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e 6e  Expr = pEList->n
c650: 45 78 70 72 3b 0a 20 20 20 20 20 20 65 78 70 72  Expr;.      expr
c660: 5f 65 6e 64 5f 6c 61 62 65 6c 20 3d 20 73 71 6c  _end_label = sql
c670: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
c680: 6c 28 76 29 3b 0a 20 20 20 20 20 20 69 66 28 20  l(v);.      if( 
c690: 70 45 78 70 72 2d 3e 70 4c 65 66 74 20 29 7b 0a  pExpr->pLeft ){.
c6a0: 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
c6b0: 78 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20  xprCode(pParse, 
c6c0: 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20  pExpr->pLeft);. 
c6d0: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 66 6f 72       }.      for
c6e0: 28 69 3d 30 3b 20 69 3c 6e 45 78 70 72 3b 20 69  (i=0; i<nExpr; i
c6f0: 3d 69 2b 32 29 7b 0a 20 20 20 20 20 20 20 20 73  =i+2){.        s
c700: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
c710: 50 61 72 73 65 2c 20 61 4c 69 73 74 65 6c 65 6d  Parse, aListelem
c720: 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
c730: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c740: 4c 65 66 74 20 29 7b 0a 20 20 20 20 20 20 20 20  Left ){.        
c750: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
c760: 4f 70 28 76 2c 20 4f 50 5f 44 75 70 2c 20 31 2c  Op(v, OP_Dup, 1,
c770: 20 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6a   1);.          j
c780: 75 6d 70 49 6e 73 74 20 3d 20 63 6f 64 65 43 6f  umpInst = codeCo
c790: 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45  mpare(pParse, pE
c7a0: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 61 4c 69 73  xpr->pLeft, aLis
c7b0: 74 65 6c 65 6d 5b 69 5d 2e 70 45 78 70 72 2c 0a  telem[i].pExpr,.
c7c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
c7e0: 20 4f 50 5f 4e 65 2c 20 30 2c 20 31 29 3b 0a 20   OP_Ne, 0, 1);. 
c7f0: 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
c800: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
c810: 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20 20 20  Pop, 1, 0);.    
c820: 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
c830: 20 20 20 20 20 6a 75 6d 70 49 6e 73 74 20 3d 20       jumpInst = 
c840: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
c850: 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 31 2c  (v, OP_IfNot, 1,
c860: 20 30 29 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20   0);.        }. 
c870: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78         sqlite3Ex
c880: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 61  prCode(pParse, a
c890: 4c 69 73 74 65 6c 65 6d 5b 69 2b 31 5d 2e 70 45  Listelem[i+1].pE
c8a0: 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 73 71  xpr);.        sq
c8b0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
c8c0: 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 65 78  , OP_Goto, 0, ex
c8d0: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
c8e0: 20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71         addr = sq
c8f0: 6c 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74  lite3VdbeCurrent
c900: 41 64 64 72 28 76 29 3b 0a 20 20 20 20 20 20 20  Addr(v);.       
c910: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
c920: 67 65 50 32 28 76 2c 20 6a 75 6d 70 49 6e 73 74  geP2(v, jumpInst
c930: 2c 20 61 64 64 72 29 3b 0a 20 20 20 20 20 20 7d  , addr);.      }
c940: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
c950: 2d 3e 70 4c 65 66 74 20 29 7b 0a 20 20 20 20 20  ->pLeft ){.     
c960: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
c970: 64 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31  dOp(v, OP_Pop, 1
c980: 2c 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  , 0);.      }.  
c990: 20 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 70      if( pExpr->p
c9a0: 52 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 20  Right ){.       
c9b0: 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
c9c0: 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
c9d0: 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20 20 7d  pRight);.      }
c9e0: 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
c9f0: 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 28 76  lite3VdbeAddOp(v
ca00: 2c 20 4f 50 5f 53 74 72 69 6e 67 38 2c 20 30 2c  , OP_String8, 0,
ca10: 20 30 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20   0);.      }.   
ca20: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
ca30: 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 78  solveLabel(v, ex
ca40: 70 72 5f 65 6e 64 5f 6c 61 62 65 6c 29 3b 0a 20  pr_end_label);. 
ca50: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
ca60: 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45  }.#ifndef SQLITE
ca70: 5f 4f 4d 49 54 5f 54 52 49 47 47 45 52 0a 20 20  _OMIT_TRIGGER.  
ca80: 20 20 63 61 73 65 20 54 4b 5f 52 41 49 53 45 3a    case TK_RAISE:
ca90: 20 7b 0a 20 20 20 20 20 20 69 66 28 20 21 70 50   {.      if( !pP
caa0: 61 72 73 65 2d 3e 74 72 69 67 53 74 61 63 6b 20  arse->trigStack 
cab0: 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  ){.        sqlit
cac0: 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73  e3ErrorMsg(pPars
cad0: 65 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  e,.             
cae0: 20 20 20 20 20 20 20 20 20 20 22 52 41 49 53 45            "RAISE
caf0: 28 29 20 6d 61 79 20 6f 6e 6c 79 20 62 65 20 75  () may only be u
cb00: 73 65 64 20 77 69 74 68 69 6e 20 61 20 74 72 69  sed within a tri
cb10: 67 67 65 72 2d 70 72 6f 67 72 61 6d 22 29 3b 0a  gger-program");.
cb20: 09 72 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d  .return;.      }
cb30: 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
cb40: 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 4f 45 5f 49 67  ->iColumn!=OE_Ig
cb50: 6e 6f 72 65 20 29 7b 0a 20 20 20 20 20 20 20 20  nore ){.        
cb60: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
cb70: 69 43 6f 6c 75 6d 6e 3d 3d 4f 45 5f 52 6f 6c 6c  iColumn==OE_Roll
cb80: 62 61 63 6b 20 7c 7c 0a 20 20 20 20 20 20 20 20  back ||.        
cb90: 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e           pExpr->
cba0: 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 41 62  iColumn == OE_Ab
cbb0: 6f 72 74 20 7c 7c 0a 20 20 20 20 20 20 20 20 20  ort ||.         
cbc0: 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69          pExpr->i
cbd0: 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f 46 61 69  Column == OE_Fai
cbe0: 6c 20 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  l );.         sq
cbf0: 6c 69 74 65 33 56 64 62 65 4f 70 33 28 76 2c 20  lite3VdbeOp3(v, 
cc00: 4f 50 5f 48 61 6c 74 2c 20 53 51 4c 49 54 45 5f  OP_Halt, SQLITE_
cc10: 43 4f 4e 53 54 52 41 49 4e 54 2c 20 70 45 78 70  CONSTRAINT, pExp
cc20: 72 2d 3e 69 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20  r->iColumn,.    
cc30: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
cc40: 20 20 20 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e      pExpr->token
cc50: 2e 7a 2c 20 70 45 78 70 72 2d 3e 74 6f 6b 65 6e  .z, pExpr->token
cc60: 2e 6e 29 3b 0a 20 20 20 20 20 20 20 20 20 73 71  .n);.         sq
cc70: 6c 69 74 65 33 56 64 62 65 44 65 71 75 6f 74 65  lite3VdbeDequote
cc80: 50 33 28 76 2c 20 2d 31 29 3b 0a 20 20 20 20 20  P3(v, -1);.     
cc90: 20 7d 20 65 6c 73 65 20 7b 0a 20 20 20 20 20 20   } else {.      
cca0: 20 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72     assert( pExpr
ccb0: 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 3d 20 4f 45 5f  ->iColumn == OE_
ccc0: 49 67 6e 6f 72 65 20 29 3b 0a 20 20 20 20 20 20  Ignore );.      
ccd0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
cce0: 64 4f 70 28 76 2c 20 4f 50 5f 43 6f 6e 74 65 78  dOp(v, OP_Contex
ccf0: 74 50 6f 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20  tPop, 0, 0);.   
cd00: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
cd10: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74  eAddOp(v, OP_Got
cd20: 6f 2c 20 30 2c 20 70 50 61 72 73 65 2d 3e 74 72  o, 0, pParse->tr
cd30: 69 67 53 74 61 63 6b 2d 3e 69 67 6e 6f 72 65 4a  igStack->ignoreJ
cd40: 75 6d 70 29 3b 0a 20 20 20 20 20 20 20 20 20 56  ump);.         V
cd50: 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  dbeComment((v, "
cd60: 23 20 72 61 69 73 65 28 49 47 4e 4f 52 45 29 22  # raise(IGNORE)"
cd70: 29 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  ));.      }.    
cd80: 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 62 72 65  }.#endif.    bre
cd90: 61 6b 3b 0a 20 20 7d 0a 7d 0a 0a 23 69 66 6e 64  ak;.  }.}..#ifnd
cda0: 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
cdb0: 52 49 47 47 45 52 0a 2f 2a 0a 2a 2a 20 47 65 6e  RIGGER./*.** Gen
cdc0: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
cdd0: 65 76 61 6c 75 74 65 73 20 74 68 65 20 67 69 76  evalutes the giv
cde0: 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e  en expression an
cdf0: 64 20 6c 65 61 76 65 73 20 74 68 65 20 72 65 73  d leaves the res
ce00: 75 6c 74 0a 2a 2a 20 6f 6e 20 74 68 65 20 73 74  ult.** on the st
ce10: 61 63 6b 2e 20 20 53 65 65 20 61 6c 73 6f 20 73  ack.  See also s
ce20: 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 29  qlite3ExprCode()
ce30: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
ce40: 74 69 6e 65 20 6d 69 67 68 74 20 61 6c 73 6f 20  tine might also 
ce50: 63 61 63 68 65 20 74 68 65 20 72 65 73 75 6c 74  cache the result
ce60: 20 61 6e 64 20 6d 6f 64 69 66 79 20 74 68 65 20   and modify the 
ce70: 70 45 78 70 72 20 74 72 65 65 0a 2a 2a 20 73 6f  pExpr tree.** so
ce80: 20 74 68 61 74 20 69 74 20 77 69 6c 6c 20 6d 61   that it will ma
ce90: 6b 65 20 75 73 65 20 6f 66 20 74 68 65 20 63 61  ke use of the ca
cea0: 63 68 65 64 20 72 65 73 75 6c 74 20 6f 6e 20 73  ched result on s
ceb0: 75 62 73 65 71 75 65 6e 74 20 65 76 61 6c 75 61  ubsequent evalua
cec0: 74 69 6f 6e 73 0a 2a 2a 20 72 61 74 68 65 72 20  tions.** rather 
ced0: 74 68 61 6e 20 65 76 61 6c 75 61 74 65 20 74 68  than evaluate th
cee0: 65 20 77 68 6f 6c 65 20 65 78 70 72 65 73 73 69  e whole expressi
cef0: 6f 6e 20 61 67 61 69 6e 2e 20 20 54 72 69 76 69  on again.  Trivi
cf00: 61 6c 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61  al expressions a
cf10: 72 65 0a 2a 2a 20 6e 6f 74 20 63 61 63 68 65 64  re.** not cached
cf20: 2e 20 20 49 66 20 74 68 65 20 65 78 70 72 65 73  .  If the expres
cf30: 73 69 6f 6e 20 69 73 20 63 61 63 68 65 64 2c 20  sion is cached, 
cf40: 69 74 73 20 72 65 73 75 6c 74 20 69 73 20 73 74  its result is st
cf50: 6f 72 65 64 20 69 6e 20 61 20 0a 2a 2a 20 6d 65  ored in a .** me
cf60: 6d 6f 72 79 20 6c 6f 63 61 74 69 6f 6e 2e 0a 2a  mory location..*
cf70: 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
cf80: 70 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50  prCodeAndCache(P
cf90: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78  arse *pParse, Ex
cfa0: 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 56 64  pr *pExpr){.  Vd
cfb0: 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
cfc0: 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 69 4d 65  pVdbe;.  int iMe
cfd0: 6d 3b 0a 20 20 69 6e 74 20 61 64 64 72 31 2c 20  m;.  int addr1, 
cfe0: 61 64 64 72 32 3b 0a 20 20 69 66 28 20 76 3d 3d  addr2;.  if( v==
cff0: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 64  0 ) return;.  ad
d000: 64 72 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62  dr1 = sqlite3Vdb
d010: 65 43 75 72 72 65 6e 74 41 64 64 72 28 76 29 3b  eCurrentAddr(v);
d020: 0a 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  .  sqlite3ExprCo
d030: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
d040: 29 3b 0a 20 20 61 64 64 72 32 20 3d 20 73 71 6c  );.  addr2 = sql
d050: 69 74 65 33 56 64 62 65 43 75 72 72 65 6e 74 41  ite3VdbeCurrentA
d060: 64 64 72 28 76 29 3b 0a 20 20 69 66 28 20 61 64  ddr(v);.  if( ad
d070: 64 72 32 3e 61 64 64 72 31 2b 31 20 7c 7c 20 73  dr2>addr1+1 || s
d080: 71 6c 69 74 65 33 56 64 62 65 47 65 74 4f 70 28  qlite3VdbeGetOp(
d090: 76 2c 20 61 64 64 72 31 29 2d 3e 6f 70 63 6f 64  v, addr1)->opcod
d0a0: 65 3d 3d 4f 50 5f 46 75 6e 63 74 69 6f 6e 20 29  e==OP_Function )
d0b0: 7b 0a 20 20 20 20 69 4d 65 6d 20 3d 20 70 45 78  {.    iMem = pEx
d0c0: 70 72 2d 3e 69 54 61 62 6c 65 20 3d 20 70 50 61  pr->iTable = pPa
d0d0: 72 73 65 2d 3e 6e 4d 65 6d 2b 2b 3b 0a 20 20 20  rse->nMem++;.   
d0e0: 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
d0f0: 70 28 76 2c 20 4f 50 5f 4d 65 6d 53 74 6f 72 65  p(v, OP_MemStore
d100: 2c 20 69 4d 65 6d 2c 20 30 29 3b 0a 20 20 20 20  , iMem, 0);.    
d110: 70 45 78 70 72 2d 3e 6f 70 20 3d 20 54 4b 5f 52  pExpr->op = TK_R
d120: 45 47 49 53 54 45 52 3b 0a 20 20 7d 0a 7d 0a 23  EGISTER;.  }.}.#
d130: 65 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e  endif../*.** Gen
d140: 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
d150: 70 75 73 68 65 73 20 74 68 65 20 76 61 6c 75 65  pushes the value
d160: 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d 65 6e   of every elemen
d170: 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e 0a 2a  t of the given.*
d180: 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
d190: 74 20 6f 6e 74 6f 20 74 68 65 20 73 74 61 63 6b  t onto the stack
d1a0: 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ..**.** Return t
d1b0: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 6c 65  he number of ele
d1c0: 6d 65 6e 74 73 20 70 75 73 68 65 64 20 6f 6e 74  ments pushed ont
d1d0: 6f 20 74 68 65 20 73 74 61 63 6b 2e 0a 2a 2f 0a  o the stack..*/.
d1e0: 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
d1f0: 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20 20 50  odeExprList(.  P
d200: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
d210: 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e    /* Parsing con
d220: 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 4c 69  text */.  ExprLi
d230: 73 74 20 2a 70 4c 69 73 74 20 20 20 20 2f 2a 20  st *pList    /* 
d240: 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  The expression l
d250: 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65 64 20  ist to be coded 
d260: 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63 74 20 45  */.){.  struct E
d270: 78 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49  xprList_item *pI
d280: 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  tem;.  int i, n;
d290: 0a 20 20 56 64 62 65 20 2a 76 3b 0a 20 20 69 66  .  Vdbe *v;.  if
d2a0: 28 20 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ( pList==0 ) ret
d2b0: 75 72 6e 20 30 3b 0a 20 20 76 20 3d 20 73 71 6c  urn 0;.  v = sql
d2c0: 69 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72  ite3GetVdbe(pPar
d2d0: 73 65 29 3b 0a 20 20 6e 20 3d 20 70 4c 69 73 74  se);.  n = pList
d2e0: 2d 3e 6e 45 78 70 72 3b 0a 20 20 66 6f 72 28 70  ->nExpr;.  for(p
d2f0: 49 74 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69  Item=pList->a, i
d300: 3d 30 3b 20 69 3c 6e 3b 20 69 2b 2b 2c 20 70 49  =0; i<n; i++, pI
d310: 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 73 71 6c 69  tem++){.    sqli
d320: 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72  te3ExprCode(pPar
d330: 73 65 2c 20 70 49 74 65 6d 2d 3e 70 45 78 70 72  se, pItem->pExpr
d340: 29 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20  );.  }.  return 
d350: 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  n;.}../*.** Gene
d360: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
d370: 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
d380: 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
d390: 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
d3a0: 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
d3b0: 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
d3c0: 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
d3d0: 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
d3e0: 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
d3f0: 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
d400: 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
d410: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
d420: 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
d430: 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
d440: 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
d450: 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
d460: 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
d470: 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
d480: 61 67 20 69 73 20 74 72 75 65 2e 0a 2a 2a 0a 2a  ag is true..**.*
d490: 2a 20 54 68 69 73 20 63 6f 64 65 20 64 65 70 65  * This code depe
d4a0: 6e 64 73 20 6f 6e 20 74 68 65 20 66 61 63 74 20  nds on the fact 
d4b0: 74 68 61 74 20 63 65 72 74 61 69 6e 20 74 6f 6b  that certain tok
d4c0: 65 6e 20 76 61 6c 75 65 73 20 28 65 78 3a 20 54  en values (ex: T
d4d0: 4b 5f 45 51 29 0a 2a 2a 20 61 72 65 20 74 68 65  K_EQ).** are the
d4e0: 20 73 61 6d 65 20 61 73 20 6f 70 63 6f 64 65 20   same as opcode 
d4f0: 76 61 6c 75 65 73 20 28 65 78 3a 20 4f 50 5f 45  values (ex: OP_E
d500: 71 29 20 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e  q) that implemen
d510: 74 20 74 68 65 20 63 6f 72 72 65 73 70 6f 6e 64  t the correspond
d520: 69 6e 67 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e  ing.** operation
d530: 2e 20 20 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65  .  Special comme
d540: 6e 74 73 20 69 6e 20 76 64 62 65 2e 63 20 61 6e  nts in vdbe.c an
d550: 64 20 74 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e  d the mkopcodeh.
d560: 61 77 6b 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a  awk script in.**
d570: 20 74 68 65 20 6d 61 6b 65 20 70 72 6f 63 65 73   the make proces
d580: 73 20 63 61 75 73 65 20 74 68 65 73 65 20 76 61  s cause these va
d590: 6c 75 65 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20  lues to align.  
d5a0: 41 73 73 65 72 74 28 29 73 20 69 6e 20 74 68 65  Assert()s in the
d5b0: 20 63 6f 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76   code.** below v
d5c0: 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20 6e  erify that the n
d5d0: 75 6d 62 65 72 73 20 61 72 65 20 61 6c 69 67 6e  umbers are align
d5e0: 65 64 20 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f  ed correctly..*/
d5f0: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
d600: 72 49 66 54 72 75 65 28 50 61 72 73 65 20 2a 70  rIfTrue(Parse *p
d610: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
d620: 70 72 2c 20 69 6e 74 20 64 65 73 74 2c 20 69 6e  pr, int dest, in
d630: 74 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20  t jumpIfNull){. 
d640: 20 56 64 62 65 20 2a 76 20 3d 20 70 50 61 72 73   Vdbe *v = pPars
d650: 65 2d 3e 70 56 64 62 65 3b 0a 20 20 69 6e 74 20  e->pVdbe;.  int 
d660: 6f 70 20 3d 20 30 3b 0a 20 20 69 66 28 20 76 3d  op = 0;.  if( v=
d670: 3d 30 20 7c 7c 20 70 45 78 70 72 3d 3d 30 20 29  =0 || pExpr==0 )
d680: 20 72 65 74 75 72 6e 3b 0a 20 20 6f 70 20 3d 20   return;.  op = 
d690: 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 73 77 69  pExpr->op;.  swi
d6a0: 74 63 68 28 20 6f 70 20 29 7b 0a 20 20 20 20 63  tch( op ){.    c
d6b0: 61 73 65 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20  ase TK_AND: {.  
d6c0: 20 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c      int d2 = sql
d6d0: 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65  ite3VdbeMakeLabe
d6e0: 6c 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  l(v);.      sqli
d6f0: 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
d700: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
d710: 65 66 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66  eft, d2, !jumpIf
d720: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c  Null);.      sql
d730: 69 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70  ite3ExprIfTrue(p
d740: 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52  Parse, pExpr->pR
d750: 69 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70  ight, dest, jump
d760: 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73  IfNull);.      s
d770: 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76  qlite3VdbeResolv
d780: 65 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20  eLabel(v, d2);. 
d790: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d7a0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
d7b0: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
d7c0: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
d7d0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
d7e0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
d7f0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
d800: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
d810: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
d820: 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66  ht, dest, jumpIf
d830: 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  Null);.      bre
d840: 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
d850: 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
d860: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66     sqlite3ExprIf
d870: 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45  False(pParse, pE
d880: 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
d890: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
d8a0: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
d8b0: 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
d8c0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
d8d0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
d8e0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
d8f0: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
d900: 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
d910: 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
d920: 28 20 54 4b 5f 4c 54 3d 3d 4f 50 5f 4c 74 20 29  ( TK_LT==OP_Lt )
d930: 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
d940: 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65 20 29 3b 0a  TK_LE==OP_Le );.
d950: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b        assert( TK
d960: 5f 47 54 3d 3d 4f 50 5f 47 74 20 29 3b 0a 20 20  _GT==OP_Gt );.  
d970: 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 47      assert( TK_G
d980: 45 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20 20 20 20  E==OP_Ge );.    
d990: 20 20 61 73 73 65 72 74 28 20 54 4b 5f 45 51 3d    assert( TK_EQ=
d9a0: 3d 4f 50 5f 45 71 20 29 3b 0a 20 20 20 20 20 20  =OP_Eq );.      
d9b0: 61 73 73 65 72 74 28 20 54 4b 5f 4e 45 3d 3d 4f  assert( TK_NE==O
d9c0: 50 5f 4e 65 20 29 3b 0a 20 20 20 20 20 20 73 71  P_Ne );.      sq
d9d0: 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50  lite3ExprCode(pP
d9e0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
d9f0: 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ft);.      sqlit
da00: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
da10: 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
da20: 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d  );.      codeCom
da30: 70 61 72 65 28 70 50 61 72 73 65 2c 20 70 45 78  pare(pParse, pEx
da40: 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72  pr->pLeft, pExpr
da50: 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20 64 65  ->pRight, op, de
da60: 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b  st, jumpIfNull);
da70: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
da80: 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
da90: 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61 73 65  ISNULL:.    case
daa0: 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b 0a 20   TK_NOTNULL: {. 
dab0: 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
dac0: 49 53 4e 55 4c 4c 3d 3d 4f 50 5f 49 73 4e 75 6c  ISNULL==OP_IsNul
dad0: 6c 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  l );.      asser
dae0: 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3d 3d 4f  t( TK_NOTNULL==O
daf0: 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 20  P_NotNull );.   
db00: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
db10: 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  de(pParse, pExpr
db20: 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20  ->pLeft);.      
db30: 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
db40: 28 76 2c 20 6f 70 2c 20 31 2c 20 64 65 73 74 29  (v, op, 1, dest)
db50: 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
db60: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
db70: 5f 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20  _BETWEEN: {.    
db80: 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65 73 73    /* The express
db90: 69 6f 6e 20 22 78 20 42 45 54 57 45 45 4e 20 79  ion "x BETWEEN y
dba0: 20 41 4e 44 20 7a 22 20 69 73 20 69 6d 70 6c 65   AND z" is imple
dbb0: 6d 65 6e 74 65 64 20 61 73 3a 0a 20 20 20 20 20  mented as:.     
dbc0: 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 31 20 49   **.      ** 1 I
dbd0: 46 20 28 78 20 3c 20 79 29 20 47 4f 54 4f 20 33  F (x < y) GOTO 3
dbe0: 0a 20 20 20 20 20 20 2a 2a 20 32 20 49 46 20 28  .      ** 2 IF (
dbf0: 78 20 3c 3d 20 7a 29 20 47 4f 54 4f 20 3c 64 65  x <= z) GOTO <de
dc00: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 2e  st>.      ** 3 .
dc10: 2e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  ...      */.    
dc20: 20 20 69 6e 74 20 61 64 64 72 3b 0a 20 20 20 20    int addr;.    
dc30: 20 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20    Expr *pLeft = 
dc40: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
dc50: 20 20 20 20 45 78 70 72 20 2a 70 52 69 67 68 74      Expr *pRight
dc60: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d   = pExpr->pList-
dc70: 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[0].pExpr;.   
dc80: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
dc90: 64 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  de(pParse, pLeft
dca0: 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
dcb0: 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f  VdbeAddOp(v, OP_
dcc0: 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  Dup, 0, 0);.    
dcd0: 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
dce0: 65 28 70 50 61 72 73 65 2c 20 70 52 69 67 68 74  e(pParse, pRight
dcf0: 29 3b 0a 20 20 20 20 20 20 61 64 64 72 20 3d 20  );.      addr = 
dd00: 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72  codeCompare(pPar
dd10: 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68  se, pLeft, pRigh
dd20: 74 2c 20 4f 50 5f 4c 74 2c 20 30 2c 20 21 6a 75  t, OP_Lt, 0, !ju
dd30: 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a 20 20 20 20  mpIfNull);..    
dd40: 20 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72    pRight = pExpr
dd50: 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45  ->pList->a[1].pE
dd60: 78 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  xpr;.      sqlit
dd70: 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
dd80: 65 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20  e, pRight);.    
dd90: 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50    codeCompare(pP
dda0: 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69  arse, pLeft, pRi
ddb0: 67 68 74 2c 20 4f 50 5f 4c 65 2c 20 64 65 73 74  ght, OP_Le, dest
ddc0: 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 0a  , jumpIfNull);..
ddd0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
dde0: 65 41 64 64 4f 70 28 76 2c 20 4f 50 5f 49 6e 74  eAddOp(v, OP_Int
ddf0: 65 67 65 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20  eger, 0, 0);.   
de00: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 43 68     sqlite3VdbeCh
de10: 61 6e 67 65 50 32 28 76 2c 20 61 64 64 72 2c 20  angeP2(v, addr, 
de20: 73 71 6c 69 74 65 33 56 64 62 65 43 75 72 72 65  sqlite3VdbeCurre
de30: 6e 74 41 64 64 72 28 76 29 29 3b 0a 20 20 20 20  ntAddr(v));.    
de40: 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
de50: 4f 70 28 76 2c 20 4f 50 5f 50 6f 70 2c 20 31 2c  Op(v, OP_Pop, 1,
de60: 20 30 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b   0);.      break
de70: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 64 65 66 61  ;.    }.    defa
de80: 75 6c 74 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  ult: {.      sql
de90: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
dea0: 72 73 65 2c 20 70 45 78 70 72 29 3b 0a 20 20 20  rse, pExpr);.   
deb0: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
dec0: 64 4f 70 28 76 2c 20 4f 50 5f 49 66 2c 20 6a 75  dOp(v, OP_If, ju
ded0: 6d 70 49 66 4e 75 6c 6c 2c 20 64 65 73 74 29 3b  mpIfNull, dest);
dee0: 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
def0: 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a    }.  }.}../*.**
df00: 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 66   Generate code f
df10: 6f 72 20 61 20 62 6f 6f 6c 65 61 6e 20 65 78 70  or a boolean exp
df20: 72 65 73 73 69 6f 6e 20 73 75 63 68 20 74 68 61  ression such tha
df30: 74 20 61 20 6a 75 6d 70 20 69 73 20 6d 61 64 65  t a jump is made
df40: 0a 2a 2a 20 74 6f 20 74 68 65 20 6c 61 62 65 6c  .** to the label
df50: 20 22 64 65 73 74 22 20 69 66 20 74 68 65 20 65   "dest" if the e
df60: 78 70 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c  xpression is fal
df70: 73 65 20 62 75 74 20 65 78 65 63 75 74 69 6f 6e  se but execution
df80: 0a 2a 2a 20 63 6f 6e 74 69 6e 75 65 73 20 73 74  .** continues st
df90: 72 61 69 67 68 74 20 74 68 72 75 20 69 66 20 74  raight thru if t
dfa0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
dfb0: 20 74 72 75 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20   true..**.** If 
dfc0: 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 65  the expression e
dfd0: 76 61 6c 75 61 74 65 73 20 74 6f 20 4e 55 4c 4c  valuates to NULL
dfe0: 20 28 6e 65 69 74 68 65 72 20 74 72 75 65 20 6e   (neither true n
dff0: 6f 72 20 66 61 6c 73 65 29 20 74 68 65 6e 0a 2a  or false) then.*
e000: 2a 20 6a 75 6d 70 20 69 66 20 6a 75 6d 70 49 66  * jump if jumpIf
e010: 4e 75 6c 6c 20 69 73 20 74 72 75 65 20 6f 72 20  Null is true or 
e020: 66 61 6c 6c 20 74 68 72 6f 75 67 68 20 69 66 20  fall through if 
e030: 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20 66 61  jumpIfNull is fa
e040: 6c 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  lse..*/.void sql
e050: 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
e060: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45  Parse *pParse, E
e070: 78 70 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20  xpr *pExpr, int 
e080: 64 65 73 74 2c 20 69 6e 74 20 6a 75 6d 70 49 66  dest, int jumpIf
e090: 4e 75 6c 6c 29 7b 0a 20 20 56 64 62 65 20 2a 76  Null){.  Vdbe *v
e0a0: 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
e0b0: 3b 0a 20 20 69 6e 74 20 6f 70 20 3d 20 30 3b 0a  ;.  int op = 0;.
e0c0: 20 20 69 66 28 20 76 3d 3d 30 20 7c 7c 20 70 45    if( v==0 || pE
e0d0: 78 70 72 3d 3d 30 20 29 20 72 65 74 75 72 6e 3b  xpr==0 ) return;
e0e0: 0a 0a 20 20 2f 2a 20 54 68 65 20 76 61 6c 75 65  ..  /* The value
e0f0: 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 20 61 6e   of pExpr->op an
e100: 64 20 6f 70 20 61 72 65 20 72 65 6c 61 74 65 64  d op are related
e110: 20 61 73 20 66 6f 6c 6c 6f 77 73 3a 0a 20 20 2a   as follows:.  *
e120: 2a 0a 20 20 2a 2a 20 20 20 20 20 20 20 70 45 78  *.  **       pEx
e130: 70 72 2d 3e 6f 70 20 20 20 20 20 20 20 20 20 20  pr->op          
e140: 20 20 6f 70 0a 20 20 2a 2a 20 20 20 20 20 20 20    op.  **       
e150: 2d 2d 2d 2d 2d 2d 2d 2d 2d 20 20 20 20 20 20 20  ---------       
e160: 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d 2d 2d 0a 20 20     ----------.  
e170: 2a 2a 20 20 20 20 20 20 20 54 4b 5f 49 53 4e 55  **       TK_ISNU
e180: 4c 4c 20 20 20 20 20 20 20 20 20 20 4f 50 5f 4e  LL          OP_N
e190: 6f 74 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  otNull.  **     
e1a0: 20 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 20 20 20    TK_NOTNULL    
e1b0: 20 20 20 20 20 4f 50 5f 49 73 4e 75 6c 6c 0a 20       OP_IsNull. 
e1c0: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 45 20   **       TK_NE 
e1d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e1e0: 45 71 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Eq.  **       TK
e1f0: 5f 45 51 20 20 20 20 20 20 20 20 20 20 20 20 20  _EQ             
e200: 20 4f 50 5f 4e 65 0a 20 20 2a 2a 20 20 20 20 20   OP_Ne.  **     
e210: 20 20 54 4b 5f 47 54 20 20 20 20 20 20 20 20 20    TK_GT         
e220: 20 20 20 20 20 4f 50 5f 4c 65 0a 20 20 2a 2a 20       OP_Le.  ** 
e230: 20 20 20 20 20 20 54 4b 5f 4c 45 20 20 20 20 20        TK_LE     
e240: 20 20 20 20 20 20 20 20 20 4f 50 5f 47 74 0a 20           OP_Gt. 
e250: 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 45 20   **       TK_GE 
e260: 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
e270: 4c 74 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Lt.  **       TK
e280: 5f 4c 54 20 20 20 20 20 20 20 20 20 20 20 20 20  _LT             
e290: 20 4f 50 5f 47 65 0a 20 20 2a 2a 0a 20 20 2a 2a   OP_Ge.  **.  **
e2a0: 20 46 6f 72 20 6f 74 68 65 72 20 76 61 6c 75 65   For other value
e2b0: 73 20 6f 66 20 70 45 78 70 72 2d 3e 6f 70 2c 20  s of pExpr->op, 
e2c0: 6f 70 20 69 73 20 75 6e 64 65 66 69 6e 65 64 20  op is undefined 
e2d0: 61 6e 64 20 75 6e 75 73 65 64 2e 0a 20 20 2a 2a  and unused..  **
e2e0: 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 54 4b   The value of TK
e2f0: 5f 20 61 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61  _ and OP_ consta
e300: 6e 74 73 20 61 72 65 20 61 72 72 61 6e 67 65 64  nts are arranged
e310: 20 73 75 63 68 20 74 68 61 74 20 77 65 0a 20 20   such that we.  
e320: 2a 2a 20 63 61 6e 20 63 6f 6d 70 75 74 65 20 74  ** can compute t
e330: 68 65 20 6d 61 70 70 69 6e 67 20 61 62 6f 76 65  he mapping above
e340: 20 75 73 69 6e 67 20 74 68 65 20 66 6f 6c 6c 6f   using the follo
e350: 77 69 6e 67 20 65 78 70 72 65 73 73 69 6f 6e 2e  wing expression.
e360: 0a 20 20 2a 2a 20 41 73 73 65 72 74 28 29 73 20  .  ** Assert()s 
e370: 76 65 72 69 66 79 20 74 68 61 74 20 74 68 65 20  verify that the 
e380: 63 6f 6d 70 75 74 61 74 69 6f 6e 20 69 73 20 63  computation is c
e390: 6f 72 72 65 63 74 2e 0a 20 20 2a 2f 0a 20 20 6f  orrect..  */.  o
e3a0: 70 20 3d 20 28 28 70 45 78 70 72 2d 3e 6f 70 2b  p = ((pExpr->op+
e3b0: 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 29 5e 31  (TK_ISNULL&1))^1
e3c0: 29 2d 28 54 4b 5f 49 53 4e 55 4c 4c 26 31 29 3b  )-(TK_ISNULL&1);
e3d0: 0a 0a 20 20 2f 2a 20 56 65 72 69 66 79 20 63 6f  ..  /* Verify co
e3e0: 72 72 65 63 74 20 61 6c 69 67 6e 6d 65 6e 74 20  rrect alignment 
e3f0: 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50 5f 20 63  of TK_ and OP_ c
e400: 6f 6e 73 74 61 6e 74 73 0a 20 20 2a 2f 0a 20 20  onstants.  */.  
e410: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
e420: 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 7c 7c 20  p!=TK_ISNULL || 
e430: 6f 70 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29  op==OP_NotNull )
e440: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e450: 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 4f 54 4e 55 4c  r->op!=TK_NOTNUL
e460: 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 49 73 4e 75  L || op==OP_IsNu
e470: 6c 6c 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20  ll );.  assert( 
e480: 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4e 45  pExpr->op!=TK_NE
e490: 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 45 71 20 29 3b   || op==OP_Eq );
e4a0: 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
e4b0: 2d 3e 6f 70 21 3d 54 4b 5f 45 51 20 7c 7c 20 6f  ->op!=TK_EQ || o
e4c0: 70 3d 3d 4f 50 5f 4e 65 20 29 3b 0a 20 20 61 73  p==OP_Ne );.  as
e4d0: 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21  sert( pExpr->op!
e4e0: 3d 54 4b 5f 4c 54 20 7c 7c 20 6f 70 3d 3d 4f 50  =TK_LT || op==OP
e4f0: 5f 47 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28  _Ge );.  assert(
e500: 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c   pExpr->op!=TK_L
e510: 45 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 47 74 20 29  E || op==OP_Gt )
e520: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70  ;.  assert( pExp
e530: 72 2d 3e 6f 70 21 3d 54 4b 5f 47 54 20 7c 7c 20  r->op!=TK_GT || 
e540: 6f 70 3d 3d 4f 50 5f 4c 65 20 29 3b 0a 20 20 61  op==OP_Le );.  a
e550: 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70  ssert( pExpr->op
e560: 21 3d 54 4b 5f 47 45 20 7c 7c 20 6f 70 3d 3d 4f  !=TK_GE || op==O
e570: 50 5f 4c 74 20 29 3b 0a 0a 20 20 73 77 69 74 63  P_Lt );..  switc
e580: 68 28 20 70 45 78 70 72 2d 3e 6f 70 20 29 7b 0a  h( pExpr->op ){.
e590: 20 20 20 20 63 61 73 65 20 54 4b 5f 41 4e 44 3a      case TK_AND:
e5a0: 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
e5b0: 45 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72  ExprIfFalse(pPar
e5c0: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e5d0: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e5e0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e5f0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
e600: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e610: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e620: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
e630: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
e640: 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
e650: 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
e660: 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
e670: 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
e680: 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
e690: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
e6a0: 74 2c 20 64 32 2c 20 21 6a 75 6d 70 49 66 4e 75  t, d2, !jumpIfNu
e6b0: 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
e6c0: 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70 50  e3ExprIfFalse(pP
e6d0: 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
e6e0: 67 68 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  ght, dest, jumpI
e6f0: 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71  fNull);.      sq
e700: 6c 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65  lite3VdbeResolve
e710: 4c 61 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20  Label(v, d2);.  
e720: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
e730: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
e740: 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
e750: 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
e760: 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74  se, pExpr->pLeft
e770: 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
e780: 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
e790: 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65  ;.    }.    case
e7a0: 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61 73 65   TK_LT:.    case
e7b0: 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61 73 65   TK_LE:.    case
e7c0: 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61 73 65   TK_GT:.    case
e7d0: 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61 73 65   TK_GE:.    case
e7e0: 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61 73 65   TK_NE:.    case
e7f0: 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20 20 20   TK_EQ: {.      
e800: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
e810: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
e820: 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
e830: 69 74 65 33 45 78 70 72 43 6f 64 65 28 70 50 61  ite3ExprCode(pPa
e840: 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67  rse, pExpr->pRig
e850: 68 74 29 3b 0a 20 20 20 20 20 20 63 6f 64 65 43  ht);.      codeC
e860: 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c 20 70  ompare(pParse, p
e870: 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70 45 78  Expr->pLeft, pEx
e880: 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70 2c 20  pr->pRight, op, 
e890: 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  dest, jumpIfNull
e8a0: 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
e8b0: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
e8c0: 4b 5f 49 53 4e 55 4c 4c 3a 0a 20 20 20 20 63 61  K_ISNULL:.    ca
e8d0: 73 65 20 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7b  se TK_NOTNULL: {
e8e0: 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
e8f0: 70 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70  prCode(pParse, p
e900: 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
e910: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
e920: 64 64 4f 70 28 76 2c 20 6f 70 2c 20 31 2c 20 64  ddOp(v, op, 1, d
e930: 65 73 74 29 3b 0a 20 20 20 20 20 20 62 72 65 61  est);.      brea
e940: 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73  k;.    }.    cas
e950: 65 20 54 4b 5f 42 45 54 57 45 45 4e 3a 20 7b 0a  e TK_BETWEEN: {.
e960: 20 20 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70        /* The exp
e970: 72 65 73 73 69 6f 6e 20 69 73 20 22 78 20 42 45  ression is "x BE
e980: 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 22 2e 20  TWEEN y AND z". 
e990: 49 74 20 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65  It is implemente
e9a0: 64 20 61 73 3a 0a 20 20 20 20 20 20 2a 2a 0a 20  d as:.      **. 
e9b0: 20 20 20 20 20 2a 2a 20 31 20 49 46 20 28 78 20       ** 1 IF (x 
e9c0: 3e 3d 20 79 29 20 47 4f 54 4f 20 33 0a 20 20 20  >= y) GOTO 3.   
e9d0: 20 20 20 2a 2a 20 32 20 47 4f 54 4f 20 3c 64 65     ** 2 GOTO <de
e9e0: 73 74 3e 0a 20 20 20 20 20 20 2a 2a 20 33 20 49  st>.      ** 3 I
e9f0: 46 20 28 78 20 3e 20 7a 29 20 47 4f 54 4f 20 3c  F (x > z) GOTO <
ea00: 64 65 73 74 3e 0a 20 20 20 20 20 20 2a 2f 0a 20  dest>.      */. 
ea10: 20 20 20 20 20 69 6e 74 20 61 64 64 72 3b 0a 20       int addr;. 
ea20: 20 20 20 20 20 45 78 70 72 20 2a 70 4c 65 66 74       Expr *pLeft
ea30: 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b   = pExpr->pLeft;
ea40: 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 52 69  .      Expr *pRi
ea50: 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c 69  ght = pExpr->pLi
ea60: 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
ea70: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ea80: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 4c  rCode(pParse, pL
ea90: 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  eft);.      sqli
eaa0: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
eab0: 4f 50 5f 44 75 70 2c 20 30 2c 20 30 29 3b 0a 20  OP_Dup, 0, 0);. 
eac0: 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
ead0: 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 52 69  Code(pParse, pRi
eae0: 67 68 74 29 3b 0a 20 20 20 20 20 20 61 64 64 72  ght);.      addr
eaf0: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 43 75   = sqlite3VdbeCu
eb00: 72 72 65 6e 74 41 64 64 72 28 76 29 3b 0a 20 20  rrentAddr(v);.  
eb10: 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
eb20: 70 50 61 72 73 65 2c 20 70 4c 65 66 74 2c 20 70  pParse, pLeft, p
eb30: 52 69 67 68 74 2c 20 4f 50 5f 47 65 2c 20 61 64  Right, OP_Ge, ad
eb40: 64 72 2b 33 2c 20 21 6a 75 6d 70 49 66 4e 75 6c  dr+3, !jumpIfNul
eb50: 6c 29 3b 0a 0a 20 20 20 20 20 20 73 71 6c 69 74  l);..      sqlit
eb60: 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20 4f  e3VdbeAddOp(v, O
eb70: 50 5f 50 6f 70 2c 20 31 2c 20 30 29 3b 0a 20 20  P_Pop, 1, 0);.  
eb80: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
eb90: 64 64 4f 70 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c  ddOp(v, OP_Goto,
eba0: 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20 20   0, dest);.     
ebb0: 20 70 52 69 67 68 74 20 3d 20 70 45 78 70 72 2d   pRight = pExpr-
ebc0: 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70 45 78  >pList->a[1].pEx
ebd0: 70 72 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  pr;.      sqlite
ebe0: 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73 65  3ExprCode(pParse
ebf0: 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 20  , pRight);.     
ec00: 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
ec10: 72 73 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67  rse, pLeft, pRig
ec20: 68 74 2c 20 4f 50 5f 47 74 2c 20 64 65 73 74 2c  ht, OP_Gt, dest,
ec30: 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
ec40: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
ec50: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a  .    default: {.
ec60: 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
ec70: 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45  rCode(pParse, pE
ec80: 78 70 72 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  xpr);.      sqli
ec90: 74 65 33 56 64 62 65 41 64 64 4f 70 28 76 2c 20  te3VdbeAddOp(v, 
eca0: 4f 50 5f 49 66 4e 6f 74 2c 20 6a 75 6d 70 49 66  OP_IfNot, jumpIf
ecb0: 4e 75 6c 6c 2c 20 64 65 73 74 29 3b 0a 20 20 20  Null, dest);.   
ecc0: 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
ecd0: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 44 6f 20    }.}../*.** Do 
ece0: 61 20 64 65 65 70 20 63 6f 6d 70 61 72 69 73 6f  a deep compariso
ecf0: 6e 20 6f 66 20 74 77 6f 20 65 78 70 72 65 73 73  n of two express
ed00: 69 6f 6e 20 74 72 65 65 73 2e 20 20 52 65 74 75  ion trees.  Retu
ed10: 72 6e 20 54 52 55 45 20 28 6e 6f 6e 2d 7a 65 72  rn TRUE (non-zer
ed20: 6f 29 0a 2a 2a 20 69 66 20 74 68 65 79 20 61 72  o).** if they ar
ed30: 65 20 69 64 65 6e 74 69 63 61 6c 20 61 6e 64 20  e identical and 
ed40: 72 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20  return FALSE if 
ed50: 74 68 65 79 20 64 69 66 66 65 72 20 69 6e 20 61  they differ in a
ed60: 6e 79 20 77 61 79 2e 0a 2a 2f 0a 69 6e 74 20 73  ny way..*/.int s
ed70: 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72  qlite3ExprCompar
ed80: 65 28 45 78 70 72 20 2a 70 41 2c 20 45 78 70 72  e(Expr *pA, Expr
ed90: 20 2a 70 42 29 7b 0a 20 20 69 6e 74 20 69 3b 0a   *pB){.  int i;.
eda0: 20 20 69 66 28 20 70 41 3d 3d 30 20 29 7b 0a 20    if( pA==0 ){. 
edb0: 20 20 20 72 65 74 75 72 6e 20 70 42 3d 3d 30 3b     return pB==0;
edc0: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 42 3d  .  }else if( pB=
edd0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
ede0: 20 30 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   0;.  }.  if( pA
edf0: 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70 20 29 20 72  ->op!=pB->op ) r
ee00: 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21  eturn 0;.  if( !
ee10: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ee20: 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20 70 42  re(pA->pLeft, pB
ee30: 2d 3e 70 4c 65 66 74 29 20 29 20 72 65 74 75 72  ->pLeft) ) retur
ee40: 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71 6c 69  n 0;.  if( !sqli
ee50: 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
ee60: 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e 70  A->pRight, pB->p
ee70: 52 69 67 68 74 29 20 29 20 72 65 74 75 72 6e 20  Right) ) return 
ee80: 30 3b 0a 20 20 69 66 28 20 70 41 2d 3e 70 4c 69  0;.  if( pA->pLi
ee90: 73 74 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  st ){.    if( pB
eea0: 2d 3e 70 4c 69 73 74 3d 3d 30 20 29 20 72 65 74  ->pList==0 ) ret
eeb0: 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 70  urn 0;.    if( p
eec0: 41 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 21  A->pList->nExpr!
eed0: 3d 70 42 2d 3e 70 4c 69 73 74 2d 3e 6e 45 78 70  =pB->pList->nExp
eee0: 72 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  r ) return 0;.  
eef0: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41 2d    for(i=0; i<pA-
ef00: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  >pList->nExpr; i
ef10: 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 21  ++){.      if( !
ef20: 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70 61  sqlite3ExprCompa
ef30: 72 65 28 70 41 2d 3e 70 4c 69 73 74 2d 3e 61 5b  re(pA->pList->a[
ef40: 69 5d 2e 70 45 78 70 72 2c 20 70 42 2d 3e 70 4c  i].pExpr, pB->pL
ef50: 69 73 74 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 29  ist->a[i].pExpr)
ef60: 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
ef70: 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
ef80: 20 20 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20    }.  }else if( 
ef90: 70 42 2d 3e 70 4c 69 73 74 20 29 7b 0a 20 20 20  pB->pList ){.   
efa0: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 7d 0a 20   return 0;.  }. 
efb0: 20 69 66 28 20 70 41 2d 3e 70 53 65 6c 65 63 74   if( pA->pSelect
efc0: 20 7c 7c 20 70 42 2d 3e 70 53 65 6c 65 63 74 20   || pB->pSelect 
efd0: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66  ) return 0;.  if
efe0: 28 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42  ( pA->iTable!=pB
eff0: 2d 3e 69 54 61 62 6c 65 20 7c 7c 20 70 41 2d 3e  ->iTable || pA->
f000: 69 43 6f 6c 75 6d 6e 21 3d 70 42 2d 3e 69 43 6f  iColumn!=pB->iCo
f010: 6c 75 6d 6e 20 29 20 72 65 74 75 72 6e 20 30 3b  lumn ) return 0;
f020: 0a 20 20 69 66 28 20 70 41 2d 3e 74 6f 6b 65 6e  .  if( pA->token
f030: 2e 7a 20 29 7b 0a 20 20 20 20 69 66 28 20 70 42  .z ){.    if( pB
f040: 2d 3e 74 6f 6b 65 6e 2e 7a 3d 3d 30 20 29 20 72  ->token.z==0 ) r
f050: 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 69 66 28  eturn 0;.    if(
f060: 20 70 42 2d 3e 74 6f 6b 65 6e 2e 6e 21 3d 70 41   pB->token.n!=pA
f070: 2d 3e 74 6f 6b 65 6e 2e 6e 20 29 20 72 65 74 75  ->token.n ) retu
f080: 72 6e 20 30 3b 0a 20 20 20 20 69 66 28 20 73 71  rn 0;.    if( sq
f090: 6c 69 74 65 33 53 74 72 4e 49 43 6d 70 28 70 41  lite3StrNICmp(pA
f0a0: 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74  ->token.z, pB->t
f0b0: 6f 6b 65 6e 2e 7a 2c 20 70 42 2d 3e 74 6f 6b 65  oken.z, pB->toke
f0c0: 6e 2e 6e 29 21 3d 30 20 29 20 72 65 74 75 72 6e  n.n)!=0 ) return
f0d0: 20 30 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e   0;.  }.  return
f0e0: 20 31 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 64 64   1;.}../*.** Add
f0f0: 20 61 20 6e 65 77 20 65 6c 65 6d 65 6e 74 20 74   a new element t
f100: 6f 20 74 68 65 20 70 50 61 72 73 65 2d 3e 61 41  o the pParse->aA
f110: 67 67 5b 5d 20 61 72 72 61 79 20 61 6e 64 20 72  gg[] array and r
f120: 65 74 75 72 6e 20 69 74 73 20 69 6e 64 65 78 2e  eturn its index.
f130: 0a 2a 2a 20 54 68 65 20 6e 65 77 20 65 6c 65 6d  .** The new elem
f140: 65 6e 74 20 69 73 20 69 6e 69 74 69 61 6c 69 7a  ent is initializ
f150: 65 64 20 74 6f 20 7a 65 72 6f 2e 20 20 54 68 65  ed to zero.  The
f160: 20 63 61 6c 6c 69 6e 67 20 66 75 6e 63 74 69 6f   calling functio
f170: 6e 20 69 73 0a 2a 2a 20 65 78 70 65 63 74 65 64  n is.** expected
f180: 20 74 6f 20 66 69 6c 6c 20 69 74 20 69 6e 2e 0a   to fill it in..
f190: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 70  */.static int ap
f1a0: 70 65 6e 64 41 67 67 49 6e 66 6f 28 50 61 72 73  pendAggInfo(Pars
f1b0: 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 66  e *pParse){.  if
f1c0: 28 20 28 70 50 61 72 73 65 2d 3e 6e 41 67 67 20  ( (pParse->nAgg 
f1d0: 26 20 30 78 37 29 3d 3d 30 20 29 7b 0a 20 20 20  & 0x7)==0 ){.   
f1e0: 20 69 6e 74 20 61 6d 74 20 3d 20 70 50 61 72 73   int amt = pPars
f1f0: 65 2d 3e 6e 41 67 67 20 2b 20 38 3b 0a 20 20 20  e->nAgg + 8;.   
f200: 20 41 67 67 45 78 70 72 20 2a 61 41 67 67 20 3d   AggExpr *aAgg =
f210: 20 73 71 6c 69 74 65 52 65 61 6c 6c 6f 63 28 70   sqliteRealloc(p
f220: 50 61 72 73 65 2d 3e 61 41 67 67 2c 20 61 6d 74  Parse->aAgg, amt
f230: 2a 73 69 7a 65 6f 66 28 70 50 61 72 73 65 2d 3e  *sizeof(pParse->
f240: 61 41 67 67 5b 30 5d 29 29 3b 0a 20 20 20 20 69  aAgg[0]));.    i
f250: 66 28 20 61 41 67 67 3d 3d 30 20 29 7b 0a 20 20  f( aAgg==0 ){.  
f260: 20 20 20 20 72 65 74 75 72 6e 20 2d 31 3b 0a 20      return -1;. 
f270: 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
f280: 3e 61 41 67 67 20 3d 20 61 41 67 67 3b 0a 20 20  >aAgg = aAgg;.  
f290: 7d 0a 20 20 6d 65 6d 73 65 74 28 26 70 50 61 72  }.  memset(&pPar
f2a0: 73 65 2d 3e 61 41 67 67 5b 70 50 61 72 73 65 2d  se->aAgg[pParse-
f2b0: 3e 6e 41 67 67 5d 2c 20 30 2c 20 73 69 7a 65 6f  >nAgg], 0, sizeo
f2c0: 66 28 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 30  f(pParse->aAgg[0
f2d0: 5d 29 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 50  ]));.  return pP
f2e0: 61 72 73 65 2d 3e 6e 41 67 67 2b 2b 3b 0a 7d 0a  arse->nAgg++;.}.
f2f0: 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  ./*.** This is a
f300: 6e 20 78 46 75 6e 63 20 66 6f 72 20 77 61 6c 6b  n xFunc for walk
f310: 45 78 70 72 54 72 65 65 28 29 20 75 73 65 64 20  ExprTree() used 
f320: 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 0a 2a 2a  to implement .**
f330: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
f340: 79 7a 65 41 67 67 72 65 67 61 74 65 73 28 29 2e  yzeAggregates().
f350: 20 20 53 65 65 20 73 71 6c 69 74 65 33 45 78 70    See sqlite3Exp
f360: 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74  rAnalyzeAggregat
f370: 65 73 0a 2a 2a 20 66 6f 72 20 61 64 64 69 74 69  es.** for additi
f380: 6f 6e 61 6c 20 69 6e 66 6f 72 6d 61 74 69 6f 6e  onal information
f390: 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72 6f 75  ..**.** This rou
f3a0: 74 69 6e 65 20 61 6e 61 6c 79 7a 65 73 20 74 68  tine analyzes th
f3b0: 65 20 61 67 67 72 65 67 61 74 65 20 66 75 6e 63  e aggregate func
f3c0: 74 69 6f 6e 20 61 74 20 70 45 78 70 72 2e 0a 2a  tion at pExpr..*
f3d0: 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61  /.static int ana
f3e0: 6c 79 7a 65 41 67 67 72 65 67 61 74 65 28 76 6f  lyzeAggregate(vo
f3f0: 69 64 20 2a 70 41 72 67 2c 20 45 78 70 72 20 2a  id *pArg, Expr *
f400: 70 45 78 70 72 29 7b 0a 20 20 69 6e 74 20 69 3b  pExpr){.  int i;
f410: 0a 20 20 41 67 67 45 78 70 72 20 2a 61 41 67 67  .  AggExpr *aAgg
f420: 3b 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  ;.  Parse *pPars
f430: 65 20 3d 20 28 50 61 72 73 65 2a 29 70 41 72 67  e = (Parse*)pArg
f440: 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
f450: 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
f460: 73 65 20 54 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a  se TK_COLUMN: {.
f470: 20 20 20 20 20 20 61 41 67 67 20 3d 20 70 50 61        aAgg = pPa
f480: 72 73 65 2d 3e 61 41 67 67 3b 0a 20 20 20 20 20  rse->aAgg;.     
f490: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 50 61 72   for(i=0; i<pPar
f4a0: 73 65 2d 3e 6e 41 67 67 3b 20 69 2b 2b 29 7b 0a  se->nAgg; i++){.
f4b0: 20 20 20 20 20 20 20 20 69 66 28 20 61 41 67 67          if( aAgg
f4c0: 5b 69 5d 2e 69 73 41 67 67 20 29 20 63 6f 6e 74  [i].isAgg ) cont
f4d0: 69 6e 75 65 3b 0a 20 20 20 20 20 20 20 20 69 66  inue;.        if
f4e0: 28 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72 2d  ( aAgg[i].pExpr-
f4f0: 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70 72 2d 3e  >iTable==pExpr->
f500: 69 54 61 62 6c 65 0a 20 20 20 20 20 20 20 20 20  iTable.         
f510: 26 26 20 61 41 67 67 5b 69 5d 2e 70 45 78 70 72  && aAgg[i].pExpr
f520: 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d 70 45 78 70 72  ->iColumn==pExpr
f530: 2d 3e 69 43 6f 6c 75 6d 6e 20 29 7b 0a 20 20 20  ->iColumn ){.   
f540: 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
f550: 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a        }.      }.
f560: 20 20 20 20 20 20 69 66 28 20 69 3e 3d 70 50 61        if( i>=pPa
f570: 72 73 65 2d 3e 6e 41 67 67 20 29 7b 0a 20 20 20  rse->nAgg ){.   
f580: 20 20 20 20 20 69 20 3d 20 61 70 70 65 6e 64 41       i = appendA
f590: 67 67 49 6e 66 6f 28 70 50 61 72 73 65 29 3b 0a  ggInfo(pParse);.
f5a0: 20 20 20 20 20 20 20 20 69 66 28 20 69 3c 30 20          if( i<0 
f5b0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20  ) return 1;.    
f5c0: 20 20 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67      pParse->aAgg
f5d0: 5b 69 5d 2e 69 73 41 67 67 20 3d 20 30 3b 0a 20  [i].isAgg = 0;. 
f5e0: 20 20 20 20 20 20 20 70 50 61 72 73 65 2d 3e 61         pParse->a
f5f0: 41 67 67 5b 69 5d 2e 70 45 78 70 72 20 3d 20 70  Agg[i].pExpr = p
f600: 45 78 70 72 3b 0a 20 20 20 20 20 20 7d 0a 20 20  Expr;.      }.  
f610: 20 20 20 20 70 45 78 70 72 2d 3e 69 41 67 67 20      pExpr->iAgg 
f620: 3d 20 69 3b 0a 20 20 20 20 20 20 72 65 74 75 72  = i;.      retur
f630: 6e 20 31 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  n 1;.    }.    c
f640: 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
f650: 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 61 41 67  ION: {.      aAg
f660: 67 20 3d 20 70 50 61 72 73 65 2d 3e 61 41 67 67  g = pParse->aAgg
f670: 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d 30 3b  ;.      for(i=0;
f680: 20 69 3c 70 50 61 72 73 65 2d 3e 6e 41 67 67 3b   i<pParse->nAgg;
f690: 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69   i++){.        i
f6a0: 66 28 20 21 61 41 67 67 5b 69 5d 2e 69 73 41 67  f( !aAgg[i].isAg
f6b0: 67 20 29 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20  g ) continue;.  
f6c0: 20 20 20 20 20 20 69 66 28 20 73 71 6c 69 74 65        if( sqlite
f6d0: 33 45 78 70 72 43 6f 6d 70 61 72 65 28 61 41 67  3ExprCompare(aAg
f6e0: 67 5b 69 5d 2e 70 45 78 70 72 2c 20 70 45 78 70  g[i].pExpr, pExp
f6f0: 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  r) ){.          
f700: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
f710: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
f720: 66 28 20 69 3e 3d 70 50 61 72 73 65 2d 3e 6e 41  f( i>=pParse->nA
f730: 67 67 20 29 7b 0a 20 20 20 20 20 20 20 20 75 38  gg ){.        u8
f740: 20 65 6e 63 20 3d 20 70 50 61 72 73 65 2d 3e 64   enc = pParse->d
f750: 62 2d 3e 65 6e 63 3b 0a 20 20 20 20 20 20 20 20  b->enc;.        
f760: 69 20 3d 20 61 70 70 65 6e 64 41 67 67 49 6e 66  i = appendAggInf
f770: 6f 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  o(pParse);.     
f780: 20 20 20 69 66 28 20 69 3c 30 20 29 20 72 65 74     if( i<0 ) ret
f790: 75 72 6e 20 31 3b 0a 20 20 20 20 20 20 20 20 70  urn 1;.        p
f7a0: 50 61 72 73 65 2d 3e 61 41 67 67 5b 69 5d 2e 69  Parse->aAgg[i].i
f7b0: 73 41 67 67 20 3d 20 31 3b 0a 20 20 20 20 20 20  sAgg = 1;.      
f7c0: 20 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 69    pParse->aAgg[i
f7d0: 5d 2e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ].pExpr = pExpr;
f7e0: 0a 20 20 20 20 20 20 20 20 70 50 61 72 73 65 2d  .        pParse-
f7f0: 3e 61 41 67 67 5b 69 5d 2e 70 46 75 6e 63 20 3d  >aAgg[i].pFunc =
f800: 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75 6e 63   sqlite3FindFunc
f810: 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e 64 62 2c  tion(pParse->db,
f820: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45  .             pE
f830: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 7a 2c 20 70 45  xpr->token.z, pE
f840: 78 70 72 2d 3e 74 6f 6b 65 6e 2e 6e 2c 0a 20 20  xpr->token.n,.  
f850: 20 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72             pExpr
f860: 2d 3e 70 4c 69 73 74 20 3f 20 70 45 78 70 72 2d  ->pList ? pExpr-
f870: 3e 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 3a 20  >pList->nExpr : 
f880: 30 2c 20 65 6e 63 2c 20 30 29 3b 0a 20 20 20 20  0, enc, 0);.    
f890: 20 20 7d 0a 20 20 20 20 20 20 70 45 78 70 72 2d    }.      pExpr-
f8a0: 3e 69 41 67 67 20 3d 20 69 3b 0a 20 20 20 20 20  >iAgg = i;.     
f8b0: 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d   return 1;.    }
f8c0: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b  .  }.  return 0;
f8d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a  .}../*.** Analyz
f8e0: 65 20 74 68 65 20 67 69 76 65 6e 20 65 78 70 72  e the given expr
f8f0: 65 73 73 69 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66  ession looking f
f900: 6f 72 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  or aggregate fun
f910: 63 74 69 6f 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f  ctions and.** fo
f920: 72 20 76 61 72 69 61 62 6c 65 73 20 74 68 61 74  r variables that
f930: 20 6e 65 65 64 20 74 6f 20 62 65 20 61 64 64 65   need to be adde
f940: 64 20 74 6f 20 74 68 65 20 70 50 61 72 73 65 2d  d to the pParse-
f950: 3e 61 41 67 67 5b 5d 20 61 72 72 61 79 2e 0a 2a  >aAgg[] array..*
f960: 2a 20 4d 61 6b 65 20 61 64 64 69 74 69 6f 6e 61  * Make additiona
f970: 6c 20 65 6e 74 72 69 65 73 20 74 6f 20 74 68 65  l entries to the
f980: 20 70 50 61 72 73 65 2d 3e 61 41 67 67 5b 5d 20   pParse->aAgg[] 
f990: 61 72 72 61 79 20 61 73 20 6e 65 63 65 73 73 61  array as necessa
f9a0: 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  ry..**.** This r
f9b0: 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f 6e  outine should on
f9c0: 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66 74  ly be called aft
f9d0: 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  er the expressio
f9e0: 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61 6e  n has been.** an
f9f0: 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74 65  alyzed by sqlite
fa00: 33 45 78 70 72 52 65 73 6f 6c 76 65 4e 61 6d 65  3ExprResolveName
fa10: 73 28 29 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 65 72  s()..**.** If er
fa20: 72 6f 72 73 20 61 72 65 20 73 65 65 6e 2c 20 6c  rors are seen, l
fa30: 65 61 76 65 20 61 6e 20 65 72 72 6f 72 20 6d 65  eave an error me
fa40: 73 73 61 67 65 20 69 6e 20 7a 45 72 72 4d 73 67  ssage in zErrMsg
fa50: 20 61 6e 64 20 72 65 74 75 72 6e 0a 2a 2a 20 74   and return.** t
fa60: 68 65 20 6e 75 6d 62 65 72 20 6f 66 20 65 72 72  he number of err
fa70: 6f 72 73 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ors..*/.int sqli
fa80: 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
fa90: 67 72 65 67 61 74 65 73 28 50 61 72 73 65 20 2a  gregates(Parse *
faa0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
fab0: 78 70 72 29 7b 0a 20 20 69 6e 74 20 6e 45 72 72  xpr){.  int nErr
fac0: 20 3d 20 70 50 61 72 73 65 2d 3e 6e 45 72 72 3b   = pParse->nErr;
fad0: 0a 20 20 77 61 6c 6b 45 78 70 72 54 72 65 65 28  .  walkExprTree(
fae0: 70 45 78 70 72 2c 20 61 6e 61 6c 79 7a 65 41 67  pExpr, analyzeAg
faf0: 67 72 65 67 61 74 65 2c 20 70 50 61 72 73 65 29  gregate, pParse)
fb00: 3b 0a 20 20 72 65 74 75 72 6e 20 70 50 61 72 73  ;.  return pPars
fb10: 65 2d 3e 6e 45 72 72 20 2d 20 6e 45 72 72 3b 0a  e->nErr - nErr;.
fb20: 7d 0a 0a 2f 2a 0a 2a 2a 20 4c 6f 63 61 74 65 20  }../*.** Locate 
fb30: 61 20 75 73 65 72 20 66 75 6e 63 74 69 6f 6e 20  a user function 
fb40: 67 69 76 65 6e 20 61 20 6e 61 6d 65 2c 20 61 20  given a name, a 
fb50: 6e 75 6d 62 65 72 20 6f 66 20 61 72 67 75 6d 65  number of argume
fb60: 6e 74 73 20 61 6e 64 20 61 20 66 6c 61 67 0a 2a  nts and a flag.*
fb70: 2a 20 69 6e 64 69 63 61 74 69 6e 67 20 77 68 65  * indicating whe
fb80: 74 68 65 72 20 74 68 65 20 66 75 6e 63 74 69 6f  ther the functio
fb90: 6e 20 70 72 65 66 65 72 73 20 55 54 46 2d 31 36  n prefers UTF-16
fba0: 20 6f 76 65 72 20 55 54 46 2d 38 2e 20 20 52 65   over UTF-8.  Re
fbb0: 74 75 72 6e 20 61 0a 2a 2a 20 70 6f 69 6e 74 65  turn a.** pointe
fbc0: 72 20 74 6f 20 74 68 65 20 46 75 6e 63 44 65 66  r to the FuncDef
fbd0: 20 73 74 72 75 63 74 75 72 65 20 74 68 61 74 20   structure that 
fbe0: 64 65 66 69 6e 65 73 20 74 68 61 74 20 66 75 6e  defines that fun
fbf0: 63 74 69 6f 6e 2c 20 6f 72 20 72 65 74 75 72 6e  ction, or return
fc00: 0a 2a 2a 20 4e 55 4c 4c 20 69 66 20 74 68 65 20  .** NULL if the 
fc10: 66 75 6e 63 74 69 6f 6e 20 64 6f 65 73 20 6e 6f  function does no
fc20: 74 20 65 78 69 73 74 2e 0a 2a 2a 0a 2a 2a 20 49  t exist..**.** I
fc30: 66 20 74 68 65 20 63 72 65 61 74 65 46 6c 61 67  f the createFlag
fc40: 20 61 72 67 75 6d 65 6e 74 20 69 73 20 74 72 75   argument is tru
fc50: 65 2c 20 74 68 65 6e 20 61 20 6e 65 77 20 28 62  e, then a new (b
fc60: 6c 61 6e 6b 29 20 46 75 6e 63 44 65 66 0a 2a 2a  lank) FuncDef.**
fc70: 20 73 74 72 75 63 74 75 72 65 20 69 73 20 63 72   structure is cr
fc80: 65 61 74 65 64 20 61 6e 64 20 6c 69 6b 65 64 20  eated and liked 
fc90: 69 6e 74 6f 20 74 68 65 20 22 64 62 22 20 73 74  into the "db" st
fca0: 72 75 63 74 75 72 65 20 69 66 20 61 0a 2a 2a 20  ructure if a.** 
fcb0: 6e 6f 20 6d 61 74 63 68 69 6e 67 20 66 75 6e 63  no matching func
fcc0: 74 69 6f 6e 20 70 72 65 76 69 6f 75 73 6c 79 20  tion previously 
fcd0: 65 78 69 73 74 65 64 2e 20 20 57 68 65 6e 20 63  existed.  When c
fce0: 72 65 61 74 65 46 6c 61 67 20 69 73 20 74 72 75  reateFlag is tru
fcf0: 65 0a 2a 2a 20 61 6e 64 20 74 68 65 20 6e 41 72  e.** and the nAr
fd00: 67 20 70 61 72 61 6d 65 74 65 72 20 69 73 20 2d  g parameter is -
fd10: 31 2c 20 74 68 65 6e 20 6f 6e 6c 79 20 61 20 66  1, then only a f
fd20: 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 61 63 63  unction that acc
fd30: 65 70 74 73 0a 2a 2a 20 61 6e 79 20 6e 75 6d 62  epts.** any numb
fd40: 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20  er of arguments 
fd50: 77 69 6c 6c 20 62 65 20 72 65 74 75 72 6e 65 64  will be returned
fd60: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74  ..**.** If creat
fd70: 65 46 6c 61 67 20 69 73 20 66 61 6c 73 65 20 61  eFlag is false a
fd80: 6e 64 20 6e 41 72 67 20 69 73 20 2d 31 2c 20 74  nd nArg is -1, t
fd90: 68 65 6e 20 74 68 65 20 66 69 72 73 74 20 76 61  hen the first va
fda0: 6c 69 64 0a 2a 2a 20 66 75 6e 63 74 69 6f 6e 20  lid.** function 
fdb0: 66 6f 75 6e 64 20 69 73 20 72 65 74 75 72 6e 65  found is returne
fdc0: 64 2e 20 20 41 20 66 75 6e 63 74 69 6f 6e 20 69  d.  A function i
fdd0: 73 20 76 61 6c 69 64 20 69 66 20 65 69 74 68 65  s valid if eithe
fde0: 72 20 78 46 75 6e 63 0a 2a 2a 20 6f 72 20 78 53  r xFunc.** or xS
fdf0: 74 65 70 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2e  tep is non-zero.
fe00: 0a 2a 2a 0a 2a 2a 20 49 66 20 63 72 65 61 74 65  .**.** If create
fe10: 46 6c 61 67 20 69 73 20 66 61 6c 73 65 2c 20 74  Flag is false, t
fe20: 68 65 6e 20 61 20 66 75 6e 63 74 69 6f 6e 20 77  hen a function w
fe30: 69 74 68 20 74 68 65 20 72 65 71 75 69 72 65 64  ith the required
fe40: 20 6e 61 6d 65 20 61 6e 64 0a 2a 2a 20 6e 75 6d   name and.** num
fe50: 62 65 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73  ber of arguments
fe60: 20 6d 61 79 20 62 65 20 72 65 74 75 72 6e 65 64   may be returned
fe70: 20 65 76 65 6e 20 69 66 20 74 68 65 20 65 54 65   even if the eTe
fe80: 78 74 52 65 70 20 66 6c 61 67 20 64 6f 65 73 20  xtRep flag does 
fe90: 6e 6f 74 0a 2a 2a 20 6d 61 74 63 68 20 74 68 61  not.** match tha
fea0: 74 20 72 65 71 75 65 73 74 65 64 2e 0a 2a 2f 0a  t requested..*/.
feb0: 46 75 6e 63 44 65 66 20 2a 73 71 6c 69 74 65 33  FuncDef *sqlite3
fec0: 46 69 6e 64 46 75 6e 63 74 69 6f 6e 28 0a 20 20  FindFunction(.  
fed0: 73 71 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20  sqlite3 *db,    
fee0: 20 20 20 2f 2a 20 41 6e 20 6f 70 65 6e 20 64 61     /* An open da
fef0: 74 61 62 61 73 65 20 2a 2f 0a 20 20 63 6f 6e 73  tabase */.  cons
ff00: 74 20 63 68 61 72 20 2a 7a 4e 61 6d 65 2c 20 2f  t char *zName, /
ff10: 2a 20 4e 61 6d 65 20 6f 66 20 74 68 65 20 66 75  * Name of the fu
ff20: 6e 63 74 69 6f 6e 2e 20 20 4e 6f 74 20 6e 75 6c  nction.  Not nul
ff30: 6c 2d 74 65 72 6d 69 6e 61 74 65 64 20 2a 2f 0a  l-terminated */.
ff40: 20 20 69 6e 74 20 6e 4e 61 6d 65 2c 20 20 20 20    int nName,    
ff50: 20 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f       /* Number o
ff60: 66 20 63 68 61 72 61 63 74 65 72 73 20 69 6e 20  f characters in 
ff70: 74 68 65 20 6e 61 6d 65 20 2a 2f 0a 20 20 69 6e  the name */.  in
ff80: 74 20 6e 41 72 67 2c 20 20 20 20 20 20 20 20 20  t nArg,         
ff90: 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 61 72   /* Number of ar
ffa0: 67 75 6d 65 6e 74 73 2e 20 20 2d 31 20 6d 65 61  guments.  -1 mea
ffb0: 6e 73 20 61 6e 79 20 6e 75 6d 62 65 72 20 2a 2f  ns any number */
ffc0: 0a 20 20 75 38 20 65 6e 63 2c 20 20 20 20 20 20  .  u8 enc,      
ffd0: 20 20 20 20 20 20 2f 2a 20 50 72 65 66 65 72 72        /* Preferr
ffe0: 65 64 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67  ed text encoding
fff0: 20 2a 2f 0a 20 20 69 6e 74 20 63 72 65 61 74 65   */.  int create
10000 46 6c 61 67 20 20 20 20 20 2f 2a 20 43 72 65 61  Flag     /* Crea
10010 74 65 20 6e 65 77 20 65 6e 74 72 79 20 69 66 20  te new entry if 
10020 74 72 75 65 20 61 6e 64 20 64 6f 65 73 20 6e 6f  true and does no
10030 74 20 6f 74 68 65 72 77 69 73 65 20 65 78 69 73  t otherwise exis
10040 74 20 2a 2f 0a 29 7b 0a 20 20 46 75 6e 63 44 65  t */.){.  FuncDe
10050 66 20 2a 70 3b 20 20 20 20 20 20 20 20 20 2f 2a  f *p;         /*
10060 20 49 74 65 72 61 74 6f 72 20 76 61 72 69 61 62   Iterator variab
10070 6c 65 20 2a 2f 0a 20 20 46 75 6e 63 44 65 66 20  le */.  FuncDef 
10080 2a 70 46 69 72 73 74 3b 20 20 20 20 2f 2a 20 46  *pFirst;    /* F
10090 69 72 73 74 20 66 75 6e 63 74 69 6f 6e 20 77 69  irst function wi
100a0 74 68 20 74 68 69 73 20 6e 61 6d 65 20 2a 2f 0a  th this name */.
100b0 20 20 46 75 6e 63 44 65 66 20 2a 70 42 65 73 74    FuncDef *pBest
100c0 20 3d 20 30 3b 20 2f 2a 20 42 65 73 74 20 6d 61   = 0; /* Best ma
100d0 74 63 68 20 66 6f 75 6e 64 20 73 6f 20 66 61 72  tch found so far
100e0 20 2a 2f 0a 20 20 69 6e 74 20 62 65 73 74 6d 61   */.  int bestma
100f0 74 63 68 20 3d 20 30 3b 20 20 0a 0a 0a 20 20 61  tch = 0;  ...  a
10100 73 73 65 72 74 28 20 65 6e 63 3d 3d 53 51 4c 49  ssert( enc==SQLI
10110 54 45 5f 55 54 46 38 20 7c 7c 20 65 6e 63 3d 3d  TE_UTF8 || enc==
10120 53 51 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 7c  SQLITE_UTF16LE |
10130 7c 20 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54  | enc==SQLITE_UT
10140 46 31 36 42 45 20 29 3b 0a 20 20 69 66 28 20 6e  F16BE );.  if( n
10150 41 72 67 3c 2d 31 20 29 20 6e 41 72 67 20 3d 20  Arg<-1 ) nArg = 
10160 2d 31 3b 0a 0a 20 20 70 46 69 72 73 74 20 3d 20  -1;..  pFirst = 
10170 28 46 75 6e 63 44 65 66 2a 29 73 71 6c 69 74 65  (FuncDef*)sqlite
10180 33 48 61 73 68 46 69 6e 64 28 26 64 62 2d 3e 61  3HashFind(&db->a
10190 46 75 6e 63 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61  Func, zName, nNa
101a0 6d 65 29 3b 0a 20 20 66 6f 72 28 70 3d 70 46 69  me);.  for(p=pFi
101b0 72 73 74 3b 20 70 3b 20 70 3d 70 2d 3e 70 4e 65  rst; p; p=p->pNe
101c0 78 74 29 7b 0a 20 20 20 20 2f 2a 20 44 75 72 69  xt){.    /* Duri
101d0 6e 67 20 74 68 65 20 73 65 61 72 63 68 20 66 6f  ng the search fo
101e0 72 20 74 68 65 20 62 65 73 74 20 66 75 6e 63 74  r the best funct
101f0 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 2c 20  ion definition, 
10200 62 65 73 74 6d 61 74 63 68 20 69 73 20 73 65 74  bestmatch is set
10210 0a 20 20 20 20 2a 2a 20 61 73 20 66 6f 6c 6c 6f  .    ** as follo
10220 77 73 20 74 6f 20 69 6e 64 69 63 61 74 65 20 74  ws to indicate t
10230 68 65 20 71 75 61 6c 69 74 79 20 6f 66 20 74 68  he quality of th
10240 65 20 6d 61 74 63 68 20 77 69 74 68 20 74 68 65  e match with the
10250 20 64 65 66 69 6e 69 74 69 6f 6e 0a 20 20 20 20   definition.    
10260 2a 2a 20 70 6f 69 6e 74 65 64 20 74 6f 20 62 79  ** pointed to by
10270 20 70 42 65 73 74 3a 0a 20 20 20 20 2a 2a 0a 20   pBest:.    **. 
10280 20 20 20 2a 2a 20 30 3a 20 70 42 65 73 74 20 69     ** 0: pBest i
10290 73 20 4e 55 4c 4c 2e 20 4e 6f 20 6d 61 74 63 68  s NULL. No match
102a0 20 68 61 73 20 62 65 65 6e 20 66 6f 75 6e 64 2e   has been found.
102b0 0a 20 20 20 20 2a 2a 20 31 3a 20 41 20 76 61 72  .    ** 1: A var
102c0 69 61 62 6c 65 20 61 72 67 75 6d 65 6e 74 73 20  iable arguments 
102d0 66 75 6e 63 74 69 6f 6e 20 74 68 61 74 20 70 72  function that pr
102e0 65 66 65 72 73 20 55 54 46 2d 38 20 77 68 65 6e  efers UTF-8 when
102f0 20 61 20 55 54 46 2d 31 36 0a 20 20 20 20 2a 2a   a UTF-16.    **
10300 20 20 20 20 65 6e 63 6f 64 69 6e 67 20 69 73 20      encoding is 
10310 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
10320 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
10330 20 32 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   2: A variable a
10340 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
10350 6e 20 74 68 61 74 20 75 73 65 73 20 55 54 46 2d  n that uses UTF-
10360 31 36 42 45 20 77 68 65 6e 20 55 54 46 2d 31 36  16BE when UTF-16
10370 4c 45 20 69 73 0a 20 20 20 20 2a 2a 20 20 20 20  LE is.    **    
10380 72 65 71 75 65 73 74 65 64 2c 20 6f 72 20 76 69  requested, or vi
10390 63 65 20 76 65 72 73 61 2e 0a 20 20 20 20 2a 2a  ce versa..    **
103a0 20 33 3a 20 41 20 76 61 72 69 61 62 6c 65 20 61   3: A variable a
103b0 72 67 75 6d 65 6e 74 73 20 66 75 6e 63 74 69 6f  rguments functio
103c0 6e 20 75 73 69 6e 67 20 74 68 65 20 73 61 6d 65  n using the same
103d0 20 74 65 78 74 20 65 6e 63 6f 64 69 6e 67 2e 0a   text encoding..
103e0 20 20 20 20 2a 2a 20 34 3a 20 41 20 66 75 6e 63      ** 4: A func
103f0 74 69 6f 6e 20 77 69 74 68 20 74 68 65 20 65 78  tion with the ex
10400 61 63 74 20 6e 75 6d 62 65 72 20 6f 66 20 61 72  act number of ar
10410 67 75 6d 65 6e 74 73 20 72 65 71 75 65 73 74 65  guments requeste
10420 64 20 74 68 61 74 0a 20 20 20 20 2a 2a 20 20 20  d that.    **   
10430 20 70 72 65 66 65 72 73 20 55 54 46 2d 38 20 77   prefers UTF-8 w
10440 68 65 6e 20 61 20 55 54 46 2d 31 36 20 65 6e 63  hen a UTF-16 enc
10450 6f 64 69 6e 67 20 69 73 20 72 65 71 75 65 73 74  oding is request
10460 65 64 2c 20 6f 72 20 76 69 63 65 20 76 65 72 73  ed, or vice vers
10470 61 2e 0a 20 20 20 20 2a 2a 20 35 3a 20 41 20 66  a..    ** 5: A f
10480 75 6e 63 74 69 6f 6e 20 77 69 74 68 20 74 68 65  unction with the
10490 20 65 78 61 63 74 20 6e 75 6d 62 65 72 20 6f 66   exact number of
104a0 20 61 72 67 75 6d 65 6e 74 73 20 72 65 71 75 65   arguments reque
104b0 73 74 65 64 20 74 68 61 74 0a 20 20 20 20 2a 2a  sted that.    **
104c0 20 20 20 20 70 72 65 66 65 72 73 20 55 54 46 2d      prefers UTF-
104d0 31 36 4c 45 20 77 68 65 6e 20 55 54 46 2d 31 36  16LE when UTF-16
104e0 42 45 20 69 73 20 72 65 71 75 65 73 74 65 64 2c  BE is requested,
104f0 20 6f 72 20 76 69 63 65 20 76 65 72 73 61 2e 0a   or vice versa..
10500 20 20 20 20 2a 2a 20 36 3a 20 41 6e 20 65 78 61      ** 6: An exa
10510 63 74 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2a  ct match..    **
10520 0a 20 20 20 20 2a 2a 20 41 20 6c 61 72 67 65 72  .    ** A larger
10530 20 76 61 6c 75 65 20 6f 66 20 27 6d 61 74 63 68   value of 'match
10540 71 75 61 6c 27 20 69 6e 64 69 63 61 74 65 73 20  qual' indicates 
10550 61 20 6d 6f 72 65 20 64 65 73 69 72 61 62 6c 65  a more desirable
10560 20 6d 61 74 63 68 2e 0a 20 20 20 20 2a 2f 0a 20   match..    */. 
10570 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d     if( p->nArg==
10580 2d 31 20 7c 7c 20 70 2d 3e 6e 41 72 67 3d 3d 6e  -1 || p->nArg==n
10590 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31 20  Arg || nArg==-1 
105a0 29 7b 0a 20 20 20 20 20 20 69 6e 74 20 6d 61 74  ){.      int mat
105b0 63 68 20 3d 20 31 3b 20 20 20 20 20 20 20 20 20  ch = 1;         
105c0 20 2f 2a 20 51 75 61 6c 69 74 79 20 6f 66 20 74   /* Quality of t
105d0 68 69 73 20 6d 61 74 63 68 20 2a 2f 0a 20 20 20  his match */.   
105e0 20 20 20 69 66 28 20 70 2d 3e 6e 41 72 67 3d 3d     if( p->nArg==
105f0 6e 41 72 67 20 7c 7c 20 6e 41 72 67 3d 3d 2d 31  nArg || nArg==-1
10600 20 29 7b 0a 20 20 20 20 20 20 20 20 6d 61 74 63   ){.        matc
10610 68 20 3d 20 34 3b 0a 20 20 20 20 20 20 7d 0a 20  h = 4;.      }. 
10620 20 20 20 20 20 69 66 28 20 65 6e 63 3d 3d 70 2d       if( enc==p-
10630 3e 69 50 72 65 66 45 6e 63 20 29 7b 0a 20 20 20  >iPrefEnc ){.   
10640 20 20 20 20 20 6d 61 74 63 68 20 2b 3d 20 32 3b       match += 2;
10650 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 65  .      }.      e
10660 6c 73 65 20 69 66 28 20 28 65 6e 63 3d 3d 53 51  lse if( (enc==SQ
10670 4c 49 54 45 5f 55 54 46 31 36 4c 45 20 26 26 20  LITE_UTF16LE && 
10680 70 2d 3e 69 50 72 65 66 45 6e 63 3d 3d 53 51 4c  p->iPrefEnc==SQL
10690 49 54 45 5f 55 54 46 31 36 42 45 29 20 7c 7c 0a  ITE_UTF16BE) ||.
106a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 28                 (
106b0 65 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31  enc==SQLITE_UTF1
106c0 36 42 45 20 26 26 20 70 2d 3e 69 50 72 65 66 45  6BE && p->iPrefE
106d0 6e 63 3d 3d 53 51 4c 49 54 45 5f 55 54 46 31 36  nc==SQLITE_UTF16
106e0 4c 45 29 20 29 7b 0a 20 20 20 20 20 20 20 20 6d  LE) ){.        m
106f0 61 74 63 68 20 2b 3d 20 31 3b 0a 20 20 20 20 20  atch += 1;.     
10700 20 7d 0a 0a 20 20 20 20 20 20 69 66 28 20 6d 61   }..      if( ma
10710 74 63 68 3e 62 65 73 74 6d 61 74 63 68 20 29 7b  tch>bestmatch ){
10720 0a 20 20 20 20 20 20 20 20 70 42 65 73 74 20 3d  .        pBest =
10730 20 70 3b 0a 20 20 20 20 20 20 20 20 62 65 73 74   p;.        best
10740 6d 61 74 63 68 20 3d 20 6d 61 74 63 68 3b 0a 20  match = match;. 
10750 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 7d       }.    }.  }
10760 0a 0a 20 20 2f 2a 20 49 66 20 74 68 65 20 63 72  ..  /* If the cr
10770 65 61 74 65 46 6c 61 67 20 70 61 72 61 6d 65 74  eateFlag paramet
10780 65 72 20 69 73 20 74 72 75 65 2c 20 61 6e 64 20  er is true, and 
10790 74 68 65 20 73 65 61 63 68 20 64 69 64 20 6e 6f  the seach did no
107a0 74 20 72 65 76 65 61 6c 20 61 6e 0a 20 20 2a 2a  t reveal an.  **
107b0 20 65 78 61 63 74 20 6d 61 74 63 68 20 66 6f 72   exact match for
107c0 20 74 68 65 20 6e 61 6d 65 2c 20 6e 75 6d 62 65   the name, numbe
107d0 72 20 6f 66 20 61 72 67 75 6d 65 6e 74 73 20 61  r of arguments a
107e0 6e 64 20 65 6e 63 6f 64 69 6e 67 2c 20 74 68 65  nd encoding, the
107f0 6e 20 61 64 64 20 61 0a 20 20 2a 2a 20 6e 65 77  n add a.  ** new
10800 20 65 6e 74 72 79 20 74 6f 20 74 68 65 20 68 61   entry to the ha
10810 73 68 20 74 61 62 6c 65 20 61 6e 64 20 72 65 74  sh table and ret
10820 75 72 6e 20 69 74 2e 0a 20 20 2a 2f 0a 20 20 69  urn it..  */.  i
10830 66 28 20 63 72 65 61 74 65 46 6c 61 67 20 26 26  f( createFlag &&
10840 20 62 65 73 74 6d 61 74 63 68 3c 36 20 26 26 20   bestmatch<6 && 
10850 0a 20 20 20 20 20 20 28 70 42 65 73 74 20 3d 20  .      (pBest = 
10860 73 71 6c 69 74 65 4d 61 6c 6c 6f 63 28 73 69 7a  sqliteMalloc(siz
10870 65 6f 66 28 2a 70 42 65 73 74 29 2b 6e 4e 61 6d  eof(*pBest)+nNam
10880 65 2b 31 29 29 20 29 7b 0a 20 20 20 20 70 42 65  e+1)) ){.    pBe
10890 73 74 2d 3e 6e 41 72 67 20 3d 20 6e 41 72 67 3b  st->nArg = nArg;
108a0 0a 20 20 20 20 70 42 65 73 74 2d 3e 70 4e 65 78  .    pBest->pNex
108b0 74 20 3d 20 70 46 69 72 73 74 3b 0a 20 20 20 20  t = pFirst;.    
108c0 70 42 65 73 74 2d 3e 7a 4e 61 6d 65 20 3d 20 28  pBest->zName = (
108d0 63 68 61 72 2a 29 26 70 42 65 73 74 5b 31 5d 3b  char*)&pBest[1];
108e0 0a 20 20 20 20 70 42 65 73 74 2d 3e 69 50 72 65  .    pBest->iPre
108f0 66 45 6e 63 20 3d 20 65 6e 63 3b 0a 20 20 20 20  fEnc = enc;.    
10900 6d 65 6d 63 70 79 28 70 42 65 73 74 2d 3e 7a 4e  memcpy(pBest->zN
10910 61 6d 65 2c 20 7a 4e 61 6d 65 2c 20 6e 4e 61 6d  ame, zName, nNam
10920 65 29 3b 0a 20 20 20 20 70 42 65 73 74 2d 3e 7a  e);.    pBest->z
10930 4e 61 6d 65 5b 6e 4e 61 6d 65 5d 20 3d 20 30 3b  Name[nName] = 0;
10940 0a 20 20 20 20 69 66 28 20 70 42 65 73 74 3d 3d  .    if( pBest==
10950 73 71 6c 69 74 65 33 48 61 73 68 49 6e 73 65 72  sqlite3HashInser
10960 74 28 26 64 62 2d 3e 61 46 75 6e 63 2c 70 42 65  t(&db->aFunc,pBe
10970 73 74 2d 3e 7a 4e 61 6d 65 2c 6e 4e 61 6d 65 2c  st->zName,nName,
10980 28 76 6f 69 64 2a 29 70 42 65 73 74 29 20 29 7b  (void*)pBest) ){
10990 0a 20 20 20 20 20 20 73 71 6c 69 74 65 46 72 65  .      sqliteFre
109a0 65 28 70 42 65 73 74 29 3b 0a 20 20 20 20 20 20  e(pBest);.      
109b0 72 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 7d 0a  return 0;.    }.
109c0 20 20 7d 0a 0a 20 20 69 66 28 20 70 42 65 73 74    }..  if( pBest
109d0 20 26 26 20 28 70 42 65 73 74 2d 3e 78 53 74 65   && (pBest->xSte
109e0 70 20 7c 7c 20 70 42 65 73 74 2d 3e 78 46 75 6e  p || pBest->xFun
109f0 63 20 7c 7c 20 63 72 65 61 74 65 46 6c 61 67 29  c || createFlag)
10a00 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70   ){.    return p
10a10 42 65 73 74 3b 0a 20 20 7d 0a 20 20 72 65 74 75  Best;.  }.  retu
10a20 72 6e 20 30 3b 0a 7d 0a                          rn 0;.}.