/ Hex Artifact Content
Login

Artifact e1691ab0fe6be7247ef073b0038fb8ecd9944fad:


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 2f 0a 23 69  in SQLite..*/.#i
0200: 6e 63 6c 75 64 65 20 22 73 71 6c 69 74 65 49 6e  nclude "sqliteIn
0210: 74 2e 68 22 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75  t.h"../*.** Retu
0220: 72 6e 20 74 68 65 20 27 61 66 66 69 6e 69 74 79  rn the 'affinity
0230: 27 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  ' of the express
0240: 69 6f 6e 20 70 45 78 70 72 20 69 66 20 61 6e 79  ion pExpr if any
0250: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78 70 72  ..**.** If pExpr
0260: 20 69 73 20 61 20 63 6f 6c 75 6d 6e 2c 20 61 20   is a column, a 
0270: 72 65 66 65 72 65 6e 63 65 20 74 6f 20 61 20 63  reference to a c
0280: 6f 6c 75 6d 6e 20 76 69 61 20 61 6e 20 27 41 53  olumn via an 'AS
0290: 27 20 61 6c 69 61 73 2c 0a 2a 2a 20 6f 72 20 61  ' alias,.** or a
02a0: 20 73 75 62 2d 73 65 6c 65 63 74 20 77 69 74 68   sub-select with
02b0: 20 61 20 63 6f 6c 75 6d 6e 20 61 73 20 74 68 65   a column as the
02c0: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 2c 20 74   return value, t
02d0: 68 65 6e 20 74 68 65 20 0a 2a 2a 20 61 66 66 69  hen the .** affi
02e0: 6e 69 74 79 20 6f 66 20 74 68 61 74 20 63 6f 6c  nity of that col
02f0: 75 6d 6e 20 69 73 20 72 65 74 75 72 6e 65 64 2e  umn is returned.
0300: 20 4f 74 68 65 72 77 69 73 65 2c 20 30 78 30 30   Otherwise, 0x00
0310: 20 69 73 20 72 65 74 75 72 6e 65 64 2c 0a 2a 2a   is returned,.**
0320: 20 69 6e 64 69 63 61 74 69 6e 67 20 6e 6f 20 61   indicating no a
0330: 66 66 69 6e 69 74 79 20 66 6f 72 20 74 68 65 20  ffinity for the 
0340: 65 78 70 72 65 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a  expression..**.*
0350: 2a 20 69 2e 65 2e 20 74 68 65 20 57 48 45 52 45  * i.e. the WHERE
0360: 20 63 6c 61 75 73 65 20 65 78 70 72 65 73 73 73   clause expresss
0370: 69 6f 6e 73 20 69 6e 20 74 68 65 20 66 6f 6c 6c  ions in the foll
0380: 6f 77 69 6e 67 20 73 74 61 74 65 6d 65 6e 74 73  owing statements
0390: 20 61 6c 6c 0a 2a 2a 20 68 61 76 65 20 61 6e 20   all.** have an 
03a0: 61 66 66 69 6e 69 74 79 3a 0a 2a 2a 0a 2a 2a 20  affinity:.**.** 
03b0: 43 52 45 41 54 45 20 54 41 42 4c 45 20 74 31 28  CREATE TABLE t1(
03c0: 61 29 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20  a);.** SELECT * 
03d0: 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20 61 3b  FROM t1 WHERE a;
03e0: 0a 2a 2a 20 53 45 4c 45 43 54 20 61 20 41 53 20  .** SELECT a AS 
03f0: 62 20 46 52 4f 4d 20 74 31 20 57 48 45 52 45 20  b FROM t1 WHERE 
0400: 62 3b 0a 2a 2a 20 53 45 4c 45 43 54 20 2a 20 46  b;.** SELECT * F
0410: 52 4f 4d 20 74 31 20 57 48 45 52 45 20 28 73 65  ROM t1 WHERE (se
0420: 6c 65 63 74 20 61 20 66 72 6f 6d 20 74 31 29 3b  lect a from t1);
0430: 0a 2a 2f 0a 63 68 61 72 20 73 71 6c 69 74 65 33  .*/.char sqlite3
0440: 45 78 70 72 41 66 66 69 6e 69 74 79 28 45 78 70  ExprAffinity(Exp
0450: 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
0460: 20 6f 70 3b 0a 20 20 70 45 78 70 72 20 3d 20 73   op;.  pExpr = s
0470: 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70 43 6f  qlite3ExprSkipCo
0480: 6c 6c 61 74 65 28 70 45 78 70 72 29 3b 0a 20 20  llate(pExpr);.  
0490: 69 66 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73  if( pExpr->flags
04a0: 20 26 20 45 50 5f 47 65 6e 65 72 69 63 20 29 20   & EP_Generic ) 
04b0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 6f 70 20 3d  return 0;.  op =
04c0: 20 70 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 69 66   pExpr->op;.  if
04d0: 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
04e0: 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20 70  ){.    assert( p
04f0: 45 78 70 72 2d 3e 66 6c 61 67 73 26 45 50 5f 78  Expr->flags&EP_x
0500: 49 73 53 65 6c 65 63 74 20 29 3b 0a 20 20 20 20  IsSelect );.    
0510: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0520: 70 72 41 66 66 69 6e 69 74 79 28 70 45 78 70 72  prAffinity(pExpr
0530: 2d 3e 78 2e 70 53 65 6c 65 63 74 2d 3e 70 45 4c  ->x.pSelect->pEL
0540: 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 29  ist->a[0].pExpr)
0550: 3b 0a 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51  ;.  }.#ifndef SQ
0560: 4c 49 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20  LITE_OMIT_CAST. 
0570: 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43 41 53 54   if( op==TK_CAST
0580: 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
0590: 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
05a0: 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
05b0: 6c 75 65 29 20 29 3b 0a 20 20 20 20 72 65 74 75  lue) );.    retu
05c0: 72 6e 20 73 71 6c 69 74 65 33 41 66 66 69 6e 69  rn sqlite3Affini
05d0: 74 79 54 79 70 65 28 70 45 78 70 72 2d 3e 75 2e  tyType(pExpr->u.
05e0: 7a 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 7d 0a  zToken, 0);.  }.
05f0: 23 65 6e 64 69 66 0a 20 20 69 66 28 20 28 6f 70  #endif.  if( (op
0600: 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20  ==TK_AGG_COLUMN 
0610: 7c 7c 20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e  || op==TK_COLUMN
0620: 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45 47 49 53   || op==TK_REGIS
0630: 54 45 52 29 20 0a 20 20 20 26 26 20 70 45 78 70  TER) .   && pExp
0640: 72 2d 3e 70 54 61 62 21 3d 30 0a 20 20 29 7b 0a  r->pTab!=0.  ){.
0650: 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b 5f 52 45      /* op==TK_RE
0660: 47 49 53 54 45 52 20 26 26 20 70 45 78 70 72 2d  GISTER && pExpr-
0670: 3e 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73  >pTab!=0 happens
0680: 20 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20   when pExpr was 
0690: 6f 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 2a  originally.    *
06a0: 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62 75  * a TK_COLUMN bu
06b0: 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c 79  t was previously
06c0: 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20 63   evaluated and c
06d0: 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69 73  ached in a regis
06e0: 74 65 72 20 2a 2f 0a 20 20 20 20 69 6e 74 20 6a  ter */.    int j
06f0: 20 3d 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d   = pExpr->iColum
0700: 6e 3b 0a 20 20 20 20 69 66 28 20 6a 3c 30 20 29  n;.    if( j<0 )
0710: 20 72 65 74 75 72 6e 20 53 51 4c 49 54 45 5f 41   return SQLITE_A
0720: 46 46 5f 49 4e 54 45 47 45 52 3b 0a 20 20 20 20  FF_INTEGER;.    
0730: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 70  assert( pExpr->p
0740: 54 61 62 20 26 26 20 6a 3c 70 45 78 70 72 2d 3e  Tab && j<pExpr->
0750: 70 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20  pTab->nCol );.  
0760: 20 20 72 65 74 75 72 6e 20 70 45 78 70 72 2d 3e    return pExpr->
0770: 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d 2e 61 66  pTab->aCol[j].af
0780: 66 69 6e 69 74 79 3b 0a 20 20 7d 0a 20 20 72 65  finity;.  }.  re
0790: 74 75 72 6e 20 70 45 78 70 72 2d 3e 61 66 66 69  turn pExpr->affi
07a0: 6e 69 74 79 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53  nity;.}../*.** S
07b0: 65 74 20 74 68 65 20 63 6f 6c 6c 61 74 69 6e 67  et the collating
07c0: 20 73 65 71 75 65 6e 63 65 20 66 6f 72 20 65 78   sequence for ex
07d0: 70 72 65 73 73 69 6f 6e 20 70 45 78 70 72 20 74  pression pExpr t
07e0: 6f 20 62 65 20 74 68 65 20 63 6f 6c 6c 61 74 69  o be the collati
07f0: 6e 67 0a 2a 2a 20 73 65 71 75 65 6e 63 65 20 6e  ng.** sequence n
0800: 61 6d 65 64 20 62 79 20 70 54 6f 6b 65 6e 2e 20  amed by pToken. 
0810: 20 20 52 65 74 75 72 6e 20 61 20 70 6f 69 6e 74    Return a point
0820: 65 72 20 74 6f 20 61 20 6e 65 77 20 45 78 70 72  er to a new Expr
0830: 20 6e 6f 64 65 20 74 68 61 74 0a 2a 2a 20 69 6d   node that.** im
0840: 70 6c 65 6d 65 6e 74 73 20 74 68 65 20 43 4f 4c  plements the COL
0850: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 2e 0a 2a  LATE operator..*
0860: 2a 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79  *.** If a memory
0870: 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f   allocation erro
0880: 72 20 6f 63 63 75 72 73 2c 20 74 68 61 74 20 66  r occurs, that f
0890: 61 63 74 20 69 73 20 72 65 63 6f 72 64 65 64 20  act is recorded 
08a0: 69 6e 20 70 50 61 72 73 65 2d 3e 64 62 0a 2a 2a  in pParse->db.**
08b0: 20 61 6e 64 20 74 68 65 20 70 45 78 70 72 20 70   and the pExpr p
08c0: 61 72 61 6d 65 74 65 72 20 69 73 20 72 65 74 75  arameter is retu
08d0: 72 6e 65 64 20 75 6e 63 68 61 6e 67 65 64 2e 0a  rned unchanged..
08e0: 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33  */.Expr *sqlite3
08f0: 45 78 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f  ExprAddCollateTo
0900: 6b 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  ken(.  Parse *pP
0910: 61 72 73 65 2c 20 20 20 20 20 20 20 20 20 20 20  arse,           
0920: 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f 6e 74 65  /* Parsing conte
0930: 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70 45  xt */.  Expr *pE
0940: 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 20 20  xpr,            
0950: 20 2f 2a 20 41 64 64 20 74 68 65 20 22 43 4f 4c   /* Add the "COL
0960: 4c 41 54 45 22 20 63 6c 61 75 73 65 20 74 6f 20  LATE" clause to 
0970: 74 68 69 73 20 65 78 70 72 65 73 73 69 6f 6e 20  this expression 
0980: 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b 65 6e  */.  const Token
0990: 20 2a 70 43 6f 6c 6c 4e 61 6d 65 20 20 20 2f 2a   *pCollName   /*
09a0: 20 4e 61 6d 65 20 6f 66 20 63 6f 6c 6c 61 74 69   Name of collati
09b0: 6e 67 20 73 65 71 75 65 6e 63 65 20 2a 2f 0a 29  ng sequence */.)
09c0: 7b 0a 20 20 69 66 28 20 70 43 6f 6c 6c 4e 61 6d  {.  if( pCollNam
09d0: 65 2d 3e 6e 3e 30 20 29 7b 0a 20 20 20 20 45 78  e->n>0 ){.    Ex
09e0: 70 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74  pr *pNew = sqlit
09f0: 65 33 45 78 70 72 41 6c 6c 6f 63 28 70 50 61 72  e3ExprAlloc(pPar
0a00: 73 65 2d 3e 64 62 2c 20 54 4b 5f 43 4f 4c 4c 41  se->db, TK_COLLA
0a10: 54 45 2c 20 70 43 6f 6c 6c 4e 61 6d 65 2c 20 31  TE, pCollName, 1
0a20: 29 3b 0a 20 20 20 20 69 66 28 20 70 4e 65 77 20  );.    if( pNew 
0a30: 29 7b 0a 20 20 20 20 20 20 70 4e 65 77 2d 3e 70  ){.      pNew->p
0a40: 4c 65 66 74 20 3d 20 70 45 78 70 72 3b 0a 20 20  Left = pExpr;.  
0a50: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
0a60: 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 7c 45 50  |= EP_Collate|EP
0a70: 5f 53 6b 69 70 3b 0a 20 20 20 20 20 20 70 45 78  _Skip;.      pEx
0a80: 70 72 20 3d 20 70 4e 65 77 3b 0a 20 20 20 20 7d  pr = pNew;.    }
0a90: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 45  .  }.  return pE
0aa0: 78 70 72 3b 0a 7d 0a 45 78 70 72 20 2a 73 71 6c  xpr;.}.Expr *sql
0ab0: 69 74 65 33 45 78 70 72 41 64 64 43 6f 6c 6c 61  ite3ExprAddColla
0ac0: 74 65 53 74 72 69 6e 67 28 50 61 72 73 65 20 2a  teString(Parse *
0ad0: 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
0ae0: 78 70 72 2c 20 63 6f 6e 73 74 20 63 68 61 72 20  xpr, const char 
0af0: 2a 7a 43 29 7b 0a 20 20 54 6f 6b 65 6e 20 73 3b  *zC){.  Token s;
0b00: 0a 20 20 61 73 73 65 72 74 28 20 7a 43 21 3d 30  .  assert( zC!=0
0b10: 20 29 3b 0a 20 20 73 2e 7a 20 3d 20 7a 43 3b 0a   );.  s.z = zC;.
0b20: 20 20 73 2e 6e 20 3d 20 73 71 6c 69 74 65 33 53    s.n = sqlite3S
0b30: 74 72 6c 65 6e 33 30 28 73 2e 7a 29 3b 0a 20 20  trlen30(s.z);.  
0b40: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78  return sqlite3Ex
0b50: 70 72 41 64 64 43 6f 6c 6c 61 74 65 54 6f 6b 65  prAddCollateToke
0b60: 6e 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c  n(pParse, pExpr,
0b70: 20 26 73 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53   &s);.}../*.** S
0b80: 6b 69 70 20 6f 76 65 72 20 61 6e 79 20 54 4b 5f  kip over any TK_
0b90: 43 4f 4c 4c 41 54 45 20 6f 72 20 54 4b 5f 41 53  COLLATE or TK_AS
0ba0: 20 6f 70 65 72 61 74 6f 72 73 20 61 6e 64 20 61   operators and a
0bb0: 6e 79 20 75 6e 6c 69 6b 65 6c 79 28 29 0a 2a 2a  ny unlikely().**
0bc0: 20 6f 72 20 6c 69 6b 65 6c 69 68 6f 6f 64 28 29   or likelihood()
0bd0: 20 66 75 6e 63 74 69 6f 6e 20 61 74 20 74 68 65   function at the
0be0: 20 72 6f 6f 74 20 6f 66 20 61 6e 20 65 78 70 72   root of an expr
0bf0: 65 73 73 69 6f 6e 2e 0a 2a 2f 0a 45 78 70 72 20  ession..*/.Expr 
0c00: 2a 73 71 6c 69 74 65 33 45 78 70 72 53 6b 69 70  *sqlite3ExprSkip
0c10: 43 6f 6c 6c 61 74 65 28 45 78 70 72 20 2a 70 45  Collate(Expr *pE
0c20: 78 70 72 29 7b 0a 20 20 77 68 69 6c 65 28 20 70  xpr){.  while( p
0c30: 45 78 70 72 20 26 26 20 45 78 70 72 48 61 73 50  Expr && ExprHasP
0c40: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
0c50: 50 5f 53 6b 69 70 29 20 29 7b 0a 20 20 20 20 69  P_Skip) ){.    i
0c60: 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72  f( ExprHasProper
0c70: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 55 6e 6c  ty(pExpr, EP_Unl
0c80: 69 6b 65 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  ikely) ){.      
0c90: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
0ca0: 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
0cb0: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b  EP_xIsSelect) );
0cc0: 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70  .      assert( p
0cd0: 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e  Expr->x.pList->n
0ce0: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 20 20  Expr>0 );.      
0cf0: 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
0d00: 70 3d 3d 54 4b 5f 46 55 4e 43 54 49 4f 4e 20 29  p==TK_FUNCTION )
0d10: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0d20: 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
0d30: 61 5b 30 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20  a[0].pExpr;.    
0d40: 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 61 73 73  }else{.      ass
0d50: 65 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d  ert( pExpr->op==
0d60: 54 4b 5f 43 4f 4c 4c 41 54 45 20 7c 7c 20 70 45  TK_COLLATE || pE
0d70: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41 53 20 29  xpr->op==TK_AS )
0d80: 3b 0a 20 20 20 20 20 20 70 45 78 70 72 20 3d 20  ;.      pExpr = 
0d90: 70 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20  pExpr->pLeft;.  
0da0: 20 20 7d 0a 20 20 7d 20 20 20 0a 20 20 72 65 74    }.  }   .  ret
0db0: 75 72 6e 20 70 45 78 70 72 3b 0a 7d 0a 0a 2f 2a  urn pExpr;.}../*
0dc0: 0a 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 63  .** Return the c
0dd0: 6f 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63  ollation sequenc
0de0: 65 20 66 6f 72 20 74 68 65 20 65 78 70 72 65 73  e for the expres
0df0: 73 69 6f 6e 20 70 45 78 70 72 2e 20 49 66 0a 2a  sion pExpr. If.*
0e00: 2a 20 74 68 65 72 65 20 69 73 20 6e 6f 20 64 65  * there is no de
0e10: 66 69 6e 65 64 20 63 6f 6c 6c 61 74 69 6e 67 20  fined collating 
0e20: 73 65 71 75 65 6e 63 65 2c 20 72 65 74 75 72 6e  sequence, return
0e30: 20 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54 68 65   NULL..**.** The
0e40: 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
0e50: 6e 63 65 20 6d 69 67 68 74 20 62 65 20 64 65 74  nce might be det
0e60: 65 72 6d 69 6e 65 64 20 62 79 20 61 20 43 4f 4c  ermined by a COL
0e70: 4c 41 54 45 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  LATE operator.**
0e80: 20 6f 72 20 62 79 20 74 68 65 20 70 72 65 73 65   or by the prese
0e90: 6e 63 65 20 6f 66 20 61 20 63 6f 6c 75 6d 6e 20  nce of a column 
0ea0: 77 69 74 68 20 61 20 64 65 66 69 6e 65 64 20 63  with a defined c
0eb0: 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65 6e 63  ollating sequenc
0ec0: 65 2e 0a 2a 2a 20 43 4f 4c 4c 41 54 45 20 6f 70  e..** COLLATE op
0ed0: 65 72 61 74 6f 72 73 20 74 61 6b 65 20 66 69 72  erators take fir
0ee0: 73 74 20 70 72 65 63 65 64 65 6e 63 65 2e 20 20  st precedence.  
0ef0: 4c 65 66 74 20 6f 70 65 72 61 6e 64 73 20 74 61  Left operands ta
0f00: 6b 65 0a 2a 2a 20 70 72 65 63 65 64 65 6e 63 65  ke.** precedence
0f10: 20 6f 76 65 72 20 72 69 67 68 74 20 6f 70 65 72   over right oper
0f20: 61 6e 64 73 2e 0a 2a 2f 0a 43 6f 6c 6c 53 65 71  ands..*/.CollSeq
0f30: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c   *sqlite3ExprCol
0f40: 6c 53 65 71 28 50 61 72 73 65 20 2a 70 50 61 72  lSeq(Parse *pPar
0f50: 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 29  se, Expr *pExpr)
0f60: 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62 20  {.  sqlite3 *db 
0f70: 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20 20  = pParse->db;.  
0f80: 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c 20 3d  CollSeq *pColl =
0f90: 20 30 3b 0a 20 20 45 78 70 72 20 2a 70 20 3d 20   0;.  Expr *p = 
0fa0: 70 45 78 70 72 3b 0a 20 20 77 68 69 6c 65 28 20  pExpr;.  while( 
0fb0: 70 20 29 7b 0a 20 20 20 20 69 6e 74 20 6f 70 20  p ){.    int op 
0fc0: 3d 20 70 2d 3e 6f 70 3b 0a 20 20 20 20 69 66 28  = p->op;.    if(
0fd0: 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 47   p->flags & EP_G
0fe0: 65 6e 65 72 69 63 20 29 20 62 72 65 61 6b 3b 0a  eneric ) break;.
0ff0: 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 43      if( op==TK_C
1000: 41 53 54 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 55 50  AST || op==TK_UP
1010: 4c 55 53 20 29 7b 0a 20 20 20 20 20 20 70 20 3d  LUS ){.      p =
1020: 20 70 2d 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20   p->pLeft;.     
1030: 20 63 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 7d   continue;.    }
1040: 0a 20 20 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  .    if( op==TK_
1050: 43 4f 4c 4c 41 54 45 20 7c 7c 20 28 6f 70 3d 3d  COLLATE || (op==
1060: 54 4b 5f 52 45 47 49 53 54 45 52 20 26 26 20 70  TK_REGISTER && p
1070: 2d 3e 6f 70 32 3d 3d 54 4b 5f 43 4f 4c 4c 41 54  ->op2==TK_COLLAT
1080: 45 29 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c  E) ){.      pCol
1090: 6c 20 3d 20 73 71 6c 69 74 65 33 47 65 74 43 6f  l = sqlite3GetCo
10a0: 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 45 4e  llSeq(pParse, EN
10b0: 43 28 64 62 29 2c 20 30 2c 20 70 2d 3e 75 2e 7a  C(db), 0, p->u.z
10c0: 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62 72  Token);.      br
10d0: 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 69  eak;.    }.    i
10e0: 66 28 20 70 2d 3e 70 54 61 62 21 3d 30 0a 20 20  f( p->pTab!=0.  
10f0: 20 20 20 26 26 20 28 6f 70 3d 3d 54 4b 5f 41 47     && (op==TK_AG
1100: 47 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 6f 70 3d 3d  G_COLUMN || op==
1110: 54 4b 5f 43 4f 4c 55 4d 4e 0a 20 20 20 20 20 20  TK_COLUMN.      
1120: 20 20 20 20 7c 7c 20 6f 70 3d 3d 54 4b 5f 52 45      || op==TK_RE
1130: 47 49 53 54 45 52 20 7c 7c 20 6f 70 3d 3d 54 4b  GISTER || op==TK
1140: 5f 54 52 49 47 47 45 52 29 0a 20 20 20 20 29 7b  _TRIGGER).    ){
1150: 0a 20 20 20 20 20 20 2f 2a 20 6f 70 3d 3d 54 4b  .      /* op==TK
1160: 5f 52 45 47 49 53 54 45 52 20 26 26 20 70 2d 3e  _REGISTER && p->
1170: 70 54 61 62 21 3d 30 20 68 61 70 70 65 6e 73 20  pTab!=0 happens 
1180: 77 68 65 6e 20 70 45 78 70 72 20 77 61 73 20 6f  when pExpr was o
1190: 72 69 67 69 6e 61 6c 6c 79 0a 20 20 20 20 20 20  riginally.      
11a0: 2a 2a 20 61 20 54 4b 5f 43 4f 4c 55 4d 4e 20 62  ** a TK_COLUMN b
11b0: 75 74 20 77 61 73 20 70 72 65 76 69 6f 75 73 6c  ut was previousl
11c0: 79 20 65 76 61 6c 75 61 74 65 64 20 61 6e 64 20  y evaluated and 
11d0: 63 61 63 68 65 64 20 69 6e 20 61 20 72 65 67 69  cached in a regi
11e0: 73 74 65 72 20 2a 2f 0a 20 20 20 20 20 20 69 6e  ster */.      in
11f0: 74 20 6a 20 3d 20 70 2d 3e 69 43 6f 6c 75 6d 6e  t j = p->iColumn
1200: 3b 0a 20 20 20 20 20 20 69 66 28 20 6a 3e 3d 30  ;.      if( j>=0
1210: 20 29 7b 0a 20 20 20 20 20 20 20 20 63 6f 6e 73   ){.        cons
1220: 74 20 63 68 61 72 20 2a 7a 43 6f 6c 6c 20 3d 20  t char *zColl = 
1230: 70 2d 3e 70 54 61 62 2d 3e 61 43 6f 6c 5b 6a 5d  p->pTab->aCol[j]
1240: 2e 7a 43 6f 6c 6c 3b 0a 20 20 20 20 20 20 20 20  .zColl;.        
1250: 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 46  pColl = sqlite3F
1260: 69 6e 64 43 6f 6c 6c 53 65 71 28 64 62 2c 20 45  indCollSeq(db, E
1270: 4e 43 28 64 62 29 2c 20 7a 43 6f 6c 6c 2c 20 30  NC(db), zColl, 0
1280: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1290: 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
12a0: 20 20 69 66 28 20 70 2d 3e 66 6c 61 67 73 20 26    if( p->flags &
12b0: 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29 7b 0a 20   EP_Collate ){. 
12c0: 20 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28       if( ALWAYS(
12d0: 70 2d 3e 70 4c 65 66 74 29 20 26 26 20 28 70 2d  p->pLeft) && (p-
12e0: 3e 70 4c 65 66 74 2d 3e 66 6c 61 67 73 20 26 20  >pLeft->flags & 
12f0: 45 50 5f 43 6f 6c 6c 61 74 65 29 21 3d 30 20 29  EP_Collate)!=0 )
1300: 7b 0a 20 20 20 20 20 20 20 20 70 20 3d 20 70 2d  {.        p = p-
1310: 3e 70 4c 65 66 74 3b 0a 20 20 20 20 20 20 7d 65  >pLeft;.      }e
1320: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 70 20 3d  lse{.        p =
1330: 20 70 2d 3e 70 52 69 67 68 74 3b 0a 20 20 20 20   p->pRight;.    
1340: 20 20 7d 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20    }.    }else{. 
1350: 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1360: 7d 0a 20 20 7d 0a 20 20 69 66 28 20 73 71 6c 69  }.  }.  if( sqli
1370: 74 65 33 43 68 65 63 6b 43 6f 6c 6c 53 65 71 28  te3CheckCollSeq(
1380: 70 50 61 72 73 65 2c 20 70 43 6f 6c 6c 29 20 29  pParse, pColl) )
1390: 7b 20 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 30  { .    pColl = 0
13a0: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70  ;.  }.  return p
13b0: 43 6f 6c 6c 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70  Coll;.}../*.** p
13c0: 45 78 70 72 20 69 73 20 61 6e 20 6f 70 65 72 61  Expr is an opera
13d0: 6e 64 20 6f 66 20 61 20 63 6f 6d 70 61 72 69 73  nd of a comparis
13e0: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 20 20 61 66  on operator.  af
13f0: 66 32 20 69 73 20 74 68 65 0a 2a 2a 20 74 79 70  f2 is the.** typ
1400: 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20 74 68  e affinity of th
1410: 65 20 6f 74 68 65 72 20 6f 70 65 72 61 6e 64 2e  e other operand.
1420: 20 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20 72    This routine r
1430: 65 74 75 72 6e 73 20 74 68 65 0a 2a 2a 20 74 79  eturns the.** ty
1440: 70 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74  pe affinity that
1450: 20 73 68 6f 75 6c 64 20 62 65 20 75 73 65 64 20   should be used 
1460: 66 6f 72 20 74 68 65 20 63 6f 6d 70 61 72 69 73  for the comparis
1470: 6f 6e 20 6f 70 65 72 61 74 6f 72 2e 0a 2a 2f 0a  on operator..*/.
1480: 63 68 61 72 20 73 71 6c 69 74 65 33 43 6f 6d 70  char sqlite3Comp
1490: 61 72 65 41 66 66 69 6e 69 74 79 28 45 78 70 72  areAffinity(Expr
14a0: 20 2a 70 45 78 70 72 2c 20 63 68 61 72 20 61 66   *pExpr, char af
14b0: 66 32 29 7b 0a 20 20 63 68 61 72 20 61 66 66 31  f2){.  char aff1
14c0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 66   = sqlite3ExprAf
14d0: 66 69 6e 69 74 79 28 70 45 78 70 72 29 3b 0a 20  finity(pExpr);. 
14e0: 20 69 66 28 20 61 66 66 31 20 26 26 20 61 66 66   if( aff1 && aff
14f0: 32 20 29 7b 0a 20 20 20 20 2f 2a 20 42 6f 74 68  2 ){.    /* Both
1500: 20 73 69 64 65 73 20 6f 66 20 74 68 65 20 63 6f   sides of the co
1510: 6d 70 61 72 69 73 6f 6e 20 61 72 65 20 63 6f 6c  mparison are col
1520: 75 6d 6e 73 2e 20 49 66 20 6f 6e 65 20 68 61 73  umns. If one has
1530: 20 6e 75 6d 65 72 69 63 0a 20 20 20 20 2a 2a 20   numeric.    ** 
1540: 61 66 66 69 6e 69 74 79 2c 20 75 73 65 20 74 68  affinity, use th
1550: 61 74 2e 20 4f 74 68 65 72 77 69 73 65 20 75 73  at. Otherwise us
1560: 65 20 6e 6f 20 61 66 66 69 6e 69 74 79 2e 0a 20  e no affinity.. 
1570: 20 20 20 2a 2f 0a 20 20 20 20 69 66 28 20 73 71     */.    if( sq
1580: 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66  lite3IsNumericAf
1590: 66 69 6e 69 74 79 28 61 66 66 31 29 20 7c 7c 20  finity(aff1) || 
15a0: 73 71 6c 69 74 65 33 49 73 4e 75 6d 65 72 69 63  sqlite3IsNumeric
15b0: 41 66 66 69 6e 69 74 79 28 61 66 66 32 29 20 29  Affinity(aff2) )
15c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 53  {.      return S
15d0: 51 4c 49 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49  QLITE_AFF_NUMERI
15e0: 43 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  C;.    }else{.  
15f0: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
1600: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 20 20  E_AFF_NONE;.    
1610: 7d 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  }.  }else if( !a
1620: 66 66 31 20 26 26 20 21 61 66 66 32 20 29 7b 0a  ff1 && !aff2 ){.
1630: 20 20 20 20 2f 2a 20 4e 65 69 74 68 65 72 20 73      /* Neither s
1640: 69 64 65 20 6f 66 20 74 68 65 20 63 6f 6d 70 61  ide of the compa
1650: 72 69 73 6f 6e 20 69 73 20 61 20 63 6f 6c 75 6d  rison is a colum
1660: 6e 2e 20 20 43 6f 6d 70 61 72 65 20 74 68 65 0a  n.  Compare the.
1670: 20 20 20 20 2a 2a 20 72 65 73 75 6c 74 73 20 64      ** results d
1680: 69 72 65 63 74 6c 79 2e 0a 20 20 20 20 2a 2f 0a  irectly..    */.
1690: 20 20 20 20 72 65 74 75 72 6e 20 53 51 4c 49 54      return SQLIT
16a0: 45 5f 41 46 46 5f 4e 4f 4e 45 3b 0a 20 20 7d 65  E_AFF_NONE;.  }e
16b0: 6c 73 65 7b 0a 20 20 20 20 2f 2a 20 4f 6e 65 20  lse{.    /* One 
16c0: 73 69 64 65 20 69 73 20 61 20 63 6f 6c 75 6d 6e  side is a column
16d0: 2c 20 74 68 65 20 6f 74 68 65 72 20 69 73 20 6e  , the other is n
16e0: 6f 74 2e 20 55 73 65 20 74 68 65 20 63 6f 6c 75  ot. Use the colu
16f0: 6d 6e 73 20 61 66 66 69 6e 69 74 79 2e 20 2a 2f  mns affinity. */
1700: 0a 20 20 20 20 61 73 73 65 72 74 28 20 61 66 66  .    assert( aff
1710: 31 3d 3d 30 20 7c 7c 20 61 66 66 32 3d 3d 30 20  1==0 || aff2==0 
1720: 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 28 61  );.    return (a
1730: 66 66 31 20 2b 20 61 66 66 32 29 3b 0a 20 20 7d  ff1 + aff2);.  }
1740: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70 72 20  .}../*.** pExpr 
1750: 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f 6e 20  is a comparison 
1760: 6f 70 65 72 61 74 6f 72 2e 20 20 52 65 74 75 72  operator.  Retur
1770: 6e 20 74 68 65 20 74 79 70 65 20 61 66 66 69 6e  n the type affin
1780: 69 74 79 20 74 68 61 74 20 73 68 6f 75 6c 64 0a  ity that should.
1790: 2a 2a 20 62 65 20 61 70 70 6c 69 65 64 20 74 6f  ** be applied to
17a0: 20 62 6f 74 68 20 6f 70 65 72 61 6e 64 73 20 70   both operands p
17b0: 72 69 6f 72 20 74 6f 20 64 6f 69 6e 67 20 74 68  rior to doing th
17c0: 65 20 63 6f 6d 70 61 72 69 73 6f 6e 2e 0a 2a 2f  e comparison..*/
17d0: 0a 73 74 61 74 69 63 20 63 68 61 72 20 63 6f 6d  .static char com
17e0: 70 61 72 69 73 6f 6e 41 66 66 69 6e 69 74 79 28  parisonAffinity(
17f0: 45 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20  Expr *pExpr){.  
1800: 63 68 61 72 20 61 66 66 3b 0a 20 20 61 73 73 65  char aff;.  asse
1810: 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  rt( pExpr->op==T
1820: 4b 5f 45 51 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_EQ || pExpr->o
1830: 70 3d 3d 54 4b 5f 49 4e 20 7c 7c 20 70 45 78 70  p==TK_IN || pExp
1840: 72 2d 3e 6f 70 3d 3d 54 4b 5f 4c 54 20 7c 7c 0a  r->op==TK_LT ||.
1850: 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
1860: 3e 6f 70 3d 3d 54 4b 5f 47 54 20 7c 7c 20 70 45  >op==TK_GT || pE
1870: 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 47 45 20 7c  xpr->op==TK_GE |
1880: 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  | pExpr->op==TK_
1890: 4c 45 20 7c 7c 0a 20 20 20 20 20 20 20 20 20 20  LE ||.          
18a0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 4e 45  pExpr->op==TK_NE
18b0: 20 7c 7c 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   || pExpr->op==T
18c0: 4b 5f 49 53 20 7c 7c 20 70 45 78 70 72 2d 3e 6f  K_IS || pExpr->o
18d0: 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a 20  p==TK_ISNOT );. 
18e0: 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
18f0: 70 4c 65 66 74 20 29 3b 0a 20 20 61 66 66 20 3d  pLeft );.  aff =
1900: 20 73 71 6c 69 74 65 33 45 78 70 72 41 66 66 69   sqlite3ExprAffi
1910: 6e 69 74 79 28 70 45 78 70 72 2d 3e 70 4c 65 66  nity(pExpr->pLef
1920: 74 29 3b 0a 20 20 69 66 28 20 70 45 78 70 72 2d  t);.  if( pExpr-
1930: 3e 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 61  >pRight ){.    a
1940: 66 66 20 3d 20 73 71 6c 69 74 65 33 43 6f 6d 70  ff = sqlite3Comp
1950: 61 72 65 41 66 66 69 6e 69 74 79 28 70 45 78 70  areAffinity(pExp
1960: 72 2d 3e 70 52 69 67 68 74 2c 20 61 66 66 29 3b  r->pRight, aff);
1970: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 45 78 70  .  }else if( Exp
1980: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78  rHasProperty(pEx
1990: 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  pr, EP_xIsSelect
19a0: 29 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20 73  ) ){.    aff = s
19b0: 71 6c 69 74 65 33 43 6f 6d 70 61 72 65 41 66 66  qlite3CompareAff
19c0: 69 6e 69 74 79 28 70 45 78 70 72 2d 3e 78 2e 70  inity(pExpr->x.p
19d0: 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 2d 3e  Select->pEList->
19e0: 61 5b 30 5d 2e 70 45 78 70 72 2c 20 61 66 66 29  a[0].pExpr, aff)
19f0: 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 21 61  ;.  }else if( !a
1a00: 66 66 20 29 7b 0a 20 20 20 20 61 66 66 20 3d 20  ff ){.    aff = 
1a10: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3b  SQLITE_AFF_NONE;
1a20: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 61 66  .  }.  return af
1a30: 66 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 70 45 78 70  f;.}../*.** pExp
1a40: 72 20 69 73 20 61 20 63 6f 6d 70 61 72 69 73 6f  r is a compariso
1a50: 6e 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 65 67  n expression, eg
1a60: 2e 20 27 3d 27 2c 20 27 3c 27 2c 20 49 4e 28 2e  . '=', '<', IN(.
1a70: 2e 2e 29 20 65 74 63 2e 0a 2a 2a 20 69 64 78 5f  ..) etc..** idx_
1a80: 61 66 66 69 6e 69 74 79 20 69 73 20 74 68 65 20  affinity is the 
1a90: 61 66 66 69 6e 69 74 79 20 6f 66 20 61 6e 20 69  affinity of an i
1aa0: 6e 64 65 78 65 64 20 63 6f 6c 75 6d 6e 2e 20 52  ndexed column. R
1ab0: 65 74 75 72 6e 20 74 72 75 65 0a 2a 2a 20 69 66  eturn true.** if
1ac0: 20 74 68 65 20 69 6e 64 65 78 20 77 69 74 68 20   the index with 
1ad0: 61 66 66 69 6e 69 74 79 20 69 64 78 5f 61 66 66  affinity idx_aff
1ae0: 69 6e 69 74 79 20 6d 61 79 20 62 65 20 75 73 65  inity may be use
1af0: 64 20 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 0a 2a  d to implement.*
1b00: 2a 20 74 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e  * the comparison
1b10: 20 69 6e 20 70 45 78 70 72 2e 0a 2a 2f 0a 69 6e   in pExpr..*/.in
1b20: 74 20 73 71 6c 69 74 65 33 49 6e 64 65 78 41 66  t sqlite3IndexAf
1b30: 66 69 6e 69 74 79 4f 6b 28 45 78 70 72 20 2a 70  finityOk(Expr *p
1b40: 45 78 70 72 2c 20 63 68 61 72 20 69 64 78 5f 61  Expr, char idx_a
1b50: 66 66 69 6e 69 74 79 29 7b 0a 20 20 63 68 61 72  ffinity){.  char
1b60: 20 61 66 66 20 3d 20 63 6f 6d 70 61 72 69 73 6f   aff = compariso
1b70: 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
1b80: 3b 0a 20 20 73 77 69 74 63 68 28 20 61 66 66 20  ;.  switch( aff 
1b90: 29 7b 0a 20 20 20 20 63 61 73 65 20 53 51 4c 49  ){.    case SQLI
1ba0: 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 0a 20 20 20  TE_AFF_NONE:.   
1bb0: 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 20     return 1;.   
1bc0: 20 63 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46   case SQLITE_AFF
1bd0: 5f 54 45 58 54 3a 0a 20 20 20 20 20 20 72 65 74  _TEXT:.      ret
1be0: 75 72 6e 20 69 64 78 5f 61 66 66 69 6e 69 74 79  urn idx_affinity
1bf0: 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 54 45 58  ==SQLITE_AFF_TEX
1c00: 54 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a  T;.    default:.
1c10: 20 20 20 20 20 20 72 65 74 75 72 6e 20 73 71 6c        return sql
1c20: 69 74 65 33 49 73 4e 75 6d 65 72 69 63 41 66 66  ite3IsNumericAff
1c30: 69 6e 69 74 79 28 69 64 78 5f 61 66 66 69 6e 69  inity(idx_affini
1c40: 74 79 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  ty);.  }.}../*.*
1c50: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 50 35 20  * Return the P5 
1c60: 76 61 6c 75 65 20 74 68 61 74 20 73 68 6f 75 6c  value that shoul
1c70: 64 20 62 65 20 75 73 65 64 20 66 6f 72 20 61 20  d be used for a 
1c80: 62 69 6e 61 72 79 20 63 6f 6d 70 61 72 69 73 6f  binary compariso
1c90: 6e 0a 2a 2a 20 6f 70 63 6f 64 65 20 28 4f 50 5f  n.** opcode (OP_
1ca0: 45 71 2c 20 4f 50 5f 47 65 20 65 74 63 2e 29 20  Eq, OP_Ge etc.) 
1cb0: 75 73 65 64 20 74 6f 20 63 6f 6d 70 61 72 65 20  used to compare 
1cc0: 70 45 78 70 72 31 20 61 6e 64 20 70 45 78 70 72  pExpr1 and pExpr
1cd0: 32 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 75 38 20  2..*/.static u8 
1ce0: 62 69 6e 61 72 79 43 6f 6d 70 61 72 65 50 35 28  binaryCompareP5(
1cf0: 45 78 70 72 20 2a 70 45 78 70 72 31 2c 20 45 78  Expr *pExpr1, Ex
1d00: 70 72 20 2a 70 45 78 70 72 32 2c 20 69 6e 74 20  pr *pExpr2, int 
1d10: 6a 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 75  jumpIfNull){.  u
1d20: 38 20 61 66 66 20 3d 20 28 63 68 61 72 29 73 71  8 aff = (char)sq
1d30: 6c 69 74 65 33 45 78 70 72 41 66 66 69 6e 69 74  lite3ExprAffinit
1d40: 79 28 70 45 78 70 72 32 29 3b 0a 20 20 61 66 66  y(pExpr2);.  aff
1d50: 20 3d 20 28 75 38 29 73 71 6c 69 74 65 33 43 6f   = (u8)sqlite3Co
1d60: 6d 70 61 72 65 41 66 66 69 6e 69 74 79 28 70 45  mpareAffinity(pE
1d70: 78 70 72 31 2c 20 61 66 66 29 20 7c 20 28 75 38  xpr1, aff) | (u8
1d80: 29 6a 75 6d 70 49 66 4e 75 6c 6c 3b 0a 20 20 72  )jumpIfNull;.  r
1d90: 65 74 75 72 6e 20 61 66 66 3b 0a 7d 0a 0a 2f 2a  eturn aff;.}../*
1da0: 0a 2a 2a 20 52 65 74 75 72 6e 20 61 20 70 6f 69  .** Return a poi
1db0: 6e 74 65 72 20 74 6f 20 74 68 65 20 63 6f 6c 6c  nter to the coll
1dc0: 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65 20 74  ation sequence t
1dd0: 68 61 74 20 73 68 6f 75 6c 64 20 62 65 20 75 73  hat should be us
1de0: 65 64 20 62 79 0a 2a 2a 20 61 20 62 69 6e 61 72  ed by.** a binar
1df0: 79 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70 65  y comparison ope
1e00: 72 61 74 6f 72 20 63 6f 6d 70 61 72 69 6e 67 20  rator comparing 
1e10: 70 4c 65 66 74 20 61 6e 64 20 70 52 69 67 68 74  pLeft and pRight
1e20: 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 6c  ..**.** If the l
1e30: 65 66 74 20 68 61 6e 64 20 65 78 70 72 65 73 73  eft hand express
1e40: 69 6f 6e 20 68 61 73 20 61 20 63 6f 6c 6c 61 74  ion has a collat
1e50: 69 6e 67 20 73 65 71 75 65 6e 63 65 20 74 79 70  ing sequence typ
1e60: 65 2c 20 74 68 65 6e 20 69 74 20 69 73 0a 2a 2a  e, then it is.**
1e70: 20 75 73 65 64 2e 20 4f 74 68 65 72 77 69 73 65   used. Otherwise
1e80: 20 74 68 65 20 63 6f 6c 6c 61 74 69 6f 6e 20 73   the collation s
1e90: 65 71 75 65 6e 63 65 20 66 6f 72 20 74 68 65 20  equence for the 
1ea0: 72 69 67 68 74 20 68 61 6e 64 20 65 78 70 72 65  right hand expre
1eb0: 73 73 69 6f 6e 0a 2a 2a 20 69 73 20 75 73 65 64  ssion.** is used
1ec0: 2c 20 6f 72 20 74 68 65 20 64 65 66 61 75 6c 74  , or the default
1ed0: 20 28 42 49 4e 41 52 59 29 20 69 66 20 6e 65 69   (BINARY) if nei
1ee0: 74 68 65 72 20 65 78 70 72 65 73 73 69 6f 6e 20  ther expression 
1ef0: 68 61 73 20 61 20 63 6f 6c 6c 61 74 69 6e 67 0a  has a collating.
1f00: 2a 2a 20 74 79 70 65 2e 0a 2a 2a 0a 2a 2a 20 41  ** type..**.** A
1f10: 72 67 75 6d 65 6e 74 20 70 52 69 67 68 74 20 28  rgument pRight (
1f20: 62 75 74 20 6e 6f 74 20 70 4c 65 66 74 29 20 6d  but not pLeft) m
1f30: 61 79 20 62 65 20 61 20 6e 75 6c 6c 20 70 6f 69  ay be a null poi
1f40: 6e 74 65 72 2e 20 49 6e 20 74 68 69 73 20 63 61  nter. In this ca
1f50: 73 65 2c 0a 2a 2a 20 69 74 20 69 73 20 6e 6f 74  se,.** it is not
1f60: 20 63 6f 6e 73 69 64 65 72 65 64 2e 0a 2a 2f 0a   considered..*/.
1f70: 43 6f 6c 6c 53 65 71 20 2a 73 71 6c 69 74 65 33  CollSeq *sqlite3
1f80: 42 69 6e 61 72 79 43 6f 6d 70 61 72 65 43 6f 6c  BinaryCompareCol
1f90: 6c 53 65 71 28 0a 20 20 50 61 72 73 65 20 2a 70  lSeq(.  Parse *p
1fa0: 50 61 72 73 65 2c 20 0a 20 20 45 78 70 72 20 2a  Parse, .  Expr *
1fb0: 70 4c 65 66 74 2c 20 0a 20 20 45 78 70 72 20 2a  pLeft, .  Expr *
1fc0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 43 6f 6c 6c  pRight.){.  Coll
1fd0: 53 65 71 20 2a 70 43 6f 6c 6c 3b 0a 20 20 61 73  Seq *pColl;.  as
1fe0: 73 65 72 74 28 20 70 4c 65 66 74 20 29 3b 0a 20  sert( pLeft );. 
1ff0: 20 69 66 28 20 70 4c 65 66 74 2d 3e 66 6c 61 67   if( pLeft->flag
2000: 73 20 26 20 45 50 5f 43 6f 6c 6c 61 74 65 20 29  s & EP_Collate )
2010: 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73 71  {.    pColl = sq
2020: 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65 71  lite3ExprCollSeq
2030: 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29 3b  (pParse, pLeft);
2040: 0a 20 20 7d 65 6c 73 65 20 69 66 28 20 70 52 69  .  }else if( pRi
2050: 67 68 74 20 26 26 20 28 70 52 69 67 68 74 2d 3e  ght && (pRight->
2060: 66 6c 61 67 73 20 26 20 45 50 5f 43 6f 6c 6c 61  flags & EP_Colla
2070: 74 65 29 21 3d 30 20 29 7b 0a 20 20 20 20 70 43  te)!=0 ){.    pC
2080: 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45 78 70  oll = sqlite3Exp
2090: 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c  rCollSeq(pParse,
20a0: 20 70 52 69 67 68 74 29 3b 0a 20 20 7d 65 6c 73   pRight);.  }els
20b0: 65 7b 0a 20 20 20 20 70 43 6f 6c 6c 20 3d 20 73  e{.    pColl = s
20c0: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
20d0: 71 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74 29  q(pParse, pLeft)
20e0: 3b 0a 20 20 20 20 69 66 28 20 21 70 43 6f 6c 6c  ;.    if( !pColl
20f0: 20 29 7b 0a 20 20 20 20 20 20 70 43 6f 6c 6c 20   ){.      pColl 
2100: 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6c  = sqlite3ExprCol
2110: 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 52 69  lSeq(pParse, pRi
2120: 67 68 74 29 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  ght);.    }.  }.
2130: 20 20 72 65 74 75 72 6e 20 70 43 6f 6c 6c 3b 0a    return pColl;.
2140: 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
2150: 65 20 63 6f 64 65 20 66 6f 72 20 61 20 63 6f 6d  e code for a com
2160: 70 61 72 69 73 6f 6e 20 6f 70 65 72 61 74 6f 72  parison operator
2170: 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20  ..*/.static int 
2180: 63 6f 64 65 43 6f 6d 70 61 72 65 28 0a 20 20 50  codeCompare(.  P
2190: 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20 20  arse *pParse,   
21a0: 20 2f 2a 20 54 68 65 20 70 61 72 73 69 6e 67 20   /* The parsing 
21b0: 28 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72 61  (and code genera
21c0: 74 69 6e 67 29 20 63 6f 6e 74 65 78 74 20 2a 2f  ting) context */
21d0: 0a 20 20 45 78 70 72 20 2a 70 4c 65 66 74 2c 20  .  Expr *pLeft, 
21e0: 20 20 20 20 20 2f 2a 20 54 68 65 20 6c 65 66 74       /* The left
21f0: 20 6f 70 65 72 61 6e 64 20 2a 2f 0a 20 20 45 78   operand */.  Ex
2200: 70 72 20 2a 70 52 69 67 68 74 2c 20 20 20 20 20  pr *pRight,     
2210: 2f 2a 20 54 68 65 20 72 69 67 68 74 20 6f 70 65  /* The right ope
2220: 72 61 6e 64 20 2a 2f 0a 20 20 69 6e 74 20 6f 70  rand */.  int op
2230: 63 6f 64 65 2c 20 20 20 20 20 20 20 2f 2a 20 54  code,       /* T
2240: 68 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  he comparison op
2250: 63 6f 64 65 20 2a 2f 0a 20 20 69 6e 74 20 69 6e  code */.  int in
2260: 31 2c 20 69 6e 74 20 69 6e 32 2c 20 2f 2a 20 52  1, int in2, /* R
2270: 65 67 69 73 74 65 72 20 68 6f 6c 64 69 6e 67 20  egister holding 
2280: 6f 70 65 72 61 6e 64 73 20 2a 2f 0a 20 20 69 6e  operands */.  in
2290: 74 20 64 65 73 74 2c 20 20 20 20 20 20 20 20 20  t dest,         
22a0: 2f 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20  /* Jump here if 
22b0: 74 72 75 65 2e 20 20 2a 2f 0a 20 20 69 6e 74 20  true.  */.  int 
22c0: 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f 2a  jumpIfNull    /*
22d0: 20 49 66 20 74 72 75 65 2c 20 6a 75 6d 70 20 69   If true, jump i
22e0: 66 20 65 69 74 68 65 72 20 6f 70 65 72 61 6e 64  f either operand
22f0: 20 69 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   is NULL */.){. 
2300: 20 69 6e 74 20 70 35 3b 0a 20 20 69 6e 74 20 61   int p5;.  int a
2310: 64 64 72 3b 0a 20 20 43 6f 6c 6c 53 65 71 20 2a  ddr;.  CollSeq *
2320: 70 34 3b 0a 0a 20 20 70 34 20 3d 20 73 71 6c 69  p4;..  p4 = sqli
2330: 74 65 33 42 69 6e 61 72 79 43 6f 6d 70 61 72 65  te3BinaryCompare
2340: 43 6f 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20  CollSeq(pParse, 
2350: 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29 3b 0a  pLeft, pRight);.
2360: 20 20 70 35 20 3d 20 62 69 6e 61 72 79 43 6f 6d    p5 = binaryCom
2370: 70 61 72 65 50 35 28 70 4c 65 66 74 2c 20 70 52  pareP5(pLeft, pR
2380: 69 67 68 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c  ight, jumpIfNull
2390: 29 3b 0a 20 20 61 64 64 72 20 3d 20 73 71 6c 69  );.  addr = sqli
23a0: 74 65 33 56 64 62 65 41 64 64 4f 70 34 28 70 50  te3VdbeAddOp4(pP
23b0: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 6f 70 63  arse->pVdbe, opc
23c0: 6f 64 65 2c 20 69 6e 32 2c 20 64 65 73 74 2c 20  ode, in2, dest, 
23d0: 69 6e 31 2c 0a 20 20 20 20 20 20 20 20 20 20 20  in1,.           
23e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23f0: 28 76 6f 69 64 2a 29 70 34 2c 20 50 34 5f 43 4f  (void*)p4, P4_CO
2400: 4c 4c 53 45 51 29 3b 0a 20 20 73 71 6c 69 74 65  LLSEQ);.  sqlite
2410: 33 56 64 62 65 43 68 61 6e 67 65 50 35 28 70 50  3VdbeChangeP5(pP
2420: 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 28 75 38  arse->pVdbe, (u8
2430: 29 70 35 29 3b 0a 20 20 72 65 74 75 72 6e 20 61  )p5);.  return a
2440: 64 64 72 3b 0a 7d 0a 0a 23 69 66 20 53 51 4c 49  ddr;.}..#if SQLI
2450: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2460: 48 3e 30 0a 2f 2a 0a 2a 2a 20 43 68 65 63 6b 20  H>0./*.** Check 
2470: 74 68 61 74 20 61 72 67 75 6d 65 6e 74 20 6e 48  that argument nH
2480: 65 69 67 68 74 20 69 73 20 6c 65 73 73 20 74 68  eight is less th
2490: 61 6e 20 6f 72 20 65 71 75 61 6c 20 74 6f 20 74  an or equal to t
24a0: 68 65 20 6d 61 78 69 6d 75 6d 0a 2a 2a 20 65 78  he maximum.** ex
24b0: 70 72 65 73 73 69 6f 6e 20 64 65 70 74 68 20 61  pression depth a
24c0: 6c 6c 6f 77 65 64 2e 20 49 66 20 69 74 20 69 73  llowed. If it is
24d0: 20 6e 6f 74 2c 20 6c 65 61 76 65 20 61 6e 20 65   not, leave an e
24e0: 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69 6e 0a  rror message in.
24f0: 2a 2a 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 69 6e  ** pParse..*/.in
2500: 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65  t sqlite3ExprChe
2510: 63 6b 48 65 69 67 68 74 28 50 61 72 73 65 20 2a  ckHeight(Parse *
2520: 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 48 65 69  pParse, int nHei
2530: 67 68 74 29 7b 0a 20 20 69 6e 74 20 72 63 20 3d  ght){.  int rc =
2540: 20 53 51 4c 49 54 45 5f 4f 4b 3b 0a 20 20 69 6e   SQLITE_OK;.  in
2550: 74 20 6d 78 48 65 69 67 68 74 20 3d 20 70 50 61  t mxHeight = pPa
2560: 72 73 65 2d 3e 64 62 2d 3e 61 4c 69 6d 69 74 5b  rse->db->aLimit[
2570: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 45 58 50  SQLITE_LIMIT_EXP
2580: 52 5f 44 45 50 54 48 5d 3b 0a 20 20 69 66 28 20  R_DEPTH];.  if( 
2590: 6e 48 65 69 67 68 74 3e 6d 78 48 65 69 67 68 74  nHeight>mxHeight
25a0: 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   ){.    sqlite3E
25b0: 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
25c0: 0a 20 20 20 20 20 20 20 22 45 78 70 72 65 73 73  .       "Express
25d0: 69 6f 6e 20 74 72 65 65 20 69 73 20 74 6f 6f 20  ion tree is too 
25e0: 6c 61 72 67 65 20 28 6d 61 78 69 6d 75 6d 20 64  large (maximum d
25f0: 65 70 74 68 20 25 64 29 22 2c 20 6d 78 48 65 69  epth %d)", mxHei
2600: 67 68 74 0a 20 20 20 20 29 3b 0a 20 20 20 20 72  ght.    );.    r
2610: 63 20 3d 20 53 51 4c 49 54 45 5f 45 52 52 4f 52  c = SQLITE_ERROR
2620: 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 72  ;.  }.  return r
2630: 63 3b 0a 7d 0a 0a 2f 2a 20 54 68 65 20 66 6f 6c  c;.}../* The fol
2640: 6c 6f 77 69 6e 67 20 74 68 72 65 65 20 66 75 6e  lowing three fun
2650: 63 74 69 6f 6e 73 2c 20 68 65 69 67 68 74 4f 66  ctions, heightOf
2660: 45 78 70 72 28 29 2c 20 68 65 69 67 68 74 4f 66  Expr(), heightOf
2670: 45 78 70 72 4c 69 73 74 28 29 0a 2a 2a 20 61 6e  ExprList().** an
2680: 64 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74  d heightOfSelect
2690: 28 29 2c 20 61 72 65 20 75 73 65 64 20 74 6f 20  (), are used to 
26a0: 64 65 74 65 72 6d 69 6e 65 20 74 68 65 20 6d 61  determine the ma
26b0: 78 69 6d 75 6d 20 68 65 69 67 68 74 0a 2a 2a 20  ximum height.** 
26c0: 6f 66 20 61 6e 79 20 65 78 70 72 65 73 73 69 6f  of any expressio
26d0: 6e 20 74 72 65 65 20 72 65 66 65 72 65 6e 63 65  n tree reference
26e0: 64 20 62 79 20 74 68 65 20 73 74 72 75 63 74 75  d by the structu
26f0: 72 65 20 70 61 73 73 65 64 20 61 73 20 74 68 65  re passed as the
2700: 0a 2a 2a 20 66 69 72 73 74 20 61 72 67 75 6d 65  .** first argume
2710: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 69  nt..**.** If thi
2720: 73 20 6d 61 78 69 6d 75 6d 20 68 65 69 67 68 74  s maximum height
2730: 20 69 73 20 67 72 65 61 74 65 72 20 74 68 61 6e   is greater than
2740: 20 74 68 65 20 63 75 72 72 65 6e 74 20 76 61 6c   the current val
2750: 75 65 20 70 6f 69 6e 74 65 64 0a 2a 2a 20 74 6f  ue pointed.** to
2760: 20 62 79 20 70 6e 48 65 69 67 68 74 2c 20 74 68   by pnHeight, th
2770: 65 20 73 65 63 6f 6e 64 20 70 61 72 61 6d 65 74  e second paramet
2780: 65 72 2c 20 74 68 65 6e 20 73 65 74 20 2a 70 6e  er, then set *pn
2790: 48 65 69 67 68 74 20 74 6f 20 74 68 61 74 0a 2a  Height to that.*
27a0: 2a 20 76 61 6c 75 65 2e 0a 2a 2f 0a 73 74 61 74  * value..*/.stat
27b0: 69 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66  ic void heightOf
27c0: 45 78 70 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  Expr(Expr *p, in
27d0: 74 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20  t *pnHeight){.  
27e0: 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69 66 28  if( p ){.    if(
27f0: 20 70 2d 3e 6e 48 65 69 67 68 74 3e 2a 70 6e 48   p->nHeight>*pnH
2800: 65 69 67 68 74 20 29 7b 0a 20 20 20 20 20 20 2a  eight ){.      *
2810: 70 6e 48 65 69 67 68 74 20 3d 20 70 2d 3e 6e 48  pnHeight = p->nH
2820: 65 69 67 68 74 3b 0a 20 20 20 20 7d 0a 20 20 7d  eight;.    }.  }
2830: 0a 7d 0a 73 74 61 74 69 63 20 76 6f 69 64 20 68  .}.static void h
2840: 65 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28  eightOfExprList(
2850: 45 78 70 72 4c 69 73 74 20 2a 70 2c 20 69 6e 74  ExprList *p, int
2860: 20 2a 70 6e 48 65 69 67 68 74 29 7b 0a 20 20 69   *pnHeight){.  i
2870: 66 28 20 70 20 29 7b 0a 20 20 20 20 69 6e 74 20  f( p ){.    int 
2880: 69 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20  i;.    for(i=0; 
2890: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29  i<p->nExpr; i++)
28a0: 7b 0a 20 20 20 20 20 20 68 65 69 67 68 74 4f 66  {.      heightOf
28b0: 45 78 70 72 28 70 2d 3e 61 5b 69 5d 2e 70 45 78  Expr(p->a[i].pEx
28c0: 70 72 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  pr, pnHeight);. 
28d0: 20 20 20 7d 0a 20 20 7d 0a 7d 0a 73 74 61 74 69     }.  }.}.stati
28e0: 63 20 76 6f 69 64 20 68 65 69 67 68 74 4f 66 53  c void heightOfS
28f0: 65 6c 65 63 74 28 53 65 6c 65 63 74 20 2a 70 2c  elect(Select *p,
2900: 20 69 6e 74 20 2a 70 6e 48 65 69 67 68 74 29 7b   int *pnHeight){
2910: 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20  .  if( p ){.    
2920: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2930: 70 57 68 65 72 65 2c 20 70 6e 48 65 69 67 68 74  pWhere, pnHeight
2940: 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45  );.    heightOfE
2950: 78 70 72 28 70 2d 3e 70 48 61 76 69 6e 67 2c 20  xpr(p->pHaving, 
2960: 70 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68  pnHeight);.    h
2970: 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e 70  eightOfExpr(p->p
2980: 4c 69 6d 69 74 2c 20 70 6e 48 65 69 67 68 74 29  Limit, pnHeight)
2990: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
29a0: 70 72 28 70 2d 3e 70 4f 66 66 73 65 74 2c 20 70  pr(p->pOffset, p
29b0: 6e 48 65 69 67 68 74 29 3b 0a 20 20 20 20 68 65  nHeight);.    he
29c0: 69 67 68 74 4f 66 45 78 70 72 4c 69 73 74 28 70  ightOfExprList(p
29d0: 2d 3e 70 45 4c 69 73 74 2c 20 70 6e 48 65 69 67  ->pEList, pnHeig
29e0: 68 74 29 3b 0a 20 20 20 20 68 65 69 67 68 74 4f  ht);.    heightO
29f0: 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 70 47 72  fExprList(p->pGr
2a00: 6f 75 70 42 79 2c 20 70 6e 48 65 69 67 68 74 29  oupBy, pnHeight)
2a10: 3b 0a 20 20 20 20 68 65 69 67 68 74 4f 66 45 78  ;.    heightOfEx
2a20: 70 72 4c 69 73 74 28 70 2d 3e 70 4f 72 64 65 72  prList(p->pOrder
2a30: 42 79 2c 20 70 6e 48 65 69 67 68 74 29 3b 0a 20  By, pnHeight);. 
2a40: 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c 65 63     heightOfSelec
2a50: 74 28 70 2d 3e 70 50 72 69 6f 72 2c 20 70 6e 48  t(p->pPrior, pnH
2a60: 65 69 67 68 74 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f  eight);.  }.}../
2a70: 2a 0a 2a 2a 20 53 65 74 20 74 68 65 20 45 78 70  *.** Set the Exp
2a80: 72 2e 6e 48 65 69 67 68 74 20 76 61 72 69 61 62  r.nHeight variab
2a90: 6c 65 20 69 6e 20 74 68 65 20 73 74 72 75 63 74  le in the struct
2aa0: 75 72 65 20 70 61 73 73 65 64 20 61 73 20 61 6e  ure passed as an
2ab0: 20 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 2e 20 41   .** argument. A
2ac0: 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 77 69 74  n expression wit
2ad0: 68 20 6e 6f 20 63 68 69 6c 64 72 65 6e 2c 20 45  h no children, E
2ae0: 78 70 72 2e 70 4c 69 73 74 20 6f 72 20 0a 2a 2a  xpr.pList or .**
2af0: 20 45 78 70 72 2e 70 53 65 6c 65 63 74 20 6d 65   Expr.pSelect me
2b00: 6d 62 65 72 20 68 61 73 20 61 20 68 65 69 67 68  mber has a heigh
2b10: 74 20 6f 66 20 31 2e 20 41 6e 79 20 6f 74 68 65  t of 1. Any othe
2b20: 72 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a 20  r expression.** 
2b30: 68 61 73 20 61 20 68 65 69 67 68 74 20 65 71 75  has a height equ
2b40: 61 6c 20 74 6f 20 74 68 65 20 6d 61 78 69 6d 75  al to the maximu
2b50: 6d 20 68 65 69 67 68 74 20 6f 66 20 61 6e 79 20  m height of any 
2b60: 6f 74 68 65 72 20 0a 2a 2a 20 72 65 66 65 72 65  other .** refere
2b70: 6e 63 65 64 20 45 78 70 72 20 70 6c 75 73 20 6f  nced Expr plus o
2b80: 6e 65 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f  ne..*/.static vo
2b90: 69 64 20 65 78 70 72 53 65 74 48 65 69 67 68 74  id exprSetHeight
2ba0: 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74  (Expr *p){.  int
2bb0: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2bc0: 68 65 69 67 68 74 4f 66 45 78 70 72 28 70 2d 3e  heightOfExpr(p->
2bd0: 70 4c 65 66 74 2c 20 26 6e 48 65 69 67 68 74 29  pLeft, &nHeight)
2be0: 3b 0a 20 20 68 65 69 67 68 74 4f 66 45 78 70 72  ;.  heightOfExpr
2bf0: 28 70 2d 3e 70 52 69 67 68 74 2c 20 26 6e 48 65  (p->pRight, &nHe
2c00: 69 67 68 74 29 3b 0a 20 20 69 66 28 20 45 78 70  ight);.  if( Exp
2c10: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20  rHasProperty(p, 
2c20: 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 7b  EP_xIsSelect) ){
2c30: 0a 20 20 20 20 68 65 69 67 68 74 4f 66 53 65 6c  .    heightOfSel
2c40: 65 63 74 28 70 2d 3e 78 2e 70 53 65 6c 65 63 74  ect(p->x.pSelect
2c50: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  , &nHeight);.  }
2c60: 65 6c 73 65 7b 0a 20 20 20 20 68 65 69 67 68 74  else{.    height
2c70: 4f 66 45 78 70 72 4c 69 73 74 28 70 2d 3e 78 2e  OfExprList(p->x.
2c80: 70 4c 69 73 74 2c 20 26 6e 48 65 69 67 68 74 29  pList, &nHeight)
2c90: 3b 0a 20 20 7d 0a 20 20 70 2d 3e 6e 48 65 69 67  ;.  }.  p->nHeig
2ca0: 68 74 20 3d 20 6e 48 65 69 67 68 74 20 2b 20 31  ht = nHeight + 1
2cb0: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65 74 20 74  ;.}../*.** Set t
2cc0: 68 65 20 45 78 70 72 2e 6e 48 65 69 67 68 74 20  he Expr.nHeight 
2cd0: 76 61 72 69 61 62 6c 65 20 75 73 69 6e 67 20 74  variable using t
2ce0: 68 65 20 65 78 70 72 53 65 74 48 65 69 67 68 74  he exprSetHeight
2cf0: 28 29 20 66 75 6e 63 74 69 6f 6e 2e 20 49 66 0a  () function. If.
2d00: 2a 2a 20 74 68 65 20 68 65 69 67 68 74 20 69 73  ** the height is
2d10: 20 67 72 65 61 74 65 72 20 74 68 61 6e 20 74 68   greater than th
2d20: 65 20 6d 61 78 69 6d 75 6d 20 61 6c 6c 6f 77 65  e maximum allowe
2d30: 64 20 65 78 70 72 65 73 73 69 6f 6e 20 64 65 70  d expression dep
2d40: 74 68 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e 20  th,.** leave an 
2d50: 65 72 72 6f 72 20 69 6e 20 70 50 61 72 73 65 2e  error in pParse.
2d60: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
2d70: 45 78 70 72 53 65 74 48 65 69 67 68 74 28 50 61  ExprSetHeight(Pa
2d80: 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
2d90: 72 20 2a 70 29 7b 0a 20 20 65 78 70 72 53 65 74  r *p){.  exprSet
2da0: 48 65 69 67 68 74 28 70 29 3b 0a 20 20 73 71 6c  Height(p);.  sql
2db0: 69 74 65 33 45 78 70 72 43 68 65 63 6b 48 65 69  ite3ExprCheckHei
2dc0: 67 68 74 28 70 50 61 72 73 65 2c 20 70 2d 3e 6e  ght(pParse, p->n
2dd0: 48 65 69 67 68 74 29 3b 0a 7d 0a 0a 2f 2a 0a 2a  Height);.}../*.*
2de0: 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6d 61 78  * Return the max
2df0: 69 6d 75 6d 20 68 65 69 67 68 74 20 6f 66 20 61  imum height of a
2e00: 6e 79 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72  ny expression tr
2e10: 65 65 20 72 65 66 65 72 65 6e 63 65 64 0a 2a 2a  ee referenced.**
2e20: 20 62 79 20 74 68 65 20 73 65 6c 65 63 74 20 73   by the select s
2e30: 74 61 74 65 6d 65 6e 74 20 70 61 73 73 65 64 20  tatement passed 
2e40: 61 73 20 61 6e 20 61 72 67 75 6d 65 6e 74 2e 0a  as an argument..
2e50: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 53 65  */.int sqlite3Se
2e60: 6c 65 63 74 45 78 70 72 48 65 69 67 68 74 28 53  lectExprHeight(S
2e70: 65 6c 65 63 74 20 2a 70 29 7b 0a 20 20 69 6e 74  elect *p){.  int
2e80: 20 6e 48 65 69 67 68 74 20 3d 20 30 3b 0a 20 20   nHeight = 0;.  
2e90: 68 65 69 67 68 74 4f 66 53 65 6c 65 63 74 28 70  heightOfSelect(p
2ea0: 2c 20 26 6e 48 65 69 67 68 74 29 3b 0a 20 20 72  , &nHeight);.  r
2eb0: 65 74 75 72 6e 20 6e 48 65 69 67 68 74 3b 0a 7d  eturn nHeight;.}
2ec0: 0a 23 65 6c 73 65 0a 20 20 23 64 65 66 69 6e 65  .#else.  #define
2ed0: 20 65 78 70 72 53 65 74 48 65 69 67 68 74 28 79   exprSetHeight(y
2ee0: 29 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  ).#endif /* SQLI
2ef0: 54 45 5f 4d 41 58 5f 45 58 50 52 5f 44 45 50 54  TE_MAX_EXPR_DEPT
2f00: 48 3e 30 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 54 68  H>0 */../*.** Th
2f10: 69 73 20 72 6f 75 74 69 6e 65 20 69 73 20 74 68  is routine is th
2f20: 65 20 63 6f 72 65 20 61 6c 6c 6f 63 61 74 6f 72  e core allocator
2f30: 20 66 6f 72 20 45 78 70 72 20 6e 6f 64 65 73 2e   for Expr nodes.
2f40: 0a 2a 2a 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74  .**.** Construct
2f50: 20 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f   a new expressio
2f60: 6e 20 6e 6f 64 65 20 61 6e 64 20 72 65 74 75 72  n node and retur
2f70: 6e 20 61 20 70 6f 69 6e 74 65 72 20 74 6f 20 69  n a pointer to i
2f80: 74 2e 20 20 4d 65 6d 6f 72 79 0a 2a 2a 20 66 6f  t.  Memory.** fo
2f90: 72 20 74 68 69 73 20 6e 6f 64 65 20 61 6e 64 20  r this node and 
2fa0: 66 6f 72 20 74 68 65 20 70 54 6f 6b 65 6e 20 61  for the pToken a
2fb0: 72 67 75 6d 65 6e 74 20 69 73 20 61 20 73 69 6e  rgument is a sin
2fc0: 67 6c 65 20 61 6c 6c 6f 63 61 74 69 6f 6e 0a 2a  gle allocation.*
2fd0: 2a 20 6f 62 74 61 69 6e 65 64 20 66 72 6f 6d 20  * obtained from 
2fe0: 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 28  sqlite3DbMalloc(
2ff0: 29 2e 20 20 54 68 65 20 63 61 6c 6c 69 6e 67 20  ).  The calling 
3000: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 69 73 20 72  function.** is r
3010: 65 73 70 6f 6e 73 69 62 6c 65 20 66 6f 72 20 6d  esponsible for m
3020: 61 6b 69 6e 67 20 73 75 72 65 20 74 68 65 20 6e  aking sure the n
3030: 6f 64 65 20 65 76 65 6e 74 75 61 6c 6c 79 20 67  ode eventually g
3040: 65 74 73 20 66 72 65 65 64 2e 0a 2a 2a 0a 2a 2a  ets freed..**.**
3050: 20 49 66 20 64 65 71 75 6f 74 65 20 69 73 20 74   If dequote is t
3060: 72 75 65 2c 20 74 68 65 6e 20 74 68 65 20 74 6f  rue, then the to
3070: 6b 65 6e 20 28 69 66 20 69 74 20 65 78 69 73 74  ken (if it exist
3080: 73 29 20 69 73 20 64 65 71 75 6f 74 65 64 2e 0a  s) is dequoted..
3090: 2a 2a 20 49 66 20 64 65 71 75 6f 74 65 20 69 73  ** If dequote is
30a0: 20 66 61 6c 73 65 2c 20 6e 6f 20 64 65 71 75 6f   false, no dequo
30b0: 74 69 6e 67 20 69 73 20 70 65 72 66 6f 72 6d 61  ting is performa
30c0: 6e 63 65 2e 20 20 54 68 65 20 64 65 51 75 6f 74  nce.  The deQuot
30d0: 65 0a 2a 2a 20 70 61 72 61 6d 65 74 65 72 20 69  e.** parameter i
30e0: 73 20 69 67 6e 6f 72 65 64 20 69 66 20 70 54 6f  s ignored if pTo
30f0: 6b 65 6e 20 69 73 20 4e 55 4c 4c 20 6f 72 20 69  ken is NULL or i
3100: 66 20 74 68 65 20 74 6f 6b 65 6e 20 64 6f 65 73  f the token does
3110: 20 6e 6f 74 0a 2a 2a 20 61 70 70 65 61 72 20 74   not.** appear t
3120: 6f 20 62 65 20 71 75 6f 74 65 64 2e 20 20 49 66  o be quoted.  If
3130: 20 74 68 65 20 71 75 6f 74 65 73 20 77 65 72 65   the quotes were
3140: 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 2e 2e   of the form "..
3150: 2e 22 20 28 64 6f 75 62 6c 65 2d 71 75 6f 74 65  ." (double-quote
3160: 73 29 0a 2a 2a 20 74 68 65 6e 20 74 68 65 20 45  s).** then the E
3170: 50 5f 44 62 6c 51 75 6f 74 65 64 20 66 6c 61 67  P_DblQuoted flag
3180: 20 69 73 20 73 65 74 20 6f 6e 20 74 68 65 20 65   is set on the e
3190: 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 2e 0a  xpression node..
31a0: 2a 2a 0a 2a 2a 20 53 70 65 63 69 61 6c 20 63 61  **.** Special ca
31b0: 73 65 3a 20 20 49 66 20 6f 70 3d 3d 54 4b 5f 49  se:  If op==TK_I
31c0: 4e 54 45 47 45 52 20 61 6e 64 20 70 54 6f 6b 65  NTEGER and pToke
31d0: 6e 20 70 6f 69 6e 74 73 20 74 6f 20 61 20 73 74  n points to a st
31e0: 72 69 6e 67 20 74 68 61 74 0a 2a 2a 20 63 61 6e  ring that.** can
31f0: 20 62 65 20 74 72 61 6e 73 6c 61 74 65 64 20 69   be translated i
3200: 6e 74 6f 20 61 20 33 32 2d 62 69 74 20 69 6e 74  nto a 32-bit int
3210: 65 67 65 72 2c 20 74 68 65 6e 20 74 68 65 20 74  eger, then the t
3220: 6f 6b 65 6e 20 69 73 20 6e 6f 74 0a 2a 2a 20 73  oken is not.** s
3230: 74 6f 72 65 64 20 69 6e 20 75 2e 7a 54 6f 6b 65  tored in u.zToke
3240: 6e 2e 20 20 49 6e 73 74 65 61 64 2c 20 74 68 65  n.  Instead, the
3250: 20 69 6e 74 65 67 65 72 20 76 61 6c 75 65 73 20   integer values 
3260: 69 73 20 77 72 69 74 74 65 6e 0a 2a 2a 20 69 6e  is written.** in
3270: 74 6f 20 75 2e 69 56 61 6c 75 65 20 61 6e 64 20  to u.iValue and 
3280: 74 68 65 20 45 50 5f 49 6e 74 56 61 6c 75 65 20  the EP_IntValue 
3290: 66 6c 61 67 20 69 73 20 73 65 74 2e 20 20 4e 6f  flag is set.  No
32a0: 20 65 78 74 72 61 20 73 74 6f 72 61 67 65 0a 2a   extra storage.*
32b0: 2a 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 74  * is allocated t
32c0: 6f 20 68 6f 6c 64 20 74 68 65 20 69 6e 74 65 67  o hold the integ
32d0: 65 72 20 74 65 78 74 20 61 6e 64 20 74 68 65 20  er text and the 
32e0: 64 65 71 75 6f 74 65 20 66 6c 61 67 20 69 73 20  dequote flag is 
32f0: 69 67 6e 6f 72 65 64 2e 0a 2a 2f 0a 45 78 70 72  ignored..*/.Expr
3300: 20 2a 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c   *sqlite3ExprAll
3310: 6f 63 28 0a 20 20 73 71 6c 69 74 65 33 20 2a 64  oc(.  sqlite3 *d
3320: 62 2c 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  b,            /*
3330: 20 48 61 6e 64 6c 65 20 66 6f 72 20 73 71 6c 69   Handle for sqli
3340: 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f 28  te3DbMallocZero(
3350: 29 20 28 6d 61 79 20 62 65 20 6e 75 6c 6c 29 20  ) (may be null) 
3360: 2a 2f 0a 20 20 69 6e 74 20 6f 70 2c 20 20 20 20  */.  int op,    
3370: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
3380: 45 78 70 72 65 73 73 69 6f 6e 20 6f 70 63 6f 64  Expression opcod
3390: 65 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f 6b  e */.  const Tok
33a0: 65 6e 20 2a 70 54 6f 6b 65 6e 2c 20 20 20 20 2f  en *pToken,    /
33b0: 2a 20 54 6f 6b 65 6e 20 61 72 67 75 6d 65 6e 74  * Token argument
33c0: 2e 20 20 4d 69 67 68 74 20 62 65 20 4e 55 4c 4c  .  Might be NULL
33d0: 20 2a 2f 0a 20 20 69 6e 74 20 64 65 71 75 6f 74   */.  int dequot
33e0: 65 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  e             /*
33f0: 20 54 72 75 65 20 74 6f 20 64 65 71 75 6f 74 65   True to dequote
3400: 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a 70   */.){.  Expr *p
3410: 4e 65 77 3b 0a 20 20 69 6e 74 20 6e 45 78 74 72  New;.  int nExtr
3420: 61 20 3d 20 30 3b 0a 20 20 69 6e 74 20 69 56 61  a = 0;.  int iVa
3430: 6c 75 65 20 3d 20 30 3b 0a 0a 20 20 69 66 28 20  lue = 0;..  if( 
3440: 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20 69 66  pToken ){.    if
3450: 28 20 6f 70 21 3d 54 4b 5f 49 4e 54 45 47 45 52  ( op!=TK_INTEGER
3460: 20 7c 7c 20 70 54 6f 6b 65 6e 2d 3e 7a 3d 3d 30   || pToken->z==0
3470: 0a 20 20 20 20 20 20 20 20 20 20 7c 7c 20 73 71  .          || sq
3480: 6c 69 74 65 33 47 65 74 49 6e 74 33 32 28 70 54  lite3GetInt32(pT
3490: 6f 6b 65 6e 2d 3e 7a 2c 20 26 69 56 61 6c 75 65  oken->z, &iValue
34a0: 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20 20 6e 45  )==0 ){.      nE
34b0: 78 74 72 61 20 3d 20 70 54 6f 6b 65 6e 2d 3e 6e  xtra = pToken->n
34c0: 2b 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  +1;.      assert
34d0: 28 20 69 56 61 6c 75 65 3e 3d 30 20 29 3b 0a 20  ( iValue>=0 );. 
34e0: 20 20 20 7d 0a 20 20 7d 0a 20 20 70 4e 65 77 20     }.  }.  pNew 
34f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
3500: 63 5a 65 72 6f 28 64 62 2c 20 73 69 7a 65 6f 66  cZero(db, sizeof
3510: 28 45 78 70 72 29 2b 6e 45 78 74 72 61 29 3b 0a  (Expr)+nExtra);.
3520: 20 20 69 66 28 20 70 4e 65 77 20 29 7b 0a 20 20    if( pNew ){.  
3530: 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 28 75 38    pNew->op = (u8
3540: 29 6f 70 3b 0a 20 20 20 20 70 4e 65 77 2d 3e 69  )op;.    pNew->i
3550: 41 67 67 20 3d 20 2d 31 3b 0a 20 20 20 20 69 66  Agg = -1;.    if
3560: 28 20 70 54 6f 6b 65 6e 20 29 7b 0a 20 20 20 20  ( pToken ){.    
3570: 20 20 69 66 28 20 6e 45 78 74 72 61 3d 3d 30 20    if( nExtra==0 
3580: 29 7b 0a 20 20 20 20 20 20 20 20 70 4e 65 77 2d  ){.        pNew-
3590: 3e 66 6c 61 67 73 20 7c 3d 20 45 50 5f 49 6e 74  >flags |= EP_Int
35a0: 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 20 20 70  Value;.        p
35b0: 4e 65 77 2d 3e 75 2e 69 56 61 6c 75 65 20 3d 20  New->u.iValue = 
35c0: 69 56 61 6c 75 65 3b 0a 20 20 20 20 20 20 7d 65  iValue;.      }e
35d0: 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 74  lse{.        int
35e0: 20 63 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77   c;.        pNew
35f0: 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68  ->u.zToken = (ch
3600: 61 72 2a 29 26 70 4e 65 77 5b 31 5d 3b 0a 20 20  ar*)&pNew[1];.  
3610: 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 54        assert( pT
3620: 6f 6b 65 6e 2d 3e 7a 21 3d 30 20 7c 7c 20 70 54  oken->z!=0 || pT
3630: 6f 6b 65 6e 2d 3e 6e 3d 3d 30 20 29 3b 0a 20 20  oken->n==0 );.  
3640: 20 20 20 20 20 20 69 66 28 20 70 54 6f 6b 65 6e        if( pToken
3650: 2d 3e 6e 20 29 20 6d 65 6d 63 70 79 28 70 4e 65  ->n ) memcpy(pNe
3660: 77 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 70 54 6f  w->u.zToken, pTo
3670: 6b 65 6e 2d 3e 7a 2c 20 70 54 6f 6b 65 6e 2d 3e  ken->z, pToken->
3680: 6e 29 3b 0a 20 20 20 20 20 20 20 20 70 4e 65 77  n);.        pNew
3690: 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 70 54 6f 6b 65  ->u.zToken[pToke
36a0: 6e 2d 3e 6e 5d 20 3d 20 30 3b 0a 20 20 20 20 20  n->n] = 0;.     
36b0: 20 20 20 69 66 28 20 64 65 71 75 6f 74 65 20 26     if( dequote &
36c0: 26 20 6e 45 78 74 72 61 3e 3d 33 20 0a 20 20 20  & nExtra>=3 .   
36d0: 20 20 20 20 20 20 20 20 20 20 26 26 20 28 28 63            && ((c
36e0: 20 3d 20 70 54 6f 6b 65 6e 2d 3e 7a 5b 30 5d 29   = pToken->z[0])
36f0: 3d 3d 27 5c 27 27 20 7c 7c 20 63 3d 3d 27 22 27  =='\'' || c=='"'
3700: 20 7c 7c 20 63 3d 3d 27 5b 27 20 7c 7c 20 63 3d   || c=='[' || c=
3710: 3d 27 60 27 29 20 29 7b 0a 20 20 20 20 20 20 20  ='`') ){.       
3720: 20 20 20 73 71 6c 69 74 65 33 44 65 71 75 6f 74     sqlite3Dequot
3730: 65 28 70 4e 65 77 2d 3e 75 2e 7a 54 6f 6b 65 6e  e(pNew->u.zToken
3740: 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69 66 28  );.          if(
3750: 20 63 3d 3d 27 22 27 20 29 20 70 4e 65 77 2d 3e   c=='"' ) pNew->
3760: 66 6c 61 67 73 20 7c 3d 20 45 50 5f 44 62 6c 51  flags |= EP_DblQ
3770: 75 6f 74 65 64 3b 0a 20 20 20 20 20 20 20 20 7d  uoted;.        }
3780: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 0a 23  .      }.    }.#
3790: 69 66 20 53 51 4c 49 54 45 5f 4d 41 58 5f 45 58  if SQLITE_MAX_EX
37a0: 50 52 5f 44 45 50 54 48 3e 30 0a 20 20 20 20 70  PR_DEPTH>0.    p
37b0: 4e 65 77 2d 3e 6e 48 65 69 67 68 74 20 3d 20 31  New->nHeight = 1
37c0: 3b 0a 23 65 6e 64 69 66 20 20 0a 20 20 7d 0a 20  ;.#endif  .  }. 
37d0: 20 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a   return pNew;.}.
37e0: 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63 61 74 65 20  ./*.** Allocate 
37f0: 61 20 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e  a new expression
3800: 20 6e 6f 64 65 20 66 72 6f 6d 20 61 20 7a 65 72   node from a zer
3810: 6f 2d 74 65 72 6d 69 6e 61 74 65 64 20 74 6f 6b  o-terminated tok
3820: 65 6e 20 74 68 61 74 20 68 61 73 0a 2a 2a 20 61  en that has.** a
3830: 6c 72 65 61 64 79 20 62 65 65 6e 20 64 65 71 75  lready been dequ
3840: 6f 74 65 64 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73  oted..*/.Expr *s
3850: 71 6c 69 74 65 33 45 78 70 72 28 0a 20 20 73 71  qlite3Expr(.  sq
3860: 6c 69 74 65 33 20 2a 64 62 2c 20 20 20 20 20 20  lite3 *db,      
3870: 20 20 20 20 20 20 2f 2a 20 48 61 6e 64 6c 65 20        /* Handle 
3880: 66 6f 72 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  for sqlite3DbMal
3890: 6c 6f 63 5a 65 72 6f 28 29 20 28 6d 61 79 20 62  locZero() (may b
38a0: 65 20 6e 75 6c 6c 29 20 2a 2f 0a 20 20 69 6e 74  e null) */.  int
38b0: 20 6f 70 2c 20 20 20 20 20 20 20 20 20 20 20 20   op,            
38c0: 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69       /* Expressi
38d0: 6f 6e 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 63  on opcode */.  c
38e0: 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54 6f 6b 65  onst char *zToke
38f0: 6e 20 20 20 20 20 20 2f 2a 20 54 6f 6b 65 6e 20  n      /* Token 
3900: 61 72 67 75 6d 65 6e 74 2e 20 20 4d 69 67 68 74  argument.  Might
3910: 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20   be NULL */.){. 
3920: 20 54 6f 6b 65 6e 20 78 3b 0a 20 20 78 2e 7a 20   Token x;.  x.z 
3930: 3d 20 7a 54 6f 6b 65 6e 3b 0a 20 20 78 2e 6e 20  = zToken;.  x.n 
3940: 3d 20 7a 54 6f 6b 65 6e 20 3f 20 73 71 6c 69 74  = zToken ? sqlit
3950: 65 33 53 74 72 6c 65 6e 33 30 28 7a 54 6f 6b 65  e3Strlen30(zToke
3960: 6e 29 20 3a 20 30 3b 0a 20 20 72 65 74 75 72 6e  n) : 0;.  return
3970: 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c 6c 6f   sqlite3ExprAllo
3980: 63 28 64 62 2c 20 6f 70 2c 20 26 78 2c 20 30 29  c(db, op, &x, 0)
3990: 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 74 74 61 63  ;.}../*.** Attac
39a0: 68 20 73 75 62 74 72 65 65 73 20 70 4c 65 66 74  h subtrees pLeft
39b0: 20 61 6e 64 20 70 52 69 67 68 74 20 74 6f 20 74   and pRight to t
39c0: 68 65 20 45 78 70 72 20 6e 6f 64 65 20 70 52 6f  he Expr node pRo
39d0: 6f 74 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 52 6f  ot..**.** If pRo
39e0: 6f 74 3d 3d 4e 55 4c 4c 20 74 68 61 74 20 6d 65  ot==NULL that me
39f0: 61 6e 73 20 74 68 61 74 20 61 20 6d 65 6d 6f 72  ans that a memor
3a00: 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72  y allocation err
3a10: 6f 72 20 68 61 73 20 6f 63 63 75 72 72 65 64 2e  or has occurred.
3a20: 0a 2a 2a 20 49 6e 20 74 68 61 74 20 63 61 73 65  .** In that case
3a30: 2c 20 64 65 6c 65 74 65 20 74 68 65 20 73 75 62  , delete the sub
3a40: 74 72 65 65 73 20 70 4c 65 66 74 20 61 6e 64 20  trees pLeft and 
3a50: 70 52 69 67 68 74 2e 0a 2a 2f 0a 76 6f 69 64 20  pRight..*/.void 
3a60: 73 71 6c 69 74 65 33 45 78 70 72 41 74 74 61 63  sqlite3ExprAttac
3a70: 68 53 75 62 74 72 65 65 73 28 0a 20 20 73 71 6c  hSubtrees(.  sql
3a80: 69 74 65 33 20 2a 64 62 2c 0a 20 20 45 78 70 72  ite3 *db,.  Expr
3a90: 20 2a 70 52 6f 6f 74 2c 0a 20 20 45 78 70 72 20   *pRoot,.  Expr 
3aa0: 2a 70 4c 65 66 74 2c 0a 20 20 45 78 70 72 20 2a  *pLeft,.  Expr *
3ab0: 70 52 69 67 68 74 0a 29 7b 0a 20 20 69 66 28 20  pRight.){.  if( 
3ac0: 70 52 6f 6f 74 3d 3d 30 20 29 7b 0a 20 20 20 20  pRoot==0 ){.    
3ad0: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
3ae0: 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20 20  ocFailed );.    
3af0: 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c 65 74  sqlite3ExprDelet
3b00: 65 28 64 62 2c 20 70 4c 65 66 74 29 3b 0a 20 20  e(db, pLeft);.  
3b10: 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65 6c    sqlite3ExprDel
3b20: 65 74 65 28 64 62 2c 20 70 52 69 67 68 74 29 3b  ete(db, pRight);
3b30: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 66  .  }else{.    if
3b40: 28 20 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20  ( pRight ){.    
3b50: 20 20 70 52 6f 6f 74 2d 3e 70 52 69 67 68 74 20    pRoot->pRight 
3b60: 3d 20 70 52 69 67 68 74 3b 0a 20 20 20 20 20 20  = pRight;.      
3b70: 70 52 6f 6f 74 2d 3e 66 6c 61 67 73 20 7c 3d 20  pRoot->flags |= 
3b80: 45 50 5f 43 6f 6c 6c 61 74 65 20 26 20 70 52 69  EP_Collate & pRi
3b90: 67 68 74 2d 3e 66 6c 61 67 73 3b 0a 20 20 20 20  ght->flags;.    
3ba0: 7d 0a 20 20 20 20 69 66 28 20 70 4c 65 66 74 20  }.    if( pLeft 
3bb0: 29 7b 0a 20 20 20 20 20 20 70 52 6f 6f 74 2d 3e  ){.      pRoot->
3bc0: 70 4c 65 66 74 20 3d 20 70 4c 65 66 74 3b 0a 20  pLeft = pLeft;. 
3bd0: 20 20 20 20 20 70 52 6f 6f 74 2d 3e 66 6c 61 67       pRoot->flag
3be0: 73 20 7c 3d 20 45 50 5f 43 6f 6c 6c 61 74 65 20  s |= EP_Collate 
3bf0: 26 20 70 4c 65 66 74 2d 3e 66 6c 61 67 73 3b 0a  & pLeft->flags;.
3c00: 20 20 20 20 7d 0a 20 20 20 20 65 78 70 72 53 65      }.    exprSe
3c10: 74 48 65 69 67 68 74 28 70 52 6f 6f 74 29 3b 0a  tHeight(pRoot);.
3c20: 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c    }.}../*.** All
3c30: 6f 63 61 74 65 20 61 20 45 78 70 72 20 6e 6f 64  ocate a Expr nod
3c40: 65 20 77 68 69 63 68 20 6a 6f 69 6e 73 20 61 73  e which joins as
3c50: 20 6d 61 6e 79 20 61 73 20 74 77 6f 20 73 75 62   many as two sub
3c60: 74 72 65 65 73 2e 0a 2a 2a 0a 2a 2a 20 4f 6e 65  trees..**.** One
3c70: 20 6f 72 20 62 6f 74 68 20 6f 66 20 74 68 65 20   or both of the 
3c80: 73 75 62 74 72 65 65 73 20 63 61 6e 20 62 65 20  subtrees can be 
3c90: 4e 55 4c 4c 2e 20 20 52 65 74 75 72 6e 20 61 20  NULL.  Return a 
3ca0: 70 6f 69 6e 74 65 72 20 74 6f 20 74 68 65 20 6e  pointer to the n
3cb0: 65 77 0a 2a 2a 20 45 78 70 72 20 6e 6f 64 65 2e  ew.** Expr node.
3cc0: 20 20 4f 72 2c 20 69 66 20 61 6e 20 4f 4f 4d 20    Or, if an OOM 
3cd0: 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 73 65  error occurs, se
3ce0: 74 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61  t pParse->db->ma
3cf0: 6c 6c 6f 63 46 61 69 6c 65 64 2c 0a 2a 2a 20 66  llocFailed,.** f
3d00: 72 65 65 20 74 68 65 20 73 75 62 74 72 65 65 73  ree the subtrees
3d10: 20 61 6e 64 20 72 65 74 75 72 6e 20 4e 55 4c 4c   and return NULL
3d20: 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74  ..*/.Expr *sqlit
3d30: 65 33 50 45 78 70 72 28 0a 20 20 50 61 72 73 65  e3PExpr(.  Parse
3d40: 20 2a 70 50 61 72 73 65 2c 20 20 20 20 20 20 20   *pParse,       
3d50: 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63 6f     /* Parsing co
3d60: 6e 74 65 78 74 20 2a 2f 0a 20 20 69 6e 74 20 6f  ntext */.  int o
3d70: 70 2c 20 20 20 20 20 20 20 20 20 20 20 20 20 20  p,              
3d80: 20 20 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e     /* Expression
3d90: 20 6f 70 63 6f 64 65 20 2a 2f 0a 20 20 45 78 70   opcode */.  Exp
3da0: 72 20 2a 70 4c 65 66 74 2c 20 20 20 20 20 20 20  r *pLeft,       
3db0: 20 20 20 20 20 2f 2a 20 4c 65 66 74 20 6f 70 65       /* Left ope
3dc0: 72 61 6e 64 20 2a 2f 0a 20 20 45 78 70 72 20 2a  rand */.  Expr *
3dd0: 70 52 69 67 68 74 2c 20 20 20 20 20 20 20 20 20  pRight,         
3de0: 20 20 2f 2a 20 52 69 67 68 74 20 6f 70 65 72 61    /* Right opera
3df0: 6e 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 54 6f  nd */.  const To
3e00: 6b 65 6e 20 2a 70 54 6f 6b 65 6e 20 20 20 20 20  ken *pToken     
3e10: 2f 2a 20 41 72 67 75 6d 65 6e 74 20 74 6f 6b 65  /* Argument toke
3e20: 6e 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 20 2a  n */.){.  Expr *
3e30: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
3e40: 41 4e 44 20 26 26 20 70 4c 65 66 74 20 26 26 20  AND && pLeft && 
3e50: 70 52 69 67 68 74 20 29 7b 0a 20 20 20 20 2f 2a  pRight ){.    /*
3e60: 20 54 61 6b 65 20 61 64 76 61 6e 74 61 67 65 20   Take advantage 
3e70: 6f 66 20 73 68 6f 72 74 2d 63 69 72 63 75 69 74  of short-circuit
3e80: 20 66 61 6c 73 65 20 6f 70 74 69 6d 69 7a 61 74   false optimizat
3e90: 69 6f 6e 20 66 6f 72 20 41 4e 44 20 2a 2f 0a 20  ion for AND */. 
3ea0: 20 20 20 70 20 3d 20 73 71 6c 69 74 65 33 45 78     p = sqlite3Ex
3eb0: 70 72 41 6e 64 28 70 50 61 72 73 65 2d 3e 64 62  prAnd(pParse->db
3ec0: 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74 29  , pLeft, pRight)
3ed0: 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 70  ;.  }else{.    p
3ee0: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
3ef0: 6c 6f 63 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  loc(pParse->db, 
3f00: 6f 70 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b 0a  op, pToken, 1);.
3f10: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 41      sqlite3ExprA
3f20: 74 74 61 63 68 53 75 62 74 72 65 65 73 28 70 50  ttachSubtrees(pP
3f30: 61 72 73 65 2d 3e 64 62 2c 20 70 2c 20 70 4c 65  arse->db, p, pLe
3f40: 66 74 2c 20 70 52 69 67 68 74 29 3b 0a 20 20 7d  ft, pRight);.  }
3f50: 0a 20 20 69 66 28 20 70 20 29 20 7b 0a 20 20 20  .  if( p ) {.   
3f60: 20 73 71 6c 69 74 65 33 45 78 70 72 43 68 65 63   sqlite3ExprChec
3f70: 6b 48 65 69 67 68 74 28 70 50 61 72 73 65 2c 20  kHeight(pParse, 
3f80: 70 2d 3e 6e 48 65 69 67 68 74 29 3b 0a 20 20 7d  p->nHeight);.  }
3f90: 0a 20 20 72 65 74 75 72 6e 20 70 3b 0a 7d 0a 0a  .  return p;.}..
3fa0: 2f 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70  /*.** If the exp
3fb0: 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 77 61 79  ression is alway
3fc0: 73 20 65 69 74 68 65 72 20 54 52 55 45 20 6f 72  s either TRUE or
3fd0: 20 46 41 4c 53 45 20 28 72 65 73 70 65 63 74 69   FALSE (respecti
3fe0: 76 65 6c 79 29 2c 0a 2a 2a 20 74 68 65 6e 20 72  vely),.** then r
3ff0: 65 74 75 72 6e 20 31 2e 20 20 49 66 20 6f 6e 65  eturn 1.  If one
4000: 20 63 61 6e 6e 6f 74 20 64 65 74 65 72 6d 69 6e   cannot determin
4010: 65 20 74 68 65 20 74 72 75 74 68 20 76 61 6c 75  e the truth valu
4020: 65 20 6f 66 20 74 68 65 0a 2a 2a 20 65 78 70 72  e of the.** expr
4030: 65 73 73 69 6f 6e 20 61 74 20 63 6f 6d 70 69 6c  ession at compil
4040: 65 2d 74 69 6d 65 20 72 65 74 75 72 6e 20 30 2e  e-time return 0.
4050: 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 69 73 20 61  .**.** This is a
4060: 6e 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 2e 20  n optimization. 
4070: 20 49 66 20 69 73 20 4f 4b 20 74 6f 20 72 65 74   If is OK to ret
4080: 75 72 6e 20 30 20 68 65 72 65 20 65 76 65 6e 20  urn 0 here even 
4090: 69 66 0a 2a 2a 20 74 68 65 20 65 78 70 72 65 73  if.** the expres
40a0: 73 69 6f 6e 20 72 65 61 6c 6c 79 20 69 73 20 61  sion really is a
40b0: 6c 77 61 79 73 20 66 61 6c 73 65 20 6f 72 20 66  lways false or f
40c0: 61 6c 73 65 20 28 61 20 66 61 6c 73 65 20 6e 65  alse (a false ne
40d0: 67 61 74 69 76 65 29 2e 0a 2a 2a 20 42 75 74 20  gative)..** But 
40e0: 69 74 20 69 73 20 61 20 62 75 67 20 74 6f 20 72  it is a bug to r
40f0: 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20 65  eturn 1 if the e
4100: 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74 20  xpression might 
4110: 68 61 76 65 20 64 69 66 66 65 72 65 6e 74 0a 2a  have different.*
4120: 2a 20 62 6f 6f 6c 65 61 6e 20 76 61 6c 75 65 73  * boolean values
4130: 20 69 6e 20 64 69 66 66 65 72 65 6e 74 20 63 69   in different ci
4140: 72 63 75 6d 73 74 61 6e 63 65 73 20 28 61 20 66  rcumstances (a f
4150: 61 6c 73 65 20 70 6f 73 69 74 69 76 65 2e 29 0a  alse positive.).
4160: 2a 2a 0a 2a 2a 20 4e 6f 74 65 20 74 68 61 74 20  **.** Note that 
4170: 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
4180: 6e 20 69 73 20 70 61 72 74 20 6f 66 20 63 6f 6e  n is part of con
4190: 64 69 74 69 6f 6e 61 6c 20 66 6f 72 20 61 0a 2a  ditional for a.*
41a0: 2a 20 4c 45 46 54 20 4a 4f 49 4e 2c 20 74 68 65  * LEFT JOIN, the
41b0: 6e 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  n we cannot dete
41c0: 72 6d 69 6e 65 20 61 74 20 63 6f 6d 70 69 6c 65  rmine at compile
41d0: 2d 74 69 6d 65 20 77 68 65 74 68 65 72 20 6f 72  -time whether or
41e0: 20 6e 6f 74 0a 2a 2a 20 69 73 20 69 74 20 74 72   not.** is it tr
41f0: 75 65 20 6f 72 20 66 61 6c 73 65 2c 20 73 6f 20  ue or false, so 
4200: 61 6c 77 61 79 73 20 72 65 74 75 72 6e 20 30 2e  always return 0.
4210: 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 65  .*/.static int e
4220: 78 70 72 41 6c 77 61 79 73 54 72 75 65 28 45 78  xprAlwaysTrue(Ex
4230: 70 72 20 2a 70 29 7b 0a 20 20 69 6e 74 20 76 20  pr *p){.  int v 
4240: 3d 20 30 3b 0a 20 20 69 66 28 20 45 78 70 72 48  = 0;.  if( ExprH
4250: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
4260: 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 20 72 65 74  _FromJoin) ) ret
4270: 75 72 6e 20 30 3b 0a 20 20 69 66 28 20 21 73 71  urn 0;.  if( !sq
4280: 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74 65 67  lite3ExprIsInteg
4290: 65 72 28 70 2c 20 26 76 29 20 29 20 72 65 74 75  er(p, &v) ) retu
42a0: 72 6e 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 76  rn 0;.  return v
42b0: 21 3d 30 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e  !=0;.}.static in
42c0: 74 20 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73  t exprAlwaysFals
42d0: 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 69 6e  e(Expr *p){.  in
42e0: 74 20 76 20 3d 20 30 3b 0a 20 20 69 66 28 20 45  t v = 0;.  if( E
42f0: 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
4300: 2c 20 45 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29  , EP_FromJoin) )
4310: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
4320: 20 21 73 71 6c 69 74 65 33 45 78 70 72 49 73 49   !sqlite3ExprIsI
4330: 6e 74 65 67 65 72 28 70 2c 20 26 76 29 20 29 20  nteger(p, &v) ) 
4340: 72 65 74 75 72 6e 20 30 3b 0a 20 20 72 65 74 75  return 0;.  retu
4350: 72 6e 20 76 3d 3d 30 3b 0a 7d 0a 0a 2f 2a 0a 2a  rn v==0;.}../*.*
4360: 2a 20 4a 6f 69 6e 20 74 77 6f 20 65 78 70 72 65  * Join two expre
4370: 73 73 69 6f 6e 73 20 75 73 69 6e 67 20 61 6e 20  ssions using an 
4380: 41 4e 44 20 6f 70 65 72 61 74 6f 72 2e 20 20 49  AND operator.  I
4390: 66 20 65 69 74 68 65 72 20 65 78 70 72 65 73 73  f either express
43a0: 69 6f 6e 20 69 73 0a 2a 2a 20 4e 55 4c 4c 2c 20  ion is.** NULL, 
43b0: 74 68 65 6e 20 6a 75 73 74 20 72 65 74 75 72 6e  then just return
43c0: 20 74 68 65 20 6f 74 68 65 72 20 65 78 70 72 65   the other expre
43d0: 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  ssion..**.** If 
43e0: 6f 6e 65 20 73 69 64 65 20 6f 72 20 74 68 65 20  one side or the 
43f0: 6f 74 68 65 72 20 6f 66 20 74 68 65 20 41 4e 44  other of the AND
4400: 20 69 73 20 6b 6e 6f 77 6e 20 74 6f 20 62 65 20   is known to be 
4410: 66 61 6c 73 65 2c 20 74 68 65 6e 20 69 6e 73 74  false, then inst
4420: 65 61 64 0a 2a 2a 20 6f 66 20 72 65 74 75 72 6e  ead.** of return
4430: 69 6e 67 20 61 6e 20 41 4e 44 20 65 78 70 72 65  ing an AND expre
4440: 73 73 69 6f 6e 2c 20 6a 75 73 74 20 72 65 74 75  ssion, just retu
4450: 72 6e 20 61 20 63 6f 6e 73 74 61 6e 74 20 65 78  rn a constant ex
4460: 70 72 65 73 73 69 6f 6e 20 77 69 74 68 0a 2a 2a  pression with.**
4470: 20 61 20 76 61 6c 75 65 20 6f 66 20 66 61 6c 73   a value of fals
4480: 65 2e 0a 2a 2f 0a 45 78 70 72 20 2a 73 71 6c 69  e..*/.Expr *sqli
4490: 74 65 33 45 78 70 72 41 6e 64 28 73 71 6c 69 74  te3ExprAnd(sqlit
44a0: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 4c  e3 *db, Expr *pL
44b0: 65 66 74 2c 20 45 78 70 72 20 2a 70 52 69 67 68  eft, Expr *pRigh
44c0: 74 29 7b 0a 20 20 69 66 28 20 70 4c 65 66 74 3d  t){.  if( pLeft=
44d0: 3d 30 20 29 7b 0a 20 20 20 20 72 65 74 75 72 6e  =0 ){.    return
44e0: 20 70 52 69 67 68 74 3b 0a 20 20 7d 65 6c 73 65   pRight;.  }else
44f0: 20 69 66 28 20 70 52 69 67 68 74 3d 3d 30 20 29   if( pRight==0 )
4500: 7b 0a 20 20 20 20 72 65 74 75 72 6e 20 70 4c 65  {.    return pLe
4510: 66 74 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28 20  ft;.  }else if( 
4520: 65 78 70 72 41 6c 77 61 79 73 46 61 6c 73 65 28  exprAlwaysFalse(
4530: 70 4c 65 66 74 29 20 7c 7c 20 65 78 70 72 41 6c  pLeft) || exprAl
4540: 77 61 79 73 46 61 6c 73 65 28 70 52 69 67 68 74  waysFalse(pRight
4550: 29 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  ) ){.    sqlite3
4560: 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70  ExprDelete(db, p
4570: 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69 74  Left);.    sqlit
4580: 65 33 45 78 70 72 44 65 6c 65 74 65 28 64 62 2c  e3ExprDelete(db,
4590: 20 70 52 69 67 68 74 29 3b 0a 20 20 20 20 72 65   pRight);.    re
45a0: 74 75 72 6e 20 73 71 6c 69 74 65 33 45 78 70 72  turn sqlite3Expr
45b0: 41 6c 6c 6f 63 28 64 62 2c 20 54 4b 5f 49 4e 54  Alloc(db, TK_INT
45c0: 45 47 45 52 2c 20 26 73 71 6c 69 74 65 33 49 6e  EGER, &sqlite3In
45d0: 74 54 6f 6b 65 6e 73 5b 30 5d 2c 20 30 29 3b 0a  tTokens[0], 0);.
45e0: 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 45 78 70    }else{.    Exp
45f0: 72 20 2a 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  r *pNew = sqlite
4600: 33 45 78 70 72 41 6c 6c 6f 63 28 64 62 2c 20 54  3ExprAlloc(db, T
4610: 4b 5f 41 4e 44 2c 20 30 2c 20 30 29 3b 0a 20 20  K_AND, 0, 0);.  
4620: 20 20 73 71 6c 69 74 65 33 45 78 70 72 41 74 74    sqlite3ExprAtt
4630: 61 63 68 53 75 62 74 72 65 65 73 28 64 62 2c 20  achSubtrees(db, 
4640: 70 4e 65 77 2c 20 70 4c 65 66 74 2c 20 70 52 69  pNew, pLeft, pRi
4650: 67 68 74 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ght);.    return
4660: 20 70 4e 65 77 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a   pNew;.  }.}../*
4670: 0a 2a 2a 20 43 6f 6e 73 74 72 75 63 74 20 61 20  .** Construct a 
4680: 6e 65 77 20 65 78 70 72 65 73 73 69 6f 6e 20 6e  new expression n
4690: 6f 64 65 20 66 6f 72 20 61 20 66 75 6e 63 74 69  ode for a functi
46a0: 6f 6e 20 77 69 74 68 20 6d 75 6c 74 69 70 6c 65  on with multiple
46b0: 0a 2a 2a 20 61 72 67 75 6d 65 6e 74 73 2e 0a 2a  .** arguments..*
46c0: 2f 0a 45 78 70 72 20 2a 73 71 6c 69 74 65 33 45  /.Expr *sqlite3E
46d0: 78 70 72 46 75 6e 63 74 69 6f 6e 28 50 61 72 73  xprFunction(Pars
46e0: 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72 4c  e *pParse, ExprL
46f0: 69 73 74 20 2a 70 4c 69 73 74 2c 20 54 6f 6b 65  ist *pList, Toke
4700: 6e 20 2a 70 54 6f 6b 65 6e 29 7b 0a 20 20 45 78  n *pToken){.  Ex
4710: 70 72 20 2a 70 4e 65 77 3b 0a 20 20 73 71 6c 69  pr *pNew;.  sqli
4720: 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65  te3 *db = pParse
4730: 2d 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20  ->db;.  assert( 
4740: 70 54 6f 6b 65 6e 20 29 3b 0a 20 20 70 4e 65 77  pToken );.  pNew
4750: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 41 6c   = sqlite3ExprAl
4760: 6c 6f 63 28 64 62 2c 20 54 4b 5f 46 55 4e 43 54  loc(db, TK_FUNCT
4770: 49 4f 4e 2c 20 70 54 6f 6b 65 6e 2c 20 31 29 3b  ION, pToken, 1);
4780: 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29  .  if( pNew==0 )
4790: 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
47a0: 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c 20  rListDelete(db, 
47b0: 70 4c 69 73 74 29 3b 20 2f 2a 20 41 76 6f 69 64  pList); /* Avoid
47c0: 20 6d 65 6d 6f 72 79 20 6c 65 61 6b 20 77 68 65   memory leak whe
47d0: 6e 20 6d 61 6c 6c 6f 63 20 66 61 69 6c 73 20 2a  n malloc fails *
47e0: 2f 0a 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a  /.    return 0;.
47f0: 20 20 7d 0a 20 20 70 4e 65 77 2d 3e 78 2e 70 4c    }.  pNew->x.pL
4800: 69 73 74 20 3d 20 70 4c 69 73 74 3b 0a 20 20 61  ist = pList;.  a
4810: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
4820: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
4830: 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
4840: 20 73 71 6c 69 74 65 33 45 78 70 72 53 65 74 48   sqlite3ExprSetH
4850: 65 69 67 68 74 28 70 50 61 72 73 65 2c 20 70 4e  eight(pParse, pN
4860: 65 77 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e  ew);.  return pN
4870: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 73 73  ew;.}../*.** Ass
4880: 69 67 6e 20 61 20 76 61 72 69 61 62 6c 65 20 6e  ign a variable n
4890: 75 6d 62 65 72 20 74 6f 20 61 6e 20 65 78 70 72  umber to an expr
48a0: 65 73 73 69 6f 6e 20 74 68 61 74 20 65 6e 63 6f  ession that enco
48b0: 64 65 73 20 61 20 77 69 6c 64 63 61 72 64 0a 2a  des a wildcard.*
48c0: 2a 20 69 6e 20 74 68 65 20 6f 72 69 67 69 6e 61  * in the origina
48d0: 6c 20 53 51 4c 20 73 74 61 74 65 6d 65 6e 74 2e  l SQL statement.
48e0: 20 20 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72    .**.** Wildcar
48f0: 64 73 20 63 6f 6e 73 69 73 74 69 6e 67 20 6f 66  ds consisting of
4900: 20 61 20 73 69 6e 67 6c 65 20 22 3f 22 20 61 72   a single "?" ar
4910: 65 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 6e  e assigned the n
4920: 65 78 74 20 73 65 71 75 65 6e 74 69 61 6c 0a 2a  ext sequential.*
4930: 2a 20 76 61 72 69 61 62 6c 65 20 6e 75 6d 62 65  * variable numbe
4940: 72 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c 64 63 61 72  r..**.** Wildcar
4950: 64 73 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22  ds of the form "
4960: 3f 6e 6e 6e 22 20 61 72 65 20 61 73 73 69 67 6e  ?nnn" are assign
4970: 65 64 20 74 68 65 20 6e 75 6d 62 65 72 20 22 6e  ed the number "n
4980: 6e 6e 22 2e 20 20 57 65 20 6d 61 6b 65 0a 2a 2a  nn".  We make.**
4990: 20 73 75 72 65 20 22 6e 6e 6e 22 20 69 73 20 6e   sure "nnn" is n
49a0: 6f 74 20 74 6f 6f 20 62 65 20 74 6f 20 61 76 6f  ot too be to avo
49b0: 69 64 20 61 20 64 65 6e 69 61 6c 20 6f 66 20 73  id a denial of s
49c0: 65 72 76 69 63 65 20 61 74 74 61 63 6b 20 77 68  ervice attack wh
49d0: 65 6e 0a 2a 2a 20 74 68 65 20 53 51 4c 20 73 74  en.** the SQL st
49e0: 61 74 65 6d 65 6e 74 20 63 6f 6d 65 73 20 66 72  atement comes fr
49f0: 6f 6d 20 61 6e 20 65 78 74 65 72 6e 61 6c 20 73  om an external s
4a00: 6f 75 72 63 65 2e 0a 2a 2a 0a 2a 2a 20 57 69 6c  ource..**.** Wil
4a10: 64 63 61 72 64 73 20 6f 66 20 74 68 65 20 66 6f  dcards of the fo
4a20: 72 6d 20 22 3a 61 61 61 22 2c 20 22 40 61 61 61  rm ":aaa", "@aaa
4a30: 22 2c 20 6f 72 20 22 24 61 61 61 22 20 61 72 65  ", or "$aaa" are
4a40: 20 61 73 73 69 67 6e 65 64 20 74 68 65 20 73 61   assigned the sa
4a50: 6d 65 20 6e 75 6d 62 65 72 0a 2a 2a 20 61 73 20  me number.** as 
4a60: 74 68 65 20 70 72 65 76 69 6f 75 73 20 69 6e 73  the previous ins
4a70: 74 61 6e 63 65 20 6f 66 20 74 68 65 20 73 61 6d  tance of the sam
4a80: 65 20 77 69 6c 64 63 61 72 64 2e 20 20 4f 72 20  e wildcard.  Or 
4a90: 69 66 20 74 68 69 73 20 69 73 20 74 68 65 20 66  if this is the f
4aa0: 69 72 73 74 0a 2a 2a 20 69 6e 73 74 61 6e 63 65  irst.** instance
4ab0: 20 6f 66 20 74 68 65 20 77 69 6c 64 63 61 72 64   of the wildcard
4ac0: 2c 20 74 68 65 20 6e 65 78 74 20 73 65 71 75 65  , the next seque
4ad0: 6e 69 61 6c 20 76 61 72 69 61 62 6c 65 20 6e 75  nial variable nu
4ae0: 6d 62 65 72 20 69 73 0a 2a 2a 20 61 73 73 69 67  mber is.** assig
4af0: 6e 65 64 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  ned..*/.void sql
4b00: 69 74 65 33 45 78 70 72 41 73 73 69 67 6e 56 61  ite3ExprAssignVa
4b10: 72 4e 75 6d 62 65 72 28 50 61 72 73 65 20 2a 70  rNumber(Parse *p
4b20: 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
4b30: 70 72 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a  pr){.  sqlite3 *
4b40: 64 62 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b  db = pParse->db;
4b50: 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a  .  const char *z
4b60: 3b 0a 0a 20 20 69 66 28 20 70 45 78 70 72 3d 3d  ;..  if( pExpr==
4b70: 30 20 29 20 72 65 74 75 72 6e 3b 0a 20 20 61 73  0 ) return;.  as
4b80: 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
4b90: 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
4ba0: 5f 49 6e 74 56 61 6c 75 65 7c 45 50 5f 52 65 64  _IntValue|EP_Red
4bb0: 75 63 65 64 7c 45 50 5f 54 6f 6b 65 6e 4f 6e 6c  uced|EP_TokenOnl
4bc0: 79 29 20 29 3b 0a 20 20 7a 20 3d 20 70 45 78 70  y) );.  z = pExp
4bd0: 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 61  r->u.zToken;.  a
4be0: 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a 20  ssert( z!=0 );. 
4bf0: 20 61 73 73 65 72 74 28 20 7a 5b 30 5d 21 3d 30   assert( z[0]!=0
4c00: 20 29 3b 0a 20 20 69 66 28 20 7a 5b 31 5d 3d 3d   );.  if( z[1]==
4c10: 30 20 29 7b 0a 20 20 20 20 2f 2a 20 57 69 6c 64  0 ){.    /* Wild
4c20: 63 61 72 64 20 6f 66 20 74 68 65 20 66 6f 72 6d  card of the form
4c30: 20 22 3f 22 2e 20 20 41 73 73 69 67 6e 20 74 68   "?".  Assign th
4c40: 65 20 6e 65 78 74 20 76 61 72 69 61 62 6c 65 20  e next variable 
4c50: 6e 75 6d 62 65 72 20 2a 2f 0a 20 20 20 20 61 73  number */.    as
4c60: 73 65 72 74 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20  sert( z[0]=='?' 
4c70: 29 3b 0a 20 20 20 20 70 45 78 70 72 2d 3e 69 43  );.    pExpr->iC
4c80: 6f 6c 75 6d 6e 20 3d 20 28 79 6e 56 61 72 29 28  olumn = (ynVar)(
4c90: 2b 2b 70 50 61 72 73 65 2d 3e 6e 56 61 72 29 3b  ++pParse->nVar);
4ca0: 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 79 6e  .  }else{.    yn
4cb0: 56 61 72 20 78 20 3d 20 30 3b 0a 20 20 20 20 75  Var x = 0;.    u
4cc0: 33 32 20 6e 20 3d 20 73 71 6c 69 74 65 33 53 74  32 n = sqlite3St
4cd0: 72 6c 65 6e 33 30 28 7a 29 3b 0a 20 20 20 20 69  rlen30(z);.    i
4ce0: 66 28 20 7a 5b 30 5d 3d 3d 27 3f 27 20 29 7b 0a  f( z[0]=='?' ){.
4cf0: 20 20 20 20 20 20 2f 2a 20 57 69 6c 64 63 61 72        /* Wildcar
4d00: 64 20 6f 66 20 74 68 65 20 66 6f 72 6d 20 22 3f  d of the form "?
4d10: 6e 6e 6e 22 2e 20 20 43 6f 6e 76 65 72 74 20 22  nnn".  Convert "
4d20: 6e 6e 6e 22 20 74 6f 20 61 6e 20 69 6e 74 65 67  nnn" to an integ
4d30: 65 72 20 61 6e 64 0a 20 20 20 20 20 20 2a 2a 20  er and.      ** 
4d40: 75 73 65 20 69 74 20 61 73 20 74 68 65 20 76 61  use it as the va
4d50: 72 69 61 62 6c 65 20 6e 75 6d 62 65 72 20 2a 2f  riable number */
4d60: 0a 20 20 20 20 20 20 69 36 34 20 69 3b 0a 20 20  .      i64 i;.  
4d70: 20 20 20 20 69 6e 74 20 62 4f 6b 20 3d 20 30 3d      int bOk = 0=
4d80: 3d 73 71 6c 69 74 65 33 41 74 6f 69 36 34 28 26  =sqlite3Atoi64(&
4d90: 7a 5b 31 5d 2c 20 26 69 2c 20 6e 2d 31 2c 20 53  z[1], &i, n-1, S
4da0: 51 4c 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20  QLITE_UTF8);.   
4db0: 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d     pExpr->iColum
4dc0: 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72 29 69  n = x = (ynVar)i
4dd0: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4de0: 28 20 69 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ( i==0 );.      
4df0: 74 65 73 74 63 61 73 65 28 20 69 3d 3d 31 20 29  testcase( i==1 )
4e00: 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
4e10: 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74 5b  ( i==db->aLimit[
4e20: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4e30: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 2d 31 20  IABLE_NUMBER]-1 
4e40: 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
4e50: 65 28 20 69 3d 3d 64 62 2d 3e 61 4c 69 6d 69 74  e( i==db->aLimit
4e60: 5b 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41  [SQLITE_LIMIT_VA
4e70: 52 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 20 29  RIABLE_NUMBER] )
4e80: 3b 0a 20 20 20 20 20 20 69 66 28 20 62 4f 6b 3d  ;.      if( bOk=
4e90: 3d 30 20 7c 7c 20 69 3c 31 20 7c 7c 20 69 3e 64  =0 || i<1 || i>d
4ea0: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
4eb0: 5f 4c 49 4d 49 54 5f 56 41 52 49 41 42 4c 45 5f  _LIMIT_VARIABLE_
4ec0: 4e 55 4d 42 45 52 5d 20 29 7b 0a 20 20 20 20 20  NUMBER] ){.     
4ed0: 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d     sqlite3ErrorM
4ee0: 73 67 28 70 50 61 72 73 65 2c 20 22 76 61 72 69  sg(pParse, "vari
4ef0: 61 62 6c 65 20 6e 75 6d 62 65 72 20 6d 75 73 74  able number must
4f00: 20 62 65 20 62 65 74 77 65 65 6e 20 3f 31 20 61   be between ?1 a
4f10: 6e 64 20 3f 25 64 22 2c 0a 20 20 20 20 20 20 20  nd ?%d",.       
4f20: 20 20 20 20 20 64 62 2d 3e 61 4c 69 6d 69 74 5b       db->aLimit[
4f30: 53 51 4c 49 54 45 5f 4c 49 4d 49 54 5f 56 41 52  SQLITE_LIMIT_VAR
4f40: 49 41 42 4c 45 5f 4e 55 4d 42 45 52 5d 29 3b 0a  IABLE_NUMBER]);.
4f50: 20 20 20 20 20 20 20 20 78 20 3d 20 30 3b 0a 20          x = 0;. 
4f60: 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66 28       }.      if(
4f70: 20 69 3e 70 50 61 72 73 65 2d 3e 6e 56 61 72 20   i>pParse->nVar 
4f80: 29 7b 0a 20 20 20 20 20 20 20 20 70 50 61 72 73  ){.        pPars
4f90: 65 2d 3e 6e 56 61 72 20 3d 20 28 69 6e 74 29 69  e->nVar = (int)i
4fa0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
4fb0: 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 57 69  lse{.      /* Wi
4fc0: 6c 64 63 61 72 64 73 20 6c 69 6b 65 20 22 3a 61  ldcards like ":a
4fd0: 61 61 22 2c 20 22 24 61 61 61 22 20 6f 72 20 22  aa", "$aaa" or "
4fe0: 40 61 61 61 22 2e 20 20 52 65 75 73 65 20 74 68  @aaa".  Reuse th
4ff0: 65 20 73 61 6d 65 20 76 61 72 69 61 62 6c 65 0a  e same variable.
5000: 20 20 20 20 20 20 2a 2a 20 6e 75 6d 62 65 72 20        ** number 
5010: 61 73 20 74 68 65 20 70 72 69 6f 72 20 61 70 70  as the prior app
5020: 65 61 72 61 6e 63 65 20 6f 66 20 74 68 65 20 73  earance of the s
5030: 61 6d 65 20 6e 61 6d 65 2c 20 6f 72 20 69 66 20  ame name, or if 
5040: 74 68 65 20 6e 61 6d 65 0a 20 20 20 20 20 20 2a  the name.      *
5050: 2a 20 68 61 73 20 6e 65 76 65 72 20 61 70 70 65  * has never appe
5060: 61 72 65 64 20 62 65 66 6f 72 65 2c 20 72 65 75  ared before, reu
5070: 73 65 20 74 68 65 20 73 61 6d 65 20 76 61 72 69  se the same vari
5080: 61 62 6c 65 20 6e 75 6d 62 65 72 0a 20 20 20 20  able number.    
5090: 20 20 2a 2f 0a 20 20 20 20 20 20 79 6e 56 61 72    */.      ynVar
50a0: 20 69 3b 0a 20 20 20 20 20 20 66 6f 72 28 69 3d   i;.      for(i=
50b0: 30 3b 20 69 3c 70 50 61 72 73 65 2d 3e 6e 7a 56  0; i<pParse->nzV
50c0: 61 72 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20 20  ar; i++){.      
50d0: 20 20 69 66 28 20 70 50 61 72 73 65 2d 3e 61 7a    if( pParse->az
50e0: 56 61 72 5b 69 5d 20 26 26 20 73 74 72 63 6d 70  Var[i] && strcmp
50f0: 28 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b 69  (pParse->azVar[i
5100: 5d 2c 7a 29 3d 3d 30 20 29 7b 0a 20 20 20 20 20  ],z)==0 ){.     
5110: 20 20 20 20 20 70 45 78 70 72 2d 3e 69 43 6f 6c       pExpr->iCol
5120: 75 6d 6e 20 3d 20 78 20 3d 20 28 79 6e 56 61 72  umn = x = (ynVar
5130: 29 69 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20  )i+1;.          
5140: 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 7d  break;.        }
5150: 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
5160: 66 28 20 78 3d 3d 30 20 29 20 78 20 3d 20 70 45  f( x==0 ) x = pE
5170: 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 3d 20 28  xpr->iColumn = (
5180: 79 6e 56 61 72 29 28 2b 2b 70 50 61 72 73 65 2d  ynVar)(++pParse-
5190: 3e 6e 56 61 72 29 3b 0a 20 20 20 20 7d 0a 20 20  >nVar);.    }.  
51a0: 20 20 69 66 28 20 78 3e 30 20 29 7b 0a 20 20 20    if( x>0 ){.   
51b0: 20 20 20 69 66 28 20 78 3e 70 50 61 72 73 65 2d     if( x>pParse-
51c0: 3e 6e 7a 56 61 72 20 29 7b 0a 20 20 20 20 20 20  >nzVar ){.      
51d0: 20 20 63 68 61 72 20 2a 2a 61 3b 0a 20 20 20 20    char **a;.    
51e0: 20 20 20 20 61 20 3d 20 73 71 6c 69 74 65 33 44      a = sqlite3D
51f0: 62 52 65 61 6c 6c 6f 63 28 64 62 2c 20 70 50 61  bRealloc(db, pPa
5200: 72 73 65 2d 3e 61 7a 56 61 72 2c 20 78 2a 73 69  rse->azVar, x*si
5210: 7a 65 6f 66 28 61 5b 30 5d 29 29 3b 0a 20 20 20  zeof(a[0]));.   
5220: 20 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 20       if( a==0 ) 
5230: 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 72 72 6f  return;  /* Erro
5240: 72 20 72 65 70 6f 72 74 65 64 20 74 68 72 6f 75  r reported throu
5250: 67 68 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69  gh db->mallocFai
5260: 6c 65 64 20 2a 2f 0a 20 20 20 20 20 20 20 20 70  led */.        p
5270: 50 61 72 73 65 2d 3e 61 7a 56 61 72 20 3d 20 61  Parse->azVar = a
5280: 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 73 65 74  ;.        memset
5290: 28 26 61 5b 70 50 61 72 73 65 2d 3e 6e 7a 56 61  (&a[pParse->nzVa
52a0: 72 5d 2c 20 30 2c 20 28 78 2d 70 50 61 72 73 65  r], 0, (x-pParse
52b0: 2d 3e 6e 7a 56 61 72 29 2a 73 69 7a 65 6f 66 28  ->nzVar)*sizeof(
52c0: 61 5b 30 5d 29 29 3b 0a 20 20 20 20 20 20 20 20  a[0]));.        
52d0: 70 50 61 72 73 65 2d 3e 6e 7a 56 61 72 20 3d 20  pParse->nzVar = 
52e0: 78 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  x;.      }.     
52f0: 20 69 66 28 20 7a 5b 30 5d 21 3d 27 3f 27 20 7c   if( z[0]!='?' |
5300: 7c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  | pParse->azVar[
5310: 78 2d 31 5d 3d 3d 30 20 29 7b 0a 20 20 20 20 20  x-1]==0 ){.     
5320: 20 20 20 73 71 6c 69 74 65 33 44 62 46 72 65 65     sqlite3DbFree
5330: 28 64 62 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56  (db, pParse->azV
5340: 61 72 5b 78 2d 31 5d 29 3b 0a 20 20 20 20 20 20  ar[x-1]);.      
5350: 20 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b    pParse->azVar[
5360: 78 2d 31 5d 20 3d 20 73 71 6c 69 74 65 33 44 62  x-1] = sqlite3Db
5370: 53 74 72 4e 44 75 70 28 64 62 2c 20 7a 2c 20 6e  StrNDup(db, z, n
5380: 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d  );.      }.    }
5390: 0a 20 20 7d 20 0a 20 20 69 66 28 20 21 70 50 61  .  } .  if( !pPa
53a0: 72 73 65 2d 3e 6e 45 72 72 20 26 26 20 70 50 61  rse->nErr && pPa
53b0: 72 73 65 2d 3e 6e 56 61 72 3e 64 62 2d 3e 61 4c  rse->nVar>db->aL
53c0: 69 6d 69 74 5b 53 51 4c 49 54 45 5f 4c 49 4d 49  imit[SQLITE_LIMI
53d0: 54 5f 56 41 52 49 41 42 4c 45 5f 4e 55 4d 42 45  T_VARIABLE_NUMBE
53e0: 52 5d 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65  R] ){.    sqlite
53f0: 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65  3ErrorMsg(pParse
5400: 2c 20 22 74 6f 6f 20 6d 61 6e 79 20 53 51 4c 20  , "too many SQL 
5410: 76 61 72 69 61 62 6c 65 73 22 29 3b 0a 20 20 7d  variables");.  }
5420: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 75 72 73  .}../*.** Recurs
5430: 69 76 65 6c 79 20 64 65 6c 65 74 65 20 61 6e 20  ively delete an 
5440: 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e  expression tree.
5450: 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
5460: 45 78 70 72 44 65 6c 65 74 65 28 73 71 6c 69 74  ExprDelete(sqlit
5470: 65 33 20 2a 64 62 2c 20 45 78 70 72 20 2a 70 29  e3 *db, Expr *p)
5480: 7b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20 72  {.  if( p==0 ) r
5490: 65 74 75 72 6e 3b 0a 20 20 2f 2a 20 53 61 6e 69  eturn;.  /* Sani
54a0: 74 79 20 63 68 65 63 6b 3a 20 41 73 73 65 72 74  ty check: Assert
54b0: 20 74 68 61 74 20 74 68 65 20 49 6e 74 56 61 6c   that the IntVal
54c0: 75 65 20 69 73 20 6e 6f 6e 2d 6e 65 67 61 74 69  ue is non-negati
54d0: 76 65 20 69 66 20 69 74 20 65 78 69 73 74 73 20  ve if it exists 
54e0: 2a 2f 0a 20 20 61 73 73 65 72 74 28 20 21 45 78  */.  assert( !Ex
54f0: 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 2c  prHasProperty(p,
5500: 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 7c 7c   EP_IntValue) ||
5510: 20 70 2d 3e 75 2e 69 56 61 6c 75 65 3e 3d 30 20   p->u.iValue>=0 
5520: 29 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48 61  );.  if( !ExprHa
5530: 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f  sProperty(p, EP_
5540: 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20  TokenOnly) ){.  
5550: 20 20 2f 2a 20 54 68 65 20 45 78 70 72 2e 78 20    /* The Expr.x 
5560: 75 6e 69 6f 6e 20 69 73 20 6e 65 76 65 72 20 75  union is never u
5570: 73 65 64 20 61 74 20 74 68 65 20 73 61 6d 65 20  sed at the same 
5580: 74 69 6d 65 20 61 73 20 45 78 70 72 2e 70 52 69  time as Expr.pRi
5590: 67 68 74 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  ght */.    asser
55a0: 74 28 20 70 2d 3e 78 2e 70 4c 69 73 74 3d 3d 30  t( p->x.pList==0
55b0: 20 7c 7c 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30   || p->pRight==0
55c0: 20 29 3b 0a 20 20 20 20 73 71 6c 69 74 65 33 45   );.    sqlite3E
55d0: 78 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 2d  xprDelete(db, p-
55e0: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c  >pLeft);.    sql
55f0: 69 74 65 33 45 78 70 72 44 65 6c 65 74 65 28 64  ite3ExprDelete(d
5600: 62 2c 20 70 2d 3e 70 52 69 67 68 74 29 3b 0a 20  b, p->pRight);. 
5610: 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72     if( ExprHasPr
5620: 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d  operty(p, EP_Mem
5630: 54 6f 6b 65 6e 29 20 29 20 73 71 6c 69 74 65 33  Token) ) sqlite3
5640: 44 62 46 72 65 65 28 64 62 2c 20 70 2d 3e 75 2e  DbFree(db, p->u.
5650: 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 69 66 28  zToken);.    if(
5660: 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79   ExprHasProperty
5670: 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74  (p, EP_xIsSelect
5680: 29 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ) ){.      sqlit
5690: 65 33 53 65 6c 65 63 74 44 65 6c 65 74 65 28 64  e3SelectDelete(d
56a0: 62 2c 20 70 2d 3e 78 2e 70 53 65 6c 65 63 74 29  b, p->x.pSelect)
56b0: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
56c0: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69     sqlite3ExprLi
56d0: 73 74 44 65 6c 65 74 65 28 64 62 2c 20 70 2d 3e  stDelete(db, p->
56e0: 78 2e 70 4c 69 73 74 29 3b 0a 20 20 20 20 7d 0a  x.pList);.    }.
56f0: 20 20 7d 0a 20 20 69 66 28 20 21 45 78 70 72 48    }.  if( !ExprH
5700: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
5710: 5f 53 74 61 74 69 63 29 20 29 7b 0a 20 20 20 20  _Static) ){.    
5720: 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64 62  sqlite3DbFree(db
5730: 2c 20 70 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  , p);.  }.}../*.
5740: 2a 2a 20 52 65 74 75 72 6e 20 74 68 65 20 6e 75  ** Return the nu
5750: 6d 62 65 72 20 6f 66 20 62 79 74 65 73 20 61 6c  mber of bytes al
5760: 6c 6f 63 61 74 65 64 20 66 6f 72 20 74 68 65 20  located for the 
5770: 65 78 70 72 65 73 73 69 6f 6e 20 73 74 72 75 63  expression struc
5780: 74 75 72 65 20 0a 2a 2a 20 70 61 73 73 65 64 20  ture .** passed 
5790: 61 73 20 74 68 65 20 66 69 72 73 74 20 61 72 67  as the first arg
57a0: 75 6d 65 6e 74 2e 20 54 68 69 73 20 69 73 20 61  ument. This is a
57b0: 6c 77 61 79 73 20 6f 6e 65 20 6f 66 20 45 58 50  lways one of EXP
57c0: 52 5f 46 55 4c 4c 53 49 5a 45 2c 0a 2a 2a 20 45  R_FULLSIZE,.** E
57d0: 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45 20  XPR_REDUCEDSIZE 
57e0: 6f 72 20 45 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c  or EXPR_TOKENONL
57f0: 59 53 49 5a 45 2e 0a 2a 2f 0a 73 74 61 74 69 63  YSIZE..*/.static
5800: 20 69 6e 74 20 65 78 70 72 53 74 72 75 63 74 53   int exprStructS
5810: 69 7a 65 28 45 78 70 72 20 2a 70 29 7b 0a 20 20  ize(Expr *p){.  
5820: 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70 65  if( ExprHasPrope
5830: 72 74 79 28 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f  rty(p, EP_TokenO
5840: 6e 6c 79 29 20 29 20 72 65 74 75 72 6e 20 45 58  nly) ) return EX
5850: 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45  PR_TOKENONLYSIZE
5860: 3b 0a 20 20 69 66 28 20 45 78 70 72 48 61 73 50  ;.  if( ExprHasP
5870: 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 52 65  roperty(p, EP_Re
5880: 64 75 63 65 64 29 20 29 20 72 65 74 75 72 6e 20  duced) ) return 
5890: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
58a0: 3b 0a 20 20 72 65 74 75 72 6e 20 45 58 50 52 5f  ;.  return EXPR_
58b0: 46 55 4c 4c 53 49 5a 45 3b 0a 7d 0a 0a 2f 2a 0a  FULLSIZE;.}../*.
58c0: 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70 72  ** The dupedExpr
58d0: 2a 53 69 7a 65 28 29 20 72 6f 75 74 69 6e 65 73  *Size() routines
58e0: 20 65 61 63 68 20 72 65 74 75 72 6e 20 74 68 65   each return the
58f0: 20 6e 75 6d 62 65 72 20 6f 66 20 62 79 74 65 73   number of bytes
5900: 20 72 65 71 75 69 72 65 64 0a 2a 2a 20 74 6f 20   required.** to 
5910: 73 74 6f 72 65 20 61 20 63 6f 70 79 20 6f 66 20  store a copy of 
5920: 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6f 72  an expression or
5930: 20 65 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65   expression tree
5940: 2e 20 20 54 68 65 79 20 64 69 66 66 65 72 20 69  .  They differ i
5950: 6e 0a 2a 2a 20 68 6f 77 20 6d 75 63 68 20 6f 66  n.** how much of
5960: 20 74 68 65 20 74 72 65 65 20 69 73 20 6d 65 61   the tree is mea
5970: 73 75 72 65 64 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  sured..**.**    
5980: 20 64 75 70 65 64 45 78 70 72 53 74 72 75 63 74   dupedExprStruct
5990: 53 69 7a 65 28 29 20 20 20 20 20 53 69 7a 65 20  Size()     Size 
59a0: 6f 66 20 6f 6e 6c 79 20 74 68 65 20 45 78 70 72  of only the Expr
59b0: 20 73 74 72 75 63 74 75 72 65 20 0a 2a 2a 20 20   structure .**  
59c0: 20 20 20 64 75 70 65 64 45 78 70 72 4e 6f 64 65     dupedExprNode
59d0: 53 69 7a 65 28 29 20 20 20 20 20 20 20 53 69 7a  Size()       Siz
59e0: 65 20 6f 66 20 45 78 70 72 20 2b 20 73 70 61 63  e of Expr + spac
59f0: 65 20 66 6f 72 20 74 6f 6b 65 6e 0a 2a 2a 20 20  e for token.**  
5a00: 20 20 20 64 75 70 65 64 45 78 70 72 53 69 7a 65     dupedExprSize
5a10: 28 29 20 20 20 20 20 20 20 20 20 20 20 45 78 70  ()           Exp
5a20: 72 20 2b 20 74 6f 6b 65 6e 20 2b 20 73 75 62 74  r + token + subt
5a30: 72 65 65 20 63 6f 6d 70 6f 6e 65 6e 74 73 0a 2a  ree components.*
5a40: 2a 0a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  *.**************
5a50: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a60: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a70: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a  ****************
5a80: 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 2a 0a 2a 2a  *************.**
5a90: 0a 2a 2a 20 54 68 65 20 64 75 70 65 64 45 78 70  .** The dupedExp
5aa0: 72 53 74 72 75 63 74 53 69 7a 65 28 29 20 66 75  rStructSize() fu
5ab0: 6e 63 74 69 6f 6e 20 72 65 74 75 72 6e 73 20 74  nction returns t
5ac0: 77 6f 20 76 61 6c 75 65 73 20 4f 52 2d 65 64 20  wo values OR-ed 
5ad0: 74 6f 67 65 74 68 65 72 3a 20 20 0a 2a 2a 20 28  together:  .** (
5ae0: 31 29 20 74 68 65 20 73 70 61 63 65 20 72 65 71  1) the space req
5af0: 75 69 72 65 64 20 66 6f 72 20 61 20 63 6f 70 79  uired for a copy
5b00: 20 6f 66 20 74 68 65 20 45 78 70 72 20 73 74 72   of the Expr str
5b10: 75 63 74 75 72 65 20 6f 6e 6c 79 20 61 6e 64 20  ucture only and 
5b20: 0a 2a 2a 20 28 32 29 20 74 68 65 20 45 50 5f 78  .** (2) the EP_x
5b30: 78 78 20 66 6c 61 67 73 20 74 68 61 74 20 69 6e  xx flags that in
5b40: 64 69 63 61 74 65 20 77 68 61 74 20 74 68 65 20  dicate what the 
5b50: 73 74 72 75 63 74 75 72 65 20 73 69 7a 65 20 73  structure size s
5b60: 68 6f 75 6c 64 20 62 65 2e 0a 2a 2a 20 54 68 65  hould be..** The
5b70: 20 72 65 74 75 72 6e 20 76 61 6c 75 65 73 20 69   return values i
5b80: 73 20 61 6c 77 61 79 73 20 6f 6e 65 20 6f 66 3a  s always one of:
5b90: 0a 2a 2a 0a 2a 2a 20 20 20 20 20 20 45 58 50 52  .**.**      EXPR
5ba0: 5f 46 55 4c 4c 53 49 5a 45 0a 2a 2a 20 20 20 20  _FULLSIZE.**    
5bb0: 20 20 45 58 50 52 5f 52 45 44 55 43 45 44 53 49    EXPR_REDUCEDSI
5bc0: 5a 45 20 20 20 7c 20 45 50 5f 52 65 64 75 63 65  ZE   | EP_Reduce
5bd0: 64 0a 2a 2a 20 20 20 20 20 20 45 58 50 52 5f 54  d.**      EXPR_T
5be0: 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 20 7c 20 45  OKENONLYSIZE | E
5bf0: 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 0a 2a 2a 0a 2a  P_TokenOnly.**.*
5c00: 2a 20 54 68 65 20 73 69 7a 65 20 6f 66 20 74 68  * The size of th
5c10: 65 20 73 74 72 75 63 74 75 72 65 20 63 61 6e 20  e structure can 
5c20: 62 65 20 66 6f 75 6e 64 20 62 79 20 6d 61 73 6b  be found by mask
5c30: 69 6e 67 20 74 68 65 20 72 65 74 75 72 6e 20 76  ing the return v
5c40: 61 6c 75 65 0a 2a 2a 20 6f 66 20 74 68 69 73 20  alue.** of this 
5c50: 72 6f 75 74 69 6e 65 20 77 69 74 68 20 30 78 66  routine with 0xf
5c60: 66 66 2e 20 20 54 68 65 20 66 6c 61 67 73 20 63  ff.  The flags c
5c70: 61 6e 20 62 65 20 66 6f 75 6e 64 20 62 79 20 6d  an be found by m
5c80: 61 73 6b 69 6e 67 20 74 68 65 0a 2a 2a 20 72 65  asking the.** re
5c90: 74 75 72 6e 20 76 61 6c 75 65 20 77 69 74 68 20  turn value with 
5ca0: 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f  EP_Reduced|EP_To
5cb0: 6b 65 6e 4f 6e 6c 79 2e 0a 2a 2a 0a 2a 2a 20 4e  kenOnly..**.** N
5cc0: 6f 74 65 20 74 68 61 74 20 77 69 74 68 20 66 6c  ote that with fl
5cd0: 61 67 73 3d 3d 45 58 50 52 44 55 50 5f 52 45 44  ags==EXPRDUP_RED
5ce0: 55 43 45 2c 20 74 68 69 73 20 72 6f 75 74 69 6e  UCE, this routin
5cf0: 65 73 20 77 6f 72 6b 73 20 6f 6e 20 66 75 6c 6c  es works on full
5d00: 2d 73 69 7a 65 0a 2a 2a 20 28 75 6e 72 65 64 75  -size.** (unredu
5d10: 63 65 64 29 20 45 78 70 72 20 6f 62 6a 65 63 74  ced) Expr object
5d20: 73 20 61 73 20 74 68 65 79 20 6f 72 20 6f 72 69  s as they or ori
5d30: 67 69 6e 61 6c 6c 79 20 63 6f 6e 73 74 72 75 63  ginally construc
5d40: 74 65 64 20 62 79 20 74 68 65 20 70 61 72 73 65  ted by the parse
5d50: 72 2e 0a 2a 2a 20 44 75 72 69 6e 67 20 65 78 70  r..** During exp
5d60: 72 65 73 73 69 6f 6e 20 61 6e 61 6c 79 73 69 73  ression analysis
5d70: 2c 20 65 78 74 72 61 20 69 6e 66 6f 72 6d 61 74  , extra informat
5d80: 69 6f 6e 20 69 73 20 63 6f 6d 70 75 74 65 64 20  ion is computed 
5d90: 61 6e 64 20 6d 6f 76 65 64 20 69 6e 74 6f 0a 2a  and moved into.*
5da0: 2a 20 6c 61 74 65 72 20 70 61 72 74 73 20 6f 66  * later parts of
5db0: 20 74 65 68 20 45 78 70 72 20 6f 62 6a 65 63 74   teh Expr object
5dc0: 20 61 6e 64 20 74 68 61 74 20 65 78 74 72 61 20   and that extra 
5dd0: 69 6e 66 6f 72 6d 61 74 69 6f 6e 20 6d 69 67 68  information migh
5de0: 74 20 67 65 74 20 63 68 6f 70 70 65 64 0a 2a 2a  t get chopped.**
5df0: 20 6f 66 66 20 69 66 20 74 68 65 20 65 78 70 72   off if the expr
5e00: 65 73 73 69 6f 6e 20 69 73 20 72 65 64 75 63 65  ession is reduce
5e10: 64 2e 20 20 4e 6f 74 65 20 61 6c 73 6f 20 74 68  d.  Note also th
5e20: 61 74 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 77  at it does not w
5e30: 6f 72 6b 20 74 6f 0a 2a 2a 20 6d 61 6b 65 20 61  ork to.** make a
5e40: 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45 20   EXPRDUP_REDUCE 
5e50: 63 6f 70 79 20 6f 66 20 61 20 72 65 64 75 63 65  copy of a reduce
5e60: 64 20 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 49  d expression.  I
5e70: 74 20 69 73 20 6f 6e 6c 79 20 6c 65 67 61 6c 0a  t is only legal.
5e80: 2a 2a 20 74 6f 20 72 65 64 75 63 65 20 61 20 70  ** to reduce a p
5e90: 72 69 73 74 69 6e 65 20 65 78 70 72 65 73 73 69  ristine expressi
5ea0: 6f 6e 20 74 72 65 65 20 66 72 6f 6d 20 74 68 65  on tree from the
5eb0: 20 70 61 72 73 65 72 2e 20 20 54 68 65 20 69 6d   parser.  The im
5ec0: 70 6c 65 6d 65 6e 74 61 74 69 6f 6e 0a 2a 2a 20  plementation.** 
5ed0: 6f 66 20 64 75 70 65 64 45 78 70 72 53 74 72 75  of dupedExprStru
5ee0: 63 74 53 69 7a 65 28 29 20 63 6f 6e 74 61 69 6e  ctSize() contain
5ef0: 20 6d 75 6c 74 69 70 6c 65 20 61 73 73 65 72 74   multiple assert
5f00: 28 29 20 73 74 61 74 65 6d 65 6e 74 73 20 74 68  () statements th
5f10: 61 74 20 61 74 74 65 6d 70 74 0a 2a 2a 20 74 6f  at attempt.** to
5f20: 20 65 6e 66 6f 72 63 65 20 74 68 69 73 20 63 6f   enforce this co
5f30: 6e 73 74 72 61 69 6e 74 2e 0a 2a 2f 0a 73 74 61  nstraint..*/.sta
5f40: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
5f50: 72 53 74 72 75 63 74 53 69 7a 65 28 45 78 70 72  rStructSize(Expr
5f60: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
5f70: 0a 20 20 69 6e 74 20 6e 53 69 7a 65 3b 0a 20 20  .  int nSize;.  
5f80: 61 73 73 65 72 74 28 20 66 6c 61 67 73 3d 3d 45  assert( flags==E
5f90: 58 50 52 44 55 50 5f 52 45 44 55 43 45 20 7c 7c  XPRDUP_REDUCE ||
5fa0: 20 66 6c 61 67 73 3d 3d 30 20 29 3b 20 2f 2a 20   flags==0 ); /* 
5fb0: 4f 6e 6c 79 20 6f 6e 65 20 66 6c 61 67 20 76 61  Only one flag va
5fc0: 6c 75 65 20 61 6c 6c 6f 77 65 64 20 2a 2f 0a 20  lue allowed */. 
5fd0: 20 61 73 73 65 72 74 28 20 45 58 50 52 5f 46 55   assert( EXPR_FU
5fe0: 4c 4c 53 49 5a 45 3c 3d 30 78 66 66 66 20 29 3b  LLSIZE<=0xfff );
5ff0: 0a 20 20 61 73 73 65 72 74 28 20 28 30 78 66 66  .  assert( (0xff
6000: 66 20 26 20 28 45 50 5f 52 65 64 75 63 65 64 7c  f & (EP_Reduced|
6010: 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 29 3d 3d  EP_TokenOnly))==
6020: 30 20 29 3b 0a 20 20 69 66 28 20 30 3d 3d 28 66  0 );.  if( 0==(f
6030: 6c 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44  lags&EXPRDUP_RED
6040: 55 43 45 29 20 29 7b 0a 20 20 20 20 6e 53 69 7a  UCE) ){.    nSiz
6050: 65 20 3d 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a  e = EXPR_FULLSIZ
6060: 45 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20  E;.  }else{.    
6070: 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
6080: 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50 5f 54  Property(p, EP_T
6090: 6f 6b 65 6e 4f 6e 6c 79 7c 45 50 5f 52 65 64 75  okenOnly|EP_Redu
60a0: 63 65 64 29 20 29 3b 0a 20 20 20 20 61 73 73 65  ced) );.    asse
60b0: 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
60c0: 65 72 74 79 28 70 2c 20 45 50 5f 46 72 6f 6d 4a  erty(p, EP_FromJ
60d0: 6f 69 6e 29 20 29 3b 20 0a 20 20 20 20 61 73 73  oin) ); .    ass
60e0: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
60f0: 70 65 72 74 79 28 70 2c 20 45 50 5f 4d 65 6d 54  perty(p, EP_MemT
6100: 6f 6b 65 6e 29 20 29 3b 0a 20 20 20 20 61 73 73  oken) );.    ass
6110: 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f  ert( !ExprHasPro
6120: 70 65 72 74 79 28 70 2c 20 45 50 5f 4e 6f 52 65  perty(p, EP_NoRe
6130: 64 75 63 65 29 20 29 3b 0a 20 20 20 20 69 66 28  duce) );.    if(
6140: 20 70 2d 3e 70 4c 65 66 74 20 7c 7c 20 70 2d 3e   p->pLeft || p->
6150: 78 2e 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 20  x.pList ){.     
6160: 20 6e 53 69 7a 65 20 3d 20 45 58 50 52 5f 52 45   nSize = EXPR_RE
6170: 44 55 43 45 44 53 49 5a 45 20 7c 20 45 50 5f 52  DUCEDSIZE | EP_R
6180: 65 64 75 63 65 64 3b 0a 20 20 20 20 7d 65 6c 73  educed;.    }els
6190: 65 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  e{.      assert(
61a0: 20 70 2d 3e 70 52 69 67 68 74 3d 3d 30 20 29 3b   p->pRight==0 );
61b0: 0a 20 20 20 20 20 20 6e 53 69 7a 65 20 3d 20 45  .      nSize = E
61c0: 58 50 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a  XPR_TOKENONLYSIZ
61d0: 45 20 7c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79  E | EP_TokenOnly
61e0: 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65  ;.    }.  }.  re
61f0: 74 75 72 6e 20 6e 53 69 7a 65 3b 0a 7d 0a 0a 2f  turn nSize;.}../
6200: 2a 0a 2a 2a 20 54 68 69 73 20 66 75 6e 63 74 69  *.** This functi
6210: 6f 6e 20 72 65 74 75 72 6e 73 20 74 68 65 20 73  on returns the s
6220: 70 61 63 65 20 69 6e 20 62 79 74 65 73 20 72 65  pace in bytes re
6230: 71 75 69 72 65 64 20 74 6f 20 73 74 6f 72 65 20  quired to store 
6240: 74 68 65 20 63 6f 70 79 20 0a 2a 2a 20 6f 66 20  the copy .** of 
6250: 74 68 65 20 45 78 70 72 20 73 74 72 75 63 74 75  the Expr structu
6260: 72 65 20 61 6e 64 20 61 20 63 6f 70 79 20 6f 66  re and a copy of
6270: 20 74 68 65 20 45 78 70 72 2e 75 2e 7a 54 6f 6b   the Expr.u.zTok
6280: 65 6e 20 73 74 72 69 6e 67 20 28 69 66 20 74 68  en string (if th
6290: 61 74 0a 2a 2a 20 73 74 72 69 6e 67 20 69 73 20  at.** string is 
62a0: 64 65 66 69 6e 65 64 2e 29 0a 2a 2f 0a 73 74 61  defined.).*/.sta
62b0: 74 69 63 20 69 6e 74 20 64 75 70 65 64 45 78 70  tic int dupedExp
62c0: 72 4e 6f 64 65 53 69 7a 65 28 45 78 70 72 20 2a  rNodeSize(Expr *
62d0: 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20  p, int flags){. 
62e0: 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 64 75 70   int nByte = dup
62f0: 65 64 45 78 70 72 53 74 72 75 63 74 53 69 7a 65  edExprStructSize
6300: 28 70 2c 20 66 6c 61 67 73 29 20 26 20 30 78 66  (p, flags) & 0xf
6310: 66 66 3b 0a 20 20 69 66 28 20 21 45 78 70 72 48  ff;.  if( !ExprH
6320: 61 73 50 72 6f 70 65 72 74 79 28 70 2c 20 45 50  asProperty(p, EP
6330: 5f 49 6e 74 56 61 6c 75 65 29 20 26 26 20 70 2d  _IntValue) && p-
6340: 3e 75 2e 7a 54 6f 6b 65 6e 20 29 7b 0a 20 20 20  >u.zToken ){.   
6350: 20 6e 42 79 74 65 20 2b 3d 20 73 71 6c 69 74 65   nByte += sqlite
6360: 33 53 74 72 6c 65 6e 33 30 28 70 2d 3e 75 2e 7a  3Strlen30(p->u.z
6370: 54 6f 6b 65 6e 29 2b 31 3b 0a 20 20 7d 0a 20 20  Token)+1;.  }.  
6380: 72 65 74 75 72 6e 20 52 4f 55 4e 44 38 28 6e 42  return ROUND8(nB
6390: 79 74 65 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  yte);.}../*.** R
63a0: 65 74 75 72 6e 20 74 68 65 20 6e 75 6d 62 65 72  eturn the number
63b0: 20 6f 66 20 62 79 74 65 73 20 72 65 71 75 69 72   of bytes requir
63c0: 65 64 20 74 6f 20 63 72 65 61 74 65 20 61 20 64  ed to create a d
63d0: 75 70 6c 69 63 61 74 65 20 6f 66 20 74 68 65 20  uplicate of the 
63e0: 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 70  .** expression p
63f0: 61 73 73 65 64 20 61 73 20 74 68 65 20 66 69 72  assed as the fir
6400: 73 74 20 61 72 67 75 6d 65 6e 74 2e 20 54 68 65  st argument. The
6410: 20 73 65 63 6f 6e 64 20 61 72 67 75 6d 65 6e 74   second argument
6420: 20 69 73 20 61 0a 2a 2a 20 6d 61 73 6b 20 63 6f   is a.** mask co
6430: 6e 74 61 69 6e 69 6e 67 20 45 58 50 52 44 55 50  ntaining EXPRDUP
6440: 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 0a 2a  _XXX flags..**.*
6450: 2a 20 54 68 65 20 76 61 6c 75 65 20 72 65 74 75  * The value retu
6460: 72 6e 65 64 20 69 6e 63 6c 75 64 65 73 20 73 70  rned includes sp
6470: 61 63 65 20 74 6f 20 63 72 65 61 74 65 20 61 20  ace to create a 
6480: 63 6f 70 79 20 6f 66 20 74 68 65 20 45 78 70 72  copy of the Expr
6490: 20 73 74 72 75 63 74 0a 2a 2a 20 69 74 73 65 6c   struct.** itsel
64a0: 66 20 61 6e 64 20 74 68 65 20 62 75 66 66 65 72  f and the buffer
64b0: 20 72 65 66 65 72 72 65 64 20 74 6f 20 62 79 20   referred to by 
64c0: 45 78 70 72 2e 75 2e 7a 54 6f 6b 65 6e 2c 20 69  Expr.u.zToken, i
64d0: 66 20 61 6e 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  f any..**.** If 
64e0: 74 68 65 20 45 58 50 52 44 55 50 5f 52 45 44 55  the EXPRDUP_REDU
64f0: 43 45 20 66 6c 61 67 20 69 73 20 73 65 74 2c 20  CE flag is set, 
6500: 74 68 65 6e 20 74 68 65 20 72 65 74 75 72 6e 20  then the return 
6510: 76 61 6c 75 65 20 69 6e 63 6c 75 64 65 73 20 0a  value includes .
6520: 2a 2a 20 73 70 61 63 65 20 74 6f 20 64 75 70 6c  ** space to dupl
6530: 69 63 61 74 65 20 61 6c 6c 20 45 78 70 72 20 6e  icate all Expr n
6540: 6f 64 65 73 20 69 6e 20 74 68 65 20 74 72 65 65  odes in the tree
6550: 20 66 6f 72 6d 65 64 20 62 79 20 45 78 70 72 2e   formed by Expr.
6560: 70 4c 65 66 74 20 0a 2a 2a 20 61 6e 64 20 45 78  pLeft .** and Ex
6570: 70 72 2e 70 52 69 67 68 74 20 76 61 72 69 61 62  pr.pRight variab
6580: 6c 65 73 20 28 62 75 74 20 6e 6f 74 20 66 6f 72  les (but not for
6590: 20 61 6e 79 20 73 74 72 75 63 74 75 72 65 73 20   any structures 
65a0: 70 6f 69 6e 74 65 64 20 74 6f 20 6f 72 20 0a 2a  pointed to or .*
65b0: 2a 20 64 65 73 63 65 6e 64 65 64 20 66 72 6f 6d  * descended from
65c0: 20 74 68 65 20 45 78 70 72 2e 78 2e 70 4c 69 73   the Expr.x.pLis
65d0: 74 20 6f 72 20 45 78 70 72 2e 78 2e 70 53 65 6c  t or Expr.x.pSel
65e0: 65 63 74 20 76 61 72 69 61 62 6c 65 73 29 2e 0a  ect variables)..
65f0: 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74 20 64 75  */.static int du
6600: 70 65 64 45 78 70 72 53 69 7a 65 28 45 78 70 72  pedExprSize(Expr
6610: 20 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b   *p, int flags){
6620: 0a 20 20 69 6e 74 20 6e 42 79 74 65 20 3d 20 30  .  int nByte = 0
6630: 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
6640: 20 6e 42 79 74 65 20 3d 20 64 75 70 65 64 45 78   nByte = dupedEx
6650: 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c 20 66 6c  prNodeSize(p, fl
6660: 61 67 73 29 3b 0a 20 20 20 20 69 66 28 20 66 6c  ags);.    if( fl
6670: 61 67 73 26 45 58 50 52 44 55 50 5f 52 45 44 55  ags&EXPRDUP_REDU
6680: 43 45 20 29 7b 0a 20 20 20 20 20 20 6e 42 79 74  CE ){.      nByt
6690: 65 20 2b 3d 20 64 75 70 65 64 45 78 70 72 53 69  e += dupedExprSi
66a0: 7a 65 28 70 2d 3e 70 4c 65 66 74 2c 20 66 6c 61  ze(p->pLeft, fla
66b0: 67 73 29 20 2b 20 64 75 70 65 64 45 78 70 72 53  gs) + dupedExprS
66c0: 69 7a 65 28 70 2d 3e 70 52 69 67 68 74 2c 20 66  ize(p->pRight, f
66d0: 6c 61 67 73 29 3b 0a 20 20 20 20 7d 0a 20 20 7d  lags);.    }.  }
66e0: 0a 20 20 72 65 74 75 72 6e 20 6e 42 79 74 65 3b  .  return nByte;
66f0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73 20 66  .}../*.** This f
6700: 75 6e 63 74 69 6f 6e 20 69 73 20 73 69 6d 69 6c  unction is simil
6710: 61 72 20 74 6f 20 73 71 6c 69 74 65 33 45 78 70  ar to sqlite3Exp
6720: 72 44 75 70 28 29 2c 20 65 78 63 65 70 74 20 74  rDup(), except t
6730: 68 61 74 20 69 66 20 70 7a 42 75 66 66 65 72 20  hat if pzBuffer 
6740: 0a 2a 2a 20 69 73 20 6e 6f 74 20 4e 55 4c 4c 20  .** is not NULL 
6750: 74 68 65 6e 20 2a 70 7a 42 75 66 66 65 72 20 69  then *pzBuffer i
6760: 73 20 61 73 73 75 6d 65 64 20 74 6f 20 70 6f 69  s assumed to poi
6770: 6e 74 20 74 6f 20 61 20 62 75 66 66 65 72 20 6c  nt to a buffer l
6780: 61 72 67 65 20 65 6e 6f 75 67 68 20 0a 2a 2a 20  arge enough .** 
6790: 74 6f 20 73 74 6f 72 65 20 74 68 65 20 63 6f 70  to store the cop
67a0: 79 20 6f 66 20 65 78 70 72 65 73 73 69 6f 6e 20  y of expression 
67b0: 70 2c 20 74 68 65 20 63 6f 70 69 65 73 20 6f 66  p, the copies of
67c0: 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 0a 2a 2a 20   p->u.zToken.** 
67d0: 28 69 66 20 61 70 70 6c 69 63 61 62 6c 65 29 2c  (if applicable),
67e0: 20 61 6e 64 20 74 68 65 20 63 6f 70 69 65 73 20   and the copies 
67f0: 6f 66 20 74 68 65 20 70 2d 3e 70 4c 65 66 74 20  of the p->pLeft 
6800: 61 6e 64 20 70 2d 3e 70 52 69 67 68 74 20 65 78  and p->pRight ex
6810: 70 72 65 73 73 69 6f 6e 73 2c 0a 2a 2a 20 69 66  pressions,.** if
6820: 20 61 6e 79 2e 20 42 65 66 6f 72 65 20 72 65 74   any. Before ret
6830: 75 72 6e 69 6e 67 2c 20 2a 70 7a 42 75 66 66 65  urning, *pzBuffe
6840: 72 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  r is set to the 
6850: 66 69 72 73 74 20 62 79 74 65 20 70 61 73 73 65  first byte passe
6860: 64 20 74 68 65 0a 2a 2a 20 70 6f 72 74 69 6f 6e  d the.** portion
6870: 20 6f 66 20 74 68 65 20 62 75 66 66 65 72 20 63   of the buffer c
6880: 6f 70 69 65 64 20 69 6e 74 6f 20 62 79 20 74 68  opied into by th
6890: 69 73 20 66 75 6e 63 74 69 6f 6e 2e 0a 2a 2f 0a  is function..*/.
68a0: 73 74 61 74 69 63 20 45 78 70 72 20 2a 65 78 70  static Expr *exp
68b0: 72 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62  rDup(sqlite3 *db
68c0: 2c 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66  , Expr *p, int f
68d0: 6c 61 67 73 2c 20 75 38 20 2a 2a 70 7a 42 75 66  lags, u8 **pzBuf
68e0: 66 65 72 29 7b 0a 20 20 45 78 70 72 20 2a 70 4e  fer){.  Expr *pN
68f0: 65 77 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  ew = 0;         
6900: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
6910: 56 61 6c 75 65 20 74 6f 20 72 65 74 75 72 6e 20  Value to return 
6920: 2a 2f 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20  */.  if( p ){.  
6930: 20 20 63 6f 6e 73 74 20 69 6e 74 20 69 73 52 65    const int isRe
6940: 64 75 63 65 64 20 3d 20 28 66 6c 61 67 73 26 45  duced = (flags&E
6950: 58 50 52 44 55 50 5f 52 45 44 55 43 45 29 3b 0a  XPRDUP_REDUCE);.
6960: 20 20 20 20 75 38 20 2a 7a 41 6c 6c 6f 63 3b 0a      u8 *zAlloc;.
6970: 20 20 20 20 75 33 32 20 73 74 61 74 69 63 46 6c      u32 staticFl
6980: 61 67 20 3d 20 30 3b 0a 0a 20 20 20 20 61 73 73  ag = 0;..    ass
6990: 65 72 74 28 20 70 7a 42 75 66 66 65 72 3d 3d 30  ert( pzBuffer==0
69a0: 20 7c 7c 20 69 73 52 65 64 75 63 65 64 20 29 3b   || isReduced );
69b0: 0a 0a 20 20 20 20 2f 2a 20 46 69 67 75 72 65 20  ..    /* Figure 
69c0: 6f 75 74 20 77 68 65 72 65 20 74 6f 20 77 72 69  out where to wri
69d0: 74 65 20 74 68 65 20 6e 65 77 20 45 78 70 72 20  te the new Expr 
69e0: 73 74 72 75 63 74 75 72 65 2e 20 2a 2f 0a 20 20  structure. */.  
69f0: 20 20 69 66 28 20 70 7a 42 75 66 66 65 72 20 29    if( pzBuffer )
6a00: 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f 63 20 3d  {.      zAlloc =
6a10: 20 2a 70 7a 42 75 66 66 65 72 3b 0a 20 20 20 20   *pzBuffer;.    
6a20: 20 20 73 74 61 74 69 63 46 6c 61 67 20 3d 20 45    staticFlag = E
6a30: 50 5f 53 74 61 74 69 63 3b 0a 20 20 20 20 7d 65  P_Static;.    }e
6a40: 6c 73 65 7b 0a 20 20 20 20 20 20 7a 41 6c 6c 6f  lse{.      zAllo
6a50: 63 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  c = sqlite3DbMal
6a60: 6c 6f 63 52 61 77 28 64 62 2c 20 64 75 70 65 64  locRaw(db, duped
6a70: 45 78 70 72 53 69 7a 65 28 70 2c 20 66 6c 61 67  ExprSize(p, flag
6a80: 73 29 29 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70  s));.    }.    p
6a90: 4e 65 77 20 3d 20 28 45 78 70 72 20 2a 29 7a 41  New = (Expr *)zA
6aa0: 6c 6c 6f 63 3b 0a 0a 20 20 20 20 69 66 28 20 70  lloc;..    if( p
6ab0: 4e 65 77 20 29 7b 0a 20 20 20 20 20 20 2f 2a 20  New ){.      /* 
6ac0: 53 65 74 20 6e 4e 65 77 53 69 7a 65 20 74 6f 20  Set nNewSize to 
6ad0: 74 68 65 20 73 69 7a 65 20 61 6c 6c 6f 63 61 74  the size allocat
6ae0: 65 64 20 66 6f 72 20 74 68 65 20 73 74 72 75 63  ed for the struc
6af0: 74 75 72 65 20 70 6f 69 6e 74 65 64 20 74 6f 0a  ture pointed to.
6b00: 20 20 20 20 20 20 2a 2a 20 62 79 20 70 4e 65 77        ** by pNew
6b10: 2e 20 54 68 69 73 20 69 73 20 65 69 74 68 65 72  . This is either
6b20: 20 45 58 50 52 5f 46 55 4c 4c 53 49 5a 45 2c 20   EXPR_FULLSIZE, 
6b30: 45 58 50 52 5f 52 45 44 55 43 45 44 53 49 5a 45  EXPR_REDUCEDSIZE
6b40: 20 6f 72 0a 20 20 20 20 20 20 2a 2a 20 45 58 50   or.      ** EXP
6b50: 52 5f 54 4f 4b 45 4e 4f 4e 4c 59 53 49 5a 45 2e  R_TOKENONLYSIZE.
6b60: 20 6e 54 6f 6b 65 6e 20 69 73 20 73 65 74 20 74   nToken is set t
6b70: 6f 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  o the number of 
6b80: 62 79 74 65 73 20 63 6f 6e 73 75 6d 65 64 0a 20  bytes consumed. 
6b90: 20 20 20 20 20 2a 2a 20 62 79 20 74 68 65 20 63       ** by the c
6ba0: 6f 70 79 20 6f 66 20 74 68 65 20 70 2d 3e 75 2e  opy of the p->u.
6bb0: 7a 54 6f 6b 65 6e 20 73 74 72 69 6e 67 20 28 69  zToken string (i
6bc0: 66 20 61 6e 79 29 2e 0a 20 20 20 20 20 20 2a 2f  f any)..      */
6bd0: 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 75 6e 73  .      const uns
6be0: 69 67 6e 65 64 20 6e 53 74 72 75 63 74 53 69 7a  igned nStructSiz
6bf0: 65 20 3d 20 64 75 70 65 64 45 78 70 72 53 74 72  e = dupedExprStr
6c00: 75 63 74 53 69 7a 65 28 70 2c 20 66 6c 61 67 73  uctSize(p, flags
6c10: 29 3b 0a 20 20 20 20 20 20 63 6f 6e 73 74 20 69  );.      const i
6c20: 6e 74 20 6e 4e 65 77 53 69 7a 65 20 3d 20 6e 53  nt nNewSize = nS
6c30: 74 72 75 63 74 53 69 7a 65 20 26 20 30 78 66 66  tructSize & 0xff
6c40: 66 3b 0a 20 20 20 20 20 20 69 6e 74 20 6e 54 6f  f;.      int nTo
6c50: 6b 65 6e 3b 0a 20 20 20 20 20 20 69 66 28 20 21  ken;.      if( !
6c60: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
6c70: 70 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20  p, EP_IntValue) 
6c80: 26 26 20 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 29  && p->u.zToken )
6c90: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ca0: 20 3d 20 73 71 6c 69 74 65 33 53 74 72 6c 65 6e   = sqlite3Strlen
6cb0: 33 30 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 20  30(p->u.zToken) 
6cc0: 2b 20 31 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65  + 1;.      }else
6cd0: 7b 0a 20 20 20 20 20 20 20 20 6e 54 6f 6b 65 6e  {.        nToken
6ce0: 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 0;.      }.  
6cf0: 20 20 20 20 69 66 28 20 69 73 52 65 64 75 63 65      if( isReduce
6d00: 64 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  d ){.        ass
6d10: 65 72 74 28 20 45 78 70 72 48 61 73 50 72 6f 70  ert( ExprHasProp
6d20: 65 72 74 79 28 70 2c 20 45 50 5f 52 65 64 75 63  erty(p, EP_Reduc
6d30: 65 64 29 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ed)==0 );.      
6d40: 20 20 6d 65 6d 63 70 79 28 7a 41 6c 6c 6f 63 2c    memcpy(zAlloc,
6d50: 20 70 2c 20 6e 4e 65 77 53 69 7a 65 29 3b 0a 20   p, nNewSize);. 
6d60: 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
6d70: 20 20 20 20 69 6e 74 20 6e 53 69 7a 65 20 3d 20      int nSize = 
6d80: 65 78 70 72 53 74 72 75 63 74 53 69 7a 65 28 70  exprStructSize(p
6d90: 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d 63 70  );.        memcp
6da0: 79 28 7a 41 6c 6c 6f 63 2c 20 70 2c 20 6e 53 69  y(zAlloc, p, nSi
6db0: 7a 65 29 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze);.        mem
6dc0: 73 65 74 28 26 7a 41 6c 6c 6f 63 5b 6e 53 69 7a  set(&zAlloc[nSiz
6dd0: 65 5d 2c 20 30 2c 20 45 58 50 52 5f 46 55 4c 4c  e], 0, EXPR_FULL
6de0: 53 49 5a 45 2d 6e 53 69 7a 65 29 3b 0a 20 20 20  SIZE-nSize);.   
6df0: 20 20 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 53     }..      /* S
6e00: 65 74 20 74 68 65 20 45 50 5f 52 65 64 75 63 65  et the EP_Reduce
6e10: 64 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 2c  d, EP_TokenOnly,
6e20: 20 61 6e 64 20 45 50 5f 53 74 61 74 69 63 20 66   and EP_Static f
6e30: 6c 61 67 73 20 61 70 70 72 6f 70 72 69 61 74 65  lags appropriate
6e40: 6c 79 2e 20 2a 2f 0a 20 20 20 20 20 20 70 4e 65  ly. */.      pNe
6e50: 77 2d 3e 66 6c 61 67 73 20 26 3d 20 7e 28 45 50  w->flags &= ~(EP
6e60: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
6e70: 6e 4f 6e 6c 79 7c 45 50 5f 53 74 61 74 69 63 7c  nOnly|EP_Static|
6e80: 45 50 5f 4d 65 6d 54 6f 6b 65 6e 29 3b 0a 20 20  EP_MemToken);.  
6e90: 20 20 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20      pNew->flags 
6ea0: 7c 3d 20 6e 53 74 72 75 63 74 53 69 7a 65 20 26  |= nStructSize &
6eb0: 20 28 45 50 5f 52 65 64 75 63 65 64 7c 45 50 5f   (EP_Reduced|EP_
6ec0: 54 6f 6b 65 6e 4f 6e 6c 79 29 3b 0a 20 20 20 20  TokenOnly);.    
6ed0: 20 20 70 4e 65 77 2d 3e 66 6c 61 67 73 20 7c 3d    pNew->flags |=
6ee0: 20 73 74 61 74 69 63 46 6c 61 67 3b 0a 0a 20 20   staticFlag;..  
6ef0: 20 20 20 20 2f 2a 20 43 6f 70 79 20 74 68 65 20      /* Copy the 
6f00: 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 20 73 74 72 69  p->u.zToken stri
6f10: 6e 67 2c 20 69 66 20 61 6e 79 2e 20 2a 2f 0a 20  ng, if any. */. 
6f20: 20 20 20 20 20 69 66 28 20 6e 54 6f 6b 65 6e 20       if( nToken 
6f30: 29 7b 0a 20 20 20 20 20 20 20 20 63 68 61 72 20  ){.        char 
6f40: 2a 7a 54 6f 6b 65 6e 20 3d 20 70 4e 65 77 2d 3e  *zToken = pNew->
6f50: 75 2e 7a 54 6f 6b 65 6e 20 3d 20 28 63 68 61 72  u.zToken = (char
6f60: 2a 29 26 7a 41 6c 6c 6f 63 5b 6e 4e 65 77 53 69  *)&zAlloc[nNewSi
6f70: 7a 65 5d 3b 0a 20 20 20 20 20 20 20 20 6d 65 6d  ze];.        mem
6f80: 63 70 79 28 7a 54 6f 6b 65 6e 2c 20 70 2d 3e 75  cpy(zToken, p->u
6f90: 2e 7a 54 6f 6b 65 6e 2c 20 6e 54 6f 6b 65 6e 29  .zToken, nToken)
6fa0: 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
6fb0: 20 69 66 28 20 30 3d 3d 28 28 70 2d 3e 66 6c 61   if( 0==((p->fla
6fc0: 67 73 7c 70 4e 65 77 2d 3e 66 6c 61 67 73 29 20  gs|pNew->flags) 
6fd0: 26 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20  & EP_TokenOnly) 
6fe0: 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 69  ){.        /* Fi
6ff0: 6c 6c 20 69 6e 20 74 68 65 20 70 4e 65 77 2d 3e  ll in the pNew->
7000: 78 2e 70 53 65 6c 65 63 74 20 6f 72 20 70 4e 65  x.pSelect or pNe
7010: 77 2d 3e 78 2e 70 4c 69 73 74 20 6d 65 6d 62 65  w->x.pList membe
7020: 72 2e 20 2a 2f 0a 20 20 20 20 20 20 20 20 69 66  r. */.        if
7030: 28 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  ( ExprHasPropert
7040: 79 28 70 2c 20 45 50 5f 78 49 73 53 65 6c 65 63  y(p, EP_xIsSelec
7050: 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  t) ){.          
7060: 70 4e 65 77 2d 3e 78 2e 70 53 65 6c 65 63 74 20  pNew->x.pSelect 
7070: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
7080: 75 70 28 64 62 2c 20 70 2d 3e 78 2e 70 53 65 6c  up(db, p->x.pSel
7090: 65 63 74 2c 20 69 73 52 65 64 75 63 65 64 29 3b  ect, isReduced);
70a0: 0a 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  .        }else{.
70b0: 20 20 20 20 20 20 20 20 20 20 70 4e 65 77 2d 3e            pNew->
70c0: 78 2e 70 4c 69 73 74 20 3d 20 73 71 6c 69 74 65  x.pList = sqlite
70d0: 33 45 78 70 72 4c 69 73 74 44 75 70 28 64 62 2c  3ExprListDup(db,
70e0: 20 70 2d 3e 78 2e 70 4c 69 73 74 2c 20 69 73 52   p->x.pList, isR
70f0: 65 64 75 63 65 64 29 3b 0a 20 20 20 20 20 20 20  educed);.       
7100: 20 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20   }.      }..    
7110: 20 20 2f 2a 20 46 69 6c 6c 20 69 6e 20 70 4e 65    /* Fill in pNe
7120: 77 2d 3e 70 4c 65 66 74 20 61 6e 64 20 70 4e 65  w->pLeft and pNe
7130: 77 2d 3e 70 52 69 67 68 74 2e 20 2a 2f 0a 20 20  w->pRight. */.  
7140: 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73 50      if( ExprHasP
7150: 72 6f 70 65 72 74 79 28 70 4e 65 77 2c 20 45 50  roperty(pNew, EP
7160: 5f 52 65 64 75 63 65 64 7c 45 50 5f 54 6f 6b 65  _Reduced|EP_Toke
7170: 6e 4f 6e 6c 79 29 20 29 7b 0a 20 20 20 20 20 20  nOnly) ){.      
7180: 20 20 7a 41 6c 6c 6f 63 20 2b 3d 20 64 75 70 65    zAlloc += dupe
7190: 64 45 78 70 72 4e 6f 64 65 53 69 7a 65 28 70 2c  dExprNodeSize(p,
71a0: 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 20 20 20   flags);.       
71b0: 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f 70   if( ExprHasProp
71c0: 65 72 74 79 28 70 4e 65 77 2c 20 45 50 5f 52 65  erty(pNew, EP_Re
71d0: 64 75 63 65 64 29 20 29 7b 0a 20 20 20 20 20 20  duced) ){.      
71e0: 20 20 20 20 70 4e 65 77 2d 3e 70 4c 65 66 74 20      pNew->pLeft 
71f0: 3d 20 65 78 70 72 44 75 70 28 64 62 2c 20 70 2d  = exprDup(db, p-
7200: 3e 70 4c 65 66 74 2c 20 45 58 50 52 44 55 50 5f  >pLeft, EXPRDUP_
7210: 52 45 44 55 43 45 2c 20 26 7a 41 6c 6c 6f 63 29  REDUCE, &zAlloc)
7220: 3b 0a 20 20 20 20 20 20 20 20 20 20 70 4e 65 77  ;.          pNew
7230: 2d 3e 70 52 69 67 68 74 20 3d 20 65 78 70 72 44  ->pRight = exprD
7240: 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67 68 74  up(db, p->pRight
7250: 2c 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  , EXPRDUP_REDUCE
7260: 2c 20 26 7a 41 6c 6c 6f 63 29 3b 0a 20 20 20 20  , &zAlloc);.    
7270: 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69 66      }.        if
7280: 28 20 70 7a 42 75 66 66 65 72 20 29 7b 0a 20 20  ( pzBuffer ){.  
7290: 20 20 20 20 20 20 20 20 2a 70 7a 42 75 66 66 65          *pzBuffe
72a0: 72 20 3d 20 7a 41 6c 6c 6f 63 3b 0a 20 20 20 20  r = zAlloc;.    
72b0: 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 65 6c 73      }.      }els
72c0: 65 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 21  e{.        if( !
72d0: 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
72e0: 70 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  p, EP_TokenOnly)
72f0: 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4e   ){.          pN
7300: 65 77 2d 3e 70 4c 65 66 74 20 3d 20 73 71 6c 69  ew->pLeft = sqli
7310: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
7320: 2d 3e 70 4c 65 66 74 2c 20 30 29 3b 0a 20 20 20  ->pLeft, 0);.   
7330: 20 20 20 20 20 20 20 70 4e 65 77 2d 3e 70 52 69         pNew->pRi
7340: 67 68 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70  ght = sqlite3Exp
7350: 72 44 75 70 28 64 62 2c 20 70 2d 3e 70 52 69 67  rDup(db, p->pRig
7360: 68 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20  ht, 0);.        
7370: 7d 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 7d  }.      }..    }
7380: 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4e  .  }.  return pN
7390: 65 77 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 72 65  ew;.}../*.** Cre
73a0: 61 74 65 20 61 6e 64 20 72 65 74 75 72 6e 20 61  ate and return a
73b0: 20 64 65 65 70 20 63 6f 70 79 20 6f 66 20 74 68   deep copy of th
73c0: 65 20 6f 62 6a 65 63 74 20 70 61 73 73 65 64 20  e object passed 
73d0: 61 73 20 74 68 65 20 73 65 63 6f 6e 64 20 0a 2a  as the second .*
73e0: 2a 20 61 72 67 75 6d 65 6e 74 2e 20 49 66 20 61  * argument. If a
73f0: 6e 20 4f 4f 4d 20 63 6f 6e 64 69 74 69 6f 6e 20  n OOM condition 
7400: 69 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 2c 20  is encountered, 
7410: 4e 55 4c 4c 20 69 73 20 72 65 74 75 72 6e 65 64  NULL is returned
7420: 0a 2a 2a 20 61 6e 64 20 74 68 65 20 64 62 2d 3e  .** and the db->
7430: 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c 61  mallocFailed fla
7440: 67 20 73 65 74 2e 0a 2a 2f 0a 23 69 66 6e 64 65  g set..*/.#ifnde
7450: 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 54  f SQLITE_OMIT_CT
7460: 45 0a 73 74 61 74 69 63 20 57 69 74 68 20 2a 77  E.static With *w
7470: 69 74 68 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ithDup(sqlite3 *
7480: 64 62 2c 20 57 69 74 68 20 2a 70 29 7b 0a 20 20  db, With *p){.  
7490: 57 69 74 68 20 2a 70 52 65 74 20 3d 20 30 3b 0a  With *pRet = 0;.
74a0: 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20 20 69    if( p ){.    i
74b0: 6e 74 20 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f  nt nByte = sizeo
74c0: 66 28 2a 70 29 20 2b 20 73 69 7a 65 6f 66 28 70  f(*p) + sizeof(p
74d0: 2d 3e 61 5b 30 5d 29 20 2a 20 28 70 2d 3e 6e 43  ->a[0]) * (p->nC
74e0: 74 65 2d 31 29 3b 0a 20 20 20 20 70 52 65 74 20  te-1);.    pRet 
74f0: 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f  = sqlite3DbMallo
7500: 63 5a 65 72 6f 28 64 62 2c 20 6e 42 79 74 65 29  cZero(db, nByte)
7510: 3b 0a 20 20 20 20 69 66 28 20 70 52 65 74 20 29  ;.    if( pRet )
7520: 7b 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20  {.      int i;. 
7530: 20 20 20 20 20 70 52 65 74 2d 3e 6e 43 74 65 20       pRet->nCte 
7540: 3d 20 70 2d 3e 6e 43 74 65 3b 0a 20 20 20 20 20  = p->nCte;.     
7550: 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e 6e   for(i=0; i<p->n
7560: 43 74 65 3b 20 69 2b 2b 29 7b 0a 20 20 20 20 20  Cte; i++){.     
7570: 20 20 20 70 52 65 74 2d 3e 61 5b 69 5d 2e 70 53     pRet->a[i].pS
7580: 65 6c 65 63 74 20 3d 20 73 71 6c 69 74 65 33 53  elect = sqlite3S
7590: 65 6c 65 63 74 44 75 70 28 64 62 2c 20 70 2d 3e  electDup(db, p->
75a0: 61 5b 69 5d 2e 70 53 65 6c 65 63 74 2c 20 30 29  a[i].pSelect, 0)
75b0: 3b 0a 20 20 20 20 20 20 20 20 70 52 65 74 2d 3e  ;.        pRet->
75c0: 61 5b 69 5d 2e 70 43 6f 6c 73 20 3d 20 73 71 6c  a[i].pCols = sql
75d0: 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70 28  ite3ExprListDup(
75e0: 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 70 43 6f 6c  db, p->a[i].pCol
75f0: 73 2c 20 30 29 3b 0a 20 20 20 20 20 20 20 20 70  s, 0);.        p
7600: 52 65 74 2d 3e 61 5b 69 5d 2e 7a 4e 61 6d 65 20  Ret->a[i].zName 
7610: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75  = sqlite3DbStrDu
7620: 70 28 64 62 2c 20 70 2d 3e 61 5b 69 5d 2e 7a 4e  p(db, p->a[i].zN
7630: 61 6d 65 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  ame);.      }.  
7640: 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e    }.  }.  return
7650: 20 70 52 65 74 3b 0a 7d 0a 23 65 6c 73 65 0a 23   pRet;.}.#else.#
7660: 20 64 65 66 69 6e 65 20 77 69 74 68 44 75 70 28   define withDup(
7670: 78 2c 79 29 20 30 0a 23 65 6e 64 69 66 0a 0a 2f  x,y) 0.#endif../
7680: 2a 0a 2a 2a 20 54 68 65 20 66 6f 6c 6c 6f 77 69  *.** The followi
7690: 6e 67 20 67 72 6f 75 70 20 6f 66 20 72 6f 75 74  ng group of rout
76a0: 69 6e 65 73 20 6d 61 6b 65 20 64 65 65 70 20 63  ines make deep c
76b0: 6f 70 69 65 73 20 6f 66 20 65 78 70 72 65 73 73  opies of express
76c0: 69 6f 6e 73 2c 0a 2a 2a 20 65 78 70 72 65 73 73  ions,.** express
76d0: 69 6f 6e 20 6c 69 73 74 73 2c 20 49 44 20 6c 69  ion lists, ID li
76e0: 73 74 73 2c 20 61 6e 64 20 73 65 6c 65 63 74 20  sts, and select 
76f0: 73 74 61 74 65 6d 65 6e 74 73 2e 20 20 54 68 65  statements.  The
7700: 20 63 6f 70 69 65 73 20 63 61 6e 0a 2a 2a 20 62   copies can.** b
7710: 65 20 64 65 6c 65 74 65 64 20 28 62 79 20 62 65  e deleted (by be
7720: 69 6e 67 20 70 61 73 73 65 64 20 74 6f 20 74 68  ing passed to th
7730: 65 69 72 20 72 65 73 70 65 63 74 69 76 65 20 2e  eir respective .
7740: 2e 2e 44 65 6c 65 74 65 28 29 20 72 6f 75 74 69  ..Delete() routi
7750: 6e 65 73 29 0a 2a 2a 20 77 69 74 68 6f 75 74 20  nes).** without 
7760: 65 66 66 65 63 74 69 6e 67 20 74 68 65 20 6f 72  effecting the or
7770: 69 67 69 6e 61 6c 73 2e 0a 2a 2a 0a 2a 2a 20 54  iginals..**.** T
7780: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  he expression li
7790: 73 74 2c 20 49 44 2c 20 61 6e 64 20 73 6f 75 72  st, ID, and sour
77a0: 63 65 20 6c 69 73 74 73 20 72 65 74 75 72 6e 20  ce lists return 
77b0: 62 79 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  by sqlite3ExprLi
77c0: 73 74 44 75 70 28 29 2c 0a 2a 2a 20 73 71 6c 69  stDup(),.** sqli
77d0: 74 65 33 49 64 4c 69 73 74 44 75 70 28 29 2c 20  te3IdListDup(), 
77e0: 61 6e 64 20 73 71 6c 69 74 65 33 53 72 63 4c 69  and sqlite3SrcLi
77f0: 73 74 44 75 70 28 29 20 63 61 6e 20 6e 6f 74 20  stDup() can not 
7800: 62 65 20 66 75 72 74 68 65 72 20 65 78 70 61 6e  be further expan
7810: 64 65 64 20 0a 2a 2a 20 62 79 20 73 75 62 73 65  ded .** by subse
7820: 71 75 65 6e 74 20 63 61 6c 6c 73 20 74 6f 20 73  quent calls to s
7830: 71 6c 69 74 65 2a 4c 69 73 74 41 70 70 65 6e 64  qlite*ListAppend
7840: 28 29 20 72 6f 75 74 69 6e 65 73 2e 0a 2a 2a 0a  () routines..**.
7850: 2a 2a 20 41 6e 79 20 74 61 62 6c 65 73 20 74 68  ** Any tables th
7860: 61 74 20 74 68 65 20 53 72 63 4c 69 73 74 20 6d  at the SrcList m
7870: 69 67 68 74 20 70 6f 69 6e 74 20 74 6f 20 61 72  ight point to ar
7880: 65 20 6e 6f 74 20 64 75 70 6c 69 63 61 74 65 64  e not duplicated
7890: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 66 6c 61 67  ..**.** The flag
78a0: 73 20 70 61 72 61 6d 65 74 65 72 20 63 6f 6e 74  s parameter cont
78b0: 61 69 6e 73 20 61 20 63 6f 6d 62 69 6e 61 74 69  ains a combinati
78c0: 6f 6e 20 6f 66 20 74 68 65 20 45 58 50 52 44 55  on of the EXPRDU
78d0: 50 5f 58 58 58 20 66 6c 61 67 73 2e 0a 2a 2a 20  P_XXX flags..** 
78e0: 49 66 20 74 68 65 20 45 58 50 52 44 55 50 5f 52  If the EXPRDUP_R
78f0: 45 44 55 43 45 20 66 6c 61 67 20 69 73 20 73 65  EDUCE flag is se
7900: 74 2c 20 74 68 65 6e 20 74 68 65 20 73 74 72 75  t, then the stru
7910: 63 74 75 72 65 20 72 65 74 75 72 6e 65 64 20 69  cture returned i
7920: 73 20 61 0a 2a 2a 20 74 72 75 6e 63 61 74 65 64  s a.** truncated
7930: 20 76 65 72 73 69 6f 6e 20 6f 66 20 74 68 65 20   version of the 
7940: 75 73 75 61 6c 20 45 78 70 72 20 73 74 72 75 63  usual Expr struc
7950: 74 75 72 65 20 74 68 61 74 20 77 69 6c 6c 20 62  ture that will b
7960: 65 20 73 74 6f 72 65 64 20 61 73 0a 2a 2a 20 70  e stored as.** p
7970: 61 72 74 20 6f 66 20 74 68 65 20 69 6e 2d 6d 65  art of the in-me
7980: 6d 6f 72 79 20 72 65 70 72 65 73 65 6e 74 61 74  mory representat
7990: 69 6f 6e 20 6f 66 20 74 68 65 20 64 61 74 61 62  ion of the datab
79a0: 61 73 65 20 73 63 68 65 6d 61 2e 0a 2a 2f 0a 45  ase schema..*/.E
79b0: 78 70 72 20 2a 73 71 6c 69 74 65 33 45 78 70 72  xpr *sqlite3Expr
79c0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
79d0: 20 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 66 6c   Expr *p, int fl
79e0: 61 67 73 29 7b 0a 20 20 72 65 74 75 72 6e 20 65  ags){.  return e
79f0: 78 70 72 44 75 70 28 64 62 2c 20 70 2c 20 66 6c  xprDup(db, p, fl
7a00: 61 67 73 2c 20 30 29 3b 0a 7d 0a 45 78 70 72 4c  ags, 0);.}.ExprL
7a10: 69 73 74 20 2a 73 71 6c 69 74 65 33 45 78 70 72  ist *sqlite3Expr
7a20: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
7a30: 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a 70  *db, ExprList *p
7a40: 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20  , int flags){.  
7a50: 45 78 70 72 4c 69 73 74 20 2a 70 4e 65 77 3b 0a  ExprList *pNew;.
7a60: 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
7a70: 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 2c 20 2a  t_item *pItem, *
7a80: 70 4f 6c 64 49 74 65 6d 3b 0a 20 20 69 6e 74 20  pOldItem;.  int 
7a90: 69 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29 20  i;.  if( p==0 ) 
7aa0: 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77  return 0;.  pNew
7ab0: 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c 6c   = sqlite3DbMall
7ac0: 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f 66  ocRaw(db, sizeof
7ad0: 28 2a 70 4e 65 77 29 20 29 3b 0a 20 20 69 66 28  (*pNew) );.  if(
7ae0: 20 70 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72   pNew==0 ) retur
7af0: 6e 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 6e 45 78  n 0;.  pNew->nEx
7b00: 70 72 20 3d 20 69 20 3d 20 70 2d 3e 6e 45 78 70  pr = i = p->nExp
7b10: 72 3b 0a 20 20 69 66 28 20 28 66 6c 61 67 73 20  r;.  if( (flags 
7b20: 26 20 45 58 50 52 44 55 50 5f 52 45 44 55 43 45  & EXPRDUP_REDUCE
7b30: 29 3d 3d 30 20 29 20 66 6f 72 28 69 3d 31 3b 20  )==0 ) for(i=1; 
7b40: 69 3c 70 2d 3e 6e 45 78 70 72 3b 20 69 2b 3d 69  i<p->nExpr; i+=i
7b50: 29 7b 7d 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20  ){}.  pNew->a = 
7b60: 70 49 74 65 6d 20 3d 20 73 71 6c 69 74 65 33 44  pItem = sqlite3D
7b70: 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c 20 20  bMallocRaw(db,  
7b80: 69 2a 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  i*sizeof(p->a[0]
7b90: 29 20 29 3b 0a 20 20 69 66 28 20 70 49 74 65 6d  ) );.  if( pItem
7ba0: 3d 3d 30 20 29 7b 0a 20 20 20 20 73 71 6c 69 74  ==0 ){.    sqlit
7bb0: 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 4e 65  e3DbFree(db, pNe
7bc0: 77 29 3b 0a 20 20 20 20 72 65 74 75 72 6e 20 30  w);.    return 0
7bd0: 3b 0a 20 20 7d 20 0a 20 20 70 4f 6c 64 49 74 65  ;.  } .  pOldIte
7be0: 6d 20 3d 20 70 2d 3e 61 3b 0a 20 20 66 6f 72 28  m = p->a;.  for(
7bf0: 69 3d 30 3b 20 69 3c 70 2d 3e 6e 45 78 70 72 3b  i=0; i<p->nExpr;
7c00: 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 2c 20 70   i++, pItem++, p
7c10: 4f 6c 64 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20  OldItem++){.    
7c20: 45 78 70 72 20 2a 70 4f 6c 64 45 78 70 72 20 3d  Expr *pOldExpr =
7c30: 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 45 78 70 72   pOldItem->pExpr
7c40: 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 70 45 78  ;.    pItem->pEx
7c50: 70 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  pr = sqlite3Expr
7c60: 44 75 70 28 64 62 2c 20 70 4f 6c 64 45 78 70 72  Dup(db, pOldExpr
7c70: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 20 20 70 49  , flags);.    pI
7c80: 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20 73 71 6c  tem->zName = sql
7c90: 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62 2c  ite3DbStrDup(db,
7ca0: 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e 61 6d 65   pOldItem->zName
7cb0: 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d 3e 7a 53  );.    pItem->zS
7cc0: 70 61 6e 20 3d 20 73 71 6c 69 74 65 33 44 62 53  pan = sqlite3DbS
7cd0: 74 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74  trDup(db, pOldIt
7ce0: 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20 20 20 20  em->zSpan);.    
7cf0: 70 49 74 65 6d 2d 3e 73 6f 72 74 4f 72 64 65 72  pItem->sortOrder
7d00: 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 73 6f 72   = pOldItem->sor
7d10: 74 4f 72 64 65 72 3b 0a 20 20 20 20 70 49 74 65  tOrder;.    pIte
7d20: 6d 2d 3e 64 6f 6e 65 20 3d 20 30 3b 0a 20 20 20  m->done = 0;.   
7d30: 20 70 49 74 65 6d 2d 3e 62 53 70 61 6e 49 73 54   pItem->bSpanIsT
7d40: 61 62 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 62  ab = pOldItem->b
7d50: 53 70 61 6e 49 73 54 61 62 3b 0a 20 20 20 20 70  SpanIsTab;.    p
7d60: 49 74 65 6d 2d 3e 75 20 3d 20 70 4f 6c 64 49 74  Item->u = pOldIt
7d70: 65 6d 2d 3e 75 3b 0a 20 20 7d 0a 20 20 72 65 74  em->u;.  }.  ret
7d80: 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 0a 2f 2a 0a  urn pNew;.}../*.
7d90: 2a 2a 20 49 66 20 63 75 72 73 6f 72 73 2c 20 74  ** If cursors, t
7da0: 72 69 67 67 65 72 73 2c 20 76 69 65 77 73 20 61  riggers, views a
7db0: 6e 64 20 73 75 62 71 75 65 72 69 65 73 20 61 72  nd subqueries ar
7dc0: 65 20 61 6c 6c 20 6f 6d 69 74 74 65 64 20 66 72  e all omitted fr
7dd0: 6f 6d 0a 2a 2a 20 74 68 65 20 62 75 69 6c 64 2c  om.** the build,
7de0: 20 74 68 65 6e 20 6e 6f 6e 65 20 6f 66 20 74 68   then none of th
7df0: 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 72 6f 75 74  e following rout
7e00: 69 6e 65 73 2c 20 65 78 63 65 70 74 20 66 6f 72  ines, except for
7e10: 20 0a 2a 2a 20 73 71 6c 69 74 65 33 53 65 6c 65   .** sqlite3Sele
7e20: 63 74 44 75 70 28 29 2c 20 63 61 6e 20 62 65 20  ctDup(), can be 
7e30: 63 61 6c 6c 65 64 2e 20 73 71 6c 69 74 65 33 53  called. sqlite3S
7e40: 65 6c 65 63 74 44 75 70 28 29 20 69 73 20 73 6f  electDup() is so
7e50: 6d 65 74 69 6d 65 73 0a 2a 2a 20 63 61 6c 6c 65  metimes.** calle
7e60: 64 20 77 69 74 68 20 61 20 4e 55 4c 4c 20 61 72  d with a NULL ar
7e70: 67 75 6d 65 6e 74 2e 0a 2a 2f 0a 23 69 66 20 21  gument..*/.#if !
7e80: 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f  defined(SQLITE_O
7e90: 4d 49 54 5f 56 49 45 57 29 20 7c 7c 20 21 64 65  MIT_VIEW) || !de
7ea0: 66 69 6e 65 64 28 53 51 4c 49 54 45 5f 4f 4d 49  fined(SQLITE_OMI
7eb0: 54 5f 54 52 49 47 47 45 52 29 20 5c 0a 20 7c 7c  T_TRIGGER) \. ||
7ec0: 20 21 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45   !defined(SQLITE
7ed0: 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 29 0a  _OMIT_SUBQUERY).
7ee0: 53 72 63 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  SrcList *sqlite3
7ef0: 53 72 63 4c 69 73 74 44 75 70 28 73 71 6c 69 74  SrcListDup(sqlit
7f00: 65 33 20 2a 64 62 2c 20 53 72 63 4c 69 73 74 20  e3 *db, SrcList 
7f10: 2a 70 2c 20 69 6e 74 20 66 6c 61 67 73 29 7b 0a  *p, int flags){.
7f20: 20 20 53 72 63 4c 69 73 74 20 2a 70 4e 65 77 3b    SrcList *pNew;
7f30: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 6e 74 20  .  int i;.  int 
7f40: 6e 42 79 74 65 3b 0a 20 20 69 66 28 20 70 3d 3d  nByte;.  if( p==
7f50: 30 20 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20  0 ) return 0;.  
7f60: 6e 42 79 74 65 20 3d 20 73 69 7a 65 6f 66 28 2a  nByte = sizeof(*
7f70: 70 29 20 2b 20 28 70 2d 3e 6e 53 72 63 3e 30 20  p) + (p->nSrc>0 
7f80: 3f 20 73 69 7a 65 6f 66 28 70 2d 3e 61 5b 30 5d  ? sizeof(p->a[0]
7f90: 29 20 2a 20 28 70 2d 3e 6e 53 72 63 2d 31 29 20  ) * (p->nSrc-1) 
7fa0: 3a 20 30 29 3b 0a 20 20 70 4e 65 77 20 3d 20 73  : 0);.  pNew = s
7fb0: 71 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61  qlite3DbMallocRa
7fc0: 77 28 64 62 2c 20 6e 42 79 74 65 20 29 3b 0a 20  w(db, nByte );. 
7fd0: 20 69 66 28 20 70 4e 65 77 3d 3d 30 20 29 20 72   if( pNew==0 ) r
7fe0: 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65 77 2d  eturn 0;.  pNew-
7ff0: 3e 6e 53 72 63 20 3d 20 70 4e 65 77 2d 3e 6e 41  >nSrc = pNew->nA
8000: 6c 6c 6f 63 20 3d 20 70 2d 3e 6e 53 72 63 3b 0a  lloc = p->nSrc;.
8010: 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 2d 3e    for(i=0; i<p->
8020: 6e 53 72 63 3b 20 69 2b 2b 29 7b 0a 20 20 20 20  nSrc; i++){.    
8030: 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f 69  struct SrcList_i
8040: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8050: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8060: 20 73 74 72 75 63 74 20 53 72 63 4c 69 73 74 5f   struct SrcList_
8070: 69 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d  item *pOldItem =
8080: 20 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 54   &p->a[i];.    T
8090: 61 62 6c 65 20 2a 70 54 61 62 3b 0a 20 20 20 20  able *pTab;.    
80a0: 70 4e 65 77 49 74 65 6d 2d 3e 70 53 63 68 65 6d  pNewItem->pSchem
80b0: 61 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 53  a = pOldItem->pS
80c0: 63 68 65 6d 61 3b 0a 20 20 20 20 70 4e 65 77 49  chema;.    pNewI
80d0: 74 65 6d 2d 3e 7a 44 61 74 61 62 61 73 65 20 3d  tem->zDatabase =
80e0: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
80f0: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8100: 44 61 74 61 62 61 73 65 29 3b 0a 20 20 20 20 70  Database);.    p
8110: 4e 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d  NewItem->zName =
8120: 20 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70   sqlite3DbStrDup
8130: 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a  (db, pOldItem->z
8140: 4e 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49  Name);.    pNewI
8150: 74 65 6d 2d 3e 7a 41 6c 69 61 73 20 3d 20 73 71  tem->zAlias = sq
8160: 6c 69 74 65 33 44 62 53 74 72 44 75 70 28 64 62  lite3DbStrDup(db
8170: 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 41 6c 69  , pOldItem->zAli
8180: 61 73 29 3b 0a 20 20 20 20 70 4e 65 77 49 74 65  as);.    pNewIte
8190: 6d 2d 3e 6a 6f 69 6e 74 79 70 65 20 3d 20 70 4f  m->jointype = pO
81a0: 6c 64 49 74 65 6d 2d 3e 6a 6f 69 6e 74 79 70 65  ldItem->jointype
81b0: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
81c0: 69 43 75 72 73 6f 72 20 3d 20 70 4f 6c 64 49 74  iCursor = pOldIt
81d0: 65 6d 2d 3e 69 43 75 72 73 6f 72 3b 0a 20 20 20  em->iCursor;.   
81e0: 20 70 4e 65 77 49 74 65 6d 2d 3e 61 64 64 72 46   pNewItem->addrF
81f0: 69 6c 6c 53 75 62 20 3d 20 70 4f 6c 64 49 74 65  illSub = pOldIte
8200: 6d 2d 3e 61 64 64 72 46 69 6c 6c 53 75 62 3b 0a  m->addrFillSub;.
8210: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 72 65      pNewItem->re
8220: 67 52 65 74 75 72 6e 20 3d 20 70 4f 6c 64 49 74  gReturn = pOldIt
8230: 65 6d 2d 3e 72 65 67 52 65 74 75 72 6e 3b 0a 20  em->regReturn;. 
8240: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 69 73 43     pNewItem->isC
8250: 6f 72 72 65 6c 61 74 65 64 20 3d 20 70 4f 6c 64  orrelated = pOld
8260: 49 74 65 6d 2d 3e 69 73 43 6f 72 72 65 6c 61 74  Item->isCorrelat
8270: 65 64 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d  ed;.    pNewItem
8280: 2d 3e 76 69 61 43 6f 72 6f 75 74 69 6e 65 20 3d  ->viaCoroutine =
8290: 20 70 4f 6c 64 49 74 65 6d 2d 3e 76 69 61 43 6f   pOldItem->viaCo
82a0: 72 6f 75 74 69 6e 65 3b 0a 20 20 20 20 70 4e 65  routine;.    pNe
82b0: 77 49 74 65 6d 2d 3e 69 73 52 65 63 75 72 73 69  wItem->isRecursi
82c0: 76 65 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 69  ve = pOldItem->i
82d0: 73 52 65 63 75 72 73 69 76 65 3b 0a 20 20 20 20  sRecursive;.    
82e0: 70 4e 65 77 49 74 65 6d 2d 3e 7a 49 6e 64 65 78  pNewItem->zIndex
82f0: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 44   = sqlite3DbStrD
8300: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8310: 3e 7a 49 6e 64 65 78 29 3b 0a 20 20 20 20 70 4e  >zIndex);.    pN
8320: 65 77 49 74 65 6d 2d 3e 6e 6f 74 49 6e 64 65 78  ewItem->notIndex
8330: 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 6e  ed = pOldItem->n
8340: 6f 74 49 6e 64 65 78 65 64 3b 0a 20 20 20 20 70  otIndexed;.    p
8350: 4e 65 77 49 74 65 6d 2d 3e 70 49 6e 64 65 78 20  NewItem->pIndex 
8360: 3d 20 70 4f 6c 64 49 74 65 6d 2d 3e 70 49 6e 64  = pOldItem->pInd
8370: 65 78 3b 0a 20 20 20 20 70 54 61 62 20 3d 20 70  ex;.    pTab = p
8380: 4e 65 77 49 74 65 6d 2d 3e 70 54 61 62 20 3d 20  NewItem->pTab = 
8390: 70 4f 6c 64 49 74 65 6d 2d 3e 70 54 61 62 3b 0a  pOldItem->pTab;.
83a0: 20 20 20 20 69 66 28 20 70 54 61 62 20 29 7b 0a      if( pTab ){.
83b0: 20 20 20 20 20 20 70 54 61 62 2d 3e 6e 52 65 66        pTab->nRef
83c0: 2b 2b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4e  ++;.    }.    pN
83d0: 65 77 49 74 65 6d 2d 3e 70 53 65 6c 65 63 74 20  ewItem->pSelect 
83e0: 3d 20 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44  = sqlite3SelectD
83f0: 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d  up(db, pOldItem-
8400: 3e 70 53 65 6c 65 63 74 2c 20 66 6c 61 67 73 29  >pSelect, flags)
8410: 3b 0a 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e  ;.    pNewItem->
8420: 70 4f 6e 20 3d 20 73 71 6c 69 74 65 33 45 78 70  pOn = sqlite3Exp
8430: 72 44 75 70 28 64 62 2c 20 70 4f 6c 64 49 74 65  rDup(db, pOldIte
8440: 6d 2d 3e 70 4f 6e 2c 20 66 6c 61 67 73 29 3b 0a  m->pOn, flags);.
8450: 20 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 70 55      pNewItem->pU
8460: 73 69 6e 67 20 3d 20 73 71 6c 69 74 65 33 49 64  sing = sqlite3Id
8470: 4c 69 73 74 44 75 70 28 64 62 2c 20 70 4f 6c 64  ListDup(db, pOld
8480: 49 74 65 6d 2d 3e 70 55 73 69 6e 67 29 3b 0a 20  Item->pUsing);. 
8490: 20 20 20 70 4e 65 77 49 74 65 6d 2d 3e 63 6f 6c     pNewItem->col
84a0: 55 73 65 64 20 3d 20 70 4f 6c 64 49 74 65 6d 2d  Used = pOldItem-
84b0: 3e 63 6f 6c 55 73 65 64 3b 0a 20 20 7d 0a 20 20  >colUsed;.  }.  
84c0: 72 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 49  return pNew;.}.I
84d0: 64 4c 69 73 74 20 2a 73 71 6c 69 74 65 33 49 64  dList *sqlite3Id
84e0: 4c 69 73 74 44 75 70 28 73 71 6c 69 74 65 33 20  ListDup(sqlite3 
84f0: 2a 64 62 2c 20 49 64 4c 69 73 74 20 2a 70 29 7b  *db, IdList *p){
8500: 0a 20 20 49 64 4c 69 73 74 20 2a 70 4e 65 77 3b  .  IdList *pNew;
8510: 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
8520: 70 3d 3d 30 20 29 20 72 65 74 75 72 6e 20 30 3b  p==0 ) return 0;
8530: 0a 20 20 70 4e 65 77 20 3d 20 73 71 6c 69 74 65  .  pNew = sqlite
8540: 33 44 62 4d 61 6c 6c 6f 63 52 61 77 28 64 62 2c  3DbMallocRaw(db,
8550: 20 73 69 7a 65 6f 66 28 2a 70 4e 65 77 29 20 29   sizeof(*pNew) )
8560: 3b 0a 20 20 69 66 28 20 70 4e 65 77 3d 3d 30 20  ;.  if( pNew==0 
8570: 29 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e  ) return 0;.  pN
8580: 65 77 2d 3e 6e 49 64 20 3d 20 70 2d 3e 6e 49 64  ew->nId = p->nId
8590: 3b 0a 20 20 70 4e 65 77 2d 3e 61 20 3d 20 73 71  ;.  pNew->a = sq
85a0: 6c 69 74 65 33 44 62 4d 61 6c 6c 6f 63 52 61 77  lite3DbMallocRaw
85b0: 28 64 62 2c 20 70 2d 3e 6e 49 64 2a 73 69 7a 65  (db, p->nId*size
85c0: 6f 66 28 70 2d 3e 61 5b 30 5d 29 20 29 3b 0a 20  of(p->a[0]) );. 
85d0: 20 69 66 28 20 70 4e 65 77 2d 3e 61 3d 3d 30 20   if( pNew->a==0 
85e0: 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 44 62  ){.    sqlite3Db
85f0: 46 72 65 65 28 64 62 2c 20 70 4e 65 77 29 3b 0a  Free(db, pNew);.
8600: 20 20 20 20 72 65 74 75 72 6e 20 30 3b 0a 20 20      return 0;.  
8610: 7d 0a 20 20 2f 2a 20 4e 6f 74 65 20 74 68 61 74  }.  /* Note that
8620: 20 62 65 63 61 75 73 65 20 74 68 65 20 73 69 7a   because the siz
8630: 65 20 6f 66 20 74 68 65 20 61 6c 6c 6f 63 61 74  e of the allocat
8640: 69 6f 6e 20 66 6f 72 20 70 2d 3e 61 5b 5d 20 69  ion for p->a[] i
8650: 73 20 6e 6f 74 0a 20 20 2a 2a 20 6e 65 63 65 73  s not.  ** neces
8660: 73 61 72 69 6c 79 20 61 20 70 6f 77 65 72 20 6f  sarily a power o
8670: 66 20 74 77 6f 2c 20 73 71 6c 69 74 65 33 49 64  f two, sqlite3Id
8680: 4c 69 73 74 41 70 70 65 6e 64 28 29 20 6d 61 79  ListAppend() may
8690: 20 6e 6f 74 20 62 65 20 63 61 6c 6c 65 64 0a 20   not be called. 
86a0: 20 2a 2a 20 6f 6e 20 74 68 65 20 64 75 70 6c 69   ** on the dupli
86b0: 63 61 74 65 20 63 72 65 61 74 65 64 20 62 79 20  cate created by 
86c0: 74 68 69 73 20 66 75 6e 63 74 69 6f 6e 2e 20 2a  this function. *
86d0: 2f 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70  /.  for(i=0; i<p
86e0: 2d 3e 6e 49 64 3b 20 69 2b 2b 29 7b 0a 20 20 20  ->nId; i++){.   
86f0: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8700: 74 65 6d 20 2a 70 4e 65 77 49 74 65 6d 20 3d 20  tem *pNewItem = 
8710: 26 70 4e 65 77 2d 3e 61 5b 69 5d 3b 0a 20 20 20  &pNew->a[i];.   
8720: 20 73 74 72 75 63 74 20 49 64 4c 69 73 74 5f 69   struct IdList_i
8730: 74 65 6d 20 2a 70 4f 6c 64 49 74 65 6d 20 3d 20  tem *pOldItem = 
8740: 26 70 2d 3e 61 5b 69 5d 3b 0a 20 20 20 20 70 4e  &p->a[i];.    pN
8750: 65 77 49 74 65 6d 2d 3e 7a 4e 61 6d 65 20 3d 20  ewItem->zName = 
8760: 73 71 6c 69 74 65 33 44 62 53 74 72 44 75 70 28  sqlite3DbStrDup(
8770: 64 62 2c 20 70 4f 6c 64 49 74 65 6d 2d 3e 7a 4e  db, pOldItem->zN
8780: 61 6d 65 29 3b 0a 20 20 20 20 70 4e 65 77 49 74  ame);.    pNewIt
8790: 65 6d 2d 3e 69 64 78 20 3d 20 70 4f 6c 64 49 74  em->idx = pOldIt
87a0: 65 6d 2d 3e 69 64 78 3b 0a 20 20 7d 0a 20 20 72  em->idx;.  }.  r
87b0: 65 74 75 72 6e 20 70 4e 65 77 3b 0a 7d 0a 53 65  eturn pNew;.}.Se
87c0: 6c 65 63 74 20 2a 73 71 6c 69 74 65 33 53 65 6c  lect *sqlite3Sel
87d0: 65 63 74 44 75 70 28 73 71 6c 69 74 65 33 20 2a  ectDup(sqlite3 *
87e0: 64 62 2c 20 53 65 6c 65 63 74 20 2a 70 2c 20 69  db, Select *p, i
87f0: 6e 74 20 66 6c 61 67 73 29 7b 0a 20 20 53 65 6c  nt flags){.  Sel
8800: 65 63 74 20 2a 70 4e 65 77 2c 20 2a 70 50 72 69  ect *pNew, *pPri
8810: 6f 72 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  or;.  if( p==0 )
8820: 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 70 4e 65   return 0;.  pNe
8830: 77 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  w = sqlite3DbMal
8840: 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65 6f  locRaw(db, sizeo
8850: 66 28 2a 70 29 20 29 3b 0a 20 20 69 66 28 20 70  f(*p) );.  if( p
8860: 4e 65 77 3d 3d 30 20 29 20 72 65 74 75 72 6e 20  New==0 ) return 
8870: 30 3b 0a 20 20 70 4e 65 77 2d 3e 70 45 4c 69 73  0;.  pNew->pELis
8880: 74 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 4c  t = sqlite3ExprL
8890: 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e 70 45  istDup(db, p->pE
88a0: 4c 69 73 74 2c 20 66 6c 61 67 73 29 3b 0a 20 20  List, flags);.  
88b0: 70 4e 65 77 2d 3e 70 53 72 63 20 3d 20 73 71 6c  pNew->pSrc = sql
88c0: 69 74 65 33 53 72 63 4c 69 73 74 44 75 70 28 64  ite3SrcListDup(d
88d0: 62 2c 20 70 2d 3e 70 53 72 63 2c 20 66 6c 61 67  b, p->pSrc, flag
88e0: 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 57 68 65  s);.  pNew->pWhe
88f0: 72 65 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  re = sqlite3Expr
8900: 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 68 65 72  Dup(db, p->pWher
8910: 65 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65  e, flags);.  pNe
8920: 77 2d 3e 70 47 72 6f 75 70 42 79 20 3d 20 73 71  w->pGroupBy = sq
8930: 6c 69 74 65 33 45 78 70 72 4c 69 73 74 44 75 70  lite3ExprListDup
8940: 28 64 62 2c 20 70 2d 3e 70 47 72 6f 75 70 42 79  (db, p->pGroupBy
8950: 2c 20 66 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77  , flags);.  pNew
8960: 2d 3e 70 48 61 76 69 6e 67 20 3d 20 73 71 6c 69  ->pHaving = sqli
8970: 74 65 33 45 78 70 72 44 75 70 28 64 62 2c 20 70  te3ExprDup(db, p
8980: 2d 3e 70 48 61 76 69 6e 67 2c 20 66 6c 61 67 73  ->pHaving, flags
8990: 29 3b 0a 20 20 70 4e 65 77 2d 3e 70 4f 72 64 65  );.  pNew->pOrde
89a0: 72 42 79 20 3d 20 73 71 6c 69 74 65 33 45 78 70  rBy = sqlite3Exp
89b0: 72 4c 69 73 74 44 75 70 28 64 62 2c 20 70 2d 3e  rListDup(db, p->
89c0: 70 4f 72 64 65 72 42 79 2c 20 66 6c 61 67 73 29  pOrderBy, flags)
89d0: 3b 0a 20 20 70 4e 65 77 2d 3e 6f 70 20 3d 20 70  ;.  pNew->op = p
89e0: 2d 3e 6f 70 3b 0a 20 20 70 4e 65 77 2d 3e 70 50  ->op;.  pNew->pP
89f0: 72 69 6f 72 20 3d 20 70 50 72 69 6f 72 20 3d 20  rior = pPrior = 
8a00: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 75 70  sqlite3SelectDup
8a10: 28 64 62 2c 20 70 2d 3e 70 50 72 69 6f 72 2c 20  (db, p->pPrior, 
8a20: 66 6c 61 67 73 29 3b 0a 20 20 69 66 28 20 70 50  flags);.  if( pP
8a30: 72 69 6f 72 20 29 20 70 50 72 69 6f 72 2d 3e 70  rior ) pPrior->p
8a40: 4e 65 78 74 20 3d 20 70 4e 65 77 3b 0a 20 20 70  Next = pNew;.  p
8a50: 4e 65 77 2d 3e 70 4e 65 78 74 20 3d 20 30 3b 0a  New->pNext = 0;.
8a60: 20 20 70 4e 65 77 2d 3e 70 4c 69 6d 69 74 20 3d    pNew->pLimit =
8a70: 20 73 71 6c 69 74 65 33 45 78 70 72 44 75 70 28   sqlite3ExprDup(
8a80: 64 62 2c 20 70 2d 3e 70 4c 69 6d 69 74 2c 20 66  db, p->pLimit, f
8a90: 6c 61 67 73 29 3b 0a 20 20 70 4e 65 77 2d 3e 70  lags);.  pNew->p
8aa0: 4f 66 66 73 65 74 20 3d 20 73 71 6c 69 74 65 33  Offset = sqlite3
8ab0: 45 78 70 72 44 75 70 28 64 62 2c 20 70 2d 3e 70  ExprDup(db, p->p
8ac0: 4f 66 66 73 65 74 2c 20 66 6c 61 67 73 29 3b 0a  Offset, flags);.
8ad0: 20 20 70 4e 65 77 2d 3e 69 4c 69 6d 69 74 20 3d    pNew->iLimit =
8ae0: 20 30 3b 0a 20 20 70 4e 65 77 2d 3e 69 4f 66 66   0;.  pNew->iOff
8af0: 73 65 74 20 3d 20 30 3b 0a 20 20 70 4e 65 77 2d  set = 0;.  pNew-
8b00: 3e 73 65 6c 46 6c 61 67 73 20 3d 20 70 2d 3e 73  >selFlags = p->s
8b10: 65 6c 46 6c 61 67 73 20 26 20 7e 53 46 5f 55 73  elFlags & ~SF_Us
8b20: 65 73 45 70 68 65 6d 65 72 61 6c 3b 0a 20 20 70  esEphemeral;.  p
8b30: 4e 65 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68  New->addrOpenEph
8b40: 6d 5b 30 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65  m[0] = -1;.  pNe
8b50: 77 2d 3e 61 64 64 72 4f 70 65 6e 45 70 68 6d 5b  w->addrOpenEphm[
8b60: 31 5d 20 3d 20 2d 31 3b 0a 20 20 70 4e 65 77 2d  1] = -1;.  pNew-
8b70: 3e 6e 53 65 6c 65 63 74 52 6f 77 20 3d 20 70 2d  >nSelectRow = p-
8b80: 3e 6e 53 65 6c 65 63 74 52 6f 77 3b 0a 20 20 70  >nSelectRow;.  p
8b90: 4e 65 77 2d 3e 70 57 69 74 68 20 3d 20 77 69 74  New->pWith = wit
8ba0: 68 44 75 70 28 64 62 2c 20 70 2d 3e 70 57 69 74  hDup(db, p->pWit
8bb0: 68 29 3b 0a 20 20 72 65 74 75 72 6e 20 70 4e 65  h);.  return pNe
8bc0: 77 3b 0a 7d 0a 23 65 6c 73 65 0a 53 65 6c 65 63  w;.}.#else.Selec
8bd0: 74 20 2a 73 71 6c 69 74 65 33 53 65 6c 65 63 74  t *sqlite3Select
8be0: 44 75 70 28 73 71 6c 69 74 65 33 20 2a 64 62 2c  Dup(sqlite3 *db,
8bf0: 20 53 65 6c 65 63 74 20 2a 70 2c 20 69 6e 74 20   Select *p, int 
8c00: 66 6c 61 67 73 29 7b 0a 20 20 61 73 73 65 72 74  flags){.  assert
8c10: 28 20 70 3d 3d 30 20 29 3b 0a 20 20 72 65 74 75  ( p==0 );.  retu
8c20: 72 6e 20 30 3b 0a 7d 0a 23 65 6e 64 69 66 0a 0a  rn 0;.}.#endif..
8c30: 0a 2f 2a 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77  ./*.** Add a new
8c40: 20 65 6c 65 6d 65 6e 74 20 74 6f 20 74 68 65 20   element to the 
8c50: 65 6e 64 20 6f 66 20 61 6e 20 65 78 70 72 65 73  end of an expres
8c60: 73 69 6f 6e 20 6c 69 73 74 2e 20 20 49 66 20 70  sion list.  If p
8c70: 4c 69 73 74 20 69 73 0a 2a 2a 20 69 6e 69 74 69  List is.** initi
8c80: 61 6c 6c 79 20 4e 55 4c 4c 2c 20 74 68 65 6e 20  ally NULL, then 
8c90: 63 72 65 61 74 65 20 61 20 6e 65 77 20 65 78 70  create a new exp
8ca0: 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a  ression list..**
8cb0: 0a 2a 2a 20 49 66 20 61 20 6d 65 6d 6f 72 79 20  .** If a memory 
8cc0: 61 6c 6c 6f 63 61 74 69 6f 6e 20 65 72 72 6f 72  allocation error
8cd0: 20 6f 63 63 75 72 73 2c 20 74 68 65 20 65 6e 74   occurs, the ent
8ce0: 69 72 65 20 6c 69 73 74 20 69 73 20 66 72 65 65  ire list is free
8cf0: 64 20 61 6e 64 0a 2a 2a 20 4e 55 4c 4c 20 69 73  d and.** NULL is
8d00: 20 72 65 74 75 72 6e 65 64 2e 20 20 49 66 20 6e   returned.  If n
8d10: 6f 6e 2d 4e 55 4c 4c 20 69 73 20 72 65 74 75 72  on-NULL is retur
8d20: 6e 65 64 2c 20 74 68 65 6e 20 69 74 20 69 73 20  ned, then it is 
8d30: 67 75 61 72 61 6e 74 65 65 64 0a 2a 2a 20 74 68  guaranteed.** th
8d40: 61 74 20 74 68 65 20 6e 65 77 20 65 6e 74 72 79  at the new entry
8d50: 20 77 61 73 20 73 75 63 63 65 73 73 66 75 6c 6c   was successfull
8d60: 79 20 61 70 70 65 6e 64 65 64 2e 0a 2a 2f 0a 45  y appended..*/.E
8d70: 78 70 72 4c 69 73 74 20 2a 73 71 6c 69 74 65 33  xprList *sqlite3
8d80: 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 0a  ExprListAppend(.
8d90: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
8da0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
8db0: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
8dc0: 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73    ExprList *pLis
8dd0: 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73  t,        /* Lis
8de0: 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20 61 70  t to which to ap
8df0: 70 65 6e 64 2e 20 4d 69 67 68 74 20 62 65 20 4e  pend. Might be N
8e00: 55 4c 4c 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ULL */.  Expr *p
8e10: 45 78 70 72 20 20 20 20 20 20 20 20 20 20 20 20  Expr            
8e20: 20 2f 2a 20 45 78 70 72 65 73 73 69 6f 6e 20 74   /* Expression t
8e30: 6f 20 62 65 20 61 70 70 65 6e 64 65 64 2e 20 4d  o be appended. M
8e40: 69 67 68 74 20 62 65 20 4e 55 4c 4c 20 2a 2f 0a  ight be NULL */.
8e50: 29 7b 0a 20 20 73 71 6c 69 74 65 33 20 2a 64 62  ){.  sqlite3 *db
8e60: 20 3d 20 70 50 61 72 73 65 2d 3e 64 62 3b 0a 20   = pParse->db;. 
8e70: 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29 7b   if( pList==0 ){
8e80: 0a 20 20 20 20 70 4c 69 73 74 20 3d 20 73 71 6c  .    pList = sql
8e90: 69 74 65 33 44 62 4d 61 6c 6c 6f 63 5a 65 72 6f  ite3DbMallocZero
8ea0: 28 64 62 2c 20 73 69 7a 65 6f 66 28 45 78 70 72  (db, sizeof(Expr
8eb0: 4c 69 73 74 29 20 29 3b 0a 20 20 20 20 69 66 28  List) );.    if(
8ec0: 20 70 4c 69 73 74 3d 3d 30 20 29 7b 0a 20 20 20   pList==0 ){.   
8ed0: 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65 6d 3b 0a     goto no_mem;.
8ee0: 20 20 20 20 7d 0a 20 20 20 20 70 4c 69 73 74 2d      }.    pList-
8ef0: 3e 61 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61  >a = sqlite3DbMa
8f00: 6c 6c 6f 63 52 61 77 28 64 62 2c 20 73 69 7a 65  llocRaw(db, size
8f10: 6f 66 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29  of(pList->a[0]))
8f20: 3b 0a 20 20 20 20 69 66 28 20 70 4c 69 73 74 2d  ;.    if( pList-
8f30: 3e 61 3d 3d 30 20 29 20 67 6f 74 6f 20 6e 6f 5f  >a==0 ) goto no_
8f40: 6d 65 6d 3b 0a 20 20 7d 65 6c 73 65 20 69 66 28  mem;.  }else if(
8f50: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 20 26   (pList->nExpr &
8f60: 20 28 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31   (pList->nExpr-1
8f70: 29 29 3d 3d 30 20 29 7b 0a 20 20 20 20 73 74 72  ))==0 ){.    str
8f80: 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65  uct ExprList_ite
8f90: 6d 20 2a 61 3b 0a 20 20 20 20 61 73 73 65 72 74  m *a;.    assert
8fa0: 28 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3e 30  ( pList->nExpr>0
8fb0: 20 29 3b 0a 20 20 20 20 61 20 3d 20 73 71 6c 69   );.    a = sqli
8fc0: 74 65 33 44 62 52 65 61 6c 6c 6f 63 28 64 62 2c  te3DbRealloc(db,
8fd0: 20 70 4c 69 73 74 2d 3e 61 2c 20 70 4c 69 73 74   pList->a, pList
8fe0: 2d 3e 6e 45 78 70 72 2a 32 2a 73 69 7a 65 6f 66  ->nExpr*2*sizeof
8ff0: 28 70 4c 69 73 74 2d 3e 61 5b 30 5d 29 29 3b 0a  (pList->a[0]));.
9000: 20 20 20 20 69 66 28 20 61 3d 3d 30 20 29 7b 0a      if( a==0 ){.
9010: 20 20 20 20 20 20 67 6f 74 6f 20 6e 6f 5f 6d 65        goto no_me
9020: 6d 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 4c 69  m;.    }.    pLi
9030: 73 74 2d 3e 61 20 3d 20 61 3b 0a 20 20 7d 0a 20  st->a = a;.  }. 
9040: 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e   assert( pList->
9050: 61 21 3d 30 20 29 3b 0a 20 20 69 66 28 20 31 20  a!=0 );.  if( 1 
9060: 29 7b 0a 20 20 20 20 73 74 72 75 63 74 20 45 78  ){.    struct Ex
9070: 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74  prList_item *pIt
9080: 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70  em = &pList->a[p
9090: 4c 69 73 74 2d 3e 6e 45 78 70 72 2b 2b 5d 3b 0a  List->nExpr++];.
90a0: 20 20 20 20 6d 65 6d 73 65 74 28 70 49 74 65 6d      memset(pItem
90b0: 2c 20 30 2c 20 73 69 7a 65 6f 66 28 2a 70 49 74  , 0, sizeof(*pIt
90c0: 65 6d 29 29 3b 0a 20 20 20 20 70 49 74 65 6d 2d  em));.    pItem-
90d0: 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b 0a  >pExpr = pExpr;.
90e0: 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 70 4c 69    }.  return pLi
90f0: 73 74 3b 0a 0a 6e 6f 5f 6d 65 6d 3a 20 20 20 20  st;..no_mem:    
9100: 20 0a 20 20 2f 2a 20 41 76 6f 69 64 20 6c 65 61   .  /* Avoid lea
9110: 6b 69 6e 67 20 6d 65 6d 6f 72 79 20 69 66 20 6d  king memory if m
9120: 61 6c 6c 6f 63 20 68 61 73 20 66 61 69 6c 65 64  alloc has failed
9130: 2e 20 2a 2f 0a 20 20 73 71 6c 69 74 65 33 45 78  . */.  sqlite3Ex
9140: 70 72 44 65 6c 65 74 65 28 64 62 2c 20 70 45 78  prDelete(db, pEx
9150: 70 72 29 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  pr);.  sqlite3Ex
9160: 70 72 4c 69 73 74 44 65 6c 65 74 65 28 64 62 2c  prListDelete(db,
9170: 20 70 4c 69 73 74 29 3b 0a 20 20 72 65 74 75 72   pList);.  retur
9180: 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 53 65  n 0;.}../*.** Se
9190: 74 20 74 68 65 20 45 78 70 72 4c 69 73 74 2e 61  t the ExprList.a
91a0: 5b 5d 2e 7a 4e 61 6d 65 20 65 6c 65 6d 65 6e 74  [].zName element
91b0: 20 6f 66 20 74 68 65 20 6d 6f 73 74 20 72 65 63   of the most rec
91c0: 65 6e 74 6c 79 20 61 64 64 65 64 20 69 74 65 6d  ently added item
91d0: 0a 2a 2a 20 6f 6e 20 74 68 65 20 65 78 70 72 65  .** on the expre
91e0: 73 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2a 0a 2a  ssion list..**.*
91f0: 2a 20 70 4c 69 73 74 20 6d 69 67 68 74 20 62 65  * pList might be
9200: 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77 69 6e 67 20   NULL following 
9210: 61 6e 20 4f 4f 4d 20 65 72 72 6f 72 2e 20 20 42  an OOM error.  B
9220: 75 74 20 70 4e 61 6d 65 20 73 68 6f 75 6c 64 20  ut pName should 
9230: 6e 65 76 65 72 20 62 65 0a 2a 2a 20 4e 55 4c 4c  never be.** NULL
9240: 2e 20 20 49 66 20 61 20 6d 65 6d 6f 72 79 20 61  .  If a memory a
9250: 6c 6c 6f 63 61 74 69 6f 6e 20 66 61 69 6c 73 2c  llocation fails,
9260: 20 74 68 65 20 70 50 61 72 73 65 2d 3e 64 62 2d   the pParse->db-
9270: 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65 64 20 66 6c  >mallocFailed fl
9280: 61 67 0a 2a 2a 20 69 73 20 73 65 74 2e 0a 2a 2f  ag.** is set..*/
9290: 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
92a0: 72 4c 69 73 74 53 65 74 4e 61 6d 65 28 0a 20 20  rListSetName(.  
92b0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 20  Parse *pParse,  
92c0: 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72 73 69          /* Parsi
92d0: 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a 20 20  ng context */.  
92e0: 45 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 2c  ExprList *pList,
92f0: 20 20 20 20 20 20 20 20 2f 2a 20 4c 69 73 74 20          /* List 
9300: 74 6f 20 77 68 69 63 68 20 74 6f 20 61 64 64 20  to which to add 
9310: 74 68 65 20 73 70 61 6e 2e 20 2a 2f 0a 20 20 54  the span. */.  T
9320: 6f 6b 65 6e 20 2a 70 4e 61 6d 65 2c 20 20 20 20  oken *pName,    
9330: 20 20 20 20 20 20 20 2f 2a 20 4e 61 6d 65 20 74         /* Name t
9340: 6f 20 62 65 20 61 64 64 65 64 20 2a 2f 0a 20 20  o be added */.  
9350: 69 6e 74 20 64 65 71 75 6f 74 65 20 20 20 20 20  int dequote     
9360: 20 20 20 20 20 20 20 20 2f 2a 20 54 72 75 65 20          /* True 
9370: 74 6f 20 63 61 75 73 65 20 74 68 65 20 6e 61 6d  to cause the nam
9380: 65 20 74 6f 20 62 65 20 64 65 71 75 6f 74 65 64  e to be dequoted
9390: 20 2a 2f 0a 29 7b 0a 20 20 61 73 73 65 72 74 28   */.){.  assert(
93a0: 20 70 4c 69 73 74 21 3d 30 20 7c 7c 20 70 50 61   pList!=0 || pPa
93b0: 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46  rse->db->mallocF
93c0: 61 69 6c 65 64 21 3d 30 20 29 3b 0a 20 20 69 66  ailed!=0 );.  if
93d0: 28 20 70 4c 69 73 74 20 29 7b 0a 20 20 20 20 73  ( pList ){.    s
93e0: 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
93f0: 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
9400: 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d 3e 6e  assert( pList->n
9410: 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20 70 49  Expr>0 );.    pI
9420: 74 65 6d 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b  tem = &pList->a[
9430: 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b  pList->nExpr-1];
9440: 0a 20 20 20 20 61 73 73 65 72 74 28 20 70 49 74  .    assert( pIt
9450: 65 6d 2d 3e 7a 4e 61 6d 65 3d 3d 30 20 29 3b 0a  em->zName==0 );.
9460: 20 20 20 20 70 49 74 65 6d 2d 3e 7a 4e 61 6d 65      pItem->zName
9470: 20 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e   = sqlite3DbStrN
9480: 44 75 70 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  Dup(pParse->db, 
9490: 70 4e 61 6d 65 2d 3e 7a 2c 20 70 4e 61 6d 65 2d  pName->z, pName-
94a0: 3e 6e 29 3b 0a 20 20 20 20 69 66 28 20 64 65 71  >n);.    if( deq
94b0: 75 6f 74 65 20 26 26 20 70 49 74 65 6d 2d 3e 7a  uote && pItem->z
94c0: 4e 61 6d 65 20 29 20 73 71 6c 69 74 65 33 44 65  Name ) sqlite3De
94d0: 71 75 6f 74 65 28 70 49 74 65 6d 2d 3e 7a 4e 61  quote(pItem->zNa
94e0: 6d 65 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a  me);.  }.}../*.*
94f0: 2a 20 53 65 74 20 74 68 65 20 45 78 70 72 4c 69  * Set the ExprLi
9500: 73 74 2e 61 5b 5d 2e 7a 53 70 61 6e 20 65 6c 65  st.a[].zSpan ele
9510: 6d 65 6e 74 20 6f 66 20 74 68 65 20 6d 6f 73 74  ment of the most
9520: 20 72 65 63 65 6e 74 6c 79 20 61 64 64 65 64 20   recently added 
9530: 69 74 65 6d 0a 2a 2a 20 6f 6e 20 74 68 65 20 65  item.** on the e
9540: 78 70 72 65 73 73 69 6f 6e 20 6c 69 73 74 2e 0a  xpression list..
9550: 2a 2a 0a 2a 2a 20 70 4c 69 73 74 20 6d 69 67 68  **.** pList migh
9560: 74 20 62 65 20 4e 55 4c 4c 20 66 6f 6c 6c 6f 77  t be NULL follow
9570: 69 6e 67 20 61 6e 20 4f 4f 4d 20 65 72 72 6f 72  ing an OOM error
9580: 2e 20 20 42 75 74 20 70 53 70 61 6e 20 73 68 6f  .  But pSpan sho
9590: 75 6c 64 20 6e 65 76 65 72 20 62 65 0a 2a 2a 20  uld never be.** 
95a0: 4e 55 4c 4c 2e 20 20 49 66 20 61 20 6d 65 6d 6f  NULL.  If a memo
95b0: 72 79 20 61 6c 6c 6f 63 61 74 69 6f 6e 20 66 61  ry allocation fa
95c0: 69 6c 73 2c 20 74 68 65 20 70 50 61 72 73 65 2d  ils, the pParse-
95d0: 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c 65  >db->mallocFaile
95e0: 64 20 66 6c 61 67 0a 2a 2a 20 69 73 20 73 65 74  d flag.** is set
95f0: 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65  ..*/.void sqlite
9600: 33 45 78 70 72 4c 69 73 74 53 65 74 53 70 61 6e  3ExprListSetSpan
9610: 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61 72 73  (.  Parse *pPars
9620: 65 2c 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50  e,          /* P
9630: 61 72 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  arsing context *
9640: 2f 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 4c  /.  ExprList *pL
9650: 69 73 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 4c  ist,        /* L
9660: 69 73 74 20 74 6f 20 77 68 69 63 68 20 74 6f 20  ist to which to 
9670: 61 64 64 20 74 68 65 20 73 70 61 6e 2e 20 2a 2f  add the span. */
9680: 0a 20 20 45 78 70 72 53 70 61 6e 20 2a 70 53 70  .  ExprSpan *pSp
9690: 61 6e 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68  an         /* Th
96a0: 65 20 73 70 61 6e 20 74 6f 20 62 65 20 61 64 64  e span to be add
96b0: 65 64 20 2a 2f 0a 29 7b 0a 20 20 73 71 6c 69 74  ed */.){.  sqlit
96c0: 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73 65 2d  e3 *db = pParse-
96d0: 3e 64 62 3b 0a 20 20 61 73 73 65 72 74 28 20 70  >db;.  assert( p
96e0: 4c 69 73 74 21 3d 30 20 7c 7c 20 64 62 2d 3e 6d  List!=0 || db->m
96f0: 61 6c 6c 6f 63 46 61 69 6c 65 64 21 3d 30 20 29  allocFailed!=0 )
9700: 3b 0a 20 20 69 66 28 20 70 4c 69 73 74 20 29 7b  ;.  if( pList ){
9710: 0a 20 20 20 20 73 74 72 75 63 74 20 45 78 70 72  .    struct Expr
9720: 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d  List_item *pItem
9730: 20 3d 20 26 70 4c 69 73 74 2d 3e 61 5b 70 4c 69   = &pList->a[pLi
9740: 73 74 2d 3e 6e 45 78 70 72 2d 31 5d 3b 0a 20 20  st->nExpr-1];.  
9750: 20 20 61 73 73 65 72 74 28 20 70 4c 69 73 74 2d    assert( pList-
9760: 3e 6e 45 78 70 72 3e 30 20 29 3b 0a 20 20 20 20  >nExpr>0 );.    
9770: 61 73 73 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c  assert( db->mall
9780: 6f 63 46 61 69 6c 65 64 20 7c 7c 20 70 49 74 65  ocFailed || pIte
9790: 6d 2d 3e 70 45 78 70 72 3d 3d 70 53 70 61 6e 2d  m->pExpr==pSpan-
97a0: 3e 70 45 78 70 72 20 29 3b 0a 20 20 20 20 73 71  >pExpr );.    sq
97b0: 6c 69 74 65 33 44 62 46 72 65 65 28 64 62 2c 20  lite3DbFree(db, 
97c0: 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29 3b 0a 20  pItem->zSpan);. 
97d0: 20 20 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 20     pItem->zSpan 
97e0: 3d 20 73 71 6c 69 74 65 33 44 62 53 74 72 4e 44  = sqlite3DbStrND
97f0: 75 70 28 64 62 2c 20 28 63 68 61 72 2a 29 70 53  up(db, (char*)pS
9800: 70 61 6e 2d 3e 7a 53 74 61 72 74 2c 0a 20 20 20  pan->zStart,.   
9810: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9820: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
9830: 20 28 69 6e 74 29 28 70 53 70 61 6e 2d 3e 7a 45   (int)(pSpan->zE
9840: 6e 64 20 2d 20 70 53 70 61 6e 2d 3e 7a 53 74 61  nd - pSpan->zSta
9850: 72 74 29 29 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  rt));.  }.}../*.
9860: 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72 65 73  ** If the expres
9870: 73 69 6f 6e 20 6c 69 73 74 20 70 45 4c 69 73 74  sion list pEList
9880: 20 63 6f 6e 74 61 69 6e 73 20 6d 6f 72 65 20 74   contains more t
9890: 68 61 6e 20 69 4c 69 6d 69 74 20 65 6c 65 6d 65  han iLimit eleme
98a0: 6e 74 73 2c 0a 2a 2a 20 6c 65 61 76 65 20 61 6e  nts,.** leave an
98b0: 20 65 72 72 6f 72 20 6d 65 73 73 61 67 65 20 69   error message i
98c0: 6e 20 70 50 61 72 73 65 2e 0a 2a 2f 0a 76 6f 69  n pParse..*/.voi
98d0: 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  d sqlite3ExprLis
98e0: 74 43 68 65 63 6b 4c 65 6e 67 74 68 28 0a 20 20  tCheckLength(.  
98f0: 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 0a 20  Parse *pParse,. 
9900: 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69 73   ExprList *pELis
9910: 74 2c 0a 20 20 63 6f 6e 73 74 20 63 68 61 72 20  t,.  const char 
9920: 2a 7a 4f 62 6a 65 63 74 0a 29 7b 0a 20 20 69 6e  *zObject.){.  in
9930: 74 20 6d 78 20 3d 20 70 50 61 72 73 65 2d 3e 64  t mx = pParse->d
9940: 62 2d 3e 61 4c 69 6d 69 74 5b 53 51 4c 49 54 45  b->aLimit[SQLITE
9950: 5f 4c 49 4d 49 54 5f 43 4f 4c 55 4d 4e 5d 3b 0a  _LIMIT_COLUMN];.
9960: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 4c 69    testcase( pELi
9970: 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e 6e 45  st && pEList->nE
9980: 78 70 72 3d 3d 6d 78 20 29 3b 0a 20 20 74 65 73  xpr==mx );.  tes
9990: 74 63 61 73 65 28 20 70 45 4c 69 73 74 20 26 26  tcase( pEList &&
99a0: 20 70 45 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d   pEList->nExpr==
99b0: 6d 78 2b 31 20 29 3b 0a 20 20 69 66 28 20 70 45  mx+1 );.  if( pE
99c0: 4c 69 73 74 20 26 26 20 70 45 4c 69 73 74 2d 3e  List && pEList->
99d0: 6e 45 78 70 72 3e 6d 78 20 29 7b 0a 20 20 20 20  nExpr>mx ){.    
99e0: 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
99f0: 70 50 61 72 73 65 2c 20 22 74 6f 6f 20 6d 61 6e  pParse, "too man
9a00: 79 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 25 73 22  y columns in %s"
9a10: 2c 20 7a 4f 62 6a 65 63 74 29 3b 0a 20 20 7d 0a  , zObject);.  }.
9a20: 7d 0a 0a 2f 2a 0a 2a 2a 20 44 65 6c 65 74 65 20  }../*.** Delete 
9a30: 61 6e 20 65 6e 74 69 72 65 20 65 78 70 72 65 73  an entire expres
9a40: 73 69 6f 6e 20 6c 69 73 74 2e 0a 2a 2f 0a 76 6f  sion list..*/.vo
9a50: 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  id sqlite3ExprLi
9a60: 73 74 44 65 6c 65 74 65 28 73 71 6c 69 74 65 33  stDelete(sqlite3
9a70: 20 2a 64 62 2c 20 45 78 70 72 4c 69 73 74 20 2a   *db, ExprList *
9a80: 70 4c 69 73 74 29 7b 0a 20 20 69 6e 74 20 69 3b  pList){.  int i;
9a90: 0a 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69  .  struct ExprLi
9aa0: 73 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a  st_item *pItem;.
9ab0: 20 20 69 66 28 20 70 4c 69 73 74 3d 3d 30 20 29    if( pList==0 )
9ac0: 20 72 65 74 75 72 6e 3b 0a 20 20 61 73 73 65 72   return;.  asser
9ad0: 74 28 20 70 4c 69 73 74 2d 3e 61 21 3d 30 20 7c  t( pList->a!=0 |
9ae0: 7c 20 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3d 3d  | pList->nExpr==
9af0: 30 20 29 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d  0 );.  for(pItem
9b00: 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20  =pList->a, i=0; 
9b10: 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20  i<pList->nExpr; 
9b20: 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20  i++, pItem++){. 
9b30: 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 44 65     sqlite3ExprDe
9b40: 6c 65 74 65 28 64 62 2c 20 70 49 74 65 6d 2d 3e  lete(db, pItem->
9b50: 70 45 78 70 72 29 3b 0a 20 20 20 20 73 71 6c 69  pExpr);.    sqli
9b60: 74 65 33 44 62 46 72 65 65 28 64 62 2c 20 70 49  te3DbFree(db, pI
9b70: 74 65 6d 2d 3e 7a 4e 61 6d 65 29 3b 0a 20 20 20  tem->zName);.   
9b80: 20 73 71 6c 69 74 65 33 44 62 46 72 65 65 28 64   sqlite3DbFree(d
9b90: 62 2c 20 70 49 74 65 6d 2d 3e 7a 53 70 61 6e 29  b, pItem->zSpan)
9ba0: 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 44  ;.  }.  sqlite3D
9bb0: 62 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 2d  bFree(db, pList-
9bc0: 3e 61 29 3b 0a 20 20 73 71 6c 69 74 65 33 44 62  >a);.  sqlite3Db
9bd0: 46 72 65 65 28 64 62 2c 20 70 4c 69 73 74 29 3b  Free(db, pList);
9be0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 54 68 65 73 65 20  .}../*.** These 
9bf0: 72 6f 75 74 69 6e 65 73 20 61 72 65 20 57 61 6c  routines are Wal
9c00: 6b 65 72 20 63 61 6c 6c 62 61 63 6b 73 2e 20 20  ker callbacks.  
9c10: 57 61 6c 6b 65 72 2e 75 2e 70 69 20 69 73 20 61  Walker.u.pi is a
9c20: 20 70 6f 69 6e 74 65 72 0a 2a 2a 20 74 6f 20 61   pointer.** to a
9c30: 6e 20 69 6e 74 65 67 65 72 2e 20 20 54 68 65 73  n integer.  Thes
9c40: 65 20 72 6f 75 74 69 6e 65 73 20 61 72 65 20 63  e routines are c
9c50: 68 65 63 6b 69 6e 67 20 61 6e 20 65 78 70 72 65  hecking an expre
9c60: 73 73 69 6f 6e 20 74 6f 20 73 65 65 0a 2a 2a 20  ssion to see.** 
9c70: 69 66 20 69 74 20 69 73 20 61 20 63 6f 6e 73 74  if it is a const
9c80: 61 6e 74 2e 20 20 53 65 74 20 2a 57 61 6c 6b 65  ant.  Set *Walke
9c90: 72 2e 75 2e 70 69 20 74 6f 20 30 20 69 66 20 74  r.u.pi to 0 if t
9ca0: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
9cb0: 0a 2a 2a 20 6e 6f 74 20 63 6f 6e 73 74 61 6e 74  .** not constant
9cc0: 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 73 65 20 63 61  ..**.** These ca
9cd0: 6c 6c 62 61 63 6b 20 72 6f 75 74 69 6e 65 73 20  llback routines 
9ce0: 61 72 65 20 75 73 65 64 20 74 6f 20 69 6d 70 6c  are used to impl
9cf0: 65 6d 65 6e 74 20 74 68 65 20 66 6f 6c 6c 6f 77  ement the follow
9d00: 69 6e 67 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20 73  ing:.**.**     s
9d10: 71 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73  qlite3ExprIsCons
9d20: 74 61 6e 74 28 29 0a 2a 2a 20 20 20 20 20 73 71  tant().**     sq
9d30: 6c 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74  lite3ExprIsConst
9d40: 61 6e 74 4e 6f 74 4a 6f 69 6e 28 29 0a 2a 2a 20  antNotJoin().** 
9d50: 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
9d60: 73 43 6f 6e 73 74 61 6e 74 4f 72 46 75 6e 63 74  sConstantOrFunct
9d70: 69 6f 6e 28 29 0a 2a 2a 0a 2a 2f 0a 73 74 61 74  ion().**.*/.stat
9d80: 69 63 20 69 6e 74 20 65 78 70 72 4e 6f 64 65 49  ic int exprNodeI
9d90: 73 43 6f 6e 73 74 61 6e 74 28 57 61 6c 6b 65 72  sConstant(Walker
9da0: 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70 72 20   *pWalker, Expr 
9db0: 2a 70 45 78 70 72 29 7b 0a 0a 20 20 2f 2a 20 49  *pExpr){..  /* I
9dc0: 66 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20 69  f pWalker->u.i i
9dd0: 73 20 33 20 74 68 65 6e 20 61 6e 79 20 74 65 72  s 3 then any ter
9de0: 6d 20 6f 66 20 74 68 65 20 65 78 70 72 65 73 73  m of the express
9df0: 69 6f 6e 20 74 68 61 74 20 63 6f 6d 65 73 20 66  ion that comes f
9e00: 72 6f 6d 0a 20 20 2a 2a 20 74 68 65 20 4f 4e 20  rom.  ** the ON 
9e10: 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73 65 73  or USING clauses
9e20: 20 6f 66 20 61 20 6a 6f 69 6e 20 64 69 73 71 75   of a join disqu
9e30: 61 6c 69 66 69 65 73 20 74 68 65 20 65 78 70 72  alifies the expr
9e40: 65 73 73 69 6f 6e 0a 20 20 2a 2a 20 66 72 6f 6d  ession.  ** from
9e50: 20 62 65 69 6e 67 20 63 6f 6e 73 69 64 65 72 65   being considere
9e60: 64 20 63 6f 6e 73 74 61 6e 74 2e 20 2a 2f 0a 20  d constant. */. 
9e70: 20 69 66 28 20 70 57 61 6c 6b 65 72 2d 3e 75 2e   if( pWalker->u.
9e80: 69 3d 3d 33 20 26 26 20 45 78 70 72 48 61 73 50  i==3 && ExprHasP
9e90: 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
9ea0: 50 5f 46 72 6f 6d 4a 6f 69 6e 29 20 29 7b 0a 20  P_FromJoin) ){. 
9eb0: 20 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69 20     pWalker->u.i 
9ec0: 3d 20 30 3b 0a 20 20 20 20 72 65 74 75 72 6e 20  = 0;.    return 
9ed0: 57 52 43 5f 41 62 6f 72 74 3b 0a 20 20 7d 0a 0a  WRC_Abort;.  }..
9ee0: 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72 2d    switch( pExpr-
9ef0: 3e 6f 70 20 29 7b 0a 20 20 20 20 2f 2a 20 43 6f  >op ){.    /* Co
9f00: 6e 73 69 64 65 72 20 66 75 6e 63 74 69 6f 6e 73  nsider functions
9f10: 20 74 6f 20 62 65 20 63 6f 6e 73 74 61 6e 74 20   to be constant 
9f20: 69 66 20 61 6c 6c 20 74 68 65 69 72 20 61 72 67  if all their arg
9f30: 75 6d 65 6e 74 73 20 61 72 65 20 63 6f 6e 73 74  uments are const
9f40: 61 6e 74 0a 20 20 20 20 2a 2a 20 61 6e 64 20 65  ant.    ** and e
9f50: 69 74 68 65 72 20 70 57 61 6c 6b 65 72 2d 3e 75  ither pWalker->u
9f60: 2e 69 3d 3d 32 20 6f 72 20 74 68 65 20 66 75 6e  .i==2 or the fun
9f70: 63 74 69 6f 6e 20 61 73 20 74 68 65 20 53 51 4c  ction as the SQL
9f80: 49 54 45 5f 46 55 4e 43 5f 43 4f 4e 53 54 0a 20  ITE_FUNC_CONST. 
9f90: 20 20 20 2a 2a 20 66 6c 61 67 2e 20 2a 2f 0a 20     ** flag. */. 
9fa0: 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
9fb0: 49 4f 4e 3a 0a 20 20 20 20 20 20 69 66 28 20 70  ION:.      if( p
9fc0: 57 61 6c 6b 65 72 2d 3e 75 2e 69 3d 3d 32 20 7c  Walker->u.i==2 |
9fd0: 7c 20 45 78 70 72 48 61 73 50 72 6f 70 65 72 74  | ExprHasPropert
9fe0: 79 28 70 45 78 70 72 2c 45 50 5f 43 6f 6e 73 74  y(pExpr,EP_Const
9ff0: 61 6e 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  ant) ){.        
a000: 72 65 74 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69  return WRC_Conti
a010: 6e 75 65 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  nue;.      }.   
a020: 20 20 20 2f 2a 20 46 61 6c 6c 20 74 68 72 6f 75     /* Fall throu
a030: 67 68 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54  gh */.    case T
a040: 4b 5f 49 44 3a 0a 20 20 20 20 63 61 73 65 20 54  K_ID:.    case T
a050: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 63 61  K_COLUMN:.    ca
a060: 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  se TK_AGG_FUNCTI
a070: 4f 4e 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ON:.    case TK_
a080: 41 47 47 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20  AGG_COLUMN:.    
a090: 20 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70    testcase( pExp
a0a0: 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 44 20 29 3b 0a  r->op==TK_ID );.
a0b0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a0c0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f  pExpr->op==TK_CO
a0d0: 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 74 65  LUMN );.      te
a0e0: 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
a0f0: 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e 43 54 49  p==TK_AGG_FUNCTI
a100: 4f 4e 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ON );.      test
a110: 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d  case( pExpr->op=
a120: 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 20 29  =TK_AGG_COLUMN )
a130: 3b 0a 20 20 20 20 20 20 70 57 61 6c 6b 65 72 2d  ;.      pWalker-
a140: 3e 75 2e 69 20 3d 20 30 3b 0a 20 20 20 20 20 20  >u.i = 0;.      
a150: 72 65 74 75 72 6e 20 57 52 43 5f 41 62 6f 72 74  return WRC_Abort
a160: 3b 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 0a 20  ;.    default:. 
a170: 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70       testcase( p
a180: 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45 4c  Expr->op==TK_SEL
a190: 45 43 54 20 29 3b 20 2f 2a 20 73 65 6c 65 63 74  ECT ); /* select
a1a0: 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20 77  NodeIsConstant w
a1b0: 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f 0a  ill disallow */.
a1c0: 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
a1d0: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 45 58  pExpr->op==TK_EX
a1e0: 49 53 54 53 20 29 3b 20 2f 2a 20 73 65 6c 65 63  ISTS ); /* selec
a1f0: 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 20  tNodeIsConstant 
a200: 77 69 6c 6c 20 64 69 73 61 6c 6c 6f 77 20 2a 2f  will disallow */
a210: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 57 52  .      return WR
a220: 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 20 20 7d 0a  C_Continue;.  }.
a230: 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 73 65 6c  }.static int sel
a240: 65 63 74 4e 6f 64 65 49 73 43 6f 6e 73 74 61 6e  ectNodeIsConstan
a250: 74 28 57 61 6c 6b 65 72 20 2a 70 57 61 6c 6b 65  t(Walker *pWalke
a260: 72 2c 20 53 65 6c 65 63 74 20 2a 4e 6f 74 55 73  r, Select *NotUs
a270: 65 64 29 7b 0a 20 20 55 4e 55 53 45 44 5f 50 41  ed){.  UNUSED_PA
a280: 52 41 4d 45 54 45 52 28 4e 6f 74 55 73 65 64 29  RAMETER(NotUsed)
a290: 3b 0a 20 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 69  ;.  pWalker->u.i
a2a0: 20 3d 20 30 3b 0a 20 20 72 65 74 75 72 6e 20 57   = 0;.  return W
a2b0: 52 43 5f 41 62 6f 72 74 3b 0a 7d 0a 73 74 61 74  RC_Abort;.}.stat
a2c0: 69 63 20 69 6e 74 20 65 78 70 72 49 73 43 6f 6e  ic int exprIsCon
a2d0: 73 74 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20  st(Expr *p, int 
a2e0: 69 6e 69 74 46 6c 61 67 29 7b 0a 20 20 57 61 6c  initFlag){.  Wal
a2f0: 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
a300: 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
a310: 29 3b 0a 20 20 77 2e 75 2e 69 20 3d 20 69 6e 69  );.  w.u.i = ini
a320: 74 46 6c 61 67 3b 0a 20 20 77 2e 78 45 78 70 72  tFlag;.  w.xExpr
a330: 43 61 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 4e  Callback = exprN
a340: 6f 64 65 49 73 43 6f 6e 73 74 61 6e 74 3b 0a 20  odeIsConstant;. 
a350: 20 77 2e 78 53 65 6c 65 63 74 43 61 6c 6c 62 61   w.xSelectCallba
a360: 63 6b 20 3d 20 73 65 6c 65 63 74 4e 6f 64 65 49  ck = selectNodeI
a370: 73 43 6f 6e 73 74 61 6e 74 3b 0a 20 20 73 71 6c  sConstant;.  sql
a380: 69 74 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c  ite3WalkExpr(&w,
a390: 20 70 29 3b 0a 20 20 72 65 74 75 72 6e 20 77 2e   p);.  return w.
a3a0: 75 2e 69 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 57 61  u.i;.}../*.** Wa
a3b0: 6c 6b 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  lk an expression
a3c0: 20 74 72 65 65 2e 20 20 52 65 74 75 72 6e 20 31   tree.  Return 1
a3d0: 20 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69   if the expressi
a3e0: 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e 74 0a 2a  on is constant.*
a3f0: 2a 20 61 6e 64 20 30 20 69 66 20 69 74 20 69 6e  * and 0 if it in
a400: 76 6f 6c 76 65 73 20 76 61 72 69 61 62 6c 65 73  volves variables
a410: 20 6f 72 20 66 75 6e 63 74 69 6f 6e 20 63 61 6c   or function cal
a420: 6c 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68  ls..**.** For th
a430: 65 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68  e purposes of th
a440: 69 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64  is function, a d
a450: 6f 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72  ouble-quoted str
a460: 69 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a  ing (ex: "abc").
a470: 2a 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64  ** is considered
a480: 20 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20   a variable but 
a490: 61 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20  a single-quoted 
a4a0: 73 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63  string (ex: 'abc
a4b0: 27 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74  ') is.** a const
a4c0: 61 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69  ant..*/.int sqli
a4d0: 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
a4e0: 74 28 45 78 70 72 20 2a 70 29 7b 0a 20 20 72 65  t(Expr *p){.  re
a4f0: 74 75 72 6e 20 65 78 70 72 49 73 43 6f 6e 73 74  turn exprIsConst
a500: 28 70 2c 20 31 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  (p, 1);.}../*.**
a510: 20 57 61 6c 6b 20 61 6e 20 65 78 70 72 65 73 73   Walk an express
a520: 69 6f 6e 20 74 72 65 65 2e 20 20 52 65 74 75 72  ion tree.  Retur
a530: 6e 20 31 20 69 66 20 74 68 65 20 65 78 70 72 65  n 1 if the expre
a540: 73 73 69 6f 6e 20 69 73 20 63 6f 6e 73 74 61 6e  ssion is constan
a550: 74 0a 2a 2a 20 74 68 61 74 20 64 6f 65 73 20 6e  t.** that does n
a560: 6f 20 6f 72 69 67 69 6e 61 74 65 20 66 72 6f 6d  o originate from
a570: 20 74 68 65 20 4f 4e 20 6f 72 20 55 53 49 4e 47   the ON or USING
a580: 20 63 6c 61 75 73 65 73 20 6f 66 20 61 20 6a 6f   clauses of a jo
a590: 69 6e 2e 0a 2a 2a 20 52 65 74 75 72 6e 20 30 20  in..** Return 0 
a5a0: 69 66 20 69 74 20 69 6e 76 6f 6c 76 65 73 20 76  if it involves v
a5b0: 61 72 69 61 62 6c 65 73 20 6f 72 20 66 75 6e 63  ariables or func
a5c0: 74 69 6f 6e 20 63 61 6c 6c 73 20 6f 72 20 74 65  tion calls or te
a5d0: 72 6d 73 20 66 72 6f 6d 0a 2a 2a 20 61 6e 20 4f  rms from.** an O
a5e0: 4e 20 6f 72 20 55 53 49 4e 47 20 63 6c 61 75 73  N or USING claus
a5f0: 65 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  e..*/.int sqlite
a600: 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 4e  3ExprIsConstantN
a610: 6f 74 4a 6f 69 6e 28 45 78 70 72 20 2a 70 29 7b  otJoin(Expr *p){
a620: 0a 20 20 72 65 74 75 72 6e 20 65 78 70 72 49 73  .  return exprIs
a630: 43 6f 6e 73 74 28 70 2c 20 33 29 3b 0a 7d 0a 0a  Const(p, 3);.}..
a640: 2f 2a 0a 2a 2a 20 57 61 6c 6b 20 61 6e 20 65 78  /*.** Walk an ex
a650: 70 72 65 73 73 69 6f 6e 20 74 72 65 65 2e 20 20  pression tree.  
a660: 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 20  Return 1 if the 
a670: 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f  expression is co
a680: 6e 73 74 61 6e 74 0a 2a 2a 20 6f 72 20 61 20 66  nstant.** or a f
a690: 75 6e 63 74 69 6f 6e 20 63 61 6c 6c 20 77 69 74  unction call wit
a6a0: 68 20 63 6f 6e 73 74 61 6e 74 20 61 72 67 75 6d  h constant argum
a6b0: 65 6e 74 73 2e 20 20 52 65 74 75 72 6e 20 61 6e  ents.  Return an
a6c0: 64 20 30 20 69 66 20 74 68 65 72 65 0a 2a 2a 20  d 0 if there.** 
a6d0: 61 72 65 20 61 6e 79 20 76 61 72 69 61 62 6c 65  are any variable
a6e0: 73 2e 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 74 68 65  s..**.** For the
a6f0: 20 70 75 72 70 6f 73 65 73 20 6f 66 20 74 68 69   purposes of thi
a700: 73 20 66 75 6e 63 74 69 6f 6e 2c 20 61 20 64 6f  s function, a do
a710: 75 62 6c 65 2d 71 75 6f 74 65 64 20 73 74 72 69  uble-quoted stri
a720: 6e 67 20 28 65 78 3a 20 22 61 62 63 22 29 0a 2a  ng (ex: "abc").*
a730: 2a 20 69 73 20 63 6f 6e 73 69 64 65 72 65 64 20  * is considered 
a740: 61 20 76 61 72 69 61 62 6c 65 20 62 75 74 20 61  a variable but a
a750: 20 73 69 6e 67 6c 65 2d 71 75 6f 74 65 64 20 73   single-quoted s
a760: 74 72 69 6e 67 20 28 65 78 3a 20 27 61 62 63 27  tring (ex: 'abc'
a770: 29 20 69 73 0a 2a 2a 20 61 20 63 6f 6e 73 74 61  ) is.** a consta
a780: 6e 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  nt..*/.int sqlit
a790: 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74  e3ExprIsConstant
a7a0: 4f 72 46 75 6e 63 74 69 6f 6e 28 45 78 70 72 20  OrFunction(Expr 
a7b0: 2a 70 29 7b 0a 20 20 72 65 74 75 72 6e 20 65 78  *p){.  return ex
a7c0: 70 72 49 73 43 6f 6e 73 74 28 70 2c 20 32 29 3b  prIsConst(p, 2);
a7d0: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 49 66 20 74 68 65  .}../*.** If the
a7e0: 20 65 78 70 72 65 73 73 69 6f 6e 20 70 20 63 6f   expression p co
a7f0: 64 65 73 20 61 20 63 6f 6e 73 74 61 6e 74 20 69  des a constant i
a800: 6e 74 65 67 65 72 20 74 68 61 74 20 69 73 20 73  nteger that is s
a810: 6d 61 6c 6c 20 65 6e 6f 75 67 68 0a 2a 2a 20 74  mall enough.** t
a820: 6f 20 66 69 74 20 69 6e 20 61 20 33 32 2d 62 69  o fit in a 32-bi
a830: 74 20 69 6e 74 65 67 65 72 2c 20 72 65 74 75 72  t integer, retur
a840: 6e 20 31 20 61 6e 64 20 70 75 74 20 74 68 65 20  n 1 and put the 
a850: 76 61 6c 75 65 20 6f 66 20 74 68 65 20 69 6e 74  value of the int
a860: 65 67 65 72 0a 2a 2a 20 69 6e 20 2a 70 56 61 6c  eger.** in *pVal
a870: 75 65 2e 20 20 49 66 20 74 68 65 20 65 78 70 72  ue.  If the expr
a880: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 61 6e  ession is not an
a890: 20 69 6e 74 65 67 65 72 20 6f 72 20 69 66 20 69   integer or if i
a8a0: 74 20 69 73 20 74 6f 6f 20 62 69 67 0a 2a 2a 20  t is too big.** 
a8b0: 74 6f 20 66 69 74 20 69 6e 20 61 20 73 69 67 6e  to fit in a sign
a8c0: 65 64 20 33 32 2d 62 69 74 20 69 6e 74 65 67 65  ed 32-bit intege
a8d0: 72 2c 20 72 65 74 75 72 6e 20 30 20 61 6e 64 20  r, return 0 and 
a8e0: 6c 65 61 76 65 20 2a 70 56 61 6c 75 65 20 75 6e  leave *pValue un
a8f0: 63 68 61 6e 67 65 64 2e 0a 2a 2f 0a 69 6e 74 20  changed..*/.int 
a900: 73 71 6c 69 74 65 33 45 78 70 72 49 73 49 6e 74  sqlite3ExprIsInt
a910: 65 67 65 72 28 45 78 70 72 20 2a 70 2c 20 69 6e  eger(Expr *p, in
a920: 74 20 2a 70 56 61 6c 75 65 29 7b 0a 20 20 69 6e  t *pValue){.  in
a930: 74 20 72 63 20 3d 20 30 3b 0a 0a 20 20 2f 2a 20  t rc = 0;..  /* 
a940: 49 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  If an expression
a950: 20 69 73 20 61 6e 20 69 6e 74 65 67 65 72 20 6c   is an integer l
a960: 69 74 65 72 61 6c 20 74 68 61 74 20 66 69 74 73  iteral that fits
a970: 20 69 6e 20 61 20 73 69 67 6e 65 64 20 33 32 2d   in a signed 32-
a980: 62 69 74 0a 20 20 2a 2a 20 69 6e 74 65 67 65 72  bit.  ** integer
a990: 2c 20 74 68 65 6e 20 74 68 65 20 45 50 5f 49 6e  , then the EP_In
a9a0: 74 56 61 6c 75 65 20 66 6c 61 67 20 77 69 6c 6c  tValue flag will
a9b0: 20 68 61 76 65 20 61 6c 72 65 61 64 79 20 62 65   have already be
a9c0: 65 6e 20 73 65 74 20 2a 2f 0a 20 20 61 73 73 65  en set */.  asse
a9d0: 72 74 28 20 70 2d 3e 6f 70 21 3d 54 4b 5f 49 4e  rt( p->op!=TK_IN
a9e0: 54 45 47 45 52 20 7c 7c 20 28 70 2d 3e 66 6c 61  TEGER || (p->fla
a9f0: 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c 75 65  gs & EP_IntValue
aa00: 29 21 3d 30 0a 20 20 20 20 20 20 20 20 20 20 20  )!=0.           
aa10: 7c 7c 20 73 71 6c 69 74 65 33 47 65 74 49 6e 74  || sqlite3GetInt
aa20: 33 32 28 70 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  32(p->u.zToken, 
aa30: 26 72 63 29 3d 3d 30 20 29 3b 0a 0a 20 20 69 66  &rc)==0 );..  if
aa40: 28 20 70 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f  ( p->flags & EP_
aa50: 49 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20  IntValue ){.    
aa60: 2a 70 56 61 6c 75 65 20 3d 20 70 2d 3e 75 2e 69  *pValue = p->u.i
aa70: 56 61 6c 75 65 3b 0a 20 20 20 20 72 65 74 75 72  Value;.    retur
aa80: 6e 20 31 3b 0a 20 20 7d 0a 20 20 73 77 69 74 63  n 1;.  }.  switc
aa90: 68 28 20 70 2d 3e 6f 70 20 29 7b 0a 20 20 20 20  h( p->op ){.    
aaa0: 63 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 7b  case TK_UPLUS: {
aab0: 0a 20 20 20 20 20 20 72 63 20 3d 20 73 71 6c 69  .      rc = sqli
aac0: 74 65 33 45 78 70 72 49 73 49 6e 74 65 67 65 72  te3ExprIsInteger
aad0: 28 70 2d 3e 70 4c 65 66 74 2c 20 70 56 61 6c 75  (p->pLeft, pValu
aae0: 65 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  e);.      break;
aaf0: 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
ab00: 54 4b 5f 55 4d 49 4e 55 53 3a 20 7b 0a 20 20 20  TK_UMINUS: {.   
ab10: 20 20 20 69 6e 74 20 76 3b 0a 20 20 20 20 20 20     int v;.      
ab20: 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 49  if( sqlite3ExprI
ab30: 73 49 6e 74 65 67 65 72 28 70 2d 3e 70 4c 65 66  sInteger(p->pLef
ab40: 74 2c 20 26 76 29 20 29 7b 0a 20 20 20 20 20 20  t, &v) ){.      
ab50: 20 20 61 73 73 65 72 74 28 20 76 21 3d 28 2d 32    assert( v!=(-2
ab60: 31 34 37 34 38 33 36 34 37 2d 31 29 20 29 3b 0a  147483647-1) );.
ab70: 20 20 20 20 20 20 20 20 2a 70 56 61 6c 75 65 20          *pValue 
ab80: 3d 20 2d 76 3b 0a 20 20 20 20 20 20 20 20 72 63  = -v;.        rc
ab90: 20 3d 20 31 3b 0a 20 20 20 20 20 20 7d 0a 20 20   = 1;.      }.  
aba0: 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
abb0: 0a 20 20 20 20 64 65 66 61 75 6c 74 3a 20 62 72  .    default: br
abc0: 65 61 6b 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  eak;.  }.  retur
abd0: 6e 20 72 63 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52  n rc;.}../*.** R
abe0: 65 74 75 72 6e 20 46 41 4c 53 45 20 69 66 20 74  eturn FALSE if t
abf0: 68 65 72 65 20 69 73 20 6e 6f 20 63 68 61 6e 63  here is no chanc
ac00: 65 20 74 68 61 74 20 74 68 65 20 65 78 70 72 65  e that the expre
ac10: 73 73 69 6f 6e 20 63 61 6e 20 62 65 20 4e 55 4c  ssion can be NUL
ac20: 4c 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20  L..**.** If the 
ac30: 65 78 70 72 65 73 73 69 6f 6e 20 6d 69 67 68 74  expression might
ac40: 20 62 65 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74   be NULL or if t
ac50: 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
ac60: 20 74 6f 6f 20 63 6f 6d 70 6c 65 78 0a 2a 2a 20   too complex.** 
ac70: 74 6f 20 74 65 6c 6c 20 72 65 74 75 72 6e 20 54  to tell return T
ac80: 52 55 45 2e 20 20 0a 2a 2a 0a 2a 2a 20 54 68 69  RUE.  .**.** Thi
ac90: 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
aca0: 64 20 61 73 20 61 6e 20 6f 70 74 69 6d 69 7a 61  d as an optimiza
acb0: 74 69 6f 6e 2c 20 74 6f 20 73 6b 69 70 20 4f 50  tion, to skip OP
acc0: 5f 49 73 4e 75 6c 6c 20 6f 70 63 6f 64 65 73 0a  _IsNull opcodes.
acd0: 2a 2a 20 77 68 65 6e 20 77 65 20 6b 6e 6f 77 20  ** when we know 
ace0: 74 68 61 74 20 61 20 76 61 6c 75 65 20 63 61 6e  that a value can
acf0: 6e 6f 74 20 62 65 20 4e 55 4c 4c 2e 20 20 48 65  not be NULL.  He
ad00: 6e 63 65 2c 20 61 20 66 61 6c 73 65 20 70 6f 73  nce, a false pos
ad10: 69 74 69 76 65 0a 2a 2a 20 28 72 65 74 75 72 6e  itive.** (return
ad20: 69 6e 67 20 54 52 55 45 20 77 68 65 6e 20 69 6e  ing TRUE when in
ad30: 20 66 61 63 74 20 74 68 65 20 65 78 70 72 65 73   fact the expres
ad40: 73 69 6f 6e 20 63 61 6e 20 6e 65 76 65 72 20 62  sion can never b
ad50: 65 20 4e 55 4c 4c 29 20 6d 69 67 68 74 0a 2a 2a  e NULL) might.**
ad60: 20 62 65 20 61 20 73 6d 61 6c 6c 20 70 65 72 66   be a small perf
ad70: 6f 72 6d 61 6e 63 65 20 68 69 74 20 62 75 74 20  ormance hit but 
ad80: 69 73 20 6f 74 68 65 72 77 69 73 65 20 68 61 72  is otherwise har
ad90: 6d 6c 65 73 73 2e 20 20 4f 6e 20 74 68 65 20 6f  mless.  On the o
ada0: 74 68 65 72 0a 2a 2a 20 68 61 6e 64 2c 20 61 20  ther.** hand, a 
adb0: 66 61 6c 73 65 20 6e 65 67 61 74 69 76 65 20 28  false negative (
adc0: 72 65 74 75 72 6e 69 6e 67 20 46 41 4c 53 45 20  returning FALSE 
add0: 77 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  when the result 
ade0: 63 6f 75 6c 64 20 62 65 20 4e 55 4c 4c 29 0a 2a  could be NULL).*
adf0: 2a 20 77 69 6c 6c 20 6c 69 6b 65 6c 79 20 72 65  * will likely re
ae00: 73 75 6c 74 20 69 6e 20 61 6e 20 69 6e 63 6f 72  sult in an incor
ae10: 72 65 63 74 20 61 6e 73 77 65 72 2e 20 20 53 6f  rect answer.  So
ae20: 20 77 68 65 6e 20 69 6e 20 64 6f 75 62 74 2c 20   when in doubt, 
ae30: 72 65 74 75 72 6e 0a 2a 2a 20 54 52 55 45 2e 0a  return.** TRUE..
ae40: 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78  */.int sqlite3Ex
ae50: 70 72 43 61 6e 42 65 4e 75 6c 6c 28 63 6f 6e 73  prCanBeNull(cons
ae60: 74 20 45 78 70 72 20 2a 70 29 7b 0a 20 20 75 38  t Expr *p){.  u8
ae70: 20 6f 70 3b 0a 20 20 77 68 69 6c 65 28 20 70 2d   op;.  while( p-
ae80: 3e 6f 70 3d 3d 54 4b 5f 55 50 4c 55 53 20 7c 7c  >op==TK_UPLUS ||
ae90: 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55 4d 49 4e 55   p->op==TK_UMINU
aea0: 53 20 29 7b 20 70 20 3d 20 70 2d 3e 70 4c 65 66  S ){ p = p->pLef
aeb0: 74 3b 20 7d 0a 20 20 6f 70 20 3d 20 70 2d 3e 6f  t; }.  op = p->o
aec0: 70 3b 0a 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f  p;.  if( op==TK_
aed0: 52 45 47 49 53 54 45 52 20 29 20 6f 70 20 3d 20  REGISTER ) op = 
aee0: 70 2d 3e 6f 70 32 3b 0a 20 20 73 77 69 74 63 68  p->op2;.  switch
aef0: 28 20 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ( op ){.    case
af00: 20 54 4b 5f 49 4e 54 45 47 45 52 3a 0a 20 20 20   TK_INTEGER:.   
af10: 20 63 61 73 65 20 54 4b 5f 53 54 52 49 4e 47 3a   case TK_STRING:
af20: 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
af30: 41 54 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  AT:.    case TK_
af40: 42 4c 4f 42 3a 0a 20 20 20 20 20 20 72 65 74 75  BLOB:.      retu
af50: 72 6e 20 30 3b 0a 20 20 20 20 63 61 73 65 20 54  rn 0;.    case T
af60: 4b 5f 43 4f 4c 55 4d 4e 3a 0a 20 20 20 20 20 20  K_COLUMN:.      
af70: 61 73 73 65 72 74 28 20 70 2d 3e 70 54 61 62 21  assert( p->pTab!
af80: 3d 30 20 29 3b 0a 20 20 20 20 20 20 72 65 74 75  =0 );.      retu
af90: 72 6e 20 70 2d 3e 69 43 6f 6c 75 6d 6e 3e 3d 30  rn p->iColumn>=0
afa0: 20 26 26 20 70 2d 3e 70 54 61 62 2d 3e 61 43 6f   && p->pTab->aCo
afb0: 6c 5b 70 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 6e 6f  l[p->iColumn].no
afc0: 74 4e 75 6c 6c 3d 3d 30 3b 0a 20 20 20 20 64 65  tNull==0;.    de
afd0: 66 61 75 6c 74 3a 0a 20 20 20 20 20 20 72 65 74  fault:.      ret
afe0: 75 72 6e 20 31 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  urn 1;.  }.}../*
aff0: 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55 45 20  .** Return TRUE 
b000: 69 66 20 74 68 65 20 67 69 76 65 6e 20 65 78 70  if the given exp
b010: 72 65 73 73 69 6f 6e 20 69 73 20 61 20 63 6f 6e  ression is a con
b020: 73 74 61 6e 74 20 77 68 69 63 68 20 77 6f 75 6c  stant which woul
b030: 64 20 62 65 0a 2a 2a 20 75 6e 63 68 61 6e 67 65  d be.** unchange
b040: 64 20 62 79 20 4f 50 5f 41 66 66 69 6e 69 74 79  d by OP_Affinity
b050: 20 77 69 74 68 20 74 68 65 20 61 66 66 69 6e 69   with the affini
b060: 74 79 20 67 69 76 65 6e 20 69 6e 20 74 68 65 20  ty given in the 
b070: 73 65 63 6f 6e 64 0a 2a 2a 20 61 72 67 75 6d 65  second.** argume
b080: 6e 74 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20 72  nt..**.** This r
b090: 6f 75 74 69 6e 65 20 69 73 20 75 73 65 64 20 74  outine is used t
b0a0: 6f 20 64 65 74 65 72 6d 69 6e 65 20 69 66 20 74  o determine if t
b0b0: 68 65 20 4f 50 5f 41 66 66 69 6e 69 74 79 20 6f  he OP_Affinity o
b0c0: 70 65 72 61 74 69 6f 6e 0a 2a 2a 20 63 61 6e 20  peration.** can 
b0d0: 62 65 20 6f 6d 69 74 74 65 64 2e 20 20 57 68 65  be omitted.  Whe
b0e0: 6e 20 69 6e 20 64 6f 75 62 74 20 72 65 74 75 72  n in doubt retur
b0f0: 6e 20 46 41 4c 53 45 2e 20 20 41 20 66 61 6c 73  n FALSE.  A fals
b100: 65 20 6e 65 67 61 74 69 76 65 0a 2a 2a 20 69 73  e negative.** is
b110: 20 68 61 72 6d 6c 65 73 73 2e 20 20 41 20 66 61   harmless.  A fa
b120: 6c 73 65 20 70 6f 73 69 74 69 76 65 2c 20 68 6f  lse positive, ho
b130: 77 65 76 65 72 2c 20 63 61 6e 20 72 65 73 75 6c  wever, can resul
b140: 74 20 69 6e 20 74 68 65 20 77 72 6f 6e 67 0a 2a  t in the wrong.*
b150: 2a 20 61 6e 73 77 65 72 2e 0a 2a 2f 0a 69 6e 74  * answer..*/.int
b160: 20 73 71 6c 69 74 65 33 45 78 70 72 4e 65 65 64   sqlite3ExprNeed
b170: 73 4e 6f 41 66 66 69 6e 69 74 79 43 68 61 6e 67  sNoAffinityChang
b180: 65 28 63 6f 6e 73 74 20 45 78 70 72 20 2a 70 2c  e(const Expr *p,
b190: 20 63 68 61 72 20 61 66 66 29 7b 0a 20 20 75 38   char aff){.  u8
b1a0: 20 6f 70 3b 0a 20 20 69 66 28 20 61 66 66 3d 3d   op;.  if( aff==
b1b0: 53 51 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 20  SQLITE_AFF_NONE 
b1c0: 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 77 68  ) return 1;.  wh
b1d0: 69 6c 65 28 20 70 2d 3e 6f 70 3d 3d 54 4b 5f 55  ile( p->op==TK_U
b1e0: 50 4c 55 53 20 7c 7c 20 70 2d 3e 6f 70 3d 3d 54  PLUS || p->op==T
b1f0: 4b 5f 55 4d 49 4e 55 53 20 29 7b 20 70 20 3d 20  K_UMINUS ){ p = 
b200: 70 2d 3e 70 4c 65 66 74 3b 20 7d 0a 20 20 6f 70  p->pLeft; }.  op
b210: 20 3d 20 70 2d 3e 6f 70 3b 0a 20 20 69 66 28 20   = p->op;.  if( 
b220: 6f 70 3d 3d 54 4b 5f 52 45 47 49 53 54 45 52 20  op==TK_REGISTER 
b230: 29 20 6f 70 20 3d 20 70 2d 3e 6f 70 32 3b 0a 20  ) op = p->op2;. 
b240: 20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20   switch( op ){. 
b250: 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 54 45 47     case TK_INTEG
b260: 45 52 3a 20 7b 0a 20 20 20 20 20 20 72 65 74 75  ER: {.      retu
b270: 72 6e 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f 41  rn aff==SQLITE_A
b280: 46 46 5f 49 4e 54 45 47 45 52 20 7c 7c 20 61 66  FF_INTEGER || af
b290: 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 4e 55  f==SQLITE_AFF_NU
b2a0: 4d 45 52 49 43 3b 0a 20 20 20 20 7d 0a 20 20 20  MERIC;.    }.   
b2b0: 20 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20   case TK_FLOAT: 
b2c0: 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 61  {.      return a
b2d0: 66 66 3d 3d 53 51 4c 49 54 45 5f 41 46 46 5f 52  ff==SQLITE_AFF_R
b2e0: 45 41 4c 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49  EAL || aff==SQLI
b2f0: 54 45 5f 41 46 46 5f 4e 55 4d 45 52 49 43 3b 0a  TE_AFF_NUMERIC;.
b300: 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
b310: 4b 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20  K_STRING: {.    
b320: 20 20 72 65 74 75 72 6e 20 61 66 66 3d 3d 53 51    return aff==SQ
b330: 4c 49 54 45 5f 41 46 46 5f 54 45 58 54 3b 0a 20  LITE_AFF_TEXT;. 
b340: 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
b350: 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 72  _BLOB: {.      r
b360: 65 74 75 72 6e 20 31 3b 0a 20 20 20 20 7d 0a 20  eturn 1;.    }. 
b370: 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
b380: 4e 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72  N: {.      asser
b390: 74 28 20 70 2d 3e 69 54 61 62 6c 65 3e 3d 30 20  t( p->iTable>=0 
b3a0: 29 3b 20 20 2f 2a 20 70 20 63 61 6e 6e 6f 74 20  );  /* p cannot 
b3b0: 62 65 20 70 61 72 74 20 6f 66 20 61 20 43 48 45  be part of a CHE
b3c0: 43 4b 20 63 6f 6e 73 74 72 61 69 6e 74 20 2a 2f  CK constraint */
b3d0: 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20 70 2d  .      return p-
b3e0: 3e 69 43 6f 6c 75 6d 6e 3c 30 0a 20 20 20 20 20  >iColumn<0.     
b3f0: 20 20 20 20 20 26 26 20 28 61 66 66 3d 3d 53 51       && (aff==SQ
b400: 4c 49 54 45 5f 41 46 46 5f 49 4e 54 45 47 45 52  LITE_AFF_INTEGER
b410: 20 7c 7c 20 61 66 66 3d 3d 53 51 4c 49 54 45 5f   || aff==SQLITE_
b420: 41 46 46 5f 4e 55 4d 45 52 49 43 29 3b 0a 20 20  AFF_NUMERIC);.  
b430: 20 20 7d 0a 20 20 20 20 64 65 66 61 75 6c 74 3a    }.    default:
b440: 20 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e 20   {.      return 
b450: 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a  0;.    }.  }.}..
b460: 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 54 52 55  /*.** Return TRU
b470: 45 20 69 66 20 74 68 65 20 67 69 76 65 6e 20 73  E if the given s
b480: 74 72 69 6e 67 20 69 73 20 61 20 72 6f 77 2d 69  tring is a row-i
b490: 64 20 63 6f 6c 75 6d 6e 20 6e 61 6d 65 2e 0a 2a  d column name..*
b4a0: 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 49 73 52  /.int sqlite3IsR
b4b0: 6f 77 69 64 28 63 6f 6e 73 74 20 63 68 61 72 20  owid(const char 
b4c0: 2a 7a 29 7b 0a 20 20 69 66 28 20 73 71 6c 69 74  *z){.  if( sqlit
b4d0: 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22 5f 52  e3StrICmp(z, "_R
b4e0: 4f 57 49 44 5f 22 29 3d 3d 30 20 29 20 72 65 74  OWID_")==0 ) ret
b4f0: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
b500: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
b510: 52 4f 57 49 44 22 29 3d 3d 30 20 29 20 72 65 74  ROWID")==0 ) ret
b520: 75 72 6e 20 31 3b 0a 20 20 69 66 28 20 73 71 6c  urn 1;.  if( sql
b530: 69 74 65 33 53 74 72 49 43 6d 70 28 7a 2c 20 22  ite3StrICmp(z, "
b540: 4f 49 44 22 29 3d 3d 30 20 29 20 72 65 74 75 72  OID")==0 ) retur
b550: 6e 20 31 3b 0a 20 20 72 65 74 75 72 6e 20 30 3b  n 1;.  return 0;
b560: 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e  .}../*.** Return
b570: 20 74 72 75 65 20 69 66 20 77 65 20 61 72 65 20   true if we are 
b580: 61 62 6c 65 20 74 6f 20 74 68 65 20 49 4e 20 6f  able to the IN o
b590: 70 65 72 61 74 6f 72 20 6f 70 74 69 6d 69 7a 61  perator optimiza
b5a0: 74 69 6f 6e 20 6f 6e 20 61 0a 2a 2a 20 71 75 65  tion on a.** que
b5b0: 72 79 20 6f 66 20 74 68 65 20 66 6f 72 6d 0a 2a  ry of the form.*
b5c0: 2a 0a 2a 2a 20 20 20 20 20 20 20 78 20 49 4e 20  *.**       x IN 
b5d0: 28 53 45 4c 45 43 54 20 2e 2e 2e 29 0a 2a 2a 0a  (SELECT ...).**.
b5e0: 2a 2a 20 57 68 65 72 65 20 74 68 65 20 53 45 4c  ** Where the SEL
b5f0: 45 43 54 2e 2e 2e 20 63 6c 61 75 73 65 20 69 73  ECT... clause is
b600: 20 61 73 20 73 70 65 63 69 66 69 65 64 20 62 79   as specified by
b610: 20 74 68 65 20 70 61 72 61 6d 65 74 65 72 20 74   the parameter t
b620: 6f 20 74 68 69 73 0a 2a 2a 20 72 6f 75 74 69 6e  o this.** routin
b630: 65 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53 65 6c  e..**.** The Sel
b640: 65 63 74 20 6f 62 6a 65 63 74 20 70 61 73 73 65  ect object passe
b650: 64 20 69 6e 20 68 61 73 20 61 6c 72 65 61 64 79  d in has already
b660: 20 62 65 65 6e 20 70 72 65 70 72 6f 63 65 73 73   been preprocess
b670: 65 64 20 61 6e 64 20 6e 6f 0a 2a 2a 20 65 72 72  ed and no.** err
b680: 6f 72 73 20 68 61 76 65 20 62 65 65 6e 20 66 6f  ors have been fo
b690: 75 6e 64 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20  und..*/.#ifndef 
b6a0: 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51  SQLITE_OMIT_SUBQ
b6b0: 55 45 52 59 0a 73 74 61 74 69 63 20 69 6e 74 20  UERY.static int 
b6c0: 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49 6e  isCandidateForIn
b6d0: 4f 70 74 28 53 65 6c 65 63 74 20 2a 70 29 7b 0a  Opt(Select *p){.
b6e0: 20 20 53 72 63 4c 69 73 74 20 2a 70 53 72 63 3b    SrcList *pSrc;
b6f0: 0a 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c  .  ExprList *pEL
b700: 69 73 74 3b 0a 20 20 54 61 62 6c 65 20 2a 70 54  ist;.  Table *pT
b710: 61 62 3b 0a 20 20 69 66 28 20 70 3d 3d 30 20 29  ab;.  if( p==0 )
b720: 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20 20 20   return 0;      
b730: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b740: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
b750: 6f 66 20 49 4e 20 69 73 20 53 45 4c 45 43 54 20  of IN is SELECT 
b760: 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 50 72 69  */.  if( p->pPri
b770: 6f 72 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  or ) return 0;  
b780: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4e              /* N
b790: 6f 74 20 61 20 63 6f 6d 70 6f 75 6e 64 20 53 45  ot a compound SE
b7a0: 4c 45 43 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d  LECT */.  if( p-
b7b0: 3e 73 65 6c 46 6c 61 67 73 20 26 20 28 53 46 5f  >selFlags & (SF_
b7c0: 44 69 73 74 69 6e 63 74 7c 53 46 5f 41 67 67 72  Distinct|SF_Aggr
b7d0: 65 67 61 74 65 29 20 29 7b 0a 20 20 20 20 74 65  egate) ){.    te
b7e0: 73 74 63 61 73 65 28 20 28 70 2d 3e 73 65 6c 46  stcase( (p->selF
b7f0: 6c 61 67 73 20 26 20 28 53 46 5f 44 69 73 74 69  lags & (SF_Disti
b800: 6e 63 74 7c 53 46 5f 41 67 67 72 65 67 61 74 65  nct|SF_Aggregate
b810: 29 29 3d 3d 53 46 5f 44 69 73 74 69 6e 63 74 20  ))==SF_Distinct 
b820: 29 3b 0a 20 20 20 20 74 65 73 74 63 61 73 65 28  );.    testcase(
b830: 20 28 70 2d 3e 73 65 6c 46 6c 61 67 73 20 26 20   (p->selFlags & 
b840: 28 53 46 5f 44 69 73 74 69 6e 63 74 7c 53 46 5f  (SF_Distinct|SF_
b850: 41 67 67 72 65 67 61 74 65 29 29 3d 3d 53 46 5f  Aggregate))==SF_
b860: 41 67 67 72 65 67 61 74 65 20 29 3b 0a 20 20 20  Aggregate );.   
b870: 20 72 65 74 75 72 6e 20 30 3b 20 2f 2a 20 4e 6f   return 0; /* No
b880: 20 44 49 53 54 49 4e 43 54 20 6b 65 79 77 6f 72   DISTINCT keywor
b890: 64 20 61 6e 64 20 6e 6f 20 61 67 67 72 65 67 61  d and no aggrega
b8a0: 74 65 20 66 75 6e 63 74 69 6f 6e 73 20 2a 2f 0a  te functions */.
b8b0: 20 20 7d 0a 20 20 61 73 73 65 72 74 28 20 70 2d    }.  assert( p-
b8c0: 3e 70 47 72 6f 75 70 42 79 3d 3d 30 20 29 3b 20  >pGroupBy==0 ); 
b8d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
b8e0: 48 61 73 20 6e 6f 20 47 52 4f 55 50 20 42 59 20  Has no GROUP BY 
b8f0: 63 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20  clause */.  if( 
b900: 70 2d 3e 70 4c 69 6d 69 74 20 29 20 72 65 74 75  p->pLimit ) retu
b910: 72 6e 20 30 3b 20 20 20 20 20 20 20 20 20 20 20  rn 0;           
b920: 20 20 20 2f 2a 20 48 61 73 20 6e 6f 20 4c 49 4d     /* Has no LIM
b930: 49 54 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 61  IT clause */.  a
b940: 73 73 65 72 74 28 20 70 2d 3e 70 4f 66 66 73 65  ssert( p->pOffse
b950: 74 3d 3d 30 20 29 3b 20 20 20 20 20 20 20 20 20  t==0 );         
b960: 20 20 20 20 20 20 2f 2a 20 4e 6f 20 4c 49 4d 49        /* No LIMI
b970: 54 20 6d 65 61 6e 73 20 6e 6f 20 4f 46 46 53 45  T means no OFFSE
b980: 54 20 2a 2f 0a 20 20 69 66 28 20 70 2d 3e 70 57  T */.  if( p->pW
b990: 68 65 72 65 20 29 20 72 65 74 75 72 6e 20 30 3b  here ) return 0;
b9a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a                /*
b9b0: 20 48 61 73 20 6e 6f 20 57 48 45 52 45 20 63 6c   Has no WHERE cl
b9c0: 61 75 73 65 20 2a 2f 0a 20 20 70 53 72 63 20 3d  ause */.  pSrc =
b9d0: 20 70 2d 3e 70 53 72 63 3b 0a 20 20 61 73 73 65   p->pSrc;.  asse
b9e0: 72 74 28 20 70 53 72 63 21 3d 30 20 29 3b 0a 20  rt( pSrc!=0 );. 
b9f0: 20 69 66 28 20 70 53 72 63 2d 3e 6e 53 72 63 21   if( pSrc->nSrc!
ba00: 3d 31 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20  =1 ) return 0;  
ba10: 20 20 20 20 20 20 20 20 2f 2a 20 53 69 6e 67 6c          /* Singl
ba20: 65 20 74 65 72 6d 20 69 6e 20 46 52 4f 4d 20 63  e term in FROM c
ba30: 6c 61 75 73 65 20 2a 2f 0a 20 20 69 66 28 20 70  lause */.  if( p
ba40: 53 72 63 2d 3e 61 5b 30 5d 2e 70 53 65 6c 65 63  Src->a[0].pSelec
ba50: 74 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20  t ) return 0;   
ba60: 20 20 2f 2a 20 46 52 4f 4d 20 69 73 20 6e 6f 74    /* FROM is not
ba70: 20 61 20 73 75 62 71 75 65 72 79 20 6f 72 20 76   a subquery or v
ba80: 69 65 77 20 2a 2f 0a 20 20 70 54 61 62 20 3d 20  iew */.  pTab = 
ba90: 70 53 72 63 2d 3e 61 5b 30 5d 2e 70 54 61 62 3b  pSrc->a[0].pTab;
baa0: 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70 54 61  .  if( NEVER(pTa
bab0: 62 3d 3d 30 29 20 29 20 72 65 74 75 72 6e 20 30  b==0) ) return 0
bac0: 3b 0a 20 20 61 73 73 65 72 74 28 20 70 54 61 62  ;.  assert( pTab
bad0: 2d 3e 70 53 65 6c 65 63 74 3d 3d 30 20 29 3b 20  ->pSelect==0 ); 
bae0: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 46 52             /* FR
baf0: 4f 4d 20 63 6c 61 75 73 65 20 69 73 20 6e 6f 74  OM clause is not
bb00: 20 61 20 76 69 65 77 20 2a 2f 0a 20 20 69 66 28   a view */.  if(
bb10: 20 49 73 56 69 72 74 75 61 6c 28 70 54 61 62 29   IsVirtual(pTab)
bb20: 20 29 20 72 65 74 75 72 6e 20 30 3b 20 20 20 20   ) return 0;    
bb30: 20 20 20 20 2f 2a 20 46 52 4f 4d 20 63 6c 61 75      /* FROM clau
bb40: 73 65 20 6e 6f 74 20 61 20 76 69 72 74 75 61 6c  se not a virtual
bb50: 20 74 61 62 6c 65 20 2a 2f 0a 20 20 70 45 4c 69   table */.  pELi
bb60: 73 74 20 3d 20 70 2d 3e 70 45 4c 69 73 74 3b 0a  st = p->pEList;.
bb70: 20 20 69 66 28 20 70 45 4c 69 73 74 2d 3e 6e 45    if( pEList->nE
bb80: 78 70 72 21 3d 31 20 29 20 72 65 74 75 72 6e 20  xpr!=1 ) return 
bb90: 30 3b 20 20 20 20 20 20 20 2f 2a 20 4f 6e 65 20  0;       /* One 
bba0: 63 6f 6c 75 6d 6e 20 69 6e 20 74 68 65 20 72 65  column in the re
bbb0: 73 75 6c 74 20 73 65 74 20 2a 2f 0a 20 20 69 66  sult set */.  if
bbc0: 28 20 70 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  ( pEList->a[0].p
bbd0: 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c  Expr->op!=TK_COL
bbe0: 55 4d 4e 20 29 20 72 65 74 75 72 6e 20 30 3b 20  UMN ) return 0; 
bbf0: 2f 2a 20 52 65 73 75 6c 74 20 69 73 20 61 20 63  /* Result is a c
bc00: 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 72 65 74 75 72  olumn */.  retur
bc10: 6e 20 31 3b 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  n 1;.}.#endif /*
bc20: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
bc30: 51 55 45 52 59 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20  QUERY */../*.** 
bc40: 43 6f 64 65 20 61 6e 20 4f 50 5f 4f 6e 63 65 20  Code an OP_Once 
bc50: 69 6e 73 74 72 75 63 74 69 6f 6e 20 61 6e 64 20  instruction and 
bc60: 61 6c 6c 6f 63 61 74 65 20 73 70 61 63 65 20 66  allocate space f
bc70: 6f 72 20 69 74 73 20 66 6c 61 67 2e 20 52 65 74  or its flag. Ret
bc80: 75 72 6e 20 74 68 65 20 0a 2a 2a 20 61 64 64 72  urn the .** addr
bc90: 65 73 73 20 6f 66 20 74 68 65 20 6e 65 77 20 69  ess of the new i
bca0: 6e 73 74 72 75 63 74 69 6f 6e 2e 0a 2a 2f 0a 69  nstruction..*/.i
bcb0: 6e 74 20 73 71 6c 69 74 65 33 43 6f 64 65 4f 6e  nt sqlite3CodeOn
bcc0: 63 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ce(Parse *pParse
bcd0: 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  ){.  Vdbe *v = s
bce0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
bcf0: 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 56  arse);      /* V
bd00: 69 72 74 75 61 6c 20 6d 61 63 68 69 6e 65 20 62  irtual machine b
bd10: 65 69 6e 67 20 63 6f 64 65 64 20 2a 2f 0a 20 20  eing coded */.  
bd20: 72 65 74 75 72 6e 20 73 71 6c 69 74 65 33 56 64  return sqlite3Vd
bd30: 62 65 41 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4f  beAddOp1(v, OP_O
bd40: 6e 63 65 2c 20 70 50 61 72 73 65 2d 3e 6e 4f 6e  nce, pParse->nOn
bd50: 63 65 2b 2b 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  ce++);.}../*.** 
bd60: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68  Generate code th
bd70: 61 74 20 63 68 65 63 6b 73 20 74 68 65 20 6c 65  at checks the le
bd80: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 20 6f  ft-most column o
bd90: 66 20 69 6e 64 65 78 20 74 61 62 6c 65 20 69 43  f index table iC
bda0: 75 72 20 74 6f 20 73 65 65 20 69 66 0a 2a 2a 20  ur to see if.** 
bdb0: 69 74 20 63 6f 6e 74 61 69 6e 73 20 61 6e 79 20  it contains any 
bdc0: 4e 55 4c 4c 20 65 6e 74 72 69 65 73 2e 20 20 43  NULL entries.  C
bdd0: 61 75 73 65 20 74 68 65 20 72 65 67 69 73 74 65  ause the registe
bde0: 72 20 61 74 20 72 65 67 48 61 73 4e 75 6c 6c 20  r at regHasNull 
bdf0: 74 6f 20 62 65 20 73 65 74 0a 2a 2a 20 74 6f 20  to be set.** to 
be00: 61 20 6e 6f 6e 2d 4e 55 4c 4c 20 76 61 6c 75 65  a non-NULL value
be10: 20 69 66 20 69 43 75 72 20 63 6f 6e 74 61 69 6e   if iCur contain
be20: 73 20 6e 6f 20 4e 55 4c 4c 73 2e 20 20 43 61 75  s no NULLs.  Cau
be30: 73 65 20 72 65 67 69 73 74 65 72 20 72 65 67 48  se register regH
be40: 61 73 4e 75 6c 6c 0a 2a 2a 20 74 6f 20 62 65 20  asNull.** to be 
be50: 73 65 74 20 74 6f 20 4e 55 4c 4c 20 69 66 20 69  set to NULL if i
be60: 43 75 72 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65  Cur contains one
be70: 20 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61   or more NULL va
be80: 6c 75 65 73 2e 0a 2a 2f 0a 73 74 61 74 69 63 20  lues..*/.static 
be90: 76 6f 69 64 20 73 71 6c 69 74 65 33 53 65 74 48  void sqlite3SetH
bea0: 61 73 4e 75 6c 6c 46 6c 61 67 28 56 64 62 65 20  asNullFlag(Vdbe 
beb0: 2a 76 2c 20 69 6e 74 20 69 43 75 72 2c 20 69 6e  *v, int iCur, in
bec0: 74 20 72 65 67 48 61 73 4e 75 6c 6c 29 7b 0a 20  t regHasNull){. 
bed0: 20 69 6e 74 20 6a 31 3b 0a 20 20 73 71 6c 69 74   int j1;.  sqlit
bee0: 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
bef0: 4f 50 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 72  OP_Integer, 0, r
bf00: 65 67 48 61 73 4e 75 6c 6c 29 3b 0a 20 20 6a 31  egHasNull);.  j1
bf10: 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41 64   = sqlite3VdbeAd
bf20: 64 4f 70 31 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp1(v, OP_Rewin
bf30: 64 2c 20 69 43 75 72 29 3b 20 56 64 62 65 43 6f  d, iCur); VdbeCo
bf40: 76 65 72 61 67 65 28 76 29 3b 0a 20 20 73 71 6c  verage(v);.  sql
bf50: 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
bf60: 2c 20 4f 50 5f 43 6f 6c 75 6d 6e 2c 20 69 43 75  , OP_Column, iCu
bf70: 72 2c 20 30 2c 20 72 65 67 48 61 73 4e 75 6c 6c  r, 0, regHasNull
bf80: 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
bf90: 43 68 61 6e 67 65 50 35 28 76 2c 20 4f 50 46 4c  ChangeP5(v, OPFL
bfa0: 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
bfb0: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
bfc0: 20 22 66 69 72 73 74 5f 65 6e 74 72 79 5f 69 6e   "first_entry_in
bfd0: 28 25 64 29 22 2c 20 69 43 75 72 29 29 3b 0a 20  (%d)", iCur));. 
bfe0: 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d 70   sqlite3VdbeJump
bff0: 48 65 72 65 28 76 2c 20 6a 31 29 3b 0a 7d 0a 0a  Here(v, j1);.}..
c000: 0a 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f  .#ifndef SQLITE_
c010: 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a  OMIT_SUBQUERY./*
c020: 0a 2a 2a 20 54 68 65 20 61 72 67 75 6d 65 6e 74  .** The argument
c030: 20 69 73 20 61 6e 20 49 4e 20 6f 70 65 72 61 74   is an IN operat
c040: 6f 72 20 77 69 74 68 20 61 20 6c 69 73 74 20 28  or with a list (
c050: 6e 6f 74 20 61 20 73 75 62 71 75 65 72 79 29 20  not a subquery) 
c060: 6f 6e 20 74 68 65 20 0a 2a 2a 20 72 69 67 68 74  on the .** right
c070: 2d 68 61 6e 64 20 73 69 64 65 2e 20 20 52 65 74  -hand side.  Ret
c080: 75 72 6e 20 54 52 55 45 20 69 66 20 74 68 61 74  urn TRUE if that
c090: 20 6c 69 73 74 20 69 73 20 63 6f 6e 73 74 61 6e   list is constan
c0a0: 74 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 69 6e 74  t..*/.static int
c0b0: 20 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43   sqlite3InRhsIsC
c0c0: 6f 6e 73 74 61 6e 74 28 45 78 70 72 20 2a 70 49  onstant(Expr *pI
c0d0: 6e 29 7b 0a 20 20 45 78 70 72 20 2a 70 4c 48 53  n){.  Expr *pLHS
c0e0: 3b 0a 20 20 69 6e 74 20 72 65 73 3b 0a 20 20 61  ;.  int res;.  a
c0f0: 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50  ssert( !ExprHasP
c100: 72 6f 70 65 72 74 79 28 70 49 6e 2c 20 45 50 5f  roperty(pIn, EP_
c110: 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20 20  xIsSelect) );.  
c120: 70 4c 48 53 20 3d 20 70 49 6e 2d 3e 70 4c 65 66  pLHS = pIn->pLef
c130: 74 3b 0a 20 20 70 49 6e 2d 3e 70 4c 65 66 74 20  t;.  pIn->pLeft 
c140: 3d 20 30 3b 0a 20 20 72 65 73 20 3d 20 73 71 6c  = 0;.  res = sql
c150: 69 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61  ite3ExprIsConsta
c160: 6e 74 28 70 49 6e 29 3b 0a 20 20 70 49 6e 2d 3e  nt(pIn);.  pIn->
c170: 70 4c 65 66 74 20 3d 20 70 4c 48 53 3b 0a 20 20  pLeft = pLHS;.  
c180: 72 65 74 75 72 6e 20 72 65 73 3b 0a 7d 0a 23 65  return res;.}.#e
c190: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 54 68 69 73  ndif../*.** This
c1a0: 20 66 75 6e 63 74 69 6f 6e 20 69 73 20 75 73 65   function is use
c1b0: 64 20 62 79 20 74 68 65 20 69 6d 70 6c 65 6d 65  d by the impleme
c1c0: 6e 74 61 74 69 6f 6e 20 6f 66 20 74 68 65 20 49  ntation of the I
c1d0: 4e 20 28 2e 2e 2e 29 20 6f 70 65 72 61 74 6f 72  N (...) operator
c1e0: 2e 0a 2a 2a 20 54 68 65 20 70 58 20 70 61 72 61  ..** The pX para
c1f0: 6d 65 74 65 72 20 69 73 20 74 68 65 20 65 78 70  meter is the exp
c200: 72 65 73 73 69 6f 6e 20 6f 6e 20 74 68 65 20 52  ression on the R
c210: 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65  HS of the IN ope
c220: 72 61 74 6f 72 2c 20 77 68 69 63 68 0a 2a 2a 20  rator, which.** 
c230: 6d 69 67 68 74 20 62 65 20 65 69 74 68 65 72 20  might be either 
c240: 61 20 6c 69 73 74 20 6f 66 20 65 78 70 72 65 73  a list of expres
c250: 73 69 6f 6e 73 20 6f 72 20 61 20 73 75 62 71 75  sions or a subqu
c260: 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6a  ery..**.** The j
c270: 6f 62 20 6f 66 20 74 68 69 73 20 72 6f 75 74 69  ob of this routi
c280: 6e 65 20 69 73 20 74 6f 20 66 69 6e 64 20 6f 72  ne is to find or
c290: 20 63 72 65 61 74 65 20 61 20 62 2d 74 72 65 65   create a b-tree
c2a0: 20 6f 62 6a 65 63 74 20 74 68 61 74 20 63 61 6e   object that can
c2b0: 0a 2a 2a 20 62 65 20 75 73 65 64 20 65 69 74 68  .** be used eith
c2c0: 65 72 20 74 6f 20 74 65 73 74 20 66 6f 72 20 6d  er to test for m
c2d0: 65 6d 62 65 72 73 68 69 70 20 69 6e 20 74 68 65  embership in the
c2e0: 20 52 48 53 20 73 65 74 20 6f 72 20 74 6f 20 69   RHS set or to i
c2f0: 74 65 72 61 74 65 20 74 68 72 6f 75 67 68 0a 2a  terate through.*
c300: 2a 20 61 6c 6c 20 6d 65 6d 62 65 72 73 20 6f 66  * all members of
c310: 20 74 68 65 20 52 48 53 20 73 65 74 2c 20 73 6b   the RHS set, sk
c320: 69 70 70 69 6e 67 20 64 75 70 6c 69 63 61 74 65  ipping duplicate
c330: 73 2e 0a 2a 2a 0a 2a 2a 20 41 20 63 75 72 73 6f  s..**.** A curso
c340: 72 20 69 73 20 6f 70 65 6e 65 64 20 6f 6e 20 74  r is opened on t
c350: 68 65 20 62 2d 74 72 65 65 20 6f 62 6a 65 63 74  he b-tree object
c360: 20 74 68 61 74 20 69 73 20 74 68 65 20 52 48 53   that is the RHS
c370: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c380: 74 6f 72 0a 2a 2a 20 61 6e 64 20 70 58 2d 3e 69  tor.** and pX->i
c390: 54 61 62 6c 65 20 69 73 20 73 65 74 20 74 6f 20  Table is set to 
c3a0: 74 68 65 20 69 6e 64 65 78 20 6f 66 20 74 68 61  the index of tha
c3b0: 74 20 63 75 72 73 6f 72 2e 0a 2a 2a 0a 2a 2a 20  t cursor..**.** 
c3c0: 54 68 65 20 72 65 74 75 72 6e 65 64 20 76 61 6c  The returned val
c3d0: 75 65 20 6f 66 20 74 68 69 73 20 66 75 6e 63 74  ue of this funct
c3e0: 69 6f 6e 20 69 6e 64 69 63 61 74 65 73 20 74 68  ion indicates th
c3f0: 65 20 62 2d 74 72 65 65 20 74 79 70 65 2c 20 61  e b-tree type, a
c400: 73 20 66 6f 6c 6c 6f 77 73 3a 0a 2a 2a 0a 2a 2a  s follows:.**.**
c410: 20 20 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49     IN_INDEX_ROWI
c420: 44 20 20 20 20 20 20 2d 20 54 68 65 20 63 75 72  D      - The cur
c430: 73 6f 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f  sor was opened o
c440: 6e 20 61 20 64 61 74 61 62 61 73 65 20 74 61 62  n a database tab
c450: 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  le..**   IN_INDE
c460: 58 5f 49 4e 44 45 58 5f 41 53 43 20 20 2d 20 54  X_INDEX_ASC  - T
c470: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c480: 65 6e 65 64 20 6f 6e 20 61 6e 20 61 73 63 65 6e  ened on an ascen
c490: 64 69 6e 67 20 69 6e 64 65 78 2e 0a 2a 2a 20 20  ding index..**  
c4a0: 20 49 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f   IN_INDEX_INDEX_
c4b0: 44 45 53 43 20 2d 20 54 68 65 20 63 75 72 73 6f  DESC - The curso
c4c0: 72 20 77 61 73 20 6f 70 65 6e 65 64 20 6f 6e 20  r was opened on 
c4d0: 61 20 64 65 73 63 65 6e 64 69 6e 67 20 69 6e 64  a descending ind
c4e0: 65 78 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e 44 45  ex..**   IN_INDE
c4f0: 58 5f 45 50 48 20 20 20 20 20 20 20 20 2d 20 54  X_EPH        - T
c500: 68 65 20 63 75 72 73 6f 72 20 77 61 73 20 6f 70  he cursor was op
c510: 65 6e 65 64 20 6f 6e 20 61 20 73 70 65 63 69 61  ened on a specia
c520: 6c 6c 79 20 63 72 65 61 74 65 64 20 61 6e 64 0a  lly created and.
c530: 2a 2a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  **              
c540: 20 20 20 20 20 20 20 20 20 20 20 70 6f 70 75 6c             popul
c550: 61 74 65 64 20 65 70 68 65 72 65 6d 61 6c 20 74  ated epheremal t
c560: 61 62 6c 65 2e 0a 2a 2a 20 20 20 49 4e 5f 49 4e  able..**   IN_IN
c570: 44 45 58 5f 4e 4f 4f 50 20 20 20 20 20 20 20 2d  DEX_NOOP       -
c580: 20 4e 6f 20 63 75 72 73 6f 72 20 77 61 73 20 61   No cursor was a
c590: 6c 6c 6f 63 61 74 65 64 2e 20 20 54 68 65 20 49  llocated.  The I
c5a0: 4e 20 6f 70 65 72 61 74 6f 72 20 6d 75 73 74 20  N operator must 
c5b0: 62 65 0a 2a 2a 20 20 20 20 20 20 20 20 20 20 20  be.**           
c5c0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 6d                im
c5d0: 70 6c 65 6d 65 6e 74 65 64 20 61 73 20 61 20 73  plemented as a s
c5e0: 65 71 75 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61  equence of compa
c5f0: 72 69 73 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20 41 6e  risons..**.** An
c600: 20 65 78 69 73 74 69 6e 67 20 62 2d 74 72 65 65   existing b-tree
c610: 20 6d 69 67 68 74 20 62 65 20 75 73 65 64 20 69   might be used i
c620: 66 20 74 68 65 20 52 48 53 20 65 78 70 72 65 73  f the RHS expres
c630: 73 69 6f 6e 20 70 58 20 69 73 20 61 20 73 69 6d  sion pX is a sim
c640: 70 6c 65 0a 2a 2a 20 73 75 62 71 75 65 72 79 20  ple.** subquery 
c650: 73 75 63 68 20 61 73 3a 0a 2a 2a 0a 2a 2a 20 20  such as:.**.**  
c660: 20 20 20 53 45 4c 45 43 54 20 3c 63 6f 6c 75 6d     SELECT <colum
c670: 6e 3e 20 46 52 4f 4d 20 3c 74 61 62 6c 65 3e 0a  n> FROM <table>.
c680: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 52 48 53  **.** If the RHS
c690: 20 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61   of the IN opera
c6a0: 74 6f 72 20 69 73 20 61 20 6c 69 73 74 20 6f 72  tor is a list or
c6b0: 20 61 20 6d 6f 72 65 20 63 6f 6d 70 6c 65 78 20   a more complex 
c6c0: 73 75 62 71 75 65 72 79 2c 20 74 68 65 6e 0a 2a  subquery, then.*
c6d0: 2a 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20 74  * an ephemeral t
c6e0: 61 62 6c 65 20 6d 69 67 68 74 20 6e 65 65 64 20  able might need 
c6f0: 74 6f 20 62 65 20 67 65 6e 65 72 61 74 65 64 20  to be generated 
c700: 66 72 6f 6d 20 74 68 65 20 52 48 53 20 61 6e 64  from the RHS and
c710: 20 74 68 65 6e 0a 2a 2a 20 70 58 2d 3e 69 54 61   then.** pX->iTa
c720: 62 6c 65 20 6d 61 64 65 20 74 6f 20 70 6f 69 6e  ble made to poin
c730: 74 20 74 6f 20 74 68 65 20 65 70 68 65 72 6d 65  t to the epherme
c740: 72 61 6c 20 74 61 62 6c 65 20 69 6e 73 74 65 61  ral table instea
c750: 64 20 6f 66 20 61 6e 0a 2a 2a 20 65 78 69 73 74  d of an.** exist
c760: 69 6e 67 20 74 61 62 6c 65 2e 0a 2a 2a 0a 2a 2a  ing table..**.**
c770: 20 54 68 65 20 69 6e 46 6c 61 67 73 20 70 61 72   The inFlags par
c780: 61 6d 65 74 65 72 20 6d 75 73 74 20 63 6f 6e 74  ameter must cont
c790: 61 69 6e 20 65 78 61 63 74 6c 79 20 6f 6e 65 20  ain exactly one 
c7a0: 6f 66 20 74 68 65 20 62 69 74 73 0a 2a 2a 20 49  of the bits.** I
c7b0: 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48  N_INDEX_MEMBERSH
c7c0: 49 50 20 6f 72 20 49 4e 5f 49 4e 44 45 58 5f 4c  IP or IN_INDEX_L
c7d0: 4f 4f 50 2e 20 20 49 66 20 69 6e 46 6c 61 67 73  OOP.  If inFlags
c7e0: 20 63 6f 6e 74 61 69 6e 73 0a 2a 2a 20 49 4e 5f   contains.** IN_
c7f0: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
c800: 2c 20 74 68 65 6e 20 74 68 65 20 67 65 6e 65 72  , then the gener
c810: 61 74 65 64 20 74 61 62 6c 65 20 77 69 6c 6c 20  ated table will 
c820: 62 65 20 75 73 65 64 20 66 6f 72 20 61 0a 2a 2a  be used for a.**
c830: 20 66 61 73 74 20 6d 65 6d 62 65 72 73 68 69 70   fast membership
c840: 20 74 65 73 74 2e 20 20 57 68 65 6e 20 74 68 65   test.  When the
c850: 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 20 62   IN_INDEX_LOOP b
c860: 69 74 20 69 73 20 73 65 74 2c 20 74 68 65 0a 2a  it is set, the.*
c870: 2a 20 49 4e 20 69 6e 64 65 78 20 77 69 6c 6c 20  * IN index will 
c880: 62 65 20 75 73 65 64 20 74 6f 20 6c 6f 6f 70 20  be used to loop 
c890: 6f 76 65 72 20 61 6c 6c 20 76 61 6c 75 65 73 20  over all values 
c8a0: 6f 66 20 74 68 65 20 52 48 53 20 6f 66 20 74 68  of the RHS of th
c8b0: 65 0a 2a 2a 20 49 4e 20 6f 70 65 72 61 74 6f 72  e.** IN operator
c8c0: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
c8d0: 49 4e 44 45 58 5f 4c 4f 4f 50 20 69 73 20 75 73  INDEX_LOOP is us
c8e0: 65 64 20 28 61 6e 64 20 74 68 65 20 62 2d 74 72  ed (and the b-tr
c8f0: 65 65 20 77 69 6c 6c 20 62 65 20 75 73 65 64 20  ee will be used 
c900: 74 6f 20 69 74 65 72 61 74 65 0a 2a 2a 20 74 68  to iterate.** th
c910: 72 6f 75 67 68 20 74 68 65 20 73 65 74 20 6d 65  rough the set me
c920: 6d 62 65 72 73 29 20 74 68 65 6e 20 74 68 65 20  mbers) then the 
c930: 62 2d 74 72 65 65 20 6d 75 73 74 20 6e 6f 74 20  b-tree must not 
c940: 63 6f 6e 74 61 69 6e 20 64 75 70 6c 69 63 61 74  contain duplicat
c950: 65 73 2e 0a 2a 2a 20 41 6e 20 65 70 68 65 72 65  es..** An ephere
c960: 6d 61 6c 20 74 61 62 6c 65 20 6d 75 73 74 20 62  mal table must b
c970: 65 20 75 73 65 64 20 75 6e 6c 65 73 73 20 74 68  e used unless th
c980: 65 20 73 65 6c 65 63 74 65 64 20 3c 63 6f 6c 75  e selected <colu
c990: 6d 6e 3e 20 69 73 20 67 75 61 72 61 6e 74 65 65  mn> is guarantee
c9a0: 64 0a 2a 2a 20 74 6f 20 62 65 20 75 6e 69 71 75  d.** to be uniqu
c9b0: 65 20 2d 20 65 69 74 68 65 72 20 62 65 63 61 75  e - either becau
c9c0: 73 65 20 69 74 20 69 73 20 61 6e 20 49 4e 54 45  se it is an INTE
c9d0: 47 45 52 20 50 52 49 4d 41 52 59 20 4b 45 59 20  GER PRIMARY KEY 
c9e0: 6f 72 20 69 74 0a 2a 2a 20 68 61 73 20 61 20 55  or it.** has a U
c9f0: 4e 49 51 55 45 20 63 6f 6e 73 74 72 61 69 6e 74  NIQUE constraint
ca00: 20 6f 72 20 55 4e 49 51 55 45 20 69 6e 64 65 78   or UNIQUE index
ca10: 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20 49 4e 5f  ..**.** When IN_
ca20: 49 4e 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50  INDEX_MEMBERSHIP
ca30: 20 69 73 20 75 73 65 64 20 28 61 6e 64 20 74 68   is used (and th
ca40: 65 20 62 2d 74 72 65 65 20 77 69 6c 6c 20 62 65  e b-tree will be
ca50: 20 75 73 65 64 20 0a 2a 2a 20 66 6f 72 20 66 61   used .** for fa
ca60: 73 74 20 73 65 74 20 6d 65 6d 62 65 72 73 68 69  st set membershi
ca70: 70 20 74 65 73 74 73 29 20 74 68 65 6e 20 61 6e  p tests) then an
ca80: 20 65 70 68 65 72 65 6d 61 6c 20 74 61 62 6c 65   epheremal table
ca90: 20 6d 75 73 74 20 0a 2a 2a 20 62 65 20 75 73 65   must .** be use
caa0: 64 20 75 6e 6c 65 73 73 20 3c 63 6f 6c 75 6d 6e  d unless <column
cab0: 3e 20 69 73 20 61 6e 20 49 4e 54 45 47 45 52 20  > is an INTEGER 
cac0: 50 52 49 4d 41 52 59 20 4b 45 59 20 6f 72 20 61  PRIMARY KEY or a
cad0: 6e 20 69 6e 64 65 78 20 63 61 6e 20 0a 2a 2a 20  n index can .** 
cae0: 62 65 20 66 6f 75 6e 64 20 77 69 74 68 20 3c 63  be found with <c
caf0: 6f 6c 75 6d 6e 3e 20 61 73 20 69 74 73 20 6c 65  olumn> as its le
cb00: 66 74 2d 6d 6f 73 74 20 63 6f 6c 75 6d 6e 2e 0a  ft-most column..
cb10: 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 49 4e 5f  **.** If the IN_
cb20: 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 20 61 6e  INDEX_NOOP_OK an
cb30: 64 20 49 4e 5f 49 4e 44 45 58 5f 4d 45 4d 42 45  d IN_INDEX_MEMBE
cb40: 52 53 48 49 50 20 61 72 65 20 62 6f 74 68 20 73  RSHIP are both s
cb50: 65 74 20 61 6e 64 0a 2a 2a 20 69 66 20 74 68 65  et and.** if the
cb60: 20 52 48 53 20 6f 66 20 74 68 65 20 49 4e 20 6f   RHS of the IN o
cb70: 70 65 72 61 74 6f 72 20 69 73 20 61 20 6c 69 73  perator is a lis
cb80: 74 20 28 6e 6f 74 20 61 20 73 75 62 71 75 65 72  t (not a subquer
cb90: 79 29 20 74 68 65 6e 20 74 68 69 73 0a 2a 2a 20  y) then this.** 
cba0: 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 64 65  routine might de
cbb0: 63 69 64 65 20 74 68 61 74 20 63 72 65 61 74 69  cide that creati
cbc0: 6e 67 20 61 6e 20 65 70 68 65 6d 65 72 61 6c 20  ng an ephemeral 
cbd0: 62 2d 74 72 65 65 20 66 6f 72 20 6d 65 6d 62 65  b-tree for membe
cbe0: 72 73 68 69 70 0a 2a 2a 20 74 65 73 74 69 6e 67  rship.** testing
cbf0: 20 69 73 20 74 6f 6f 20 65 78 70 65 6e 73 69 76   is too expensiv
cc00: 65 20 61 6e 64 20 72 65 74 75 72 6e 20 49 4e 5f  e and return IN_
cc10: 49 4e 44 45 58 5f 4e 4f 4f 50 2e 20 20 49 6e 20  INDEX_NOOP.  In 
cc20: 74 68 61 74 20 63 61 73 65 2c 20 74 68 65 0a 2a  that case, the.*
cc30: 2a 20 63 61 6c 6c 69 6e 67 20 72 6f 75 74 69 6e  * calling routin
cc40: 65 20 73 68 6f 75 6c 64 20 69 6d 70 6c 65 6d 65  e should impleme
cc50: 6e 74 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  nt the IN operat
cc60: 6f 72 20 75 73 69 6e 67 20 61 20 73 65 71 75 65  or using a seque
cc70: 6e 63 65 0a 2a 2a 20 6f 66 20 45 71 20 6f 72 20  nce.** of Eq or 
cc80: 4e 65 20 63 6f 6d 70 61 72 69 73 6f 6e 20 6f 70  Ne comparison op
cc90: 65 72 61 74 69 6f 6e 73 2e 0a 2a 2a 0a 2a 2a 20  erations..**.** 
cca0: 57 68 65 6e 20 74 68 65 20 62 2d 74 72 65 65 20  When the b-tree 
ccb0: 69 73 20 62 65 69 6e 67 20 75 73 65 64 20 66 6f  is being used fo
ccc0: 72 20 6d 65 6d 62 65 72 73 68 69 70 20 74 65 73  r membership tes
ccd0: 74 73 2c 20 74 68 65 20 63 61 6c 6c 69 6e 67 20  ts, the calling 
cce0: 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20 6d 69 67 68  function.** migh
ccf0: 74 20 6e 65 65 64 20 74 6f 20 6b 6e 6f 77 20 77  t need to know w
cd00: 68 65 74 68 65 72 20 6f 72 20 6e 6f 74 20 74 68  hether or not th
cd10: 65 20 52 48 53 20 73 69 64 65 20 6f 66 20 74 68  e RHS side of th
cd20: 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 0a 2a 2a  e IN operator.**
cd30: 20 63 6f 6e 74 61 69 6e 73 20 61 20 4e 55 4c 4c   contains a NULL
cd40: 2e 20 20 49 66 20 70 72 52 68 73 48 61 73 4e 75  .  If prRhsHasNu
cd50: 6c 6c 20 69 73 20 6e 6f 74 20 61 20 4e 55 4c 4c  ll is not a NULL
cd60: 20 70 6f 69 6e 74 65 72 20 61 6e 64 20 0a 2a 2a   pointer and .**
cd70: 20 69 66 20 74 68 65 72 65 20 69 73 20 61 6e 79   if there is any
cd80: 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68 65   chance that the
cd90: 20 28 2e 2e 2e 29 20 6d 69 67 68 74 20 63 6f 6e   (...) might con
cda0: 74 61 69 6e 20 61 20 4e 55 4c 4c 20 76 61 6c 75  tain a NULL valu
cdb0: 65 20 61 74 0a 2a 2a 20 72 75 6e 74 69 6d 65 2c  e at.** runtime,
cdc0: 20 74 68 65 6e 20 61 20 72 65 67 69 73 74 65 72   then a register
cdd0: 20 69 73 20 61 6c 6c 6f 63 61 74 65 64 20 61 6e   is allocated an
cde0: 64 20 74 68 65 20 72 65 67 69 73 74 65 72 20 6e  d the register n
cdf0: 75 6d 62 65 72 20 77 72 69 74 74 65 6e 0a 2a 2a  umber written.**
ce00: 20 74 6f 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   to *prRhsHasNul
ce10: 6c 2e 20 49 66 20 74 68 65 72 65 20 69 73 20 6e  l. If there is n
ce20: 6f 20 63 68 61 6e 63 65 20 74 68 61 74 20 74 68  o chance that th
ce30: 65 20 28 2e 2e 2e 29 20 63 6f 6e 74 61 69 6e 73  e (...) contains
ce40: 20 61 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65   a.** NULL value
ce50: 2c 20 74 68 65 6e 20 2a 70 72 52 68 73 48 61 73  , then *prRhsHas
ce60: 4e 75 6c 6c 20 69 73 20 6c 65 66 74 20 75 6e 63  Null is left unc
ce70: 68 61 6e 67 65 64 2e 0a 2a 2a 0a 2a 2a 20 49 66  hanged..**.** If
ce80: 20 61 20 72 65 67 69 73 74 65 72 20 69 73 20 61   a register is a
ce90: 6c 6c 6f 63 61 74 65 64 20 61 6e 64 20 69 74 73  llocated and its
cea0: 20 6c 6f 63 61 74 69 6f 6e 20 73 74 6f 72 65 64   location stored
ceb0: 20 69 6e 20 2a 70 72 52 68 73 48 61 73 4e 75 6c   in *prRhsHasNul
cec0: 6c 2c 20 74 68 65 6e 0a 2a 2a 20 74 68 65 20 76  l, then.** the v
ced0: 61 6c 75 65 20 69 6e 20 74 68 61 74 20 72 65 67  alue in that reg
cee0: 69 73 74 65 72 20 77 69 6c 6c 20 62 65 20 4e 55  ister will be NU
cef0: 4c 4c 20 69 66 20 74 68 65 20 62 2d 74 72 65 65  LL if the b-tree
cf00: 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20 6f 72   contains one or
cf10: 20 6d 6f 72 65 0a 2a 2a 20 4e 55 4c 4c 20 76 61   more.** NULL va
cf20: 6c 75 65 73 2c 20 61 6e 64 20 69 74 20 77 69 6c  lues, and it wil
cf30: 6c 20 62 65 20 73 6f 6d 65 20 6e 6f 6e 2d 4e 55  l be some non-NU
cf40: 4c 4c 20 76 61 6c 75 65 20 69 66 20 74 68 65 20  LL value if the 
cf50: 62 2d 74 72 65 65 20 63 6f 6e 74 61 69 6e 73 20  b-tree contains 
cf60: 6e 6f 0a 2a 2a 20 4e 55 4c 4c 20 76 61 6c 75 65  no.** NULL value
cf70: 73 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66 20 53 51  s..*/.#ifndef SQ
cf80: 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45  LITE_OMIT_SUBQUE
cf90: 52 59 0a 69 6e 74 20 73 71 6c 69 74 65 33 46 69  RY.int sqlite3Fi
cfa0: 6e 64 49 6e 49 6e 64 65 78 28 50 61 72 73 65 20  ndInIndex(Parse 
cfb0: 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
cfc0: 58 2c 20 75 33 32 20 69 6e 46 6c 61 67 73 2c 20  X, u32 inFlags, 
cfd0: 69 6e 74 20 2a 70 72 52 68 73 48 61 73 4e 75 6c  int *prRhsHasNul
cfe0: 6c 29 7b 0a 20 20 53 65 6c 65 63 74 20 2a 70 3b  l){.  Select *p;
cff0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d000: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53              /* S
d010: 45 4c 45 43 54 20 74 6f 20 74 68 65 20 72 69 67  ELECT to the rig
d020: 68 74 20 6f 66 20 49 4e 20 6f 70 65 72 61 74 6f  ht of IN operato
d030: 72 20 2a 2f 0a 20 20 69 6e 74 20 65 54 79 70 65  r */.  int eType
d040: 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20 20 20   = 0;           
d050: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
d060: 54 79 70 65 20 6f 66 20 52 48 53 20 74 61 62 6c  Type of RHS tabl
d070: 65 2e 20 49 4e 5f 49 4e 44 45 58 5f 2a 20 2a 2f  e. IN_INDEX_* */
d080: 0a 20 20 69 6e 74 20 69 54 61 62 20 3d 20 70 50  .  int iTab = pP
d090: 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b 20 20 20  arse->nTab++;   
d0a0: 20 20 20 20 20 20 20 20 20 2f 2a 20 43 75 72 73           /* Curs
d0b0: 6f 72 20 6f 66 20 74 68 65 20 52 48 53 20 74 61  or of the RHS ta
d0c0: 62 6c 65 20 2a 2f 0a 20 20 69 6e 74 20 6d 75 73  ble */.  int mus
d0d0: 74 42 65 55 6e 69 71 75 65 3b 20 20 20 20 20 20  tBeUnique;      
d0e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d0f0: 2a 20 54 72 75 65 20 69 66 20 52 48 53 20 6d 75  * True if RHS mu
d100: 73 74 20 62 65 20 75 6e 69 71 75 65 20 2a 2f 0a  st be unique */.
d110: 20 20 56 64 62 65 20 2a 76 20 3d 20 73 71 6c 69    Vdbe *v = sqli
d120: 74 65 33 47 65 74 56 64 62 65 28 70 50 61 72 73  te3GetVdbe(pPars
d130: 65 29 3b 20 20 20 20 20 2f 2a 20 56 69 72 74 75  e);     /* Virtu
d140: 61 6c 20 6d 61 63 68 69 6e 65 20 62 65 69 6e 67  al machine being
d150: 20 63 6f 64 65 64 20 2a 2f 0a 0a 20 20 61 73 73   coded */..  ass
d160: 65 72 74 28 20 70 58 2d 3e 6f 70 3d 3d 54 4b 5f  ert( pX->op==TK_
d170: 49 4e 20 29 3b 0a 20 20 6d 75 73 74 42 65 55 6e  IN );.  mustBeUn
d180: 69 71 75 65 20 3d 20 28 69 6e 46 6c 61 67 73 20  ique = (inFlags 
d190: 26 20 49 4e 5f 49 4e 44 45 58 5f 4c 4f 4f 50 29  & IN_INDEX_LOOP)
d1a0: 21 3d 30 3b 0a 0a 20 20 2f 2a 20 43 68 65 63 6b  !=0;..  /* Check
d1b0: 20 74 6f 20 73 65 65 20 69 66 20 61 6e 20 65 78   to see if an ex
d1c0: 69 73 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20  isting table or 
d1d0: 69 6e 64 65 78 20 63 61 6e 20 62 65 20 75 73 65  index can be use
d1e0: 64 20 74 6f 0a 20 20 2a 2a 20 73 61 74 69 73 66  d to.  ** satisf
d1f0: 79 20 74 68 65 20 71 75 65 72 79 2e 20 20 54 68  y the query.  Th
d200: 69 73 20 69 73 20 70 72 65 66 65 72 61 62 6c 65  is is preferable
d210: 20 74 6f 20 67 65 6e 65 72 61 74 69 6e 67 20 61   to generating a
d220: 20 6e 65 77 20 0a 20 20 2a 2a 20 65 70 68 65 6d   new .  ** ephem
d230: 65 72 61 6c 20 74 61 62 6c 65 2e 0a 20 20 2a 2f  eral table..  */
d240: 0a 20 20 70 20 3d 20 28 45 78 70 72 48 61 73 50  .  p = (ExprHasP
d250: 72 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78  roperty(pX, EP_x
d260: 49 73 53 65 6c 65 63 74 29 20 3f 20 70 58 2d 3e  IsSelect) ? pX->
d270: 78 2e 70 53 65 6c 65 63 74 20 3a 20 30 29 3b 0a  x.pSelect : 0);.
d280: 20 20 69 66 28 20 41 4c 57 41 59 53 28 70 50 61    if( ALWAYS(pPa
d290: 72 73 65 2d 3e 6e 45 72 72 3d 3d 30 29 20 26 26  rse->nErr==0) &&
d2a0: 20 69 73 43 61 6e 64 69 64 61 74 65 46 6f 72 49   isCandidateForI
d2b0: 6e 4f 70 74 28 70 29 20 29 7b 0a 20 20 20 20 73  nOpt(p) ){.    s
d2c0: 71 6c 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61  qlite3 *db = pPa
d2d0: 72 73 65 2d 3e 64 62 3b 20 20 20 20 20 20 20 20  rse->db;        
d2e0: 20 20 20 20 20 20 2f 2a 20 44 61 74 61 62 61 73        /* Databas
d2f0: 65 20 63 6f 6e 6e 65 63 74 69 6f 6e 20 2a 2f 0a  e connection */.
d300: 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61 62 3b      Table *pTab;
d310: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d320: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 61             /* Ta
d330: 62 6c 65 20 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a  ble <table>. */.
d340: 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72 3b      Expr *pExpr;
d350: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d360: 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 45 78             /* Ex
d370: 70 72 65 73 73 69 6f 6e 20 3c 63 6f 6c 75 6d 6e  pression <column
d380: 3e 20 2a 2f 0a 20 20 20 20 69 31 36 20 69 43 6f  > */.    i16 iCo
d390: 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
d3a0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3b0: 2f 2a 20 49 6e 64 65 78 20 6f 66 20 63 6f 6c 75  /* Index of colu
d3c0: 6d 6e 20 3c 63 6f 6c 75 6d 6e 3e 20 2a 2f 0a 20  mn <column> */. 
d3d0: 20 20 20 69 31 36 20 69 44 62 3b 20 20 20 20 20     i16 iDb;     
d3e0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d3f0: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 44 61 74            /* Dat
d400: 61 62 61 73 65 20 69 64 78 20 66 6f 72 20 70 54  abase idx for pT
d410: 61 62 20 2a 2f 0a 0a 20 20 20 20 61 73 73 65 72  ab */..    asser
d420: 74 28 20 70 20 29 3b 20 20 20 20 20 20 20 20 20  t( p );         
d430: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d440: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d450: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d460: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d470: 74 28 20 70 2d 3e 70 45 4c 69 73 74 21 3d 30 20  t( p->pEList!=0 
d480: 29 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 2f  );             /
d490: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d4a0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d4b0: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d4c0: 74 28 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b  t( p->pEList->a[
d4d0: 30 5d 2e 70 45 78 70 72 21 3d 30 20 29 3b 20 2f  0].pExpr!=0 ); /
d4e0: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d4f0: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d500: 28 70 29 20 2a 2f 0a 20 20 20 20 61 73 73 65 72  (p) */.    asser
d510: 74 28 20 70 2d 3e 70 53 72 63 21 3d 30 20 29 3b  t( p->pSrc!=0 );
d520: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2f                 /
d530: 2a 20 42 65 63 61 75 73 65 20 6f 66 20 69 73 43  * Because of isC
d540: 61 6e 64 69 64 61 74 65 46 6f 72 49 6e 4f 70 74  andidateForInOpt
d550: 28 70 29 20 2a 2f 0a 20 20 20 20 70 54 61 62 20  (p) */.    pTab 
d560: 3d 20 70 2d 3e 70 53 72 63 2d 3e 61 5b 30 5d 2e  = p->pSrc->a[0].
d570: 70 54 61 62 3b 0a 20 20 20 20 70 45 78 70 72 20  pTab;.    pExpr 
d580: 3d 20 70 2d 3e 70 45 4c 69 73 74 2d 3e 61 5b 30  = p->pEList->a[0
d590: 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 69 43 6f  ].pExpr;.    iCo
d5a0: 6c 20 3d 20 28 69 31 36 29 70 45 78 70 72 2d 3e  l = (i16)pExpr->
d5b0: 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 0a 20 20 20  iColumn;.   .   
d5c0: 20 2f 2a 20 43 6f 64 65 20 61 6e 20 4f 50 5f 54   /* Code an OP_T
d5d0: 72 61 6e 73 61 63 74 69 6f 6e 20 61 6e 64 20 4f  ransaction and O
d5e0: 50 5f 54 61 62 6c 65 4c 6f 63 6b 20 66 6f 72 20  P_TableLock for 
d5f0: 3c 74 61 62 6c 65 3e 2e 20 2a 2f 0a 20 20 20 20  <table>. */.    
d600: 69 44 62 20 3d 20 73 71 6c 69 74 65 33 53 63 68  iDb = sqlite3Sch
d610: 65 6d 61 54 6f 49 6e 64 65 78 28 64 62 2c 20 70  emaToIndex(db, p
d620: 54 61 62 2d 3e 70 53 63 68 65 6d 61 29 3b 0a 20  Tab->pSchema);. 
d630: 20 20 20 73 71 6c 69 74 65 33 43 6f 64 65 56 65     sqlite3CodeVe
d640: 72 69 66 79 53 63 68 65 6d 61 28 70 50 61 72 73  rifySchema(pPars
d650: 65 2c 20 69 44 62 29 3b 0a 20 20 20 20 73 71 6c  e, iDb);.    sql
d660: 69 74 65 33 54 61 62 6c 65 4c 6f 63 6b 28 70 50  ite3TableLock(pP
d670: 61 72 73 65 2c 20 69 44 62 2c 20 70 54 61 62 2d  arse, iDb, pTab-
d680: 3e 74 6e 75 6d 2c 20 30 2c 20 70 54 61 62 2d 3e  >tnum, 0, pTab->
d690: 7a 4e 61 6d 65 29 3b 0a 0a 20 20 20 20 2f 2a 20  zName);..    /* 
d6a0: 54 68 69 73 20 66 75 6e 63 74 69 6f 6e 20 69 73  This function is
d6b0: 20 6f 6e 6c 79 20 63 61 6c 6c 65 64 20 66 72 6f   only called fro
d6c0: 6d 20 74 77 6f 20 70 6c 61 63 65 73 2e 20 49 6e  m two places. In
d6d0: 20 62 6f 74 68 20 63 61 73 65 73 20 74 68 65 20   both cases the 
d6e0: 76 64 62 65 0a 20 20 20 20 2a 2a 20 68 61 73 20  vdbe.    ** has 
d6f0: 61 6c 72 65 61 64 79 20 62 65 65 6e 20 61 6c 6c  already been all
d700: 6f 63 61 74 65 64 2e 20 53 6f 20 61 73 73 75 6d  ocated. So assum
d710: 65 20 73 71 6c 69 74 65 33 47 65 74 56 64 62 65  e sqlite3GetVdbe
d720: 28 29 20 69 73 20 61 6c 77 61 79 73 0a 20 20 20  () is always.   
d730: 20 2a 2a 20 73 75 63 63 65 73 73 66 75 6c 20 68   ** successful h
d740: 65 72 65 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20  ere..    */.    
d750: 61 73 73 65 72 74 28 76 29 3b 0a 20 20 20 20 69  assert(v);.    i
d760: 66 28 20 69 43 6f 6c 3c 30 20 29 7b 0a 20 20 20  f( iCol<0 ){.   
d770: 20 20 20 69 6e 74 20 69 41 64 64 72 20 3d 20 73     int iAddr = s
d780: 71 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70  qlite3CodeOnce(p
d790: 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 56 64  Parse);.      Vd
d7a0: 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 0a  beCoverage(v);..
d7b0: 20 20 20 20 20 20 73 71 6c 69 74 65 33 4f 70 65        sqlite3Ope
d7c0: 6e 54 61 62 6c 65 28 70 50 61 72 73 65 2c 20 69  nTable(pParse, i
d7d0: 54 61 62 2c 20 69 44 62 2c 20 70 54 61 62 2c 20  Tab, iDb, pTab, 
d7e0: 4f 50 5f 4f 70 65 6e 52 65 61 64 29 3b 0a 20 20  OP_OpenRead);.  
d7f0: 20 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49      eType = IN_I
d800: 4e 44 45 58 5f 52 4f 57 49 44 3b 0a 0a 20 20 20  NDEX_ROWID;..   
d810: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75     sqlite3VdbeJu
d820: 6d 70 48 65 72 65 28 76 2c 20 69 41 64 64 72 29  mpHere(v, iAddr)
d830: 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20  ;.    }else{.   
d840: 20 20 20 49 6e 64 65 78 20 2a 70 49 64 78 3b 20     Index *pIdx; 
d850: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
d860: 20 20 20 20 20 20 20 20 2f 2a 20 49 74 65 72 61          /* Itera
d870: 74 6f 72 20 76 61 72 69 61 62 6c 65 20 2a 2f 0a  tor variable */.
d880: 0a 20 20 20 20 20 20 2f 2a 20 54 68 65 20 63 6f  .      /* The co
d890: 6c 6c 61 74 69 6f 6e 20 73 65 71 75 65 6e 63 65  llation sequence
d8a0: 20 75 73 65 64 20 62 79 20 74 68 65 20 63 6f 6d   used by the com
d8b0: 70 61 72 69 73 6f 6e 2e 20 49 66 20 61 6e 20 69  parison. If an i
d8c0: 6e 64 65 78 20 69 73 20 74 6f 0a 20 20 20 20 20  ndex is to.     
d8d0: 20 2a 2a 20 62 65 20 75 73 65 64 20 69 6e 20 70   ** be used in p
d8e0: 6c 61 63 65 20 6f 66 20 61 20 74 65 6d 70 2d 74  lace of a temp-t
d8f0: 61 62 6c 65 2c 20 69 74 20 6d 75 73 74 20 62 65  able, it must be
d900: 20 6f 72 64 65 72 65 64 20 61 63 63 6f 72 64 69   ordered accordi
d910: 6e 67 0a 20 20 20 20 20 20 2a 2a 20 74 6f 20 74  ng.      ** to t
d920: 68 69 73 20 63 6f 6c 6c 61 74 69 6f 6e 20 73 65  his collation se
d930: 71 75 65 6e 63 65 2e 20 20 2a 2f 0a 20 20 20 20  quence.  */.    
d940: 20 20 43 6f 6c 6c 53 65 71 20 2a 70 52 65 71 20    CollSeq *pReq 
d950: 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72 79 43  = sqlite3BinaryC
d960: 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28 70 50  ompareCollSeq(pP
d970: 61 72 73 65 2c 20 70 58 2d 3e 70 4c 65 66 74 2c  arse, pX->pLeft,
d980: 20 70 45 78 70 72 29 3b 0a 0a 20 20 20 20 20 20   pExpr);..      
d990: 2f 2a 20 43 68 65 63 6b 20 74 68 61 74 20 74 68  /* Check that th
d9a0: 65 20 61 66 66 69 6e 69 74 79 20 74 68 61 74 20  e affinity that 
d9b0: 77 69 6c 6c 20 62 65 20 75 73 65 64 20 74 6f 20  will be used to 
d9c0: 70 65 72 66 6f 72 6d 20 74 68 65 20 0a 20 20 20  perform the .   
d9d0: 20 20 20 2a 2a 20 63 6f 6d 70 61 72 69 73 6f 6e     ** comparison
d9e0: 20 69 73 20 74 68 65 20 73 61 6d 65 20 61 73 20   is the same as 
d9f0: 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f 66 20  the affinity of 
da00: 74 68 65 20 63 6f 6c 75 6d 6e 2e 20 49 66 0a 20  the column. If. 
da10: 20 20 20 20 20 2a 2a 20 69 74 20 69 73 20 6e 6f       ** it is no
da20: 74 2c 20 69 74 20 69 73 20 6e 6f 74 20 70 6f 73  t, it is not pos
da30: 73 69 62 6c 65 20 74 6f 20 75 73 65 20 61 6e 79  sible to use any
da40: 20 69 6e 64 65 78 2e 0a 20 20 20 20 20 20 2a 2f   index..      */
da50: 0a 20 20 20 20 20 20 69 6e 74 20 61 66 66 69 6e  .      int affin
da60: 69 74 79 5f 6f 6b 20 3d 20 73 71 6c 69 74 65 33  ity_ok = sqlite3
da70: 49 6e 64 65 78 41 66 66 69 6e 69 74 79 4f 6b 28  IndexAffinityOk(
da80: 70 58 2c 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 69  pX, pTab->aCol[i
da90: 43 6f 6c 5d 2e 61 66 66 69 6e 69 74 79 29 3b 0a  Col].affinity);.
daa0: 0a 20 20 20 20 20 20 66 6f 72 28 70 49 64 78 3d  .      for(pIdx=
dab0: 70 54 61 62 2d 3e 70 49 6e 64 65 78 3b 20 70 49  pTab->pIndex; pI
dac0: 64 78 20 26 26 20 65 54 79 70 65 3d 3d 30 20 26  dx && eType==0 &
dad0: 26 20 61 66 66 69 6e 69 74 79 5f 6f 6b 3b 20 70  & affinity_ok; p
dae0: 49 64 78 3d 70 49 64 78 2d 3e 70 4e 65 78 74 29  Idx=pIdx->pNext)
daf0: 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70  {.        if( (p
db00: 49 64 78 2d 3e 61 69 43 6f 6c 75 6d 6e 5b 30 5d  Idx->aiColumn[0]
db10: 3d 3d 69 43 6f 6c 29 0a 20 20 20 20 20 20 20 20  ==iCol).        
db20: 20 26 26 20 73 71 6c 69 74 65 33 46 69 6e 64 43   && sqlite3FindC
db30: 6f 6c 6c 53 65 71 28 64 62 2c 20 45 4e 43 28 64  ollSeq(db, ENC(d
db40: 62 29 2c 20 70 49 64 78 2d 3e 61 7a 43 6f 6c 6c  b), pIdx->azColl
db50: 5b 30 5d 2c 20 30 29 3d 3d 70 52 65 71 0a 20 20  [0], 0)==pReq.  
db60: 20 20 20 20 20 20 20 26 26 20 28 21 6d 75 73 74         && (!must
db70: 42 65 55 6e 69 71 75 65 20 7c 7c 20 28 70 49 64  BeUnique || (pId
db80: 78 2d 3e 6e 4b 65 79 43 6f 6c 3d 3d 31 20 26 26  x->nKeyCol==1 &&
db90: 20 49 73 55 6e 69 71 75 65 49 6e 64 65 78 28 70   IsUniqueIndex(p
dba0: 49 64 78 29 29 29 0a 20 20 20 20 20 20 20 20 29  Idx))).        )
dbb0: 7b 0a 20 20 20 20 20 20 20 20 20 20 69 6e 74 20  {.          int 
dbc0: 69 41 64 64 72 20 3d 20 73 71 6c 69 74 65 33 43  iAddr = sqlite3C
dbd0: 6f 64 65 4f 6e 63 65 28 70 50 61 72 73 65 29 3b  odeOnce(pParse);
dbe0: 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29   VdbeCoverage(v)
dbf0: 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  ;.          sqli
dc00: 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
dc10: 20 4f 50 5f 4f 70 65 6e 52 65 61 64 2c 20 69 54   OP_OpenRead, iT
dc20: 61 62 2c 20 70 49 64 78 2d 3e 74 6e 75 6d 2c 20  ab, pIdx->tnum, 
dc30: 69 44 62 29 3b 0a 20 20 20 20 20 20 20 20 20 20  iDb);.          
dc40: 73 71 6c 69 74 65 33 56 64 62 65 53 65 74 50 34  sqlite3VdbeSetP4
dc50: 4b 65 79 49 6e 66 6f 28 70 50 61 72 73 65 2c 20  KeyInfo(pParse, 
dc60: 70 49 64 78 29 3b 0a 20 20 20 20 20 20 20 20 20  pIdx);.         
dc70: 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76 2c   VdbeComment((v,
dc80: 20 22 25 73 22 2c 20 70 49 64 78 2d 3e 7a 4e 61   "%s", pIdx->zNa
dc90: 6d 65 29 29 3b 0a 20 20 20 20 20 20 20 20 20 20  me));.          
dca0: 61 73 73 65 72 74 28 20 49 4e 5f 49 4e 44 45 58  assert( IN_INDEX
dcb0: 5f 49 4e 44 45 58 5f 44 45 53 43 20 3d 3d 20 49  _INDEX_DESC == I
dcc0: 4e 5f 49 4e 44 45 58 5f 49 4e 44 45 58 5f 41 53  N_INDEX_INDEX_AS
dcd0: 43 2b 31 20 29 3b 0a 20 20 20 20 20 20 20 20 20  C+1 );.         
dce0: 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45   eType = IN_INDE
dcf0: 58 5f 49 4e 44 45 58 5f 41 53 43 20 2b 20 70 49  X_INDEX_ASC + pI
dd00: 64 78 2d 3e 61 53 6f 72 74 4f 72 64 65 72 5b 30  dx->aSortOrder[0
dd10: 5d 3b 0a 0a 20 20 20 20 20 20 20 20 20 20 69 66  ];..          if
dd20: 28 20 70 72 52 68 73 48 61 73 4e 75 6c 6c 20 26  ( prRhsHasNull &
dd30: 26 20 21 70 54 61 62 2d 3e 61 43 6f 6c 5b 69 43  & !pTab->aCol[iC
dd40: 6f 6c 5d 2e 6e 6f 74 4e 75 6c 6c 20 29 7b 0a 20  ol].notNull ){. 
dd50: 20 20 20 20 20 20 20 20 20 20 20 2a 70 72 52 68             *prRh
dd60: 73 48 61 73 4e 75 6c 6c 20 3d 20 2b 2b 70 50 61  sHasNull = ++pPa
dd70: 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 20  rse->nMem;.     
dd80: 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 53 65         sqlite3Se
dd90: 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76 2c 20  tHasNullFlag(v, 
dda0: 69 54 61 62 2c 20 2a 70 72 52 68 73 48 61 73 4e  iTab, *prRhsHasN
ddb0: 75 6c 6c 29 3b 0a 20 20 20 20 20 20 20 20 20 20  ull);.          
ddc0: 7d 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c 69  }.          sqli
ddd0: 74 65 33 56 64 62 65 4a 75 6d 70 48 65 72 65 28  te3VdbeJumpHere(
dde0: 76 2c 20 69 41 64 64 72 29 3b 0a 20 20 20 20 20  v, iAddr);.     
ddf0: 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20     }.      }.   
de00: 20 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 49 66 20   }.  }..  /* If 
de10: 6e 6f 20 70 72 65 65 78 69 73 74 69 6e 67 20 69  no preexisting i
de20: 6e 64 65 78 20 69 73 20 61 76 61 69 6c 61 62 6c  ndex is availabl
de30: 65 20 66 6f 72 20 74 68 65 20 49 4e 20 63 6c 61  e for the IN cla
de40: 75 73 65 0a 20 20 2a 2a 20 61 6e 64 20 49 4e 5f  use.  ** and IN_
de50: 49 4e 44 45 58 5f 4e 4f 4f 50 20 69 73 20 61 6e  INDEX_NOOP is an
de60: 20 61 6c 6c 6f 77 65 64 20 72 65 70 6c 79 0a 20   allowed reply. 
de70: 20 2a 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20   ** and the RHS 
de80: 6f 66 20 74 68 65 20 49 4e 20 6f 70 65 72 61 74  of the IN operat
de90: 6f 72 20 69 73 20 61 20 6c 69 73 74 2c 20 6e 6f  or is a list, no
dea0: 74 20 61 20 73 75 62 71 75 65 72 79 0a 20 20 2a  t a subquery.  *
deb0: 2a 20 61 6e 64 20 74 68 65 20 52 48 53 20 69 73  * and the RHS is
dec0: 20 6e 6f 74 20 63 6f 6e 74 61 6e 74 20 6f 72 20   not contant or 
ded0: 68 61 73 20 74 77 6f 20 6f 72 20 66 65 77 65 72  has two or fewer
dee0: 20 74 65 72 6d 73 2c 0a 20 20 2a 2a 20 74 68 65   terms,.  ** the
def0: 6e 20 69 74 20 69 73 20 6e 6f 74 20 77 6f 72 74  n it is not wort
df00: 68 20 63 72 65 61 74 69 6e 67 20 61 6e 20 65 70  h creating an ep
df10: 68 65 72 6d 65 72 61 6c 20 74 61 62 6c 65 20 74  hermeral table t
df20: 6f 20 65 76 61 6c 75 61 74 65 0a 20 20 2a 2a 20  o evaluate.  ** 
df30: 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 20  the IN operator 
df40: 73 6f 20 72 65 74 75 72 6e 20 49 4e 5f 49 4e 44  so return IN_IND
df50: 45 58 5f 4e 4f 4f 50 2e 0a 20 20 2a 2f 0a 20 20  EX_NOOP..  */.  
df60: 69 66 28 20 65 54 79 70 65 3d 3d 30 0a 20 20 20  if( eType==0.   
df70: 26 26 20 28 69 6e 46 6c 61 67 73 20 26 20 49 4e  && (inFlags & IN
df80: 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f 4b 29 0a  _INDEX_NOOP_OK).
df90: 20 20 20 26 26 20 21 45 78 70 72 48 61 73 50 72     && !ExprHasPr
dfa0: 6f 70 65 72 74 79 28 70 58 2c 20 45 50 5f 78 49  operty(pX, EP_xI
dfb0: 73 53 65 6c 65 63 74 29 0a 20 20 20 26 26 20 28  sSelect).   && (
dfc0: 21 73 71 6c 69 74 65 33 49 6e 52 68 73 49 73 43  !sqlite3InRhsIsC
dfd0: 6f 6e 73 74 61 6e 74 28 70 58 29 20 7c 7c 20 70  onstant(pX) || p
dfe0: 58 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45 78 70  X->x.pList->nExp
dff0: 72 3c 3d 32 29 0a 20 20 29 7b 0a 20 20 20 20 65  r<=2).  ){.    e
e000: 54 79 70 65 20 3d 20 49 4e 5f 49 4e 44 45 58 5f  Type = IN_INDEX_
e010: 4e 4f 4f 50 3b 0a 20 20 7d 0a 20 20 20 20 20 0a  NOOP;.  }.     .
e020: 0a 20 20 69 66 28 20 65 54 79 70 65 3d 3d 30 20  .  if( eType==0 
e030: 29 7b 0a 20 20 20 20 2f 2a 20 43 6f 75 6c 64 20  ){.    /* Could 
e040: 6e 6f 74 20 66 69 6e 64 20 61 6e 20 65 78 69 73  not find an exis
e050: 74 69 6e 67 20 74 61 62 6c 65 20 6f 72 20 69 6e  ting table or in
e060: 64 65 78 20 74 6f 20 75 73 65 20 61 73 20 74 68  dex to use as th
e070: 65 20 52 48 53 20 62 2d 74 72 65 65 2e 0a 20 20  e RHS b-tree..  
e080: 20 20 2a 2a 20 57 65 20 77 69 6c 6c 20 68 61 76    ** We will hav
e090: 65 20 74 6f 20 67 65 6e 65 72 61 74 65 20 61 6e  e to generate an
e0a0: 20 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65   ephemeral table
e0b0: 20 74 6f 20 64 6f 20 74 68 65 20 6a 6f 62 2e 0a   to do the job..
e0c0: 20 20 20 20 2a 2f 0a 20 20 20 20 75 33 32 20 73      */.    u32 s
e0d0: 61 76 65 64 4e 51 75 65 72 79 4c 6f 6f 70 20 3d  avedNQueryLoop =
e0e0: 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79 4c   pParse->nQueryL
e0f0: 6f 6f 70 3b 0a 20 20 20 20 69 6e 74 20 72 4d 61  oop;.    int rMa
e100: 79 48 61 76 65 4e 75 6c 6c 20 3d 20 30 3b 0a 20  yHaveNull = 0;. 
e110: 20 20 20 65 54 79 70 65 20 3d 20 49 4e 5f 49 4e     eType = IN_IN
e120: 44 45 58 5f 45 50 48 3b 0a 20 20 20 20 69 66 28  DEX_EPH;.    if(
e130: 20 69 6e 46 6c 61 67 73 20 26 20 49 4e 5f 49 4e   inFlags & IN_IN
e140: 44 45 58 5f 4c 4f 4f 50 20 29 7b 0a 20 20 20 20  DEX_LOOP ){.    
e150: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
e160: 4c 6f 6f 70 20 3d 20 30 3b 0a 20 20 20 20 20 20  Loop = 0;.      
e170: 69 66 28 20 70 58 2d 3e 70 4c 65 66 74 2d 3e 69  if( pX->pLeft->i
e180: 43 6f 6c 75 6d 6e 3c 30 20 26 26 20 21 45 78 70  Column<0 && !Exp
e190: 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 58 2c  rHasProperty(pX,
e1a0: 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29   EP_xIsSelect) )
e1b0: 7b 0a 20 20 20 20 20 20 20 20 65 54 79 70 65 20  {.        eType 
e1c0: 3d 20 49 4e 5f 49 4e 44 45 58 5f 52 4f 57 49 44  = IN_INDEX_ROWID
e1d0: 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 7d 65  ;.      }.    }e
e1e0: 6c 73 65 20 69 66 28 20 70 72 52 68 73 48 61 73  lse if( prRhsHas
e1f0: 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20 20 2a 70  Null ){.      *p
e200: 72 52 68 73 48 61 73 4e 75 6c 6c 20 3d 20 72 4d  rRhsHasNull = rM
e210: 61 79 48 61 76 65 4e 75 6c 6c 20 3d 20 2b 2b 70  ayHaveNull = ++p
e220: 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
e230: 20 7d 0a 20 20 20 20 73 71 6c 69 74 65 33 43 6f   }.    sqlite3Co
e240: 64 65 53 75 62 73 65 6c 65 63 74 28 70 50 61 72  deSubselect(pPar
e250: 73 65 2c 20 70 58 2c 20 72 4d 61 79 48 61 76 65  se, pX, rMayHave
e260: 4e 75 6c 6c 2c 20 65 54 79 70 65 3d 3d 49 4e 5f  Null, eType==IN_
e270: 49 4e 44 45 58 5f 52 4f 57 49 44 29 3b 0a 20 20  INDEX_ROWID);.  
e280: 20 20 70 50 61 72 73 65 2d 3e 6e 51 75 65 72 79    pParse->nQuery
e290: 4c 6f 6f 70 20 3d 20 73 61 76 65 64 4e 51 75 65  Loop = savedNQue
e2a0: 72 79 4c 6f 6f 70 3b 0a 20 20 7d 65 6c 73 65 7b  ryLoop;.  }else{
e2b0: 0a 20 20 20 20 70 58 2d 3e 69 54 61 62 6c 65 20  .    pX->iTable 
e2c0: 3d 20 69 54 61 62 3b 0a 20 20 7d 0a 20 20 72 65  = iTab;.  }.  re
e2d0: 74 75 72 6e 20 65 54 79 70 65 3b 0a 7d 0a 23 65  turn eType;.}.#e
e2e0: 6e 64 69 66 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  ndif../*.** Gene
e2f0: 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 73 63  rate code for sc
e300: 61 6c 61 72 20 73 75 62 71 75 65 72 69 65 73 20  alar subqueries 
e310: 75 73 65 64 20 61 73 20 61 20 73 75 62 71 75 65  used as a subque
e320: 72 79 20 65 78 70 72 65 73 73 69 6f 6e 2c 20 45  ry expression, E
e330: 58 49 53 54 53 2c 0a 2a 2a 20 6f 72 20 49 4e 20  XISTS,.** or IN 
e340: 6f 70 65 72 61 74 6f 72 73 2e 20 20 45 78 61 6d  operators.  Exam
e350: 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20 20 20 20  ples:.**.**     
e360: 28 53 45 4c 45 43 54 20 61 20 46 52 4f 4d 20 62  (SELECT a FROM b
e370: 29 20 20 20 20 20 20 20 20 20 20 2d 2d 20 73 75  )          -- su
e380: 62 71 75 65 72 79 0a 2a 2a 20 20 20 20 20 45 58  bquery.**     EX
e390: 49 53 54 53 20 28 53 45 4c 45 43 54 20 61 20 46  ISTS (SELECT a F
e3a0: 52 4f 4d 20 62 29 20 20 20 2d 2d 20 45 58 49 53  ROM b)   -- EXIS
e3b0: 54 53 20 73 75 62 71 75 65 72 79 0a 2a 2a 20 20  TS subquery.**  
e3c0: 20 20 20 78 20 49 4e 20 28 34 2c 35 2c 31 31 29     x IN (4,5,11)
e3d0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 2d 2d                --
e3e0: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74   IN operator wit
e3f0: 68 20 6c 69 73 74 20 6f 6e 20 72 69 67 68 74 2d  h list on right-
e400: 68 61 6e 64 20 73 69 64 65 0a 2a 2a 20 20 20 20  hand side.**    
e410: 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 61 20   x IN (SELECT a 
e420: 46 52 4f 4d 20 62 29 20 20 20 20 20 2d 2d 20 49  FROM b)     -- I
e430: 4e 20 6f 70 65 72 61 74 6f 72 20 77 69 74 68 20  N operator with 
e440: 73 75 62 71 75 65 72 79 20 6f 6e 20 74 68 65 20  subquery on the 
e450: 72 69 67 68 74 0a 2a 2a 0a 2a 2a 20 54 68 65 20  right.**.** The 
e460: 70 45 78 70 72 20 70 61 72 61 6d 65 74 65 72 20  pExpr parameter 
e470: 64 65 73 63 72 69 62 65 73 20 74 68 65 20 65 78  describes the ex
e480: 70 72 65 73 73 69 6f 6e 20 74 68 61 74 20 63 6f  pression that co
e490: 6e 74 61 69 6e 73 20 74 68 65 20 49 4e 0a 2a 2a  ntains the IN.**
e4a0: 20 6f 70 65 72 61 74 6f 72 20 6f 72 20 73 75 62   operator or sub
e4b0: 71 75 65 72 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20  query..**.** If 
e4c0: 70 61 72 61 6d 65 74 65 72 20 69 73 52 6f 77 69  parameter isRowi
e4d0: 64 20 69 73 20 6e 6f 6e 2d 7a 65 72 6f 2c 20 74  d is non-zero, t
e4e0: 68 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 70  hen expression p
e4f0: 45 78 70 72 20 69 73 20 67 75 61 72 61 6e 74 65  Expr is guarante
e500: 65 64 0a 2a 2a 20 74 6f 20 62 65 20 6f 66 20 74  ed.** to be of t
e510: 68 65 20 66 6f 72 6d 20 22 3c 72 6f 77 69 64 3e  he form "<rowid>
e520: 20 49 4e 20 28 3f 2c 20 3f 2c 20 3f 29 22 2c 20   IN (?, ?, ?)", 
e530: 77 68 65 72 65 20 3c 72 6f 77 69 64 3e 20 69 73  where <rowid> is
e540: 20 61 20 72 65 66 65 72 65 6e 63 65 0a 2a 2a 20   a reference.** 
e550: 74 6f 20 73 6f 6d 65 20 69 6e 74 65 67 65 72 20  to some integer 
e560: 6b 65 79 20 63 6f 6c 75 6d 6e 20 6f 66 20 61 20  key column of a 
e570: 74 61 62 6c 65 20 42 2d 54 72 65 65 2e 20 49 6e  table B-Tree. In
e580: 20 74 68 69 73 20 63 61 73 65 2c 20 75 73 65 20   this case, use 
e590: 61 6e 0a 2a 2a 20 69 6e 74 6b 65 79 20 42 2d 54  an.** intkey B-T
e5a0: 72 65 65 20 74 6f 20 73 74 6f 72 65 20 74 68 65  ree to store the
e5b0: 20 73 65 74 20 6f 66 20 49 4e 28 2e 2e 2e 29 20   set of IN(...) 
e5c0: 76 61 6c 75 65 73 20 69 6e 73 74 65 61 64 20 6f  values instead o
e5d0: 66 20 74 68 65 20 75 73 75 61 6c 0a 2a 2a 20 28  f the usual.** (
e5e0: 73 6c 6f 77 65 72 29 20 76 61 72 69 61 62 6c 65  slower) variable
e5f0: 20 6c 65 6e 67 74 68 20 6b 65 79 73 20 42 2d 54   length keys B-T
e600: 72 65 65 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 72 4d  ree..**.** If rM
e610: 61 79 48 61 76 65 4e 75 6c 6c 20 69 73 20 6e 6f  ayHaveNull is no
e620: 6e 2d 7a 65 72 6f 2c 20 74 68 61 74 20 6d 65 61  n-zero, that mea
e630: 6e 73 20 74 68 61 74 20 74 68 65 20 6f 70 65 72  ns that the oper
e640: 61 74 69 6f 6e 20 69 73 20 61 6e 20 49 4e 0a 2a  ation is an IN.*
e650: 2a 20 28 6e 6f 74 20 61 20 53 45 4c 45 43 54 20  * (not a SELECT 
e660: 6f 72 20 45 58 49 53 54 53 29 20 61 6e 64 20 74  or EXISTS) and t
e670: 68 61 74 20 74 68 65 20 52 48 53 20 6d 69 67 68  hat the RHS migh
e680: 74 20 63 6f 6e 74 61 69 6e 73 20 4e 55 4c 4c 73  t contains NULLs
e690: 2e 0a 2a 2a 20 41 6c 6c 20 74 68 69 73 20 72 6f  ..** All this ro
e6a0: 75 74 69 6e 65 20 64 6f 65 73 20 69 73 20 69 6e  utine does is in
e6b0: 69 74 69 61 6c 69 7a 65 20 74 68 65 20 72 65 67  itialize the reg
e6c0: 69 73 74 65 72 20 67 69 76 65 6e 20 62 79 20 72  ister given by r
e6d0: 4d 61 79 48 61 76 65 4e 75 6c 6c 0a 2a 2a 20 74  MayHaveNull.** t
e6e0: 6f 20 4e 55 4c 4c 2e 20 20 43 61 6c 6c 69 6e 67  o NULL.  Calling
e6f0: 20 72 6f 75 74 69 6e 65 73 20 77 69 6c 6c 20 74   routines will t
e700: 61 6b 65 20 63 61 72 65 20 6f 66 20 63 68 61 6e  ake care of chan
e710: 67 69 6e 67 20 74 68 69 73 20 72 65 67 69 73 74  ging this regist
e720: 65 72 0a 2a 2a 20 76 61 6c 75 65 20 74 6f 20 6e  er.** value to n
e730: 6f 6e 2d 4e 55 4c 4c 20 69 66 20 74 68 65 20 52  on-NULL if the R
e740: 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
e750: 0a 2a 2a 0a 2a 2a 20 46 6f 72 20 61 20 53 45 4c  .**.** For a SEL
e760: 45 43 54 20 6f 72 20 45 58 49 53 54 53 20 6f 70  ECT or EXISTS op
e770: 65 72 61 74 6f 72 2c 20 72 65 74 75 72 6e 20 74  erator, return t
e780: 68 65 20 72 65 67 69 73 74 65 72 20 74 68 61 74  he register that
e790: 20 68 6f 6c 64 73 20 74 68 65 0a 2a 2a 20 72 65   holds the.** re
e7a0: 73 75 6c 74 2e 20 20 46 6f 72 20 49 4e 20 6f 70  sult.  For IN op
e7b0: 65 72 61 74 6f 72 73 20 6f 72 20 69 66 20 61 6e  erators or if an
e7c0: 20 65 72 72 6f 72 20 6f 63 63 75 72 73 2c 20 74   error occurs, t
e7d0: 68 65 20 72 65 74 75 72 6e 20 76 61 6c 75 65 20  he return value 
e7e0: 69 73 20 30 2e 0a 2a 2f 0a 23 69 66 6e 64 65 66  is 0..*/.#ifndef
e7f0: 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55 42   SQLITE_OMIT_SUB
e800: 51 55 45 52 59 0a 69 6e 74 20 73 71 6c 69 74 65  QUERY.int sqlite
e810: 33 43 6f 64 65 53 75 62 73 65 6c 65 63 74 28 0a  3CodeSubselect(.
e820: 20 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c    Parse *pParse,
e830: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 50 61 72            /* Par
e840: 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
e850: 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
e860: 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
e870: 20 49 4e 2c 20 53 45 4c 45 43 54 2c 20 6f 72 20   IN, SELECT, or 
e880: 45 58 49 53 54 53 20 6f 70 65 72 61 74 6f 72 20  EXISTS operator 
e890: 2a 2f 0a 20 20 69 6e 74 20 72 48 61 73 4e 75 6c  */.  int rHasNul
e8a0: 6c 46 6c 61 67 2c 20 20 20 20 20 20 20 2f 2a 20  lFlag,       /* 
e8b0: 52 65 67 69 73 74 65 72 20 74 68 61 74 20 72 65  Register that re
e8c0: 63 6f 72 64 73 20 77 68 65 74 68 65 72 20 4e 55  cords whether NU
e8d0: 4c 4c 73 20 65 78 69 73 74 20 69 6e 20 52 48 53  LLs exist in RHS
e8e0: 20 2a 2f 0a 20 20 69 6e 74 20 69 73 52 6f 77 69   */.  int isRowi
e8f0: 64 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a  d             /*
e900: 20 49 66 20 74 72 75 65 2c 20 4c 48 53 20 6f 66   If true, LHS of
e910: 20 49 4e 20 6f 70 65 72 61 74 6f 72 20 69 73 20   IN operator is 
e920: 61 20 72 6f 77 69 64 20 2a 2f 0a 29 7b 0a 20 20  a rowid */.){.  
e930: 69 6e 74 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63  int jmpIfDynamic
e940: 20 3d 20 2d 31 3b 20 20 20 20 20 20 20 20 20 20   = -1;          
e950: 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 4f              /* O
e960: 6e 65 2d 74 69 6d 65 20 74 65 73 74 20 61 64 64  ne-time test add
e970: 72 65 73 73 20 2a 2f 0a 20 20 69 6e 74 20 72 52  ress */.  int rR
e980: 65 67 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  eg = 0;         
e990: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
e9a0: 20 20 2f 2a 20 52 65 67 69 73 74 65 72 20 73 74    /* Register st
e9b0: 6f 72 69 6e 67 20 72 65 73 75 6c 74 69 6e 67 20  oring resulting 
e9c0: 2a 2f 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 73  */.  Vdbe *v = s
e9d0: 71 6c 69 74 65 33 47 65 74 56 64 62 65 28 70 50  qlite3GetVdbe(pP
e9e0: 61 72 73 65 29 3b 0a 20 20 69 66 28 20 4e 45 56  arse);.  if( NEV
e9f0: 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
ea00: 6e 20 30 3b 0a 20 20 73 71 6c 69 74 65 33 45 78  n 0;.  sqlite3Ex
ea10: 70 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72  prCachePush(pPar
ea20: 73 65 29 3b 0a 0a 20 20 2f 2a 20 54 68 69 73 20  se);..  /* This 
ea30: 63 6f 64 65 20 6d 75 73 74 20 62 65 20 72 75 6e  code must be run
ea40: 20 69 6e 20 69 74 73 20 65 6e 74 69 72 65 74 79   in its entirety
ea50: 20 65 76 65 72 79 20 74 69 6d 65 20 69 74 20 69   every time it i
ea60: 73 20 65 6e 63 6f 75 6e 74 65 72 65 64 0a 20 20  s encountered.  
ea70: 2a 2a 20 69 66 20 61 6e 79 20 6f 66 20 74 68 65  ** if any of the
ea80: 20 66 6f 6c 6c 6f 77 69 6e 67 20 69 73 20 74 72   following is tr
ea90: 75 65 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20 20  ue:.  **.  **   
eaa0: 20 2a 20 20 54 68 65 20 72 69 67 68 74 2d 68 61   *  The right-ha
eab0: 6e 64 20 73 69 64 65 20 69 73 20 61 20 63 6f 72  nd side is a cor
eac0: 72 65 6c 61 74 65 64 20 73 75 62 71 75 65 72 79  related subquery
ead0: 0a 20 20 2a 2a 20 20 20 20 2a 20 20 54 68 65 20  .  **    *  The 
eae0: 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65 20  right-hand side 
eaf0: 69 73 20 61 6e 20 65 78 70 72 65 73 73 69 6f 6e  is an expression
eb00: 20 6c 69 73 74 20 63 6f 6e 74 61 69 6e 69 6e 67   list containing
eb10: 20 76 61 72 69 61 62 6c 65 73 0a 20 20 2a 2a 20   variables.  ** 
eb20: 20 20 20 2a 20 20 57 65 20 61 72 65 20 69 6e 73     *  We are ins
eb30: 69 64 65 20 61 20 74 72 69 67 67 65 72 0a 20 20  ide a trigger.  
eb40: 2a 2a 0a 20 20 2a 2a 20 49 66 20 61 6c 6c 20 6f  **.  ** If all o
eb50: 66 20 74 68 65 20 61 62 6f 76 65 20 61 72 65 20  f the above are 
eb60: 66 61 6c 73 65 2c 20 74 68 65 6e 20 77 65 20 63  false, then we c
eb70: 61 6e 20 72 75 6e 20 74 68 69 73 20 63 6f 64 65  an run this code
eb80: 20 6a 75 73 74 20 6f 6e 63 65 0a 20 20 2a 2a 20   just once.  ** 
eb90: 73 61 76 65 20 74 68 65 20 72 65 73 75 6c 74 73  save the results
eba0: 2c 20 61 6e 64 20 72 65 75 73 65 20 74 68 65 20  , and reuse the 
ebb0: 73 61 6d 65 20 72 65 73 75 6c 74 20 6f 6e 20 73  same result on s
ebc0: 75 62 73 65 71 75 65 6e 74 20 69 6e 76 6f 63 61  ubsequent invoca
ebd0: 74 69 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66  tions..  */.  if
ebe0: 28 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72  ( !ExprHasProper
ebf0: 74 79 28 70 45 78 70 72 2c 20 45 50 5f 56 61 72  ty(pExpr, EP_Var
ec00: 53 65 6c 65 63 74 29 20 29 7b 0a 20 20 20 20 6a  Select) ){.    j
ec10: 6d 70 49 66 44 79 6e 61 6d 69 63 20 3d 20 73 71  mpIfDynamic = sq
ec20: 6c 69 74 65 33 43 6f 64 65 4f 6e 63 65 28 70 50  lite3CodeOnce(pP
ec30: 61 72 73 65 29 3b 20 56 64 62 65 43 6f 76 65 72  arse); VdbeCover
ec40: 61 67 65 28 76 29 3b 0a 20 20 7d 0a 0a 23 69 66  age(v);.  }..#if
ec50: 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
ec60: 5f 45 58 50 4c 41 49 4e 0a 20 20 69 66 28 20 70  _EXPLAIN.  if( p
ec70: 50 61 72 73 65 2d 3e 65 78 70 6c 61 69 6e 3d 3d  Parse->explain==
ec80: 32 20 29 7b 0a 20 20 20 20 63 68 61 72 20 2a 7a  2 ){.    char *z
ec90: 4d 73 67 20 3d 20 73 71 6c 69 74 65 33 4d 50 72  Msg = sqlite3MPr
eca0: 69 6e 74 66 28 0a 20 20 20 20 20 20 20 20 70 50  intf(.        pP
ecb0: 61 72 73 65 2d 3e 64 62 2c 20 22 45 58 45 43 55  arse->db, "EXECU
ecc0: 54 45 20 25 73 25 73 20 53 55 42 51 55 45 52 59  TE %s%s SUBQUERY
ecd0: 20 25 64 22 2c 20 6a 6d 70 49 66 44 79 6e 61 6d   %d", jmpIfDynam
ece0: 69 63 3e 3d 30 3f 22 22 3a 22 43 4f 52 52 45 4c  ic>=0?"":"CORREL
ecf0: 41 54 45 44 20 22 2c 0a 20 20 20 20 20 20 20 20  ATED ",.        
ed00: 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 4e  pExpr->op==TK_IN
ed10: 3f 22 4c 49 53 54 22 3a 22 53 43 41 4c 41 52 22  ?"LIST":"SCALAR"
ed20: 2c 20 70 50 61 72 73 65 2d 3e 69 4e 65 78 74 53  , pParse->iNextS
ed30: 65 6c 65 63 74 49 64 0a 20 20 20 20 29 3b 0a 20  electId.    );. 
ed40: 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
ed50: 64 4f 70 34 28 76 2c 20 4f 50 5f 45 78 70 6c 61  dOp4(v, OP_Expla
ed60: 69 6e 2c 20 70 50 61 72 73 65 2d 3e 69 53 65 6c  in, pParse->iSel
ed70: 65 63 74 49 64 2c 20 30 2c 20 30 2c 20 7a 4d 73  ectId, 0, 0, zMs
ed80: 67 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  g, P4_DYNAMIC);.
ed90: 20 20 7d 0a 23 65 6e 64 69 66 0a 0a 20 20 73 77    }.#endif..  sw
eda0: 69 74 63 68 28 20 70 45 78 70 72 2d 3e 6f 70 20  itch( pExpr->op 
edb0: 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49  ){.    case TK_I
edc0: 4e 3a 20 7b 0a 20 20 20 20 20 20 63 68 61 72 20  N: {.      char 
edd0: 61 66 66 69 6e 69 74 79 3b 20 20 20 20 20 20 20  affinity;       
ede0: 20 20 20 20 20 20 20 2f 2a 20 41 66 66 69 6e 69         /* Affini
edf0: 74 79 20 6f 66 20 74 68 65 20 4c 48 53 20 6f 66  ty of the LHS of
ee00: 20 74 68 65 20 49 4e 20 2a 2f 0a 20 20 20 20 20   the IN */.     
ee10: 20 69 6e 74 20 61 64 64 72 3b 20 20 20 20 20 20   int addr;      
ee20: 20 20 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20               /* 
ee30: 41 64 64 72 65 73 73 20 6f 66 20 4f 50 5f 4f 70  Address of OP_Op
ee40: 65 6e 45 70 68 65 6d 65 72 61 6c 20 69 6e 73 74  enEphemeral inst
ee50: 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 20 20 20  ruction */.     
ee60: 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
ee70: 45 78 70 72 2d 3e 70 4c 65 66 74 3b 20 2f 2a 20  Expr->pLeft; /* 
ee80: 74 68 65 20 4c 48 53 20 6f 66 20 74 68 65 20 49  the LHS of the I
ee90: 4e 20 6f 70 65 72 61 74 6f 72 20 2a 2f 0a 20 20  N operator */.  
eea0: 20 20 20 20 4b 65 79 49 6e 66 6f 20 2a 70 4b 65      KeyInfo *pKe
eeb0: 79 49 6e 66 6f 20 3d 20 30 3b 20 20 20 20 20 20  yInfo = 0;      
eec0: 2f 2a 20 4b 65 79 20 69 6e 66 6f 72 6d 61 74 69  /* Key informati
eed0: 6f 6e 20 2a 2f 0a 0a 20 20 20 20 20 20 61 66 66  on */..      aff
eee0: 69 6e 69 74 79 20 3d 20 73 71 6c 69 74 65 33 45  inity = sqlite3E
eef0: 78 70 72 41 66 66 69 6e 69 74 79 28 70 4c 65 66  xprAffinity(pLef
ef00: 74 29 3b 0a 0a 20 20 20 20 20 20 2f 2a 20 57 68  t);..      /* Wh
ef10: 65 74 68 65 72 20 74 68 69 73 20 69 73 20 61 6e  ether this is an
ef20: 20 27 78 20 49 4e 28 53 45 4c 45 43 54 2e 2e 2e   'x IN(SELECT...
ef30: 29 27 20 6f 72 20 61 6e 20 27 78 20 49 4e 28 3c  )' or an 'x IN(<
ef40: 65 78 70 72 6c 69 73 74 3e 29 27 0a 20 20 20 20  exprlist>)'.    
ef50: 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20    ** expression 
ef60: 69 74 20 69 73 20 68 61 6e 64 6c 65 64 20 74 68  it is handled th
ef70: 65 20 73 61 6d 65 20 77 61 79 2e 20 20 41 6e 20  e same way.  An 
ef80: 65 70 68 65 6d 65 72 61 6c 20 74 61 62 6c 65 20  ephemeral table 
ef90: 69 73 20 0a 20 20 20 20 20 20 2a 2a 20 66 69 6c  is .      ** fil
efa0: 6c 65 64 20 77 69 74 68 20 73 69 6e 67 6c 65 2d  led with single-
efb0: 66 69 65 6c 64 20 69 6e 64 65 78 20 6b 65 79 73  field index keys
efc0: 20 72 65 70 72 65 73 65 6e 74 69 6e 67 20 74 68   representing th
efd0: 65 20 72 65 73 75 6c 74 73 0a 20 20 20 20 20 20  e results.      
efe0: 2a 2a 20 66 72 6f 6d 20 74 68 65 20 53 45 4c 45  ** from the SELE
eff0: 43 54 20 6f 72 20 74 68 65 20 3c 65 78 70 72 6c  CT or the <exprl
f000: 69 73 74 3e 2e 0a 20 20 20 20 20 20 2a 2a 0a 20  ist>..      **. 
f010: 20 20 20 20 20 2a 2a 20 49 66 20 74 68 65 20 27       ** If the '
f020: 78 27 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  x' expression is
f030: 20 61 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c   a column value,
f040: 20 6f 72 20 74 68 65 20 53 45 4c 45 43 54 2e 2e   or the SELECT..
f050: 2e 0a 20 20 20 20 20 20 2a 2a 20 73 74 61 74 65  ..      ** state
f060: 6d 65 6e 74 20 72 65 74 75 72 6e 73 20 61 20 63  ment returns a c
f070: 6f 6c 75 6d 6e 20 76 61 6c 75 65 2c 20 74 68 65  olumn value, the
f080: 6e 20 74 68 65 20 61 66 66 69 6e 69 74 79 20 6f  n the affinity o
f090: 66 20 74 68 61 74 0a 20 20 20 20 20 20 2a 2a 20  f that.      ** 
f0a0: 63 6f 6c 75 6d 6e 20 69 73 20 75 73 65 64 20 74  column is used t
f0b0: 6f 20 62 75 69 6c 64 20 74 68 65 20 69 6e 64 65  o build the inde
f0c0: 78 20 6b 65 79 73 2e 20 49 66 20 62 6f 74 68 20  x keys. If both 
f0d0: 27 78 27 20 61 6e 64 20 74 68 65 0a 20 20 20 20  'x' and the.    
f0e0: 20 20 2a 2a 20 53 45 4c 45 43 54 2e 2e 2e 20 73    ** SELECT... s
f0f0: 74 61 74 65 6d 65 6e 74 20 61 72 65 20 63 6f 6c  tatement are col
f100: 75 6d 6e 73 2c 20 74 68 65 6e 20 6e 75 6d 65 72  umns, then numer
f110: 69 63 20 61 66 66 69 6e 69 74 79 20 69 73 20 75  ic affinity is u
f120: 73 65 64 0a 20 20 20 20 20 20 2a 2a 20 69 66 20  sed.      ** if 
f130: 65 69 74 68 65 72 20 63 6f 6c 75 6d 6e 20 68 61  either column ha
f140: 73 20 4e 55 4d 45 52 49 43 20 6f 72 20 49 4e 54  s NUMERIC or INT
f150: 45 47 45 52 20 61 66 66 69 6e 69 74 79 2e 20 49  EGER affinity. I
f160: 66 20 6e 65 69 74 68 65 72 0a 20 20 20 20 20 20  f neither.      
f170: 2a 2a 20 27 78 27 20 6e 6f 72 20 74 68 65 20 53  ** 'x' nor the S
f180: 45 4c 45 43 54 2e 2e 2e 20 73 74 61 74 65 6d 65  ELECT... stateme
f190: 6e 74 20 61 72 65 20 63 6f 6c 75 6d 6e 73 2c 20  nt are columns, 
f1a0: 74 68 65 6e 20 6e 75 6d 65 72 69 63 20 61 66 66  then numeric aff
f1b0: 69 6e 69 74 79 0a 20 20 20 20 20 20 2a 2a 20 69  inity.      ** i
f1c0: 73 20 75 73 65 64 2e 0a 20 20 20 20 20 20 2a 2f  s used..      */
f1d0: 0a 20 20 20 20 20 20 70 45 78 70 72 2d 3e 69 54  .      pExpr->iT
f1e0: 61 62 6c 65 20 3d 20 70 50 61 72 73 65 2d 3e 6e  able = pParse->n
f1f0: 54 61 62 2b 2b 3b 0a 20 20 20 20 20 20 61 64 64  Tab++;.      add
f200: 72 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  r = sqlite3VdbeA
f210: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4f 70 65 6e  ddOp2(v, OP_Open
f220: 45 70 68 65 6d 65 72 61 6c 2c 20 70 45 78 70 72  Ephemeral, pExpr
f230: 2d 3e 69 54 61 62 6c 65 2c 20 21 69 73 52 6f 77  ->iTable, !isRow
f240: 69 64 29 3b 0a 20 20 20 20 20 20 70 4b 65 79 49  id);.      pKeyI
f250: 6e 66 6f 20 3d 20 69 73 52 6f 77 69 64 20 3f 20  nfo = isRowid ? 
f260: 30 20 3a 20 73 71 6c 69 74 65 33 4b 65 79 49 6e  0 : sqlite3KeyIn
f270: 66 6f 41 6c 6c 6f 63 28 70 50 61 72 73 65 2d 3e  foAlloc(pParse->
f280: 64 62 2c 20 31 2c 20 31 29 3b 0a 0a 20 20 20 20  db, 1, 1);..    
f290: 20 20 69 66 28 20 45 78 70 72 48 61 73 50 72 6f    if( ExprHasPro
f2a0: 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f  perty(pExpr, EP_
f2b0: 78 49 73 53 65 6c 65 63 74 29 20 29 7b 0a 20 20  xIsSelect) ){.  
f2c0: 20 20 20 20 20 20 2f 2a 20 43 61 73 65 20 31 3a        /* Case 1:
f2d0: 20 20 20 20 20 65 78 70 72 20 49 4e 20 28 53 45       expr IN (SE
f2e0: 4c 45 43 54 20 2e 2e 2e 29 0a 20 20 20 20 20 20  LECT ...).      
f2f0: 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a 20    **.        ** 
f300: 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 6f  Generate code to
f310: 20 77 72 69 74 65 20 74 68 65 20 72 65 73 75 6c   write the resul
f320: 74 73 20 6f 66 20 74 68 65 20 73 65 6c 65 63 74  ts of the select
f330: 20 69 6e 74 6f 20 74 68 65 20 74 65 6d 70 6f 72   into the tempor
f340: 61 72 79 0a 20 20 20 20 20 20 20 20 2a 2a 20 74  ary.        ** t
f350: 61 62 6c 65 20 61 6c 6c 6f 63 61 74 65 64 20 61  able allocated a
f360: 6e 64 20 6f 70 65 6e 65 64 20 61 62 6f 76 65 2e  nd opened above.
f370: 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
f380: 20 20 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c      Select *pSel
f390: 65 63 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ect = pExpr->x.p
f3a0: 53 65 6c 65 63 74 3b 0a 20 20 20 20 20 20 20 20  Select;.        
f3b0: 53 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b  SelectDest dest;
f3c0: 0a 20 20 20 20 20 20 20 20 45 78 70 72 4c 69 73  .        ExprLis
f3d0: 74 20 2a 70 45 4c 69 73 74 3b 0a 0a 20 20 20 20  t *pEList;..    
f3e0: 20 20 20 20 61 73 73 65 72 74 28 20 21 69 73 52      assert( !isR
f3f0: 6f 77 69 64 20 29 3b 0a 20 20 20 20 20 20 20 20  owid );.        
f400: 73 71 6c 69 74 65 33 53 65 6c 65 63 74 44 65 73  sqlite3SelectDes
f410: 74 49 6e 69 74 28 26 64 65 73 74 2c 20 53 52 54  tInit(&dest, SRT
f420: 5f 53 65 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  _Set, pExpr->iTa
f430: 62 6c 65 29 3b 0a 20 20 20 20 20 20 20 20 64 65  ble);.        de
f440: 73 74 2e 61 66 66 53 64 73 74 20 3d 20 28 75 38  st.affSdst = (u8
f450: 29 61 66 66 69 6e 69 74 79 3b 0a 20 20 20 20 20  )affinity;.     
f460: 20 20 20 61 73 73 65 72 74 28 20 28 70 45 78 70     assert( (pExp
f470: 72 2d 3e 69 54 61 62 6c 65 26 30 78 30 30 30 30  r->iTable&0x0000
f480: 46 46 46 46 29 3d 3d 70 45 78 70 72 2d 3e 69 54  FFFF)==pExpr->iT
f490: 61 62 6c 65 20 29 3b 0a 20 20 20 20 20 20 20 20  able );.        
f4a0: 70 53 65 6c 65 63 74 2d 3e 69 4c 69 6d 69 74 20  pSelect->iLimit 
f4b0: 3d 20 30 3b 0a 20 20 20 20 20 20 20 20 74 65 73  = 0;.        tes
f4c0: 74 63 61 73 65 28 20 70 53 65 6c 65 63 74 2d 3e  tcase( pSelect->
f4d0: 73 65 6c 46 6c 61 67 73 20 26 20 53 46 5f 44 69  selFlags & SF_Di
f4e0: 73 74 69 6e 63 74 20 29 3b 0a 20 20 20 20 20 20  stinct );.      
f4f0: 20 20 70 53 65 6c 65 63 74 2d 3e 73 65 6c 46 6c    pSelect->selFl
f500: 61 67 73 20 26 3d 20 7e 53 46 5f 44 69 73 74 69  ags &= ~SF_Disti
f510: 6e 63 74 3b 0a 20 20 20 20 20 20 20 20 74 65 73  nct;.        tes
f520: 74 63 61 73 65 28 20 70 4b 65 79 49 6e 66 6f 3d  tcase( pKeyInfo=
f530: 3d 30 20 29 3b 20 2f 2a 20 43 61 75 73 65 64 20  =0 ); /* Caused 
f540: 62 79 20 4f 4f 4d 20 69 6e 20 73 71 6c 69 74 65  by OOM in sqlite
f550: 33 4b 65 79 49 6e 66 6f 41 6c 6c 6f 63 28 29 20  3KeyInfoAlloc() 
f560: 2a 2f 0a 20 20 20 20 20 20 20 20 69 66 28 20 73  */.        if( s
f570: 71 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61  qlite3Select(pPa
f580: 72 73 65 2c 20 70 53 65 6c 65 63 74 2c 20 26 64  rse, pSelect, &d
f590: 65 73 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20  est) ){.        
f5a0: 20 20 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f    sqlite3KeyInfo
f5b0: 55 6e 72 65 66 28 70 4b 65 79 49 6e 66 6f 29 3b  Unref(pKeyInfo);
f5c0: 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
f5d0: 6e 20 30 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  n 0;.        }. 
f5e0: 20 20 20 20 20 20 20 70 45 4c 69 73 74 20 3d 20         pEList = 
f5f0: 70 53 65 6c 65 63 74 2d 3e 70 45 4c 69 73 74 3b  pSelect->pEList;
f600: 0a 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28  .        assert(
f610: 20 70 4b 65 79 49 6e 66 6f 21 3d 30 20 29 3b 20   pKeyInfo!=0 ); 
f620: 2f 2a 20 4f 4f 4d 20 77 69 6c 6c 20 63 61 75 73  /* OOM will caus
f630: 65 20 65 78 69 74 20 61 66 74 65 72 20 73 71 6c  e exit after sql
f640: 69 74 65 33 53 65 6c 65 63 74 28 29 20 2a 2f 0a  ite3Select() */.
f650: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f660: 70 45 4c 69 73 74 21 3d 30 20 29 3b 0a 20 20 20  pEList!=0 );.   
f670: 20 20 20 20 20 61 73 73 65 72 74 28 20 70 45 4c       assert( pEL
f680: 69 73 74 2d 3e 6e 45 78 70 72 3e 30 20 29 3b 0a  ist->nExpr>0 );.
f690: 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
f6a0: 73 71 6c 69 74 65 33 4b 65 79 49 6e 66 6f 49 73  sqlite3KeyInfoIs
f6b0: 57 72 69 74 65 61 62 6c 65 28 70 4b 65 79 49 6e  Writeable(pKeyIn
f6c0: 66 6f 29 20 29 3b 0a 20 20 20 20 20 20 20 20 70  fo) );.        p
f6d0: 4b 65 79 49 6e 66 6f 2d 3e 61 43 6f 6c 6c 5b 30  KeyInfo->aColl[0
f6e0: 5d 20 3d 20 73 71 6c 69 74 65 33 42 69 6e 61 72  ] = sqlite3Binar
f6f0: 79 43 6f 6d 70 61 72 65 43 6f 6c 6c 53 65 71 28  yCompareCollSeq(
f700: 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
f710: 4c 65 66 74 2c 0a 20 20 20 20 20 20 20 20 20 20  Left,.          
f720: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f730: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
f740: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70                 p
f750: 45 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70  EList->a[0].pExp
f760: 72 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 20  r);.      }else 
f770: 69 66 28 20 41 4c 57 41 59 53 28 70 45 78 70 72  if( ALWAYS(pExpr
f780: 2d 3e 78 2e 70 4c 69 73 74 21 3d 30 29 20 29 7b  ->x.pList!=0) ){
f790: 0a 20 20 20 20 20 20 20 20 2f 2a 20 43 61 73 65  .        /* Case
f7a0: 20 32 3a 20 20 20 20 20 65 78 70 72 20 49 4e 20   2:     expr IN 
f7b0: 28 65 78 70 72 6c 69 73 74 29 0a 20 20 20 20 20  (exprlist).     
f7c0: 20 20 20 2a 2a 0a 20 20 20 20 20 20 20 20 2a 2a     **.        **
f7d0: 20 46 6f 72 20 65 61 63 68 20 65 78 70 72 65 73   For each expres
f7e0: 73 69 6f 6e 2c 20 62 75 69 6c 64 20 61 6e 20 69  sion, build an i
f7f0: 6e 64 65 78 20 6b 65 79 20 66 72 6f 6d 20 74 68  ndex key from th
f800: 65 20 65 76 61 6c 75 61 74 69 6f 6e 20 61 6e 64  e evaluation and
f810: 0a 20 20 20 20 20 20 20 20 2a 2a 20 73 74 6f 72  .        ** stor
f820: 65 20 69 74 20 69 6e 20 74 68 65 20 74 65 6d 70  e it in the temp
f830: 6f 72 61 72 79 20 74 61 62 6c 65 2e 20 49 66 20  orary table. If 
f840: 3c 65 78 70 72 3e 20 69 73 20 61 20 63 6f 6c 75  <expr> is a colu
f850: 6d 6e 2c 20 74 68 65 6e 20 75 73 65 0a 20 20 20  mn, then use.   
f860: 20 20 20 20 20 2a 2a 20 74 68 61 74 20 63 6f 6c       ** that col
f870: 75 6d 6e 73 20 61 66 66 69 6e 69 74 79 20 77 68  umns affinity wh
f880: 65 6e 20 62 75 69 6c 64 69 6e 67 20 69 6e 64 65  en building inde
f890: 78 20 6b 65 79 73 2e 20 49 66 20 3c 65 78 70 72  x keys. If <expr
f8a0: 3e 20 69 73 20 6e 6f 74 0a 20 20 20 20 20 20 20  > is not.       
f8b0: 20 2a 2a 20 61 20 63 6f 6c 75 6d 6e 2c 20 75 73   ** a column, us
f8c0: 65 20 6e 75 6d 65 72 69 63 20 61 66 66 69 6e 69  e numeric affini
f8d0: 74 79 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  ty..        */. 
f8e0: 20 20 20 20 20 20 20 69 6e 74 20 69 3b 0a 20 20         int i;.  
f8f0: 20 20 20 20 20 20 45 78 70 72 4c 69 73 74 20 2a        ExprList *
f900: 70 4c 69 73 74 20 3d 20 70 45 78 70 72 2d 3e 78  pList = pExpr->x
f910: 2e 70 4c 69 73 74 3b 0a 20 20 20 20 20 20 20 20  .pList;.        
f920: 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
f930: 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20  item *pItem;.   
f940: 20 20 20 20 20 69 6e 74 20 72 31 2c 20 72 32 2c       int r1, r2,
f950: 20 72 33 3b 0a 0a 20 20 20 20 20 20 20 20 69 66   r3;..        if
f960: 28 20 21 61 66 66 69 6e 69 74 79 20 29 7b 0a 20  ( !affinity ){. 
f970: 20 20 20 20 20 20 20 20 20 61 66 66 69 6e 69 74           affinit
f980: 79 20 3d 20 53 51 4c 49 54 45 5f 41 46 46 5f 4e  y = SQLITE_AFF_N
f990: 4f 4e 45 3b 0a 20 20 20 20 20 20 20 20 7d 0a 20  ONE;.        }. 
f9a0: 20 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49         if( pKeyI
f9b0: 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 20  nfo ){.         
f9c0: 20 61 73 73 65 72 74 28 20 73 71 6c 69 74 65 33   assert( sqlite3
f9d0: 4b 65 79 49 6e 66 6f 49 73 57 72 69 74 65 61 62  KeyInfoIsWriteab
f9e0: 6c 65 28 70 4b 65 79 49 6e 66 6f 29 20 29 3b 0a  le(pKeyInfo) );.
f9f0: 20 20 20 20 20 20 20 20 20 20 70 4b 65 79 49 6e            pKeyIn
fa00: 66 6f 2d 3e 61 43 6f 6c 6c 5b 30 5d 20 3d 20 73  fo->aColl[0] = s
fa10: 71 6c 69 74 65 33 45 78 70 72 43 6f 6c 6c 53 65  qlite3ExprCollSe
fa20: 71 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  q(pParse, pExpr-
fa30: 3e 70 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 20  >pLeft);.       
fa40: 20 7d 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 4c   }..        /* L
fa50: 6f 6f 70 20 74 68 72 6f 75 67 68 20 65 61 63 68  oop through each
fa60: 20 65 78 70 72 65 73 73 69 6f 6e 20 69 6e 20 3c   expression in <
fa70: 65 78 70 72 6c 69 73 74 3e 2e 20 2a 2f 0a 20 20  exprlist>. */.  
fa80: 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
fa90: 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50 61  e3GetTempReg(pPa
faa0: 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20 72 32  rse);.        r2
fab0: 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
fac0: 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20  pReg(pParse);.  
fad0: 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77 69        if( isRowi
fae0: 64 20 29 20 73 71 6c 69 74 65 33 56 64 62 65 41  d ) sqlite3VdbeA
faf0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c  ddOp2(v, OP_Null
fb00: 2c 20 30 2c 20 72 32 29 3b 0a 20 20 20 20 20 20  , 0, r2);.      
fb10: 20 20 66 6f 72 28 69 3d 70 4c 69 73 74 2d 3e 6e    for(i=pList->n
fb20: 45 78 70 72 2c 20 70 49 74 65 6d 3d 70 4c 69 73  Expr, pItem=pLis
fb30: 74 2d 3e 61 3b 20 69 3e 30 3b 20 69 2d 2d 2c 20  t->a; i>0; i--, 
fb40: 70 49 74 65 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pItem++){.      
fb50: 20 20 20 20 45 78 70 72 20 2a 70 45 32 20 3d 20      Expr *pE2 = 
fb60: 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b 0a 20 20  pItem->pExpr;.  
fb70: 20 20 20 20 20 20 20 20 69 6e 74 20 69 56 61 6c          int iVal
fb80: 54 6f 49 6e 73 3b 0a 0a 20 20 20 20 20 20 20 20  ToIns;..        
fb90: 20 20 2f 2a 20 49 66 20 74 68 65 20 65 78 70 72    /* If the expr
fba0: 65 73 73 69 6f 6e 20 69 73 20 6e 6f 74 20 63 6f  ession is not co
fbb0: 6e 73 74 61 6e 74 20 74 68 65 6e 20 77 65 20 77  nstant then we w
fbc0: 69 6c 6c 20 6e 65 65 64 20 74 6f 0a 20 20 20 20  ill need to.    
fbd0: 20 20 20 20 20 20 2a 2a 20 64 69 73 61 62 6c 65        ** disable
fbe0: 20 74 68 65 20 74 65 73 74 20 74 68 61 74 20 77   the test that w
fbf0: 61 73 20 67 65 6e 65 72 61 74 65 64 20 61 62 6f  as generated abo
fc00: 76 65 20 74 68 61 74 20 6d 61 6b 65 73 20 73 75  ve that makes su
fc10: 72 65 0a 20 20 20 20 20 20 20 20 20 20 2a 2a 20  re.          ** 
fc20: 74 68 69 73 20 63 6f 64 65 20 6f 6e 6c 79 20 65  this code only e
fc30: 78 65 63 75 74 65 73 20 6f 6e 63 65 2e 20 20 42  xecutes once.  B
fc40: 65 63 61 75 73 65 20 66 6f 72 20 61 20 6e 6f 6e  ecause for a non
fc50: 2d 63 6f 6e 73 74 61 6e 74 0a 20 20 20 20 20 20  -constant.      
fc60: 20 20 20 20 2a 2a 20 65 78 70 72 65 73 73 69 6f      ** expressio
fc70: 6e 20 77 65 20 6e 65 65 64 20 74 6f 20 72 65 72  n we need to rer
fc80: 75 6e 20 74 68 69 73 20 63 6f 64 65 20 65 61 63  un this code eac
fc90: 68 20 74 69 6d 65 2e 0a 20 20 20 20 20 20 20 20  h time..        
fca0: 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20 69    */.          i
fcb0: 66 28 20 6a 6d 70 49 66 44 79 6e 61 6d 69 63 3e  f( jmpIfDynamic>
fcc0: 3d 30 20 26 26 20 21 73 71 6c 69 74 65 33 45 78  =0 && !sqlite3Ex
fcd0: 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70 45 32  prIsConstant(pE2
fce0: 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20  ) ){.           
fcf0: 20 73 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e   sqlite3VdbeChan
fd00: 67 65 54 6f 4e 6f 6f 70 28 76 2c 20 6a 6d 70 49  geToNoop(v, jmpI
fd10: 66 44 79 6e 61 6d 69 63 29 3b 0a 20 20 20 20 20  fDynamic);.     
fd20: 20 20 20 20 20 20 20 6a 6d 70 49 66 44 79 6e 61         jmpIfDyna
fd30: 6d 69 63 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20  mic = -1;.      
fd40: 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 20      }..         
fd50: 20 2f 2a 20 45 76 61 6c 75 61 74 65 20 74 68 65   /* Evaluate the
fd60: 20 65 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20   expression and 
fd70: 69 6e 73 65 72 74 20 69 74 20 69 6e 74 6f 20 74  insert it into t
fd80: 68 65 20 74 65 6d 70 20 74 61 62 6c 65 20 2a 2f  he temp table */
fd90: 0a 20 20 20 20 20 20 20 20 20 20 69 66 28 20 69  .          if( i
fda0: 73 52 6f 77 69 64 20 26 26 20 73 71 6c 69 74 65  sRowid && sqlite
fdb0: 33 45 78 70 72 49 73 49 6e 74 65 67 65 72 28 70  3ExprIsInteger(p
fdc0: 45 32 2c 20 26 69 56 61 6c 54 6f 49 6e 73 29 20  E2, &iValToIns) 
fdd0: 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 73  ){.            s
fde0: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
fdf0: 28 76 2c 20 4f 50 5f 49 6e 73 65 72 74 49 6e 74  (v, OP_InsertInt
fe00: 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
fe10: 20 72 32 2c 20 69 56 61 6c 54 6f 49 6e 73 29 3b   r2, iValToIns);
fe20: 0a 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65  .          }else
fe30: 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 72 33  {.            r3
fe40: 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
fe50: 64 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c  deTarget(pParse,
fe60: 20 70 45 32 2c 20 72 31 29 3b 0a 20 20 20 20 20   pE2, r1);.     
fe70: 20 20 20 20 20 20 20 69 66 28 20 69 73 52 6f 77         if( isRow
fe80: 69 64 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  id ){.          
fe90: 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
fea0: 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74  ddOp2(v, OP_Must
feb0: 42 65 49 6e 74 2c 20 72 33 2c 0a 20 20 20 20 20  BeInt, r3,.     
fec0: 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
fed0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
fee0: 65 33 56 64 62 65 43 75 72 72 65 6e 74 41 64 64  e3VdbeCurrentAdd
fef0: 72 28 76 29 2b 32 29 3b 0a 20 20 20 20 20 20 20  r(v)+2);.       
ff00: 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
ff10: 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20 20  age(v);.        
ff20: 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
ff30: 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 6e  eAddOp3(v, OP_In
ff40: 73 65 72 74 2c 20 70 45 78 70 72 2d 3e 69 54 61  sert, pExpr->iTa
ff50: 62 6c 65 2c 20 72 32 2c 20 72 33 29 3b 0a 20 20  ble, r2, r3);.  
ff60: 20 20 20 20 20 20 20 20 20 20 7d 65 6c 73 65 7b            }else{
ff70: 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 73  .              s
ff80: 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34  qlite3VdbeAddOp4
ff90: 28 76 2c 20 4f 50 5f 4d 61 6b 65 52 65 63 6f 72  (v, OP_MakeRecor
ffa0: 64 2c 20 72 33 2c 20 31 2c 20 72 32 2c 20 26 61  d, r3, 1, r2, &a
ffb0: 66 66 69 6e 69 74 79 2c 20 31 29 3b 0a 20 20 20  ffinity, 1);.   
ffc0: 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69 74             sqlit
ffd0: 65 33 45 78 70 72 43 61 63 68 65 41 66 66 69 6e  e3ExprCacheAffin
ffe0: 69 74 79 43 68 61 6e 67 65 28 70 50 61 72 73 65  ityChange(pParse
fff0: 2c 20 72 33 2c 20 31 29 3b 0a 20 20 20 20 20 20  , r3, 1);.      
10000 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
10010 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
10020 49 64 78 49 6e 73 65 72 74 2c 20 70 45 78 70 72  IdxInsert, pExpr
10030 2d 3e 69 54 61 62 6c 65 2c 20 72 32 29 3b 0a 20  ->iTable, r2);. 
10040 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
10050 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
10060 20 7d 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74   }.        sqlit
10070 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
10080 28 70 50 61 72 73 65 2c 20 72 31 29 3b 0a 20 20  (pParse, r1);.  
10090 20 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c        sqlite3Rel
100a0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
100b0 73 65 2c 20 72 32 29 3b 0a 20 20 20 20 20 20 7d  se, r2);.      }
100c0 0a 20 20 20 20 20 20 69 66 28 20 70 4b 65 79 49  .      if( pKeyI
100d0 6e 66 6f 20 29 7b 0a 20 20 20 20 20 20 20 20 73  nfo ){.        s
100e0 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
100f0 50 34 28 76 2c 20 61 64 64 72 2c 20 28 76 6f 69  P4(v, addr, (voi
10100 64 20 2a 29 70 4b 65 79 49 6e 66 6f 2c 20 50 34  d *)pKeyInfo, P4
10110 5f 4b 45 59 49 4e 46 4f 29 3b 0a 20 20 20 20 20  _KEYINFO);.     
10120 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a   }.      break;.
10130 20 20 20 20 7d 0a 0a 20 20 20 20 63 61 73 65 20      }..    case 
10140 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
10150 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 0a 20  ase TK_SELECT:. 
10160 20 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20     default: {.  
10170 20 20 20 20 2f 2a 20 49 66 20 74 68 69 73 20 68      /* If this h
10180 61 73 20 74 6f 20 62 65 20 61 20 73 63 61 6c 61  as to be a scala
10190 72 20 53 45 4c 45 43 54 2e 20 20 47 65 6e 65 72  r SELECT.  Gener
101a0 61 74 65 20 63 6f 64 65 20 74 6f 20 70 75 74 20  ate code to put 
101b0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 76 61 6c  the.      ** val
101c0 75 65 20 6f 66 20 74 68 69 73 20 73 65 6c 65 63  ue of this selec
101d0 74 20 69 6e 20 61 20 6d 65 6d 6f 72 79 20 63 65  t in a memory ce
101e0 6c 6c 20 61 6e 64 20 72 65 63 6f 72 64 20 74 68  ll and record th
101f0 65 20 6e 75 6d 62 65 72 0a 20 20 20 20 20 20 2a  e number.      *
10200 2a 20 6f 66 20 74 68 65 20 6d 65 6d 6f 72 79 20  * of the memory 
10210 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d 6e 2e  cell in iColumn.
10220 20 20 49 66 20 74 68 69 73 20 69 73 20 61 6e 20    If this is an 
10230 45 58 49 53 54 53 2c 20 77 72 69 74 65 0a 20 20  EXISTS, write.  
10240 20 20 20 20 2a 2a 20 61 6e 20 69 6e 74 65 67 65      ** an intege
10250 72 20 30 20 28 6e 6f 74 20 65 78 69 73 74 73 29  r 0 (not exists)
10260 20 6f 72 20 31 20 28 65 78 69 73 74 73 29 20 69   or 1 (exists) i
10270 6e 74 6f 20 61 20 6d 65 6d 6f 72 79 20 63 65 6c  nto a memory cel
10280 6c 0a 20 20 20 20 20 20 2a 2a 20 61 6e 64 20 72  l.      ** and r
10290 65 63 6f 72 64 20 74 68 61 74 20 6d 65 6d 6f 72  ecord that memor
102a0 79 20 63 65 6c 6c 20 69 6e 20 69 43 6f 6c 75 6d  y cell in iColum
102b0 6e 2e 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  n..      */.    
102c0 20 20 53 65 6c 65 63 74 20 2a 70 53 65 6c 3b 20    Select *pSel; 
102d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
102e0 20 20 20 20 20 20 20 20 2f 2a 20 53 45 4c 45 43          /* SELEC
102f0 54 20 73 74 61 74 65 6d 65 6e 74 20 74 6f 20 65  T statement to e
10300 6e 63 6f 64 65 20 2a 2f 0a 20 20 20 20 20 20 53  ncode */.      S
10310 65 6c 65 63 74 44 65 73 74 20 64 65 73 74 3b 20  electDest dest; 
10320 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10330 20 20 20 20 20 2f 2a 20 48 6f 77 20 74 6f 20 64       /* How to d
10340 65 61 6c 20 77 69 74 68 20 53 45 4c 45 43 74 20  eal with SELECt 
10350 72 65 73 75 6c 74 20 2a 2f 0a 0a 20 20 20 20 20  result */..     
10360 20 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72   testcase( pExpr
10370 2d 3e 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20  ->op==TK_EXISTS 
10380 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
10390 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  e( pExpr->op==TK
103a0 5f 53 45 4c 45 43 54 20 29 3b 0a 20 20 20 20 20  _SELECT );.     
103b0 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
103c0 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 7c 7c  op==TK_EXISTS ||
103d0 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53   pExpr->op==TK_S
103e0 45 4c 45 43 54 20 29 3b 0a 0a 20 20 20 20 20 20  ELECT );..      
103f0 61 73 73 65 72 74 28 20 45 78 70 72 48 61 73 50  assert( ExprHasP
10400 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45  roperty(pExpr, E
10410 50 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a  P_xIsSelect) );.
10420 20 20 20 20 20 20 70 53 65 6c 20 3d 20 70 45 78        pSel = pEx
10430 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 3b 0a 20  pr->x.pSelect;. 
10440 20 20 20 20 20 73 71 6c 69 74 65 33 53 65 6c 65       sqlite3Sele
10450 63 74 44 65 73 74 49 6e 69 74 28 26 64 65 73 74  ctDestInit(&dest
10460 2c 20 30 2c 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  , 0, ++pParse->n
10470 4d 65 6d 29 3b 0a 20 20 20 20 20 20 69 66 28 20  Mem);.      if( 
10480 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 53 45  pExpr->op==TK_SE
10490 4c 45 43 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LECT ){.        
104a0 64 65 73 74 2e 65 44 65 73 74 20 3d 20 53 52 54  dest.eDest = SRT
104b0 5f 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 64 65  _Mem;.        de
104c0 73 74 2e 69 53 64 73 74 20 3d 20 64 65 73 74 2e  st.iSdst = dest.
104d0 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 20  iSDParm;.       
104e0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
104f0 70 32 28 76 2c 20 4f 50 5f 4e 75 6c 6c 2c 20 30  p2(v, OP_Null, 0
10500 2c 20 64 65 73 74 2e 69 53 44 50 61 72 6d 29 3b  , dest.iSDParm);
10510 0a 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 6d  .        VdbeCom
10520 6d 65 6e 74 28 28 76 2c 20 22 49 6e 69 74 20 73  ment((v, "Init s
10530 75 62 71 75 65 72 79 20 72 65 73 75 6c 74 22 29  ubquery result")
10540 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
10550 20 20 20 20 20 20 20 20 64 65 73 74 2e 65 44 65          dest.eDe
10560 73 74 20 3d 20 53 52 54 5f 45 78 69 73 74 73 3b  st = SRT_Exists;
10570 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
10580 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
10590 5f 49 6e 74 65 67 65 72 2c 20 30 2c 20 64 65 73  _Integer, 0, des
105a0 74 2e 69 53 44 50 61 72 6d 29 3b 0a 20 20 20 20  t.iSDParm);.    
105b0 20 20 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28      VdbeComment(
105c0 28 76 2c 20 22 49 6e 69 74 20 45 58 49 53 54 53  (v, "Init EXISTS
105d0 20 72 65 73 75 6c 74 22 29 29 3b 0a 20 20 20 20   result"));.    
105e0 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65    }.      sqlite
105f0 33 45 78 70 72 44 65 6c 65 74 65 28 70 50 61 72  3ExprDelete(pPar
10600 73 65 2d 3e 64 62 2c 20 70 53 65 6c 2d 3e 70 4c  se->db, pSel->pL
10610 69 6d 69 74 29 3b 0a 20 20 20 20 20 20 70 53 65  imit);.      pSe
10620 6c 2d 3e 70 4c 69 6d 69 74 20 3d 20 73 71 6c 69  l->pLimit = sqli
10630 74 65 33 50 45 78 70 72 28 70 50 61 72 73 65 2c  te3PExpr(pParse,
10640 20 54 4b 5f 49 4e 54 45 47 45 52 2c 20 30 2c 20   TK_INTEGER, 0, 
10650 30 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  0,.             
10660 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10670 20 20 20 20 20 26 73 71 6c 69 74 65 33 49 6e 74       &sqlite3Int
10680 54 6f 6b 65 6e 73 5b 31 5d 29 3b 0a 20 20 20 20  Tokens[1]);.    
10690 20 20 70 53 65 6c 2d 3e 69 4c 69 6d 69 74 20 3d    pSel->iLimit =
106a0 20 30 3b 0a 20 20 20 20 20 20 69 66 28 20 73 71   0;.      if( sq
106b0 6c 69 74 65 33 53 65 6c 65 63 74 28 70 50 61 72  lite3Select(pPar
106c0 73 65 2c 20 70 53 65 6c 2c 20 26 64 65 73 74 29  se, pSel, &dest)
106d0 20 29 7b 0a 20 20 20 20 20 20 20 20 72 65 74 75   ){.        retu
106e0 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20  rn 0;.      }.  
106f0 20 20 20 20 72 52 65 67 20 3d 20 64 65 73 74 2e      rReg = dest.
10700 69 53 44 50 61 72 6d 3b 0a 20 20 20 20 20 20 45  iSDParm;.      E
10710 78 70 72 53 65 74 56 56 41 50 72 6f 70 65 72 74  xprSetVVAPropert
10720 79 28 70 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65  y(pExpr, EP_NoRe
10730 64 75 63 65 29 3b 0a 20 20 20 20 20 20 62 72 65  duce);.      bre
10740 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a 0a 20  ak;.    }.  }.. 
10750 20 69 66 28 20 72 48 61 73 4e 75 6c 6c 46 6c 61   if( rHasNullFla
10760 67 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  g ){.    sqlite3
10770 53 65 74 48 61 73 4e 75 6c 6c 46 6c 61 67 28 76  SetHasNullFlag(v
10780 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
10790 20 72 48 61 73 4e 75 6c 6c 46 6c 61 67 29 3b 0a   rHasNullFlag);.
107a0 20 20 7d 0a 0a 20 20 69 66 28 20 6a 6d 70 49 66    }..  if( jmpIf
107b0 44 79 6e 61 6d 69 63 3e 3d 30 20 29 7b 0a 20 20  Dynamic>=0 ){.  
107c0 20 20 73 71 6c 69 74 65 33 56 64 62 65 4a 75 6d    sqlite3VdbeJum
107d0 70 48 65 72 65 28 76 2c 20 6a 6d 70 49 66 44 79  pHere(v, jmpIfDy
107e0 6e 61 6d 69 63 29 3b 0a 20 20 7d 0a 20 20 73 71  namic);.  }.  sq
107f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f  lite3ExprCachePo
10800 70 28 70 50 61 72 73 65 29 3b 0a 0a 20 20 72 65  p(pParse);..  re
10810 74 75 72 6e 20 72 52 65 67 3b 0a 7d 0a 23 65 6e  turn rReg;.}.#en
10820 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d  dif /* SQLITE_OM
10830 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f 0a 0a  IT_SUBQUERY */..
10840 23 69 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f  #ifndef SQLITE_O
10850 4d 49 54 5f 53 55 42 51 55 45 52 59 0a 2f 2a 0a  MIT_SUBQUERY./*.
10860 2a 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65  ** Generate code
10870 20 66 6f 72 20 61 6e 20 49 4e 20 65 78 70 72 65   for an IN expre
10880 73 73 69 6f 6e 2e 0a 2a 2a 0a 2a 2a 20 20 20 20  ssion..**.**    
10890 20 20 78 20 49 4e 20 28 53 45 4c 45 43 54 20 2e    x IN (SELECT .
108a0 2e 2e 29 0a 2a 2a 20 20 20 20 20 20 78 20 49 4e  ..).**      x IN
108b0 20 28 76 61 6c 75 65 2c 20 76 61 6c 75 65 2c 20   (value, value, 
108c0 2e 2e 2e 29 0a 2a 2a 0a 2a 2a 20 54 68 65 20 6c  ...).**.** The l
108d0 65 66 74 2d 68 61 6e 64 20 73 69 64 65 20 28 4c  eft-hand side (L
108e0 48 53 29 20 69 73 20 61 20 73 63 61 6c 61 72 20  HS) is a scalar 
108f0 65 78 70 72 65 73 73 69 6f 6e 2e 20 20 54 68 65  expression.  The
10900 20 72 69 67 68 74 2d 68 61 6e 64 20 73 69 64 65   right-hand side
10910 20 28 52 48 53 29 0a 2a 2a 20 69 73 20 61 6e 20   (RHS).** is an 
10920 61 72 72 61 79 20 6f 66 20 7a 65 72 6f 20 6f 72  array of zero or
10930 20 6d 6f 72 65 20 76 61 6c 75 65 73 2e 20 20 54   more values.  T
10940 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
10950 20 74 72 75 65 20 69 66 20 74 68 65 20 4c 48 53   true if the LHS
10960 20 69 73 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64   is.** contained
10970 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
10980 20 20 54 68 65 20 76 61 6c 75 65 20 6f 66 20 74    The value of t
10990 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73  he expression is
109a0 20 75 6e 6b 6e 6f 77 6e 20 28 4e 55 4c 4c 29 0a   unknown (NULL).
109b0 2a 2a 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ** if the LHS is
109c0 20 4e 55 4c 4c 20 6f 72 20 69 66 20 74 68 65 20   NULL or if the 
109d0 4c 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61  LHS is not conta
109e0 69 6e 65 64 20 77 69 74 68 69 6e 20 74 68 65 20  ined within the 
109f0 52 48 53 20 61 6e 64 20 74 68 65 0a 2a 2a 20 52  RHS and the.** R
10a00 48 53 20 63 6f 6e 74 61 69 6e 73 20 6f 6e 65 20  HS contains one 
10a10 6f 72 20 6d 6f 72 65 20 4e 55 4c 4c 20 76 61 6c  or more NULL val
10a20 75 65 73 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ues..**.** This 
10a30 72 6f 75 74 69 6e 65 20 67 65 6e 65 72 61 74 65  routine generate
10a40 73 20 63 6f 64 65 20 74 68 61 74 20 6a 75 6d 70  s code that jump
10a50 73 20 74 6f 20 64 65 73 74 49 66 46 61 6c 73 65  s to destIfFalse
10a60 20 69 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e   if the LHS is n
10a70 6f 74 20 0a 2a 2a 20 63 6f 6e 74 61 69 6e 65 64  ot .** contained
10a80 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 2e   within the RHS.
10a90 20 20 49 66 20 64 75 65 20 74 6f 20 4e 55 4c 4c    If due to NULL
10aa0 73 20 77 65 20 63 61 6e 6e 6f 74 20 64 65 74 65  s we cannot dete
10ab0 72 6d 69 6e 65 20 69 66 20 74 68 65 20 4c 48 53  rmine if the LHS
10ac0 0a 2a 2a 20 69 73 20 63 6f 6e 74 61 69 6e 65 64  .** is contained
10ad0 20 69 6e 20 74 68 65 20 52 48 53 20 74 68 65 6e   in the RHS then
10ae0 20 6a 75 6d 70 20 74 6f 20 64 65 73 74 49 66 4e   jump to destIfN
10af0 75 6c 6c 2e 20 20 49 66 20 74 68 65 20 4c 48 53  ull.  If the LHS
10b00 20 69 73 20 63 6f 6e 74 61 69 6e 65 64 0a 2a 2a   is contained.**
10b10 20 77 69 74 68 69 6e 20 74 68 65 20 52 48 53 20   within the RHS 
10b20 74 68 65 6e 20 66 61 6c 6c 20 74 68 72 6f 75 67  then fall throug
10b30 68 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  h..*/.static voi
10b40 64 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  d sqlite3ExprCod
10b50 65 49 4e 28 0a 20 20 50 61 72 73 65 20 2a 70 50  eIN(.  Parse *pP
10b60 61 72 73 65 2c 20 20 20 20 20 20 20 20 2f 2a 20  arse,        /* 
10b70 50 61 72 73 69 6e 67 20 61 6e 64 20 63 6f 64 65  Parsing and code
10b80 20 67 65 6e 65 72 61 74 69 6e 67 20 63 6f 6e 74   generating cont
10b90 65 78 74 20 2a 2f 0a 20 20 45 78 70 72 20 2a 70  ext */.  Expr *p
10ba0 45 78 70 72 2c 20 20 20 20 20 20 20 20 20 20 2f  Expr,          /
10bb0 2a 20 54 68 65 20 49 4e 20 65 78 70 72 65 73 73  * The IN express
10bc0 69 6f 6e 20 2a 2f 0a 20 20 69 6e 74 20 64 65 73  ion */.  int des
10bd0 74 49 66 46 61 6c 73 65 2c 20 20 20 20 20 20 2f  tIfFalse,      /
10be0 2a 20 4a 75 6d 70 20 68 65 72 65 20 69 66 20 4c  * Jump here if L
10bf0 48 53 20 69 73 20 6e 6f 74 20 63 6f 6e 74 61 69  HS is not contai
10c00 6e 65 64 20 69 6e 20 74 68 65 20 52 48 53 20 2a  ned in the RHS *
10c10 2f 0a 20 20 69 6e 74 20 64 65 73 74 49 66 4e 75  /.  int destIfNu
10c20 6c 6c 20 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d  ll        /* Jum
10c30 70 20 68 65 72 65 20 69 66 20 74 68 65 20 72 65  p here if the re
10c40 73 75 6c 74 73 20 61 72 65 20 75 6e 6b 6e 6f 77  sults are unknow
10c50 6e 20 64 75 65 20 74 6f 20 4e 55 4c 4c 73 20 2a  n due to NULLs *
10c60 2f 0a 29 7b 0a 20 20 69 6e 74 20 72 52 68 73 48  /.){.  int rRhsH
10c70 61 73 4e 75 6c 6c 20 3d 20 30 3b 20 20 2f 2a 20  asNull = 0;  /* 
10c80 52 65 67 69 73 74 65 72 20 74 68 61 74 20 69 73  Register that is
10c90 20 74 72 75 65 20 69 66 20 52 48 53 20 63 6f 6e   true if RHS con
10ca0 74 61 69 6e 73 20 4e 55 4c 4c 20 76 61 6c 75 65  tains NULL value
10cb0 73 20 2a 2f 0a 20 20 63 68 61 72 20 61 66 66 69  s */.  char affi
10cc0 6e 69 74 79 3b 20 20 20 20 20 20 20 20 2f 2a 20  nity;        /* 
10cd0 43 6f 6d 70 61 72 69 73 6f 6e 20 61 66 66 69 6e  Comparison affin
10ce0 69 74 79 20 74 6f 20 75 73 65 20 2a 2f 0a 20 20  ity to use */.  
10cf0 69 6e 74 20 65 54 79 70 65 3b 20 20 20 20 20 20  int eType;      
10d00 20 20 20 20 20 20 2f 2a 20 54 79 70 65 20 6f 66        /* Type of
10d10 20 74 68 65 20 52 48 53 20 2a 2f 0a 20 20 69 6e   the RHS */.  in
10d20 74 20 72 31 3b 20 20 20 20 20 20 20 20 20 20 20  t r1;           
10d30 20 20 20 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79      /* Temporary
10d40 20 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f   use register */
10d50 0a 20 20 56 64 62 65 20 2a 76 3b 20 20 20 20 20  .  Vdbe *v;     
10d60 20 20 20 20 20 20 20 20 20 2f 2a 20 53 74 61 74           /* Stat
10d70 65 6d 65 6e 74 20 75 6e 64 65 72 20 63 6f 6e 73  ement under cons
10d80 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 0a 20 20 2f  truction */..  /
10d90 2a 20 43 6f 6d 70 75 74 65 20 74 68 65 20 52 48  * Compute the RH
10da0 53 2e 20 20 20 41 66 74 65 72 20 74 68 69 73 20  S.   After this 
10db0 73 74 65 70 2c 20 74 68 65 20 74 61 62 6c 65 20  step, the table 
10dc0 77 69 74 68 20 63 75 72 73 6f 72 0a 20 20 2a 2a  with cursor.  **
10dd0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 77   pExpr->iTable w
10de0 69 6c 6c 20 63 6f 6e 74 61 69 6e 73 20 74 68 65  ill contains the
10df0 20 76 61 6c 75 65 73 20 74 68 61 74 20 6d 61 6b   values that mak
10e00 65 20 75 70 20 74 68 65 20 52 48 53 2e 0a 20 20  e up the RHS..  
10e10 2a 2f 0a 20 20 76 20 3d 20 70 50 61 72 73 65 2d  */.  v = pParse-
10e20 3e 70 56 64 62 65 3b 0a 20 20 61 73 73 65 72 74  >pVdbe;.  assert
10e30 28 20 76 21 3d 30 20 29 3b 20 20 20 20 20 20 20  ( v!=0 );       
10e40 2f 2a 20 4f 4f 4d 20 64 65 74 65 63 74 65 64 20  /* OOM detected 
10e50 70 72 69 6f 72 20 74 6f 20 74 68 69 73 20 72 6f  prior to this ro
10e60 75 74 69 6e 65 20 2a 2f 0a 20 20 56 64 62 65 4e  utine */.  VdbeN
10e70 6f 6f 70 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22  oopComment((v, "
10e80 62 65 67 69 6e 20 49 4e 20 65 78 70 72 22 29 29  begin IN expr"))
10e90 3b 0a 20 20 65 54 79 70 65 20 3d 20 73 71 6c 69  ;.  eType = sqli
10ea0 74 65 33 46 69 6e 64 49 6e 49 6e 64 65 78 28 70  te3FindInIndex(p
10eb0 50 61 72 73 65 2c 20 70 45 78 70 72 2c 0a 20 20  Parse, pExpr,.  
10ec0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10ed0 20 20 20 20 20 20 20 20 20 20 20 49 4e 5f 49 4e             IN_IN
10ee0 44 45 58 5f 4d 45 4d 42 45 52 53 48 49 50 20 7c  DEX_MEMBERSHIP |
10ef0 20 49 4e 5f 49 4e 44 45 58 5f 4e 4f 4f 50 5f 4f   IN_INDEX_NOOP_O
10f00 4b 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  K,.             
10f10 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
10f20 64 65 73 74 49 66 46 61 6c 73 65 3d 3d 64 65 73  destIfFalse==des
10f30 74 49 66 4e 75 6c 6c 20 3f 20 30 20 3a 20 26 72  tIfNull ? 0 : &r
10f40 52 68 73 48 61 73 4e 75 6c 6c 29 3b 0a 0a 20 20  RhsHasNull);..  
10f50 2f 2a 20 46 69 67 75 72 65 20 6f 75 74 20 74 68  /* Figure out th
10f60 65 20 61 66 66 69 6e 69 74 79 20 74 6f 20 75 73  e affinity to us
10f70 65 20 74 6f 20 63 72 65 61 74 65 20 61 20 6b 65  e to create a ke
10f80 79 20 66 72 6f 6d 20 74 68 65 20 72 65 73 75 6c  y from the resul
10f90 74 73 0a 20 20 2a 2a 20 6f 66 20 74 68 65 20 65  ts.  ** of the e
10fa0 78 70 72 65 73 73 69 6f 6e 2e 20 61 66 66 69 6e  xpression. affin
10fb0 69 74 79 53 74 72 20 73 74 6f 72 65 73 20 61 20  ityStr stores a 
10fc0 73 74 61 74 69 63 20 73 74 72 69 6e 67 20 73 75  static string su
10fd0 69 74 61 62 6c 65 20 66 6f 72 0a 20 20 2a 2a 20  itable for.  ** 
10fe0 50 34 20 6f 66 20 4f 50 5f 4d 61 6b 65 52 65 63  P4 of OP_MakeRec
10ff0 6f 72 64 2e 0a 20 20 2a 2f 0a 20 20 61 66 66 69  ord..  */.  affi
11000 6e 69 74 79 20 3d 20 63 6f 6d 70 61 72 69 73 6f  nity = compariso
11010 6e 41 66 66 69 6e 69 74 79 28 70 45 78 70 72 29  nAffinity(pExpr)
11020 3b 0a 0a 20 20 2f 2a 20 43 6f 64 65 20 74 68 65  ;..  /* Code the
11030 20 4c 48 53 2c 20 74 68 65 20 3c 65 78 70 72 3e   LHS, the <expr>
11040 20 66 72 6f 6d 20 22 3c 65 78 70 72 3e 20 49 4e   from "<expr> IN
11050 20 28 2e 2e 2e 29 22 2e 0a 20 20 2a 2f 0a 20 20   (...)"..  */.  
11060 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
11070 50 75 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20  Push(pParse);.  
11080 72 31 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54  r1 = sqlite3GetT
11090 65 6d 70 52 65 67 28 70 50 61 72 73 65 29 3b 0a  empReg(pParse);.
110a0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
110b0 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
110c0 3e 70 4c 65 66 74 2c 20 72 31 29 3b 0a 0a 20 20  >pLeft, r1);..  
110d0 2f 2a 20 49 66 20 73 71 6c 69 74 65 33 46 69 6e  /* If sqlite3Fin
110e0 64 49 6e 49 6e 64 65 78 28 29 20 64 69 64 20 6e  dInIndex() did n
110f0 6f 74 20 66 69 6e 64 20 6f 72 20 63 72 65 61 74  ot find or creat
11100 65 20 61 6e 20 69 6e 64 65 78 20 74 68 61 74 20  e an index that 
11110 69 73 0a 20 20 2a 2a 20 73 75 69 74 61 62 6c 65  is.  ** suitable
11120 20 66 6f 72 20 65 76 61 6c 75 61 74 69 6e 67 20   for evaluating 
11130 74 68 65 20 49 4e 20 6f 70 65 72 61 74 6f 72 2c  the IN operator,
11140 20 74 68 65 6e 20 65 76 61 6c 75 61 74 65 20 75   then evaluate u
11150 73 69 6e 67 20 61 0a 20 20 2a 2a 20 73 65 71 75  sing a.  ** sequ
11160 65 6e 63 65 20 6f 66 20 63 6f 6d 70 61 72 69 73  ence of comparis
11170 6f 6e 73 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20  ons..  */.  if( 
11180 65 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f  eType==IN_INDEX_
11190 4e 4f 4f 50 20 29 7b 0a 20 20 20 20 45 78 70 72  NOOP ){.    Expr
111a0 4c 69 73 74 20 2a 70 4c 69 73 74 20 3d 20 70 45  List *pList = pE
111b0 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20  xpr->x.pList;.  
111c0 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43 6f 6c 6c    CollSeq *pColl
111d0 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f   = sqlite3ExprCo
111e0 6c 6c 53 65 71 28 70 50 61 72 73 65 2c 20 70 45  llSeq(pParse, pE
111f0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
11200 20 69 6e 74 20 6c 61 62 65 6c 4f 6b 20 3d 20 73   int labelOk = s
11210 71 6c 69 74 65 33 56 64 62 65 4d 61 6b 65 4c 61  qlite3VdbeMakeLa
11220 62 65 6c 28 76 29 3b 0a 20 20 20 20 69 6e 74 20  bel(v);.    int 
11230 72 32 2c 20 72 65 67 54 6f 46 72 65 65 3b 0a 20  r2, regToFree;. 
11240 20 20 20 69 6e 74 20 72 65 67 43 6b 4e 75 6c 6c     int regCkNull
11250 20 3d 20 30 3b 0a 20 20 20 20 69 6e 74 20 69 69   = 0;.    int ii
11260 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20 21 45  ;.    assert( !E
11270 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
11280 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
11290 63 74 29 20 29 3b 0a 20 20 20 20 69 66 28 20 64  ct) );.    if( d
112a0 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65 73 74 49  estIfNull!=destI
112b0 66 46 61 6c 73 65 20 29 7b 0a 20 20 20 20 20 20  fFalse ){.      
112c0 72 65 67 43 6b 4e 75 6c 6c 20 3d 20 73 71 6c 69  regCkNull = sqli
112d0 74 65 33 47 65 74 54 65 6d 70 52 65 67 28 70 50  te3GetTempReg(pP
112e0 61 72 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c  arse);.      sql
112f0 69 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76  ite3VdbeAddOp3(v
11300 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20 72 31 2c  , OP_BitAnd, r1,
11310 20 72 31 2c 20 72 65 67 43 6b 4e 75 6c 6c 29 3b   r1, regCkNull);
11320 0a 20 20 20 20 7d 0a 20 20 20 20 66 6f 72 28 69  .    }.    for(i
11330 69 3d 30 3b 20 69 69 3c 70 4c 69 73 74 2d 3e 6e  i=0; ii<pList->n
11340 45 78 70 72 3b 20 69 69 2b 2b 29 7b 0a 20 20 20  Expr; ii++){.   
11350 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
11360 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
11370 73 65 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 69 5d  se, pList->a[ii]
11380 2e 70 45 78 70 72 2c 20 26 72 65 67 54 6f 46 72  .pExpr, &regToFr
11390 65 65 29 3b 0a 20 20 20 20 20 20 69 66 28 20 72  ee);.      if( r
113a0 65 67 43 6b 4e 75 6c 6c 20 26 26 20 73 71 6c 69  egCkNull && sqli
113b0 74 65 33 45 78 70 72 43 61 6e 42 65 4e 75 6c 6c  te3ExprCanBeNull
113c0 28 70 4c 69 73 74 2d 3e 61 5b 69 69 5d 2e 70 45  (pList->a[ii].pE
113d0 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20  xpr) ){.        
113e0 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
113f0 33 28 76 2c 20 4f 50 5f 42 69 74 41 6e 64 2c 20  3(v, OP_BitAnd, 
11400 72 65 67 43 6b 4e 75 6c 6c 2c 20 72 32 2c 20 72  regCkNull, r2, r
11410 65 67 43 6b 4e 75 6c 6c 29 3b 0a 20 20 20 20 20  egCkNull);.     
11420 20 7d 0a 20 20 20 20 20 20 69 66 28 20 69 69 3c   }.      if( ii<
11430 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d 31 20 7c  pList->nExpr-1 |
11440 7c 20 64 65 73 74 49 66 4e 75 6c 6c 21 3d 64 65  | destIfNull!=de
11450 73 74 49 66 46 61 6c 73 65 20 29 7b 0a 20 20 20  stIfFalse ){.   
11460 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
11470 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 45 71 2c  AddOp4(v, OP_Eq,
11480 20 72 31 2c 20 6c 61 62 65 6c 4f 6b 2c 20 72 32   r1, labelOk, r2
11490 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
114a0 20 20 20 20 20 20 20 20 20 20 20 20 28 76 6f 69              (voi
114b0 64 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c  d*)pColl, P4_COL
114c0 4c 53 45 51 29 3b 0a 20 20 20 20 20 20 20 20 56  LSEQ);.        V
114d0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
114e0 20 69 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72   ii<pList->nExpr
114f0 2d 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62  -1);.        Vdb
11500 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 69  eCoverageIf(v, i
11510 69 3d 3d 70 4c 69 73 74 2d 3e 6e 45 78 70 72 2d  i==pList->nExpr-
11520 31 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69  1);.        sqli
11530 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35 28  te3VdbeChangeP5(
11540 76 2c 20 61 66 66 69 6e 69 74 79 29 3b 0a 20 20  v, affinity);.  
11550 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
11560 20 20 20 61 73 73 65 72 74 28 20 64 65 73 74 49     assert( destI
11570 66 4e 75 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c  fNull==destIfFal
11580 73 65 20 29 3b 0a 20 20 20 20 20 20 20 20 73 71  se );.        sq
11590 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
115a0 76 2c 20 4f 50 5f 4e 65 2c 20 72 31 2c 20 64 65  v, OP_Ne, r1, de
115b0 73 74 49 66 46 61 6c 73 65 2c 20 72 32 2c 0a 20  stIfFalse, r2,. 
115c0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
115d0 20 20 20 20 20 20 20 20 20 28 76 6f 69 64 2a 29           (void*)
115e0 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c 53 45  pColl, P4_COLLSE
115f0 51 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  Q); VdbeCoverage
11600 28 76 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c  (v);.        sql
11610 69 74 65 33 56 64 62 65 43 68 61 6e 67 65 50 35  ite3VdbeChangeP5
11620 28 76 2c 20 61 66 66 69 6e 69 74 79 20 7c 20 53  (v, affinity | S
11630 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c  QLITE_JUMPIFNULL
11640 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
11650 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
11660 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
11670 65 67 54 6f 46 72 65 65 29 3b 0a 20 20 20 20 7d  egToFree);.    }
11680 0a 20 20 20 20 69 66 28 20 72 65 67 43 6b 4e 75  .    if( regCkNu
11690 6c 6c 20 29 7b 0a 20 20 20 20 20 20 73 71 6c 69  ll ){.      sqli
116a0 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c  te3VdbeAddOp2(v,
116b0 20 4f 50 5f 49 73 4e 75 6c 6c 2c 20 72 65 67 43   OP_IsNull, regC
116c0 6b 4e 75 6c 6c 2c 20 64 65 73 74 49 66 4e 75 6c  kNull, destIfNul
116d0 6c 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  l); VdbeCoverage
116e0 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
116f0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
11700 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74  OP_Goto, 0, dest
11710 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 7d 0a  IfFalse);.    }.
11720 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
11730 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 6c  esolveLabel(v, l
11740 61 62 65 6c 4f 6b 29 3b 0a 20 20 20 20 73 71 6c  abelOk);.    sql
11750 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52  ite3ReleaseTempR
11760 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 43 6b  eg(pParse, regCk
11770 4e 75 6c 6c 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  Null);.  }else{.
11780 20 20 0a 20 20 20 20 2f 2a 20 49 66 20 74 68 65    .    /* If the
11790 20 4c 48 53 20 69 73 20 4e 55 4c 4c 2c 20 74 68   LHS is NULL, th
117a0 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20 69 73  en the result is
117b0 20 65 69 74 68 65 72 20 66 61 6c 73 65 20 6f 72   either false or
117c0 20 4e 55 4c 4c 20 64 65 70 65 6e 64 69 6e 67 0a   NULL depending.
117d0 20 20 20 20 2a 2a 20 6f 6e 20 77 68 65 74 68 65      ** on whethe
117e0 72 20 74 68 65 20 52 48 53 20 69 73 20 65 6d 70  r the RHS is emp
117f0 74 79 20 6f 72 20 6e 6f 74 2c 20 72 65 73 70 65  ty or not, respe
11800 63 74 69 76 65 6c 79 2e 0a 20 20 20 20 2a 2f 0a  ctively..    */.
11810 20 20 20 20 69 66 28 20 73 71 6c 69 74 65 33 45      if( sqlite3E
11820 78 70 72 43 61 6e 42 65 4e 75 6c 6c 28 70 45 78  xprCanBeNull(pEx
11830 70 72 2d 3e 70 4c 65 66 74 29 20 29 7b 0a 20 20  pr->pLeft) ){.  
11840 20 20 20 20 69 66 28 20 64 65 73 74 49 66 4e 75      if( destIfNu
11850 6c 6c 3d 3d 64 65 73 74 49 66 46 61 6c 73 65 20  ll==destIfFalse 
11860 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a 20 53 68  ){.        /* Sh
11870 6f 72 74 63 75 74 20 66 6f 72 20 74 68 65 20 63  ortcut for the c
11880 6f 6d 6d 6f 6e 20 63 61 73 65 20 77 68 65 72 65  ommon case where
11890 20 74 68 65 20 66 61 6c 73 65 20 61 6e 64 20 4e   the false and N
118a0 55 4c 4c 20 6f 75 74 63 6f 6d 65 73 20 61 72 65  ULL outcomes are
118b0 0a 20 20 20 20 20 20 20 20 2a 2a 20 74 68 65 20  .        ** the 
118c0 73 61 6d 65 2e 20 2a 2f 0a 20 20 20 20 20 20 20  same. */.       
118d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
118e0 70 32 28 76 2c 20 4f 50 5f 49 73 4e 75 6c 6c 2c  p2(v, OP_IsNull,
118f0 20 72 31 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29   r1, destIfNull)
11900 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 28 76  ; VdbeCoverage(v
11910 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a  );.      }else{.
11920 20 20 20 20 20 20 20 20 69 6e 74 20 61 64 64 72          int addr
11930 31 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65 41  1 = sqlite3VdbeA
11940 64 64 4f 70 31 28 76 2c 20 4f 50 5f 4e 6f 74 4e  ddOp1(v, OP_NotN
11950 75 6c 6c 2c 20 72 31 29 3b 20 56 64 62 65 43 6f  ull, r1); VdbeCo
11960 76 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20  verage(v);.     
11970 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11980 64 4f 70 32 28 76 2c 20 4f 50 5f 52 65 77 69 6e  dOp2(v, OP_Rewin
11990 64 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65  d, pExpr->iTable
119a0 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
119b0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
119c0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
119d0 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
119e0 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
119f0 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20  , destIfNull);. 
11a00 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11a10 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64  beJumpHere(v, ad
11a20 64 72 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  dr1);.      }.  
11a30 20 20 7d 0a 20 20 0a 20 20 20 20 69 66 28 20 65    }.  .    if( e
11a40 54 79 70 65 3d 3d 49 4e 5f 49 4e 44 45 58 5f 52  Type==IN_INDEX_R
11a50 4f 57 49 44 20 29 7b 0a 20 20 20 20 20 20 2f 2a  OWID ){.      /*
11a60 20 49 6e 20 74 68 69 73 20 63 61 73 65 2c 20 74   In this case, t
11a70 68 65 20 52 48 53 20 69 73 20 74 68 65 20 52 4f  he RHS is the RO
11a80 57 49 44 20 6f 66 20 74 61 62 6c 65 20 62 2d 74  WID of table b-t
11a90 72 65 65 0a 20 20 20 20 20 20 2a 2f 0a 20 20 20  ree.      */.   
11aa0 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
11ab0 64 4f 70 32 28 76 2c 20 4f 50 5f 4d 75 73 74 42  dOp2(v, OP_MustB
11ac0 65 49 6e 74 2c 20 72 31 2c 20 64 65 73 74 49 66  eInt, r1, destIf
11ad0 46 61 6c 73 65 29 3b 20 56 64 62 65 43 6f 76 65  False); VdbeCove
11ae0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 73  rage(v);.      s
11af0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
11b00 28 76 2c 20 4f 50 5f 4e 6f 74 45 78 69 73 74 73  (v, OP_NotExists
11b10 2c 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c  , pExpr->iTable,
11b20 20 64 65 73 74 49 66 46 61 6c 73 65 2c 20 72 31   destIfFalse, r1
11b30 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
11b40 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 7d 65  erage(v);.    }e
11b50 6c 73 65 7b 0a 20 20 20 20 20 20 2f 2a 20 49 6e  lse{.      /* In
11b60 20 74 68 69 73 20 63 61 73 65 2c 20 74 68 65 20   this case, the 
11b70 52 48 53 20 69 73 20 61 6e 20 69 6e 64 65 78 20  RHS is an index 
11b80 62 2d 74 72 65 65 2e 0a 20 20 20 20 20 20 2a 2f  b-tree..      */
11b90 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
11ba0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 41  beAddOp4(v, OP_A
11bb0 66 66 69 6e 69 74 79 2c 20 72 31 2c 20 31 2c 20  ffinity, r1, 1, 
11bc0 30 2c 20 26 61 66 66 69 6e 69 74 79 2c 20 31 29  0, &affinity, 1)
11bd0 3b 0a 20 20 0a 20 20 20 20 20 20 2f 2a 20 49 66  ;.  .      /* If
11be0 20 74 68 65 20 73 65 74 20 6d 65 6d 62 65 72 73   the set members
11bf0 68 69 70 20 74 65 73 74 20 66 61 69 6c 73 2c 20  hip test fails, 
11c00 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
11c10 6f 66 20 74 68 65 20 0a 20 20 20 20 20 20 2a 2a  of the .      **
11c20 20 22 78 20 49 4e 20 28 2e 2e 2e 29 22 20 65 78   "x IN (...)" ex
11c30 70 72 65 73 73 69 6f 6e 20 6d 75 73 74 20 62 65  pression must be
11c40 20 65 69 74 68 65 72 20 30 20 6f 72 20 4e 55 4c   either 0 or NUL
11c50 4c 2e 20 49 66 20 74 68 65 20 73 65 74 0a 20 20  L. If the set.  
11c60 20 20 20 20 2a 2a 20 63 6f 6e 74 61 69 6e 73 20      ** contains 
11c70 6e 6f 20 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20  no NULL values, 
11c80 74 68 65 6e 20 74 68 65 20 72 65 73 75 6c 74 20  then the result 
11c90 69 73 20 30 2e 20 49 66 20 74 68 65 20 73 65 74  is 0. If the set
11ca0 20 0a 20 20 20 20 20 20 2a 2a 20 63 6f 6e 74 61   .      ** conta
11cb0 69 6e 73 20 6f 6e 65 20 6f 72 20 6d 6f 72 65 20  ins one or more 
11cc0 4e 55 4c 4c 20 76 61 6c 75 65 73 2c 20 74 68 65  NULL values, the
11cd0 6e 20 74 68 65 20 72 65 73 75 6c 74 20 6f 66 20  n the result of 
11ce0 74 68 65 0a 20 20 20 20 20 20 2a 2a 20 65 78 70  the.      ** exp
11cf0 72 65 73 73 69 6f 6e 20 69 73 20 61 6c 73 6f 20  ression is also 
11d00 4e 55 4c 4c 2e 0a 20 20 20 20 20 20 2a 2f 0a 20  NULL..      */. 
11d10 20 20 20 20 20 61 73 73 65 72 74 28 20 64 65 73       assert( des
11d20 74 49 66 46 61 6c 73 65 21 3d 64 65 73 74 49 66  tIfFalse!=destIf
11d30 4e 75 6c 6c 20 7c 7c 20 72 52 68 73 48 61 73 4e  Null || rRhsHasN
11d40 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ull==0 );.      
11d50 69 66 28 20 72 52 68 73 48 61 73 4e 75 6c 6c 3d  if( rRhsHasNull=
11d60 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a  =0 ){.        /*
11d70 20 54 68 69 73 20 62 72 61 6e 63 68 20 72 75 6e   This branch run
11d80 73 20 69 66 20 69 74 20 69 73 20 6b 6e 6f 77 6e  s if it is known
11d90 20 61 74 20 63 6f 6d 70 69 6c 65 20 74 69 6d 65   at compile time
11da0 20 74 68 61 74 20 74 68 65 20 52 48 53 0a 20 20   that the RHS.  
11db0 20 20 20 20 20 20 2a 2a 20 63 61 6e 6e 6f 74 20        ** cannot 
11dc0 63 6f 6e 74 61 69 6e 20 4e 55 4c 4c 20 76 61 6c  contain NULL val
11dd0 75 65 73 2e 20 54 68 69 73 20 68 61 70 70 65 6e  ues. This happen
11de0 73 20 61 73 20 74 68 65 20 72 65 73 75 6c 74 0a  s as the result.
11df0 20 20 20 20 20 20 20 20 2a 2a 20 6f 66 20 61 20          ** of a 
11e00 22 4e 4f 54 20 4e 55 4c 4c 22 20 63 6f 6e 73 74  "NOT NULL" const
11e10 72 61 69 6e 74 20 69 6e 20 74 68 65 20 64 61 74  raint in the dat
11e20 61 62 61 73 65 20 73 63 68 65 6d 61 2e 0a 20 20  abase schema..  
11e30 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 20        **.       
11e40 20 2a 2a 20 41 6c 73 6f 20 72 75 6e 20 74 68 69   ** Also run thi
11e50 73 20 62 72 61 6e 63 68 20 69 66 20 4e 55 4c 4c  s branch if NULL
11e60 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74   is equivalent t
11e70 6f 20 46 41 4c 53 45 0a 20 20 20 20 20 20 20 20  o FALSE.        
11e80 2a 2a 20 66 6f 72 20 74 68 69 73 20 70 61 72 74  ** for this part
11e90 69 63 75 6c 61 72 20 49 4e 20 6f 70 65 72 61 74  icular IN operat
11ea0 6f 72 2e 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  or..        */. 
11eb0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
11ec0 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c 20 4f  beAddOp4Int(v, O
11ed0 50 5f 4e 6f 74 46 6f 75 6e 64 2c 20 70 45 78 70  P_NotFound, pExp
11ee0 72 2d 3e 69 54 61 62 6c 65 2c 20 64 65 73 74 49  r->iTable, destI
11ef0 66 46 61 6c 73 65 2c 20 72 31 2c 20 31 29 3b 0a  fFalse, r1, 1);.
11f00 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
11f10 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d  rage(v);.      }
11f20 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 2f 2a  else{.        /*
11f30 20 49 6e 20 74 68 69 73 20 62 72 61 6e 63 68 2c   In this branch,
11f40 20 74 68 65 20 52 48 53 20 6f 66 20 74 68 65 20   the RHS of the 
11f50 49 4e 20 6d 69 67 68 74 20 63 6f 6e 74 61 69 6e  IN might contain
11f60 20 61 20 4e 55 4c 4c 20 61 6e 64 0a 20 20 20 20   a NULL and.    
11f70 20 20 20 20 2a 2a 20 74 68 65 20 70 72 65 73 65      ** the prese
11f80 6e 63 65 20 6f 66 20 61 20 4e 55 4c 4c 20 6f 6e  nce of a NULL on
11f90 20 74 68 65 20 52 48 53 20 6d 61 6b 65 73 20 61   the RHS makes a
11fa0 20 64 69 66 66 65 72 65 6e 63 65 20 69 6e 20 74   difference in t
11fb0 68 65 0a 20 20 20 20 20 20 20 20 2a 2a 20 6f 75  he.        ** ou
11fc0 74 63 6f 6d 65 2e 0a 20 20 20 20 20 20 20 20 2a  tcome..        *
11fd0 2f 0a 20 20 20 20 20 20 20 20 69 6e 74 20 6a 31  /.        int j1
11fe0 3b 0a 20 20 0a 20 20 20 20 20 20 20 20 2f 2a 20  ;.  .        /* 
11ff0 46 69 72 73 74 20 63 68 65 63 6b 20 74 6f 20 73  First check to s
12000 65 65 20 69 66 20 74 68 65 20 4c 48 53 20 69 73  ee if the LHS is
12010 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74 68   contained in th
12020 65 20 52 48 53 2e 20 20 49 66 20 73 6f 2c 0a 20  e RHS.  If so,. 
12030 20 20 20 20 20 20 20 2a 2a 20 74 68 65 6e 20 74         ** then t
12040 68 65 20 61 6e 73 77 65 72 20 69 73 20 54 52 55  he answer is TRU
12050 45 20 74 68 65 20 70 72 65 73 65 6e 63 65 20 6f  E the presence o
12060 66 20 4e 55 4c 4c 73 20 69 6e 20 74 68 65 20 52  f NULLs in the R
12070 48 53 20 64 6f 65 73 0a 20 20 20 20 20 20 20 20  HS does.        
12080 2a 2a 20 6e 6f 74 20 6d 61 74 74 65 72 2e 20 20  ** not matter.  
12090 49 66 20 74 68 65 20 4c 48 53 20 69 73 20 6e 6f  If the LHS is no
120a0 74 20 63 6f 6e 74 61 69 6e 65 64 20 69 6e 20 74  t contained in t
120b0 68 65 20 52 48 53 2c 20 74 68 65 6e 20 74 68 65  he RHS, then the
120c0 0a 20 20 20 20 20 20 20 20 2a 2a 20 61 6e 73 77  .        ** answ
120d0 65 72 20 69 73 20 4e 55 4c 4c 20 69 66 20 74 68  er is NULL if th
120e0 65 20 52 48 53 20 63 6f 6e 74 61 69 6e 73 20 4e  e RHS contains N
120f0 55 4c 4c 73 20 61 6e 64 20 74 68 65 20 61 6e 73  ULLs and the ans
12100 77 65 72 20 69 73 0a 20 20 20 20 20 20 20 20 2a  wer is.        *
12110 2a 20 46 41 4c 53 45 20 69 66 20 74 68 65 20 52  * FALSE if the R
12120 48 53 20 69 73 20 4e 55 4c 4c 2d 66 72 65 65 2e  HS is NULL-free.
12130 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20  .        */.    
12140 20 20 20 20 6a 31 20 3d 20 73 71 6c 69 74 65 33      j1 = sqlite3
12150 56 64 62 65 41 64 64 4f 70 34 49 6e 74 28 76 2c  VdbeAddOp4Int(v,
12160 20 4f 50 5f 46 6f 75 6e 64 2c 20 70 45 78 70 72   OP_Found, pExpr
12170 2d 3e 69 54 61 62 6c 65 2c 20 30 2c 20 72 31 2c  ->iTable, 0, r1,
12180 20 31 29 3b 0a 20 20 20 20 20 20 20 20 56 64 62   1);.        Vdb
12190 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20 20  eCoverage(v);.  
121a0 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
121b0 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 49 73  eAddOp2(v, OP_Is
121c0 4e 75 6c 6c 2c 20 72 52 68 73 48 61 73 4e 75 6c  Null, rRhsHasNul
121d0 6c 2c 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a  l, destIfNull);.
121e0 20 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65          VdbeCove
121f0 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 20  rage(v);.       
12200 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
12210 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
12220 2c 20 64 65 73 74 49 66 46 61 6c 73 65 29 3b 0a  , destIfFalse);.
12230 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
12240 64 62 65 4a 75 6d 70 48 65 72 65 28 76 2c 20 6a  dbeJumpHere(v, j
12250 31 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  1);.      }.    
12260 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52  }.  }.  sqlite3R
12270 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
12280 61 72 73 65 2c 20 72 31 29 3b 0a 20 20 73 71 6c  arse, r1);.  sql
12290 69 74 65 33 45 78 70 72 43 61 63 68 65 50 6f 70  ite3ExprCachePop
122a0 28 70 50 61 72 73 65 29 3b 0a 20 20 56 64 62 65  (pParse);.  Vdbe
122b0 43 6f 6d 6d 65 6e 74 28 28 76 2c 20 22 65 6e 64  Comment((v, "end
122c0 20 49 4e 20 65 78 70 72 22 29 29 3b 0a 7d 0a 23   IN expr"));.}.#
122d0 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f  endif /* SQLITE_
122e0 4f 4d 49 54 5f 53 55 42 51 55 45 52 59 20 2a 2f  OMIT_SUBQUERY */
122f0 0a 0a 2f 2a 0a 2a 2a 20 44 75 70 6c 69 63 61 74  ../*.** Duplicat
12300 65 20 61 6e 20 38 2d 62 79 74 65 20 76 61 6c 75  e an 8-byte valu
12310 65 0a 2a 2f 0a 73 74 61 74 69 63 20 63 68 61 72  e.*/.static char
12320 20 2a 64 75 70 38 62 79 74 65 73 28 56 64 62 65   *dup8bytes(Vdbe
12330 20 2a 76 2c 20 63 6f 6e 73 74 20 63 68 61 72 20   *v, const char 
12340 2a 69 6e 29 7b 0a 20 20 63 68 61 72 20 2a 6f 75  *in){.  char *ou
12350 74 20 3d 20 73 71 6c 69 74 65 33 44 62 4d 61 6c  t = sqlite3DbMal
12360 6c 6f 63 52 61 77 28 73 71 6c 69 74 65 33 56 64  locRaw(sqlite3Vd
12370 62 65 44 62 28 76 29 2c 20 38 29 3b 0a 20 20 69  beDb(v), 8);.  i
12380 66 28 20 6f 75 74 20 29 7b 0a 20 20 20 20 6d 65  f( out ){.    me
12390 6d 63 70 79 28 6f 75 74 2c 20 69 6e 2c 20 38 29  mcpy(out, in, 8)
123a0 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 6f  ;.  }.  return o
123b0 75 74 3b 0a 7d 0a 0a 23 69 66 6e 64 65 66 20 53  ut;.}..#ifndef S
123c0 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54  QLITE_OMIT_FLOAT
123d0 49 4e 47 5f 50 4f 49 4e 54 0a 2f 2a 0a 2a 2a 20  ING_POINT./*.** 
123e0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
123f0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
12400 6c 20 70 75 74 20 74 68 65 20 66 6c 6f 61 74 69  l put the floati
12410 6e 67 20 70 6f 69 6e 74 0a 2a 2a 20 76 61 6c 75  ng point.** valu
12420 65 20 64 65 73 63 72 69 62 65 64 20 62 79 20 7a  e described by z
12430 5b 30 2e 2e 6e 2d 31 5d 20 69 6e 74 6f 20 72 65  [0..n-1] into re
12440 67 69 73 74 65 72 20 69 4d 65 6d 2e 0a 2a 2a 0a  gister iMem..**.
12450 2a 2a 20 54 68 65 20 7a 5b 5d 20 73 74 72 69 6e  ** The z[] strin
12460 67 20 77 69 6c 6c 20 70 72 6f 62 61 62 6c 79 20  g will probably 
12470 6e 6f 74 20 62 65 20 7a 65 72 6f 2d 74 65 72 6d  not be zero-term
12480 69 6e 61 74 65 64 2e 20 20 42 75 74 20 74 68 65  inated.  But the
12490 20 0a 2a 2a 20 7a 5b 6e 5d 20 63 68 61 72 61 63   .** z[n] charac
124a0 74 65 72 20 69 73 20 67 75 61 72 61 6e 74 65 65  ter is guarantee
124b0 64 20 74 6f 20 62 65 20 73 6f 6d 65 74 68 69 6e  d to be somethin
124c0 67 20 74 68 61 74 20 64 6f 65 73 20 6e 6f 74 20  g that does not 
124d0 6c 6f 6f 6b 0a 2a 2a 20 6c 69 6b 65 20 74 68 65  look.** like the
124e0 20 63 6f 6e 74 69 6e 75 61 74 69 6f 6e 20 6f 66   continuation of
124f0 20 74 68 65 20 6e 75 6d 62 65 72 2e 0a 2a 2f 0a   the number..*/.
12500 73 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65  static void code
12510 52 65 61 6c 28 56 64 62 65 20 2a 76 2c 20 63 6f  Real(Vdbe *v, co
12520 6e 73 74 20 63 68 61 72 20 2a 7a 2c 20 69 6e 74  nst char *z, int
12530 20 6e 65 67 61 74 65 46 6c 61 67 2c 20 69 6e 74   negateFlag, int
12540 20 69 4d 65 6d 29 7b 0a 20 20 69 66 28 20 41 4c   iMem){.  if( AL
12550 57 41 59 53 28 7a 21 3d 30 29 20 29 7b 0a 20 20  WAYS(z!=0) ){.  
12560 20 20 64 6f 75 62 6c 65 20 76 61 6c 75 65 3b 0a    double value;.
12570 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
12580 20 20 73 71 6c 69 74 65 33 41 74 6f 46 28 7a 2c    sqlite3AtoF(z,
12590 20 26 76 61 6c 75 65 2c 20 73 71 6c 69 74 65 33   &value, sqlite3
125a0 53 74 72 6c 65 6e 33 30 28 7a 29 2c 20 53 51 4c  Strlen30(z), SQL
125b0 49 54 45 5f 55 54 46 38 29 3b 0a 20 20 20 20 61  ITE_UTF8);.    a
125c0 73 73 65 72 74 28 20 21 73 71 6c 69 74 65 33 49  ssert( !sqlite3I
125d0 73 4e 61 4e 28 76 61 6c 75 65 29 20 29 3b 20 2f  sNaN(value) ); /
125e0 2a 20 54 68 65 20 6e 65 77 20 41 74 6f 46 20 6e  * The new AtoF n
125f0 65 76 65 72 20 72 65 74 75 72 6e 73 20 4e 61 4e  ever returns NaN
12600 20 2a 2f 0a 20 20 20 20 69 66 28 20 6e 65 67 61   */.    if( nega
12610 74 65 46 6c 61 67 20 29 20 76 61 6c 75 65 20 3d  teFlag ) value =
12620 20 2d 76 61 6c 75 65 3b 0a 20 20 20 20 7a 56 20   -value;.    zV 
12630 3d 20 64 75 70 38 62 79 74 65 73 28 76 2c 20 28  = dup8bytes(v, (
12640 63 68 61 72 2a 29 26 76 61 6c 75 65 29 3b 0a 20  char*)&value);. 
12650 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
12660 64 4f 70 34 28 76 2c 20 4f 50 5f 52 65 61 6c 2c  dOp4(v, OP_Real,
12670 20 30 2c 20 69 4d 65 6d 2c 20 30 2c 20 7a 56 2c   0, iMem, 0, zV,
12680 20 50 34 5f 52 45 41 4c 29 3b 0a 20 20 7d 0a 7d   P4_REAL);.  }.}
12690 0a 23 65 6e 64 69 66 0a 0a 0a 2f 2a 0a 2a 2a 20  .#endif.../*.** 
126a0 47 65 6e 65 72 61 74 65 20 61 6e 20 69 6e 73 74  Generate an inst
126b0 72 75 63 74 69 6f 6e 20 74 68 61 74 20 77 69 6c  ruction that wil
126c0 6c 20 70 75 74 20 74 68 65 20 69 6e 74 65 67 65  l put the intege
126d0 72 20 64 65 73 63 72 69 62 65 20 62 79 0a 2a 2a  r describe by.**
126e0 20 74 65 78 74 20 7a 5b 30 2e 2e 6e 2d 31 5d 20   text z[0..n-1] 
126f0 69 6e 74 6f 20 72 65 67 69 73 74 65 72 20 69 4d  into register iM
12700 65 6d 2e 0a 2a 2a 0a 2a 2a 20 45 78 70 72 2e 75  em..**.** Expr.u
12710 2e 7a 54 6f 6b 65 6e 20 69 73 20 61 6c 77 61 79  .zToken is alway
12720 73 20 55 54 46 38 20 61 6e 64 20 7a 65 72 6f 2d  s UTF8 and zero-
12730 74 65 72 6d 69 6e 61 74 65 64 2e 0a 2a 2f 0a 73  terminated..*/.s
12740 74 61 74 69 63 20 76 6f 69 64 20 63 6f 64 65 49  tatic void codeI
12750 6e 74 65 67 65 72 28 50 61 72 73 65 20 2a 70 50  nteger(Parse *pP
12760 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70  arse, Expr *pExp
12770 72 2c 20 69 6e 74 20 6e 65 67 46 6c 61 67 2c 20  r, int negFlag, 
12780 69 6e 74 20 69 4d 65 6d 29 7b 0a 20 20 56 64 62  int iMem){.  Vdb
12790 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
127a0 56 64 62 65 3b 0a 20 20 69 66 28 20 70 45 78 70  Vdbe;.  if( pExp
127b0 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49 6e  r->flags & EP_In
127c0 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 69 6e  tValue ){.    in
127d0 74 20 69 20 3d 20 70 45 78 70 72 2d 3e 75 2e 69  t i = pExpr->u.i
127e0 56 61 6c 75 65 3b 0a 20 20 20 20 61 73 73 65 72  Value;.    asser
127f0 74 28 20 69 3e 3d 30 20 29 3b 0a 20 20 20 20 69  t( i>=0 );.    i
12800 66 28 20 6e 65 67 46 6c 61 67 20 29 20 69 20 3d  f( negFlag ) i =
12810 20 2d 69 3b 0a 20 20 20 20 73 71 6c 69 74 65 33   -i;.    sqlite3
12820 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
12830 5f 49 6e 74 65 67 65 72 2c 20 69 2c 20 69 4d 65  _Integer, i, iMe
12840 6d 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20  m);.  }else{.   
12850 20 69 6e 74 20 63 3b 0a 20 20 20 20 69 36 34 20   int c;.    i64 
12860 76 61 6c 75 65 3b 0a 20 20 20 20 63 6f 6e 73 74  value;.    const
12870 20 63 68 61 72 20 2a 7a 20 3d 20 70 45 78 70 72   char *z = pExpr
12880 2d 3e 75 2e 7a 54 6f 6b 65 6e 3b 0a 20 20 20 20  ->u.zToken;.    
12890 61 73 73 65 72 74 28 20 7a 21 3d 30 20 29 3b 0a  assert( z!=0 );.
128a0 20 20 20 20 63 20 3d 20 73 71 6c 69 74 65 33 44      c = sqlite3D
128b0 65 63 4f 72 48 65 78 54 6f 49 36 34 28 7a 2c 20  ecOrHexToI64(z, 
128c0 26 76 61 6c 75 65 29 3b 0a 20 20 20 20 69 66 28  &value);.    if(
128d0 20 63 3d 3d 30 20 7c 7c 20 28 63 3d 3d 32 20 26   c==0 || (c==2 &
128e0 26 20 6e 65 67 46 6c 61 67 29 20 29 7b 0a 20 20  & negFlag) ){.  
128f0 20 20 20 20 63 68 61 72 20 2a 7a 56 3b 0a 20 20      char *zV;.  
12900 20 20 20 20 69 66 28 20 6e 65 67 46 6c 61 67 20      if( negFlag 
12910 29 7b 20 76 61 6c 75 65 20 3d 20 63 3d 3d 32 20  ){ value = c==2 
12920 3f 20 53 4d 41 4c 4c 45 53 54 5f 49 4e 54 36 34  ? SMALLEST_INT64
12930 20 3a 20 2d 76 61 6c 75 65 3b 20 7d 0a 20 20 20   : -value; }.   
12940 20 20 20 7a 56 20 3d 20 64 75 70 38 62 79 74 65     zV = dup8byte
12950 73 28 76 2c 20 28 63 68 61 72 2a 29 26 76 61 6c  s(v, (char*)&val
12960 75 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ue);.      sqlit
12970 65 33 56 64 62 65 41 64 64 4f 70 34 28 76 2c 20  e3VdbeAddOp4(v, 
12980 4f 50 5f 49 6e 74 36 34 2c 20 30 2c 20 69 4d 65  OP_Int64, 0, iMe
12990 6d 2c 20 30 2c 20 7a 56 2c 20 50 34 5f 49 4e 54  m, 0, zV, P4_INT
129a0 36 34 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a  64);.    }else{.
129b0 23 69 66 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d  #ifdef SQLITE_OM
129c0 49 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e  IT_FLOATING_POIN
129d0 54 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  T.      sqlite3E
129e0 72 72 6f 72 4d 73 67 28 70 50 61 72 73 65 2c 20  rrorMsg(pParse, 
129f0 22 6f 76 65 72 73 69 7a 65 64 20 69 6e 74 65 67  "oversized integ
12a00 65 72 3a 20 25 73 25 73 22 2c 20 6e 65 67 46 6c  er: %s%s", negFl
12a10 61 67 20 3f 20 22 2d 22 20 3a 20 22 22 2c 20 7a  ag ? "-" : "", z
12a20 29 3b 0a 23 65 6c 73 65 0a 23 69 66 6e 64 65 66  );.#else.#ifndef
12a30 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 48 45 58   SQLITE_OMIT_HEX
12a40 5f 49 4e 54 45 47 45 52 0a 20 20 20 20 20 20 69  _INTEGER.      i
12a50 66 28 20 73 71 6c 69 74 65 33 5f 73 74 72 6e 69  f( sqlite3_strni
12a60 63 6d 70 28 7a 2c 22 30 78 22 2c 32 29 3d 3d 30  cmp(z,"0x",2)==0
12a70 20 29 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69   ){.        sqli
12a80 74 65 33 45 72 72 6f 72 4d 73 67 28 70 50 61 72  te3ErrorMsg(pPar
12a90 73 65 2c 20 22 68 65 78 20 6c 69 74 65 72 61 6c  se, "hex literal
12aa0 20 74 6f 6f 20 62 69 67 3a 20 25 73 22 2c 20 7a   too big: %s", z
12ab0 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 0a 23  );.      }else.#
12ac0 65 6e 64 69 66 0a 20 20 20 20 20 20 7b 0a 20 20  endif.      {.  
12ad0 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c 28 76        codeReal(v
12ae0 2c 20 7a 2c 20 6e 65 67 46 6c 61 67 2c 20 69 4d  , z, negFlag, iM
12af0 65 6d 29 3b 0a 20 20 20 20 20 20 7d 0a 23 65 6e  em);.      }.#en
12b00 64 69 66 0a 20 20 20 20 7d 0a 20 20 7d 0a 7d 0a  dif.    }.  }.}.
12b10 0a 2f 2a 0a 2a 2a 20 43 6c 65 61 72 20 61 20 63  ./*.** Clear a c
12b20 61 63 68 65 20 65 6e 74 72 79 2e 0a 2a 2f 0a 73  ache entry..*/.s
12b30 74 61 74 69 63 20 76 6f 69 64 20 63 61 63 68 65  tatic void cache
12b40 45 6e 74 72 79 43 6c 65 61 72 28 50 61 72 73 65  EntryClear(Parse
12b50 20 2a 70 50 61 72 73 65 2c 20 73 74 72 75 63 74   *pParse, struct
12b60 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 29 7b 0a   yColCache *p){.
12b70 20 20 69 66 28 20 70 2d 3e 74 65 6d 70 52 65 67    if( p->tempReg
12b80 20 29 7b 0a 20 20 20 20 69 66 28 20 70 50 61 72   ){.    if( pPar
12b90 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41 72 72  se->nTempReg<Arr
12ba0 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d 3e 61  aySize(pParse->a
12bb0 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20 20 20  TempReg) ){.    
12bc0 20 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52    pParse->aTempR
12bd0 65 67 5b 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  eg[pParse->nTemp
12be0 52 65 67 2b 2b 5d 20 3d 20 70 2d 3e 69 52 65 67  Reg++] = p->iReg
12bf0 3b 0a 20 20 20 20 7d 0a 20 20 20 20 70 2d 3e 74  ;.    }.    p->t
12c00 65 6d 70 52 65 67 20 3d 20 30 3b 0a 20 20 7d 0a  empReg = 0;.  }.
12c10 7d 0a 0a 0a 2f 2a 0a 2a 2a 20 52 65 63 6f 72 64  }.../*.** Record
12c20 20 69 6e 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63   in the column c
12c30 61 63 68 65 20 74 68 61 74 20 61 20 70 61 72 74  ache that a part
12c40 69 63 75 6c 61 72 20 63 6f 6c 75 6d 6e 20 66 72  icular column fr
12c50 6f 6d 20 61 0a 2a 2a 20 70 61 72 74 69 63 75 6c  om a.** particul
12c60 61 72 20 74 61 62 6c 65 20 69 73 20 73 74 6f 72  ar table is stor
12c70 65 64 20 69 6e 20 61 20 70 61 72 74 69 63 75 6c  ed in a particul
12c80 61 72 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a  ar register..*/.
12c90 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
12ca0 43 61 63 68 65 53 74 6f 72 65 28 50 61 72 73 65  CacheStore(Parse
12cb0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 69 54   *pParse, int iT
12cc0 61 62 2c 20 69 6e 74 20 69 43 6f 6c 2c 20 69 6e  ab, int iCol, in
12cd0 74 20 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69  t iReg){.  int i
12ce0 3b 0a 20 20 69 6e 74 20 6d 69 6e 4c 72 75 3b 0a  ;.  int minLru;.
12cf0 20 20 69 6e 74 20 69 64 78 4c 72 75 3b 0a 20 20    int idxLru;.  
12d00 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65  struct yColCache
12d10 20 2a 70 3b 0a 0a 20 20 61 73 73 65 72 74 28 20   *p;..  assert( 
12d20 69 52 65 67 3e 30 20 29 3b 20 20 2f 2a 20 52 65  iReg>0 );  /* Re
12d30 67 69 73 74 65 72 20 6e 75 6d 62 65 72 73 20 61  gister numbers a
12d40 72 65 20 61 6c 77 61 79 73 20 70 6f 73 69 74 69  re always positi
12d50 76 65 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  ve */.  assert( 
12d60 69 43 6f 6c 3e 3d 2d 31 20 26 26 20 69 43 6f 6c  iCol>=-1 && iCol
12d70 3c 33 32 37 36 38 20 29 3b 20 20 2f 2a 20 46 69  <32768 );  /* Fi
12d80 6e 69 74 65 20 63 6f 6c 75 6d 6e 20 6e 75 6d 62  nite column numb
12d90 65 72 73 20 2a 2f 0a 0a 20 20 2f 2a 20 54 68 65  ers */..  /* The
12da0 20 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61   SQLITE_ColumnCa
12db0 63 68 65 20 66 6c 61 67 20 64 69 73 61 62 6c 65  che flag disable
12dc0 73 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  s the column cac
12dd0 68 65 2e 20 20 54 68 69 73 20 69 73 20 75 73 65  he.  This is use
12de0 64 0a 20 20 2a 2a 20 66 6f 72 20 74 65 73 74 69  d.  ** for testi
12df0 6e 67 20 6f 6e 6c 79 20 2d 20 74 6f 20 76 65 72  ng only - to ver
12e00 69 66 79 20 74 68 61 74 20 53 51 4c 69 74 65 20  ify that SQLite 
12e10 61 6c 77 61 79 73 20 67 65 74 73 20 74 68 65 20  always gets the 
12e20 73 61 6d 65 20 61 6e 73 77 65 72 0a 20 20 2a 2a  same answer.  **
12e30 20 77 69 74 68 20 61 6e 64 20 77 69 74 68 6f 75   with and withou
12e40 74 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  t the column cac
12e50 68 65 2e 0a 20 20 2a 2f 0a 20 20 69 66 28 20 4f  he..  */.  if( O
12e60 70 74 69 6d 69 7a 61 74 69 6f 6e 44 69 73 61 62  ptimizationDisab
12e70 6c 65 64 28 70 50 61 72 73 65 2d 3e 64 62 2c 20  led(pParse->db, 
12e80 53 51 4c 49 54 45 5f 43 6f 6c 75 6d 6e 43 61 63  SQLITE_ColumnCac
12e90 68 65 29 20 29 20 72 65 74 75 72 6e 3b 0a 0a 20  he) ) return;.. 
12ea0 20 2f 2a 20 46 69 72 73 74 20 72 65 70 6c 61 63   /* First replac
12eb0 65 20 61 6e 79 20 65 78 69 73 74 69 6e 67 20 65  e any existing e
12ec0 6e 74 72 79 2e 0a 20 20 2a 2a 0a 20 20 2a 2a 20  ntry..  **.  ** 
12ed0 41 63 74 75 61 6c 6c 79 2c 20 74 68 65 20 77 61  Actually, the wa
12ee0 79 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  y the column cac
12ef0 68 65 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20  he is currently 
12f00 75 73 65 64 2c 20 77 65 20 61 72 65 20 67 75 61  used, we are gua
12f10 72 61 6e 74 65 65 64 0a 20 20 2a 2a 20 74 68 61  ranteed.  ** tha
12f20 74 20 74 68 65 20 6f 62 6a 65 63 74 20 77 69 6c  t the object wil
12f30 6c 20 6e 65 76 65 72 20 61 6c 72 65 61 64 79 20  l never already 
12f40 62 65 20 69 6e 20 63 61 63 68 65 2e 20 20 56 65  be in cache.  Ve
12f50 72 69 66 79 20 74 68 69 73 20 67 75 61 72 61 6e  rify this guaran
12f60 74 65 65 2e 0a 20 20 2a 2f 0a 23 69 66 6e 64 65  tee..  */.#ifnde
12f70 66 20 4e 44 45 42 55 47 0a 20 20 66 6f 72 28 69  f NDEBUG.  for(i
12f80 3d 30 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43  =0, p=pParse->aC
12f90 6f 6c 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54  olCache; i<SQLIT
12fa0 45 5f 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b  E_N_COLCACHE; i+
12fb0 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20 20 61 73 73  +, p++){.    ass
12fc0 65 72 74 28 20 70 2d 3e 69 52 65 67 3d 3d 30 20  ert( p->iReg==0 
12fd0 7c 7c 20 70 2d 3e 69 54 61 62 6c 65 21 3d 69 54  || p->iTable!=iT
12fe0 61 62 20 7c 7c 20 70 2d 3e 69 43 6f 6c 75 6d 6e  ab || p->iColumn
12ff0 21 3d 69 43 6f 6c 20 29 3b 0a 20 20 7d 0a 23 65  !=iCol );.  }.#e
13000 6e 64 69 66 0a 0a 20 20 2f 2a 20 46 69 6e 64 20  ndif..  /* Find 
13010 61 6e 20 65 6d 70 74 79 20 73 6c 6f 74 20 61 6e  an empty slot an
13020 64 20 72 65 70 6c 61 63 65 20 69 74 20 2a 2f 0a  d replace it */.
13030 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61    for(i=0, p=pPa
13040 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20  rse->aColCache; 
13050 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41  i<SQLITE_N_COLCA
13060 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a  CHE; i++, p++){.
13070 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3d      if( p->iReg=
13080 3d 30 20 29 7b 0a 20 20 20 20 20 20 70 2d 3e 69  =0 ){.      p->i
13090 4c 65 76 65 6c 20 3d 20 70 50 61 72 73 65 2d 3e  Level = pParse->
130a0 69 43 61 63 68 65 4c 65 76 65 6c 3b 0a 20 20 20  iCacheLevel;.   
130b0 20 20 20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69     p->iTable = i
130c0 54 61 62 3b 0a 20 20 20 20 20 20 70 2d 3e 69 43  Tab;.      p->iC
130d0 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b 0a 20 20  olumn = iCol;.  
130e0 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69 52      p->iReg = iR
130f0 65 67 3b 0a 20 20 20 20 20 20 70 2d 3e 74 65 6d  eg;.      p->tem
13100 70 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 20 20  pReg = 0;.      
13110 70 2d 3e 6c 72 75 20 3d 20 70 50 61 72 73 65 2d  p->lru = pParse-
13120 3e 69 43 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20  >iCacheCnt++;.  
13130 20 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 20 20      return;.    
13140 7d 0a 20 20 7d 0a 0a 20 20 2f 2a 20 52 65 70 6c  }.  }..  /* Repl
13150 61 63 65 20 74 68 65 20 6c 61 73 74 20 72 65 63  ace the last rec
13160 65 6e 74 6c 79 20 75 73 65 64 20 2a 2f 0a 20 20  ently used */.  
13170 6d 69 6e 4c 72 75 20 3d 20 30 78 37 66 66 66 66  minLru = 0x7ffff
13180 66 66 66 3b 0a 20 20 69 64 78 4c 72 75 20 3d 20  fff;.  idxLru = 
13190 2d 31 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70  -1;.  for(i=0, p
131a0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
131b0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
131c0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
131d0 2b 29 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 6c  +){.    if( p->l
131e0 72 75 3c 6d 69 6e 4c 72 75 20 29 7b 0a 20 20 20  ru<minLru ){.   
131f0 20 20 20 69 64 78 4c 72 75 20 3d 20 69 3b 0a 20     idxLru = i;. 
13200 20 20 20 20 20 6d 69 6e 4c 72 75 20 3d 20 70 2d       minLru = p-
13210 3e 6c 72 75 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a  >lru;.    }.  }.
13220 20 20 69 66 28 20 41 4c 57 41 59 53 28 69 64 78    if( ALWAYS(idx
13230 4c 72 75 3e 3d 30 29 20 29 7b 0a 20 20 20 20 70  Lru>=0) ){.    p
13240 20 3d 20 26 70 50 61 72 73 65 2d 3e 61 43 6f 6c   = &pParse->aCol
13250 43 61 63 68 65 5b 69 64 78 4c 72 75 5d 3b 0a 20  Cache[idxLru];. 
13260 20 20 20 70 2d 3e 69 4c 65 76 65 6c 20 3d 20 70     p->iLevel = p
13270 50 61 72 73 65 2d 3e 69 43 61 63 68 65 4c 65 76  Parse->iCacheLev
13280 65 6c 3b 0a 20 20 20 20 70 2d 3e 69 54 61 62 6c  el;.    p->iTabl
13290 65 20 3d 20 69 54 61 62 3b 0a 20 20 20 20 70 2d  e = iTab;.    p-
132a0 3e 69 43 6f 6c 75 6d 6e 20 3d 20 69 43 6f 6c 3b  >iColumn = iCol;
132b0 0a 20 20 20 20 70 2d 3e 69 52 65 67 20 3d 20 69  .    p->iReg = i
132c0 52 65 67 3b 0a 20 20 20 20 70 2d 3e 74 65 6d 70  Reg;.    p->temp
132d0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 70 2d 3e  Reg = 0;.    p->
132e0 6c 72 75 20 3d 20 70 50 61 72 73 65 2d 3e 69 43  lru = pParse->iC
132f0 61 63 68 65 43 6e 74 2b 2b 3b 0a 20 20 20 20 72  acheCnt++;.    r
13300 65 74 75 72 6e 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a  eturn;.  }.}../*
13310 0a 2a 2a 20 49 6e 64 69 63 61 74 65 20 74 68 61  .** Indicate tha
13320 74 20 72 65 67 69 73 74 65 72 73 20 62 65 74 77  t registers betw
13330 65 65 6e 20 69 52 65 67 2e 2e 69 52 65 67 2b 6e  een iReg..iReg+n
13340 52 65 67 2d 31 20 61 72 65 20 62 65 69 6e 67 20  Reg-1 are being 
13350 6f 76 65 72 77 72 69 74 74 65 6e 2e 0a 2a 2a 20  overwritten..** 
13360 50 75 72 67 65 20 74 68 65 20 72 61 6e 67 65 20  Purge the range 
13370 6f 66 20 72 65 67 69 73 74 65 72 73 20 66 72 6f  of registers fro
13380 6d 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63  m the column cac
13390 68 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  he..*/.void sqli
133a0 74 65 33 45 78 70 72 43 61 63 68 65 52 65 6d 6f  te3ExprCacheRemo
133b0 76 65 28 50 61 72 73 65 20 2a 70 50 61 72 73 65  ve(Parse *pParse
133c0 2c 20 69 6e 74 20 69 52 65 67 2c 20 69 6e 74 20  , int iReg, int 
133d0 6e 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  nReg){.  int i;.
133e0 20 20 69 6e 74 20 69 4c 61 73 74 20 3d 20 69 52    int iLast = iR
133f0 65 67 20 2b 20 6e 52 65 67 20 2d 20 31 3b 0a 20  eg + nReg - 1;. 
13400 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63 68   struct yColCach
13410 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30 2c  e *p;.  for(i=0,
13420 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43   p=pParse->aColC
13430 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e  ache; i<SQLITE_N
13440 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20  _COLCACHE; i++, 
13450 70 2b 2b 29 7b 0a 20 20 20 20 69 6e 74 20 72 20  p++){.    int r 
13460 3d 20 70 2d 3e 69 52 65 67 3b 0a 20 20 20 20 69  = p->iReg;.    i
13470 66 28 20 72 3e 3d 69 52 65 67 20 26 26 20 72 3c  f( r>=iReg && r<
13480 3d 69 4c 61 73 74 20 29 7b 0a 20 20 20 20 20 20  =iLast ){.      
13490 63 61 63 68 65 45 6e 74 72 79 43 6c 65 61 72 28  cacheEntryClear(
134a0 70 50 61 72 73 65 2c 20 70 29 3b 0a 20 20 20 20  pParse, p);.    
134b0 20 20 70 2d 3e 69 52 65 67 20 3d 20 30 3b 0a 20    p->iReg = 0;. 
134c0 20 20 20 7d 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a     }.  }.}../*.*
134d0 2a 20 52 65 6d 65 6d 62 65 72 20 74 68 65 20 63  * Remember the c
134e0 75 72 72 65 6e 74 20 63 6f 6c 75 6d 6e 20 63 61  urrent column ca
134f0 63 68 65 20 63 6f 6e 74 65 78 74 2e 20 20 41 6e  che context.  An
13500 79 20 6e 65 77 20 65 6e 74 72 69 65 73 20 61 64  y new entries ad
13510 64 65 64 0a 2a 2a 20 61 64 64 65 64 20 74 6f 20  ded.** added to 
13520 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65  the column cache
13530 20 61 66 74 65 72 20 74 68 69 73 20 63 61 6c 6c   after this call
13540 20 61 72 65 20 72 65 6d 6f 76 65 64 20 77 68 65   are removed whe
13550 6e 20 74 68 65 0a 2a 2a 20 63 6f 72 72 65 73 70  n the.** corresp
13560 6f 6e 64 69 6e 67 20 70 6f 70 20 6f 63 63 75 72  onding pop occur
13570 73 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74  s..*/.void sqlit
13580 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28  e3ExprCachePush(
13590 50 61 72 73 65 20 2a 70 50 61 72 73 65 29 7b 0a  Parse *pParse){.
135a0 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68 65    pParse->iCache
135b0 4c 65 76 65 6c 2b 2b 3b 0a 23 69 66 64 65 66 20  Level++;.#ifdef 
135c0 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
135d0 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
135e0 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
135f0 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
13600 20 20 20 20 70 72 69 6e 74 66 28 22 50 55 53 48      printf("PUSH
13610 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72 73   to %d\n", pPars
13620 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29 3b  e->iCacheLevel);
13630 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 7d 0a 0a 2f  .  }.#endif.}../
13640 2a 0a 2a 2a 20 52 65 6d 6f 76 65 20 66 72 6f 6d  *.** Remove from
13650 20 74 68 65 20 63 6f 6c 75 6d 6e 20 63 61 63 68   the column cach
13660 65 20 61 6e 79 20 65 6e 74 72 69 65 73 20 74 68  e any entries th
13670 61 74 20 77 65 72 65 20 61 64 64 65 64 20 73 69  at were added si
13680 6e 63 65 20 74 68 65 0a 2a 2a 20 74 68 65 20 70  nce the.** the p
13690 72 65 76 69 6f 75 73 20 73 71 6c 69 74 65 33 45  revious sqlite3E
136a0 78 70 72 43 61 63 68 65 50 75 73 68 20 6f 70 65  xprCachePush ope
136b0 72 61 74 69 6f 6e 2e 20 20 49 6e 20 6f 74 68 65  ration.  In othe
136c0 72 20 77 6f 72 64 73 2c 20 72 65 73 74 6f 72 65  r words, restore
136d0 0a 2a 2a 20 74 68 65 20 63 61 63 68 65 20 74 6f  .** the cache to
136e0 20 74 68 65 20 73 74 61 74 65 20 69 74 20 77 61   the state it wa
136f0 73 20 69 6e 20 70 72 69 6f 72 20 74 68 65 20 6d  s in prior the m
13700 6f 73 74 20 72 65 63 65 6e 74 20 50 75 73 68 2e  ost recent Push.
13710 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33  .*/.void sqlite3
13720 45 78 70 72 43 61 63 68 65 50 6f 70 28 50 61 72  ExprCachePop(Par
13730 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
13740 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79  nt i;.  struct y
13750 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 20 20 61  ColCache *p;.  a
13760 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e 69  ssert( pParse->i
13770 43 61 63 68 65 4c 65 76 65 6c 3e 3d 31 20 29 3b  CacheLevel>=1 );
13780 0a 20 20 70 50 61 72 73 65 2d 3e 69 43 61 63 68  .  pParse->iCach
13790 65 4c 65 76 65 6c 2d 2d 3b 0a 23 69 66 64 65 66  eLevel--;.#ifdef
137a0 20 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20   SQLITE_DEBUG.  
137b0 69 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e  if( pParse->db->
137c0 66 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56  flags & SQLITE_V
137d0 64 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b  dbeAddopTrace ){
137e0 0a 20 20 20 20 70 72 69 6e 74 66 28 22 50 4f 50  .    printf("POP
137f0 20 20 74 6f 20 25 64 5c 6e 22 2c 20 70 50 61 72    to %d\n", pPar
13800 73 65 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 29  se->iCacheLevel)
13810 3b 0a 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 66  ;.  }.#endif.  f
13820 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72 73 65  or(i=0, p=pParse
13830 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69 3c 53  ->aColCache; i<S
13840 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43 48 45  QLITE_N_COLCACHE
13850 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20 20 20  ; i++, p++){.   
13860 20 69 66 28 20 70 2d 3e 69 52 65 67 20 26 26 20   if( p->iReg && 
13870 70 2d 3e 69 4c 65 76 65 6c 3e 70 50 61 72 73 65  p->iLevel>pParse
13880 2d 3e 69 43 61 63 68 65 4c 65 76 65 6c 20 29 7b  ->iCacheLevel ){
13890 0a 20 20 20 20 20 20 63 61 63 68 65 45 6e 74 72  .      cacheEntr
138a0 79 43 6c 65 61 72 28 70 50 61 72 73 65 2c 20 70  yClear(pParse, p
138b0 29 3b 0a 20 20 20 20 20 20 70 2d 3e 69 52 65 67  );.      p->iReg
138c0 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
138d0 7d 0a 0a 2f 2a 0a 2a 2a 20 57 68 65 6e 20 61 20  }../*.** When a 
138e0 63 61 63 68 65 64 20 63 6f 6c 75 6d 6e 20 69 73  cached column is
138f0 20 72 65 75 73 65 64 2c 20 6d 61 6b 65 20 73 75   reused, make su
13900 72 65 20 74 68 61 74 20 69 74 73 20 72 65 67 69  re that its regi
13910 73 74 65 72 20 69 73 0a 2a 2a 20 6e 6f 20 6c 6f  ster is.** no lo
13920 6e 67 65 72 20 61 76 61 69 6c 61 62 6c 65 20 61  nger available a
13930 73 20 61 20 74 65 6d 70 20 72 65 67 69 73 74 65  s a temp registe
13940 72 2e 20 20 74 69 63 6b 65 74 20 23 33 38 37 39  r.  ticket #3879
13950 3a 20 20 74 68 61 74 20 73 61 6d 65 0a 2a 2a 20  :  that same.** 
13960 72 65 67 69 73 74 65 72 20 6d 69 67 68 74 20 62  register might b
13970 65 20 69 6e 20 74 68 65 20 63 61 63 68 65 20 69  e in the cache i
13980 6e 20 6d 75 6c 74 69 70 6c 65 20 70 6c 61 63 65  n multiple place
13990 73 2c 20 73 6f 20 62 65 20 73 75 72 65 20 74 6f  s, so be sure to
139a0 0a 2a 2a 20 67 65 74 20 74 68 65 6d 20 61 6c 6c  .** get them all
139b0 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69 64  ..*/.static void
139c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68   sqlite3ExprCach
139d0 65 50 69 6e 52 65 67 69 73 74 65 72 28 50 61 72  ePinRegister(Par
139e0 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
139f0 69 52 65 67 29 7b 0a 20 20 69 6e 74 20 69 3b 0a  iReg){.  int i;.
13a00 20 20 73 74 72 75 63 74 20 79 43 6f 6c 43 61 63    struct yColCac
13a10 68 65 20 2a 70 3b 0a 20 20 66 6f 72 28 69 3d 30  he *p;.  for(i=0
13a20 2c 20 70 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c  , p=pParse->aCol
13a30 43 61 63 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f  Cache; i<SQLITE_
13a40 4e 5f 43 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c  N_COLCACHE; i++,
13a50 20 70 2b 2b 29 7b 0a 20 20 20 20 69 66 28 20 70   p++){.    if( p
13a60 2d 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a  ->iReg==iReg ){.
13a70 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65 67        p->tempReg
13a80 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20 20 7d 0a   = 0;.    }.  }.
13a90 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
13aa0 65 20 63 6f 64 65 20 74 6f 20 65 78 74 72 61 63  e code to extrac
13ab0 74 20 74 68 65 20 76 61 6c 75 65 20 6f 66 20 74  t the value of t
13ac0 68 65 20 69 43 6f 6c 2d 74 68 20 63 6f 6c 75 6d  he iCol-th colum
13ad0 6e 20 6f 66 20 61 20 74 61 62 6c 65 2e 0a 2a 2f  n of a table..*/
13ae0 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
13af0 72 43 6f 64 65 47 65 74 43 6f 6c 75 6d 6e 4f 66  rCodeGetColumnOf
13b00 54 61 62 6c 65 28 0a 20 20 56 64 62 65 20 2a 76  Table(.  Vdbe *v
13b10 2c 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20  ,        /* The 
13b20 56 44 42 45 20 75 6e 64 65 72 20 63 6f 6e 73 74  VDBE under const
13b30 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20 54 61 62  ruction */.  Tab
13b40 6c 65 20 2a 70 54 61 62 2c 20 20 20 20 2f 2a 20  le *pTab,    /* 
13b50 54 68 65 20 74 61 62 6c 65 20 63 6f 6e 74 61 69  The table contai
13b60 6e 69 6e 67 20 74 68 65 20 76 61 6c 75 65 20 2a  ning the value *
13b70 2f 0a 20 20 69 6e 74 20 69 54 61 62 43 75 72 2c  /.  int iTabCur,
13b80 20 20 20 20 2f 2a 20 54 68 65 20 74 61 62 6c 65      /* The table
13b90 20 63 75 72 73 6f 72 2e 20 20 4f 72 20 74 68 65   cursor.  Or the
13ba0 20 50 4b 20 63 75 72 73 6f 72 20 66 6f 72 20 57   PK cursor for W
13bb0 49 54 48 4f 55 54 20 52 4f 57 49 44 20 2a 2f 0a  ITHOUT ROWID */.
13bc0 20 20 69 6e 74 20 69 43 6f 6c 2c 20 20 20 20 20    int iCol,     
13bd0 20 20 2f 2a 20 49 6e 64 65 78 20 6f 66 20 74 68    /* Index of th
13be0 65 20 63 6f 6c 75 6d 6e 20 74 6f 20 65 78 74 72  e column to extr
13bf0 61 63 74 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67  act */.  int reg
13c00 4f 75 74 20 20 20 20 20 20 2f 2a 20 45 78 74 72  Out      /* Extr
13c10 61 63 74 20 74 68 65 20 76 61 6c 75 65 20 69 6e  act the value in
13c20 74 6f 20 74 68 69 73 20 72 65 67 69 73 74 65 72  to this register
13c30 20 2a 2f 0a 29 7b 0a 20 20 69 66 28 20 69 43 6f   */.){.  if( iCo
13c40 6c 3c 30 20 7c 7c 20 69 43 6f 6c 3d 3d 70 54 61  l<0 || iCol==pTa
13c50 62 2d 3e 69 50 4b 65 79 20 29 7b 0a 20 20 20 20  b->iPKey ){.    
13c60 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
13c70 32 28 76 2c 20 4f 50 5f 52 6f 77 69 64 2c 20 69  2(v, OP_Rowid, i
13c80 54 61 62 43 75 72 2c 20 72 65 67 4f 75 74 29 3b  TabCur, regOut);
13c90 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
13ca0 74 20 6f 70 20 3d 20 49 73 56 69 72 74 75 61 6c  t op = IsVirtual
13cb0 28 70 54 61 62 29 20 3f 20 4f 50 5f 56 43 6f 6c  (pTab) ? OP_VCol
13cc0 75 6d 6e 20 3a 20 4f 50 5f 43 6f 6c 75 6d 6e 3b  umn : OP_Column;
13cd0 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 69 43 6f  .    int x = iCo
13ce0 6c 3b 0a 20 20 20 20 69 66 28 20 21 48 61 73 52  l;.    if( !HasR
13cf0 6f 77 69 64 28 70 54 61 62 29 20 29 7b 0a 20 20  owid(pTab) ){.  
13d00 20 20 20 20 78 20 3d 20 73 71 6c 69 74 65 33 43      x = sqlite3C
13d10 6f 6c 75 6d 6e 4f 66 49 6e 64 65 78 28 73 71 6c  olumnOfIndex(sql
13d20 69 74 65 33 50 72 69 6d 61 72 79 4b 65 79 49 6e  ite3PrimaryKeyIn
13d30 64 65 78 28 70 54 61 62 29 2c 20 69 43 6f 6c 29  dex(pTab), iCol)
13d40 3b 0a 20 20 20 20 7d 0a 20 20 20 20 73 71 6c 69  ;.    }.    sqli
13d50 74 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c  te3VdbeAddOp3(v,
13d60 20 6f 70 2c 20 69 54 61 62 43 75 72 2c 20 78 2c   op, iTabCur, x,
13d70 20 72 65 67 4f 75 74 29 3b 0a 20 20 7d 0a 20 20   regOut);.  }.  
13d80 69 66 28 20 69 43 6f 6c 3e 3d 30 20 29 7b 0a 20  if( iCol>=0 ){. 
13d90 20 20 20 73 71 6c 69 74 65 33 43 6f 6c 75 6d 6e     sqlite3Column
13da0 44 65 66 61 75 6c 74 28 76 2c 20 70 54 61 62 2c  Default(v, pTab,
13db0 20 69 43 6f 6c 2c 20 72 65 67 4f 75 74 29 3b 0a   iCol, regOut);.
13dc0 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e    }.}../*.** Gen
13dd0 65 72 61 74 65 20 63 6f 64 65 20 74 68 61 74 20  erate code that 
13de0 77 69 6c 6c 20 65 78 74 72 61 63 74 20 74 68 65  will extract the
13df0 20 69 43 6f 6c 75 6d 6e 2d 74 68 20 63 6f 6c 75   iColumn-th colu
13e00 6d 6e 20 66 72 6f 6d 0a 2a 2a 20 74 61 62 6c 65  mn from.** table
13e10 20 70 54 61 62 20 61 6e 64 20 73 74 6f 72 65 20   pTab and store 
13e20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65  the column value
13e30 20 69 6e 20 61 20 72 65 67 69 73 74 65 72 2e 20   in a register. 
13e40 20 41 6e 20 65 66 66 6f 72 74 0a 2a 2a 20 69 73   An effort.** is
13e50 20 6d 61 64 65 20 74 6f 20 73 74 6f 72 65 20 74   made to store t
13e60 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c 75 65 20  he column value 
13e70 69 6e 20 72 65 67 69 73 74 65 72 20 69 52 65 67  in register iReg
13e80 2c 20 62 75 74 20 74 68 69 73 20 69 73 0a 2a 2a  , but this is.**
13e90 20 6e 6f 74 20 67 75 61 72 61 6e 74 65 65 64 2e   not guaranteed.
13ea0 20 20 54 68 65 20 6c 6f 63 61 74 69 6f 6e 20 6f    The location o
13eb0 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 76 61 6c  f the column val
13ec0 75 65 20 69 73 20 72 65 74 75 72 6e 65 64 2e 0a  ue is returned..
13ed0 2a 2a 0a 2a 2a 20 54 68 65 72 65 20 6d 75 73 74  **.** There must
13ee0 20 62 65 20 61 6e 20 6f 70 65 6e 20 63 75 72 73   be an open curs
13ef0 6f 72 20 74 6f 20 70 54 61 62 20 69 6e 20 69 54  or to pTab in iT
13f00 61 62 6c 65 20 77 68 65 6e 20 74 68 69 73 20 72  able when this r
13f10 6f 75 74 69 6e 65 0a 2a 2a 20 69 73 20 63 61 6c  outine.** is cal
13f20 6c 65 64 2e 20 20 49 66 20 69 43 6f 6c 75 6d 6e  led.  If iColumn
13f30 3c 30 20 74 68 65 6e 20 63 6f 64 65 20 69 73 20  <0 then code is 
13f40 67 65 6e 65 72 61 74 65 64 20 74 68 61 74 20 65  generated that e
13f50 78 74 72 61 63 74 73 20 74 68 65 20 72 6f 77 69  xtracts the rowi
13f60 64 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  d..*/.int sqlite
13f70 33 45 78 70 72 43 6f 64 65 47 65 74 43 6f 6c 75  3ExprCodeGetColu
13f80 6d 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  mn(.  Parse *pPa
13f90 72 73 65 2c 20 20 20 2f 2a 20 50 61 72 73 69 6e  rse,   /* Parsin
13fa0 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65 72  g and code gener
13fb0 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f  ating context */
13fc0 0a 20 20 54 61 62 6c 65 20 2a 70 54 61 62 2c 20  .  Table *pTab, 
13fd0 20 20 20 20 2f 2a 20 44 65 73 63 72 69 70 74 69      /* Descripti
13fe0 6f 6e 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  on of the table 
13ff0 77 65 20 61 72 65 20 72 65 61 64 69 6e 67 20 66  we are reading f
14000 72 6f 6d 20 2a 2f 0a 20 20 69 6e 74 20 69 43 6f  rom */.  int iCo
14010 6c 75 6d 6e 2c 20 20 20 20 20 2f 2a 20 49 6e 64  lumn,     /* Ind
14020 65 78 20 6f 66 20 74 68 65 20 74 61 62 6c 65 20  ex of the table 
14030 63 6f 6c 75 6d 6e 20 2a 2f 0a 20 20 69 6e 74 20  column */.  int 
14040 69 54 61 62 6c 65 2c 20 20 20 20 20 20 2f 2a 20  iTable,      /* 
14050 54 68 65 20 63 75 72 73 6f 72 20 70 6f 69 6e 74  The cursor point
14060 69 6e 67 20 74 6f 20 74 68 65 20 74 61 62 6c 65  ing to the table
14070 20 2a 2f 0a 20 20 69 6e 74 20 69 52 65 67 2c 20   */.  int iReg, 
14080 20 20 20 20 20 20 20 2f 2a 20 53 74 6f 72 65 20         /* Store 
14090 72 65 73 75 6c 74 73 20 68 65 72 65 20 2a 2f 0a  results here */.
140a0 20 20 75 38 20 70 35 20 20 20 20 20 20 20 20 20    u8 p5         
140b0 20 20 20 2f 2a 20 50 35 20 76 61 6c 75 65 20 66     /* P5 value f
140c0 6f 72 20 4f 50 5f 43 6f 6c 75 6d 6e 20 2a 2f 0a  or OP_Column */.
140d0 29 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70  ){.  Vdbe *v = p
140e0 50 61 72 73 65 2d 3e 70 56 64 62 65 3b 0a 20 20  Parse->pVdbe;.  
140f0 69 6e 74 20 69 3b 0a 20 20 73 74 72 75 63 74 20  int i;.  struct 
14100 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 20  yColCache *p;.. 
14110 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50 61 72   for(i=0, p=pPar
14120 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b 20 69  se->aColCache; i
14130 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43 41 43  <SQLITE_N_COLCAC
14140 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b 0a 20  HE; i++, p++){. 
14150 20 20 20 69 66 28 20 70 2d 3e 69 52 65 67 3e 30     if( p->iReg>0
14160 20 26 26 20 70 2d 3e 69 54 61 62 6c 65 3d 3d 69   && p->iTable==i
14170 54 61 62 6c 65 20 26 26 20 70 2d 3e 69 43 6f 6c  Table && p->iCol
14180 75 6d 6e 3d 3d 69 43 6f 6c 75 6d 6e 20 29 7b 0a  umn==iColumn ){.
14190 20 20 20 20 20 20 70 2d 3e 6c 72 75 20 3d 20 70        p->lru = p
141a0 50 61 72 73 65 2d 3e 69 43 61 63 68 65 43 6e 74  Parse->iCacheCnt
141b0 2b 2b 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ++;.      sqlite
141c0 33 45 78 70 72 43 61 63 68 65 50 69 6e 52 65 67  3ExprCachePinReg
141d0 69 73 74 65 72 28 70 50 61 72 73 65 2c 20 70 2d  ister(pParse, p-
141e0 3e 69 52 65 67 29 3b 0a 20 20 20 20 20 20 72 65  >iReg);.      re
141f0 74 75 72 6e 20 70 2d 3e 69 52 65 67 3b 0a 20 20  turn p->iReg;.  
14200 20 20 7d 0a 20 20 7d 20 20 0a 20 20 61 73 73 65    }.  }  .  asse
14210 72 74 28 20 76 21 3d 30 20 29 3b 0a 20 20 73 71  rt( v!=0 );.  sq
14220 6c 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74  lite3ExprCodeGet
14230 43 6f 6c 75 6d 6e 4f 66 54 61 62 6c 65 28 76 2c  ColumnOfTable(v,
14240 20 70 54 61 62 2c 20 69 54 61 62 6c 65 2c 20 69   pTab, iTable, i
14250 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b 0a 20  Column, iReg);. 
14260 20 69 66 28 20 70 35 20 29 7b 0a 20 20 20 20 73   if( p5 ){.    s
14270 71 6c 69 74 65 33 56 64 62 65 43 68 61 6e 67 65  qlite3VdbeChange
14280 50 35 28 76 2c 20 70 35 29 3b 0a 20 20 7d 65 6c  P5(v, p5);.  }el
14290 73 65 7b 20 20 20 0a 20 20 20 20 73 71 6c 69 74  se{   .    sqlit
142a0 65 33 45 78 70 72 43 61 63 68 65 53 74 6f 72 65  e3ExprCacheStore
142b0 28 70 50 61 72 73 65 2c 20 69 54 61 62 6c 65 2c  (pParse, iTable,
142c0 20 69 43 6f 6c 75 6d 6e 2c 20 69 52 65 67 29 3b   iColumn, iReg);
142d0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 52  .  }.  return iR
142e0 65 67 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6c 65  eg;.}../*.** Cle
142f0 61 72 20 61 6c 6c 20 63 6f 6c 75 6d 6e 20 63 61  ar all column ca
14300 63 68 65 20 65 6e 74 72 69 65 73 2e 0a 2a 2f 0a  che entries..*/.
14310 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70 72  void sqlite3Expr
14320 43 61 63 68 65 43 6c 65 61 72 28 50 61 72 73 65  CacheClear(Parse
14330 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69 6e 74   *pParse){.  int
14340 20 69 3b 0a 20 20 73 74 72 75 63 74 20 79 43 6f   i;.  struct yCo
14350 6c 43 61 63 68 65 20 2a 70 3b 0a 0a 23 69 66 20  lCache *p;..#if 
14360 53 51 4c 49 54 45 5f 44 45 42 55 47 0a 20 20 69  SQLITE_DEBUG.  i
14370 66 28 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 66  f( pParse->db->f
14380 6c 61 67 73 20 26 20 53 51 4c 49 54 45 5f 56 64  lags & SQLITE_Vd
14390 62 65 41 64 64 6f 70 54 72 61 63 65 20 29 7b 0a  beAddopTrace ){.
143a0 20 20 20 20 70 72 69 6e 74 66 28 22 43 4c 45 41      printf("CLEA
143b0 52 5c 6e 22 29 3b 0a 20 20 7d 0a 23 65 6e 64 69  R\n");.  }.#endi
143c0 66 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  f.  for(i=0, p=p
143d0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
143e0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
143f0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
14400 7b 0a 20 20 20 20 69 66 28 20 70 2d 3e 69 52 65  {.    if( p->iRe
14410 67 20 29 7b 0a 20 20 20 20 20 20 63 61 63 68 65  g ){.      cache
14420 45 6e 74 72 79 43 6c 65 61 72 28 70 50 61 72 73  EntryClear(pPars
14430 65 2c 20 70 29 3b 0a 20 20 20 20 20 20 70 2d 3e  e, p);.      p->
14440 69 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a  iReg = 0;.    }.
14450 20 20 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 52 65 63    }.}../*.** Rec
14460 6f 72 64 20 74 68 65 20 66 61 63 74 20 74 68 61  ord the fact tha
14470 74 20 61 6e 20 61 66 66 69 6e 69 74 79 20 63 68  t an affinity ch
14480 61 6e 67 65 20 68 61 73 20 6f 63 63 75 72 72 65  ange has occurre
14490 64 20 6f 6e 20 69 43 6f 75 6e 74 0a 2a 2a 20 72  d on iCount.** r
144a0 65 67 69 73 74 65 72 73 20 73 74 61 72 74 69 6e  egisters startin
144b0 67 20 77 69 74 68 20 69 53 74 61 72 74 2e 0a 2a  g with iStart..*
144c0 2f 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78  /.void sqlite3Ex
144d0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
144e0 68 61 6e 67 65 28 50 61 72 73 65 20 2a 70 50 61  hange(Parse *pPa
144f0 72 73 65 2c 20 69 6e 74 20 69 53 74 61 72 74 2c  rse, int iStart,
14500 20 69 6e 74 20 69 43 6f 75 6e 74 29 7b 0a 20 20   int iCount){.  
14510 73 71 6c 69 74 65 33 45 78 70 72 43 61 63 68 65  sqlite3ExprCache
14520 52 65 6d 6f 76 65 28 70 50 61 72 73 65 2c 20 69  Remove(pParse, i
14530 53 74 61 72 74 2c 20 69 43 6f 75 6e 74 29 3b 0a  Start, iCount);.
14540 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
14550 65 20 63 6f 64 65 20 74 6f 20 6d 6f 76 65 20 63  e code to move c
14560 6f 6e 74 65 6e 74 20 66 72 6f 6d 20 72 65 67 69  ontent from regi
14570 73 74 65 72 73 20 69 46 72 6f 6d 2e 2e 2e 69 46  sters iFrom...iF
14580 72 6f 6d 2b 6e 52 65 67 2d 31 0a 2a 2a 20 6f 76  rom+nReg-1.** ov
14590 65 72 20 74 6f 20 69 54 6f 2e 2e 69 54 6f 2b 6e  er to iTo..iTo+n
145a0 52 65 67 2d 31 2e 20 4b 65 65 70 20 74 68 65 20  Reg-1. Keep the 
145b0 63 6f 6c 75 6d 6e 20 63 61 63 68 65 20 75 70 2d  column cache up-
145c0 74 6f 2d 64 61 74 65 2e 0a 2a 2f 0a 76 6f 69 64  to-date..*/.void
145d0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
145e0 4d 6f 76 65 28 50 61 72 73 65 20 2a 70 50 61 72  Move(Parse *pPar
145f0 73 65 2c 20 69 6e 74 20 69 46 72 6f 6d 2c 20 69  se, int iFrom, i
14600 6e 74 20 69 54 6f 2c 20 69 6e 74 20 6e 52 65 67  nt iTo, int nReg
14610 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74  ){.  int i;.  st
14620 72 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a  ruct yColCache *
14630 70 3b 0a 20 20 61 73 73 65 72 74 28 20 69 46 72  p;.  assert( iFr
14640 6f 6d 3e 3d 69 54 6f 2b 6e 52 65 67 20 7c 7c 20  om>=iTo+nReg || 
14650 69 46 72 6f 6d 2b 6e 52 65 67 3c 3d 69 54 6f 20  iFrom+nReg<=iTo 
14660 29 3b 0a 20 20 73 71 6c 69 74 65 33 56 64 62 65  );.  sqlite3Vdbe
14670 41 64 64 4f 70 33 28 70 50 61 72 73 65 2d 3e 70  AddOp3(pParse->p
14680 56 64 62 65 2c 20 4f 50 5f 4d 6f 76 65 2c 20 69  Vdbe, OP_Move, i
14690 46 72 6f 6d 2c 20 69 54 6f 2c 20 6e 52 65 67 29  From, iTo, nReg)
146a0 3b 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70  ;.  for(i=0, p=p
146b0 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65  Parse->aColCache
146c0 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c  ; i<SQLITE_N_COL
146d0 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29  CACHE; i++, p++)
146e0 7b 0a 20 20 20 20 69 6e 74 20 78 20 3d 20 70 2d  {.    int x = p-
146f0 3e 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 78  >iReg;.    if( x
14700 3e 3d 69 46 72 6f 6d 20 26 26 20 78 3c 69 46 72  >=iFrom && x<iFr
14710 6f 6d 2b 6e 52 65 67 20 29 7b 0a 20 20 20 20 20  om+nReg ){.     
14720 20 70 2d 3e 69 52 65 67 20 2b 3d 20 69 54 6f 2d   p->iReg += iTo-
14730 69 46 72 6f 6d 3b 0a 20 20 20 20 7d 0a 20 20 7d  iFrom;.    }.  }
14740 0a 7d 0a 0a 23 69 66 20 64 65 66 69 6e 65 64 28  .}..#if defined(
14750 53 51 4c 49 54 45 5f 44 45 42 55 47 29 20 7c 7c  SQLITE_DEBUG) ||
14760 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
14770 43 4f 56 45 52 41 47 45 5f 54 45 53 54 29 0a 2f  COVERAGE_TEST)./
14780 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74 72 75 65  *.** Return true
14790 20 69 66 20 61 6e 79 20 72 65 67 69 73 74 65 72   if any register
147a0 20 69 6e 20 74 68 65 20 72 61 6e 67 65 20 69 46   in the range iF
147b0 72 6f 6d 2e 2e 69 54 6f 20 28 69 6e 63 6c 75 73  rom..iTo (inclus
147c0 69 76 65 29 0a 2a 2a 20 69 73 20 75 73 65 64 20  ive).** is used 
147d0 61 73 20 70 61 72 74 20 6f 66 20 74 68 65 20 63  as part of the c
147e0 6f 6c 75 6d 6e 20 63 61 63 68 65 2e 0a 2a 2a 0a  olumn cache..**.
147f0 2a 2a 20 54 68 69 73 20 72 6f 75 74 69 6e 65 20  ** This routine 
14800 69 73 20 75 73 65 64 20 77 69 74 68 69 6e 20 61  is used within a
14810 73 73 65 72 74 28 29 20 61 6e 64 20 74 65 73 74  ssert() and test
14820 63 61 73 65 28 29 20 6d 61 63 72 6f 73 20 6f 6e  case() macros on
14830 6c 79 0a 2a 2a 20 61 6e 64 20 64 6f 65 73 20 6e  ly.** and does n
14840 6f 74 20 61 70 70 65 61 72 20 69 6e 20 61 20 6e  ot appear in a n
14850 6f 72 6d 61 6c 20 62 75 69 6c 64 2e 0a 2a 2f 0a  ormal build..*/.
14860 73 74 61 74 69 63 20 69 6e 74 20 75 73 65 64 41  static int usedA
14870 73 43 6f 6c 75 6d 6e 43 61 63 68 65 28 50 61 72  sColumnCache(Par
14880 73 65 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20  se *pParse, int 
14890 69 46 72 6f 6d 2c 20 69 6e 74 20 69 54 6f 29 7b  iFrom, int iTo){
148a0 0a 20 20 69 6e 74 20 69 3b 0a 20 20 73 74 72 75  .  int i;.  stru
148b0 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70 3b  ct yColCache *p;
148c0 0a 20 20 66 6f 72 28 69 3d 30 2c 20 70 3d 70 50  .  for(i=0, p=pP
148d0 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63 68 65 3b  arse->aColCache;
148e0 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43 4f 4c 43   i<SQLITE_N_COLC
148f0 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b 2b 29 7b  ACHE; i++, p++){
14900 0a 20 20 20 20 69 6e 74 20 72 20 3d 20 70 2d 3e  .    int r = p->
14910 69 52 65 67 3b 0a 20 20 20 20 69 66 28 20 72 3e  iReg;.    if( r>
14920 3d 69 46 72 6f 6d 20 26 26 20 72 3c 3d 69 54 6f  =iFrom && r<=iTo
14930 20 29 20 72 65 74 75 72 6e 20 31 3b 20 20 20 20   ) return 1;    
14940 2f 2a 4e 4f 5f 54 45 53 54 2a 2f 0a 20 20 7d 0a  /*NO_TEST*/.  }.
14950 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d 0a 23 65    return 0;.}.#e
14960 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
14970 45 42 55 47 20 7c 7c 20 53 51 4c 49 54 45 5f 43  EBUG || SQLITE_C
14980 4f 56 45 52 41 47 45 5f 54 45 53 54 20 2a 2f 0a  OVERAGE_TEST */.
14990 0a 2f 2a 0a 2a 2a 20 43 6f 6e 76 65 72 74 20 61  ./*.** Convert a
149a0 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6e 6f 64  n expression nod
149b0 65 20 74 6f 20 61 20 54 4b 5f 52 45 47 49 53 54  e to a TK_REGIST
149c0 45 52 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f 69  ER.*/.static voi
149d0 64 20 65 78 70 72 54 6f 52 65 67 69 73 74 65 72  d exprToRegister
149e0 28 45 78 70 72 20 2a 70 2c 20 69 6e 74 20 69 52  (Expr *p, int iR
149f0 65 67 29 7b 0a 20 20 70 2d 3e 6f 70 32 20 3d 20  eg){.  p->op2 = 
14a00 70 2d 3e 6f 70 3b 0a 20 20 70 2d 3e 6f 70 20 3d  p->op;.  p->op =
14a10 20 54 4b 5f 52 45 47 49 53 54 45 52 3b 0a 20 20   TK_REGISTER;.  
14a20 70 2d 3e 69 54 61 62 6c 65 20 3d 20 69 52 65 67  p->iTable = iReg
14a30 3b 0a 20 20 45 78 70 72 43 6c 65 61 72 50 72 6f  ;.  ExprClearPro
14a40 70 65 72 74 79 28 70 2c 20 45 50 5f 53 6b 69 70  perty(p, EP_Skip
14a50 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
14a60 72 61 74 65 20 63 6f 64 65 20 69 6e 74 6f 20 74  rate code into t
14a70 68 65 20 63 75 72 72 65 6e 74 20 56 64 62 65 20  he current Vdbe 
14a80 74 6f 20 65 76 61 6c 75 61 74 65 20 74 68 65 20  to evaluate the 
14a90 67 69 76 65 6e 0a 2a 2a 20 65 78 70 72 65 73 73  given.** express
14aa0 69 6f 6e 2e 20 20 41 74 74 65 6d 70 74 20 74 6f  ion.  Attempt to
14ab0 20 73 74 6f 72 65 20 74 68 65 20 72 65 73 75 6c   store the resul
14ac0 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20 22  ts in register "
14ad0 74 61 72 67 65 74 22 2e 0a 2a 2a 20 52 65 74 75  target"..** Retu
14ae0 72 6e 20 74 68 65 20 72 65 67 69 73 74 65 72 20  rn the register 
14af0 77 68 65 72 65 20 72 65 73 75 6c 74 73 20 61 72  where results ar
14b00 65 20 73 74 6f 72 65 64 2e 0a 2a 2a 0a 2a 2a 20  e stored..**.** 
14b10 57 69 74 68 20 74 68 69 73 20 72 6f 75 74 69 6e  With this routin
14b20 65 2c 20 74 68 65 72 65 20 69 73 20 6e 6f 20 67  e, there is no g
14b30 75 61 72 61 6e 74 65 65 20 74 68 61 74 20 72 65  uarantee that re
14b40 73 75 6c 74 73 20 77 69 6c 6c 0a 2a 2a 20 62 65  sults will.** be
14b50 20 73 74 6f 72 65 64 20 69 6e 20 74 61 72 67 65   stored in targe
14b60 74 2e 20 20 54 68 65 20 72 65 73 75 6c 74 20 6d  t.  The result m
14b70 69 67 68 74 20 62 65 20 73 74 6f 72 65 64 20 69  ight be stored i
14b80 6e 20 73 6f 6d 65 20 6f 74 68 65 72 0a 2a 2a 20  n some other.** 
14b90 72 65 67 69 73 74 65 72 20 69 66 20 69 74 20 69  register if it i
14ba0 73 20 63 6f 6e 76 65 6e 69 65 6e 74 20 74 6f 20  s convenient to 
14bb0 64 6f 20 73 6f 2e 20 20 54 68 65 20 63 61 6c 6c  do so.  The call
14bc0 69 6e 67 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  ing function.** 
14bd0 6d 75 73 74 20 63 68 65 63 6b 20 74 68 65 20 72  must check the r
14be0 65 74 75 72 6e 20 63 6f 64 65 20 61 6e 64 20 6d  eturn code and m
14bf0 6f 76 65 20 74 68 65 20 72 65 73 75 6c 74 73 20  ove the results 
14c00 74 6f 20 74 68 65 20 64 65 73 69 72 65 64 0a 2a  to the desired.*
14c10 2a 20 72 65 67 69 73 74 65 72 2e 0a 2a 2f 0a 69  * register..*/.i
14c20 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  nt sqlite3ExprCo
14c30 64 65 54 61 72 67 65 74 28 50 61 72 73 65 20 2a  deTarget(Parse *
14c40 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45  pParse, Expr *pE
14c50 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74 29  xpr, int target)
14c60 7b 0a 20 20 56 64 62 65 20 2a 76 20 3d 20 70 50  {.  Vdbe *v = pP
14c70 61 72 73 65 2d 3e 70 56 64 62 65 3b 20 20 2f 2a  arse->pVdbe;  /*
14c80 20 54 68 65 20 56 4d 20 75 6e 64 65 72 20 63 6f   The VM under co
14c90 6e 73 74 72 75 63 74 69 6f 6e 20 2a 2f 0a 20 20  nstruction */.  
14ca0 69 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20  int op;         
14cb0 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
14cc0 20 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f   opcode being co
14cd0 64 65 64 20 2a 2f 0a 20 20 69 6e 74 20 69 6e 52  ded */.  int inR
14ce0 65 67 20 3d 20 74 61 72 67 65 74 3b 20 20 20 20  eg = target;    
14cf0 20 20 20 2f 2a 20 52 65 73 75 6c 74 73 20 73 74     /* Results st
14d00 6f 72 65 64 20 69 6e 20 72 65 67 69 73 74 65 72  ored in register
14d10 20 69 6e 52 65 67 20 2a 2f 0a 20 20 69 6e 74 20   inReg */.  int 
14d20 72 65 67 46 72 65 65 31 20 3d 20 30 3b 20 20 20  regFree1 = 0;   
14d30 20 20 20 20 20 20 2f 2a 20 49 66 20 6e 6f 6e 2d        /* If non-
14d40 7a 65 72 6f 20 66 72 65 65 20 74 68 69 73 20 74  zero free this t
14d50 65 6d 70 6f 72 61 72 79 20 72 65 67 69 73 74 65  emporary registe
14d60 72 20 2a 2f 0a 20 20 69 6e 74 20 72 65 67 46 72  r */.  int regFr
14d70 65 65 32 20 3d 20 30 3b 20 20 20 20 20 20 20 20  ee2 = 0;        
14d80 20 2f 2a 20 49 66 20 6e 6f 6e 2d 7a 65 72 6f 20   /* If non-zero 
14d90 66 72 65 65 20 74 68 69 73 20 74 65 6d 70 6f 72  free this tempor
14da0 61 72 79 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  ary register */.
14db0 20 20 69 6e 74 20 72 31 2c 20 72 32 2c 20 72 33    int r1, r2, r3
14dc0 2c 20 72 34 3b 20 20 20 20 20 20 20 2f 2a 20 56  , r4;       /* V
14dd0 61 72 69 6f 75 73 20 72 65 67 69 73 74 65 72 20  arious register 
14de0 6e 75 6d 62 65 72 73 20 2a 2f 0a 20 20 73 71 6c  numbers */.  sql
14df0 69 74 65 33 20 2a 64 62 20 3d 20 70 50 61 72 73  ite3 *db = pPars
14e00 65 2d 3e 64 62 3b 20 2f 2a 20 54 68 65 20 64 61  e->db; /* The da
14e10 74 61 62 61 73 65 20 63 6f 6e 6e 65 63 74 69 6f  tabase connectio
14e20 6e 20 2a 2f 0a 20 20 45 78 70 72 20 74 65 6d 70  n */.  Expr temp
14e30 58 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  X;              
14e40 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20 65 78   /* Temporary ex
14e50 70 72 65 73 73 69 6f 6e 20 6e 6f 64 65 20 2a 2f  pression node */
14e60 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61 72 67  ..  assert( targ
14e70 65 74 3e 30 20 26 26 20 74 61 72 67 65 74 3c 3d  et>0 && target<=
14e80 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29 3b 0a  pParse->nMem );.
14e90 20 20 69 66 28 20 76 3d 3d 30 20 29 7b 0a 20 20    if( v==0 ){.  
14ea0 20 20 61 73 73 65 72 74 28 20 70 50 61 72 73 65    assert( pParse
14eb0 2d 3e 64 62 2d 3e 6d 61 6c 6c 6f 63 46 61 69 6c  ->db->mallocFail
14ec0 65 64 20 29 3b 0a 20 20 20 20 72 65 74 75 72 6e  ed );.    return
14ed0 20 30 3b 0a 20 20 7d 0a 0a 20 20 69 66 28 20 70   0;.  }..  if( p
14ee0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
14ef0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
14f00 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
14f10 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
14f20 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
14f30 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
14f40 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 41 67  LUMN: {.      Ag
14f50 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f 20  gInfo *pAggInfo 
14f60 3d 20 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66  = pExpr->pAggInf
14f70 6f 3b 0a 20 20 20 20 20 20 73 74 72 75 63 74 20  o;.      struct 
14f80 41 67 67 49 6e 66 6f 5f 63 6f 6c 20 2a 70 43 6f  AggInfo_col *pCo
14f90 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e 61  l = &pAggInfo->a
14fa0 43 6f 6c 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d  Col[pExpr->iAgg]
14fb0 3b 0a 20 20 20 20 20 20 69 66 28 20 21 70 41 67  ;.      if( !pAg
14fc0 67 49 6e 66 6f 2d 3e 64 69 72 65 63 74 4d 6f 64  gInfo->directMod
14fd0 65 20 29 7b 0a 20 20 20 20 20 20 20 20 61 73 73  e ){.        ass
14fe0 65 72 74 28 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3e  ert( pCol->iMem>
14ff0 30 20 29 3b 0a 20 20 20 20 20 20 20 20 69 6e 52  0 );.        inR
15000 65 67 20 3d 20 70 43 6f 6c 2d 3e 69 4d 65 6d 3b  eg = pCol->iMem;
15010 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  .        break;.
15020 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28 20        }else if( 
15030 70 41 67 67 49 6e 66 6f 2d 3e 75 73 65 53 6f 72  pAggInfo->useSor
15040 74 69 6e 67 49 64 78 20 29 7b 0a 20 20 20 20 20  tingIdx ){.     
15050 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
15060 64 4f 70 33 28 76 2c 20 4f 50 5f 43 6f 6c 75 6d  dOp3(v, OP_Colum
15070 6e 2c 20 70 41 67 67 49 6e 66 6f 2d 3e 73 6f 72  n, pAggInfo->sor
15080 74 69 6e 67 49 64 78 50 54 61 62 2c 0a 20 20 20  tingIdxPTab,.   
15090 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
150a0 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
150b0 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 2c 20  >iSorterColumn, 
150c0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
150d0 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 7d 0a   break;.      }.
150e0 20 20 20 20 20 20 2f 2a 20 4f 74 68 65 72 77 69        /* Otherwi
150f0 73 65 2c 20 66 61 6c 6c 20 74 68 72 75 20 69 6e  se, fall thru in
15100 74 6f 20 74 68 65 20 54 4b 5f 43 4f 4c 55 4d 4e  to the TK_COLUMN
15110 20 63 61 73 65 20 2a 2f 0a 20 20 20 20 7d 0a 20   case */.    }. 
15120 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 55 4d     case TK_COLUM
15130 4e 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 69  N: {.      int i
15140 54 61 62 20 3d 20 70 45 78 70 72 2d 3e 69 54 61  Tab = pExpr->iTa
15150 62 6c 65 3b 0a 20 20 20 20 20 20 69 66 28 20 69  ble;.      if( i
15160 54 61 62 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  Tab<0 ){.       
15170 20 69 66 28 20 70 50 61 72 73 65 2d 3e 63 6b 42   if( pParse->ckB
15180 61 73 65 3e 30 20 29 7b 0a 20 20 20 20 20 20 20  ase>0 ){.       
15190 20 20 20 2f 2a 20 47 65 6e 65 72 61 74 69 6e 67     /* Generating
151a0 20 43 48 45 43 4b 20 63 6f 6e 73 74 72 61 69 6e   CHECK constrain
151b0 74 73 20 6f 72 20 69 6e 73 65 72 74 69 6e 67 20  ts or inserting 
151c0 69 6e 74 6f 20 70 61 72 74 69 61 6c 20 69 6e 64  into partial ind
151d0 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20 20  ex */.          
151e0 69 6e 52 65 67 20 3d 20 70 45 78 70 72 2d 3e 69  inReg = pExpr->i
151f0 43 6f 6c 75 6d 6e 20 2b 20 70 50 61 72 73 65 2d  Column + pParse-
15200 3e 63 6b 42 61 73 65 3b 0a 20 20 20 20 20 20 20  >ckBase;.       
15210 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
15220 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20    }else{.       
15230 20 20 20 2f 2a 20 44 65 6c 65 74 69 6e 67 20 66     /* Deleting f
15240 72 6f 6d 20 61 20 70 61 72 74 69 61 6c 20 69 6e  rom a partial in
15250 64 65 78 20 2a 2f 0a 20 20 20 20 20 20 20 20 20  dex */.         
15260 20 69 54 61 62 20 3d 20 70 50 61 72 73 65 2d 3e   iTab = pParse->
15270 69 50 61 72 74 49 64 78 54 61 62 3b 0a 20 20 20  iPartIdxTab;.   
15280 20 20 20 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20       }.      }. 
15290 20 20 20 20 20 69 6e 52 65 67 20 3d 20 73 71 6c       inReg = sql
152a0 69 74 65 33 45 78 70 72 43 6f 64 65 47 65 74 43  ite3ExprCodeGetC
152b0 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2c 20 70 45  olumn(pParse, pE
152c0 78 70 72 2d 3e 70 54 61 62 2c 0a 20 20 20 20 20  xpr->pTab,.     
152d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
152e0 20 20 20 20 20 20 20 20 20 20 70 45 78 70 72 2d            pExpr-
152f0 3e 69 43 6f 6c 75 6d 6e 2c 20 69 54 61 62 2c 20  >iColumn, iTab, 
15300 74 61 72 67 65 74 2c 0a 20 20 20 20 20 20 20 20  target,.        
15310 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
15320 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70         pExpr->op
15330 32 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b  2);.      break;
15340 0a 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20  .    }.    case 
15350 54 4b 5f 49 4e 54 45 47 45 52 3a 20 7b 0a 20 20  TK_INTEGER: {.  
15360 20 20 20 20 63 6f 64 65 49 6e 74 65 67 65 72 28      codeInteger(
15370 70 50 61 72 73 65 2c 20 70 45 78 70 72 2c 20 30  pParse, pExpr, 0
15380 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15390 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69   break;.    }.#i
153a0 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
153b0 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
153c0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 46 4c 4f  .    case TK_FLO
153d0 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
153e0 72 74 28 20 21 45 78 70 72 48 61 73 50 72 6f 70  rt( !ExprHasProp
153f0 65 72 74 79 28 70 45 78 70 72 2c 20 45 50 5f 49  erty(pExpr, EP_I
15400 6e 74 56 61 6c 75 65 29 20 29 3b 0a 20 20 20 20  ntValue) );.    
15410 20 20 63 6f 64 65 52 65 61 6c 28 76 2c 20 70 45    codeReal(v, pE
15420 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20 30  xpr->u.zToken, 0
15430 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
15440 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
15450 6e 64 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b  ndif.    case TK
15460 5f 53 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20  _STRING: {.     
15470 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
15480 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
15490 20 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b   EP_IntValue) );
154a0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64  .      sqlite3Vd
154b0 62 65 41 64 64 4f 70 34 28 76 2c 20 4f 50 5f 53  beAddOp4(v, OP_S
154c0 74 72 69 6e 67 38 2c 20 30 2c 20 74 61 72 67 65  tring8, 0, targe
154d0 74 2c 20 30 2c 20 70 45 78 70 72 2d 3e 75 2e 7a  t, 0, pExpr->u.z
154e0 54 6f 6b 65 6e 2c 20 30 29 3b 0a 20 20 20 20 20  Token, 0);.     
154f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
15500 20 20 63 61 73 65 20 54 4b 5f 4e 55 4c 4c 3a 20    case TK_NULL: 
15510 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  {.      sqlite3V
15520 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
15530 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
15540 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
15550 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
15560 49 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49  ITE_OMIT_BLOB_LI
15570 54 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54  TERAL.    case T
15580 4b 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20  K_BLOB: {.      
15590 69 6e 74 20 6e 3b 0a 20 20 20 20 20 20 63 6f 6e  int n;.      con
155a0 73 74 20 63 68 61 72 20 2a 7a 3b 0a 20 20 20 20  st char *z;.    
155b0 20 20 63 68 61 72 20 2a 7a 42 6c 6f 62 3b 0a 20    char *zBlob;. 
155c0 20 20 20 20 20 61 73 73 65 72 74 28 20 21 45 78       assert( !Ex
155d0 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70 45  prHasProperty(pE
155e0 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c 75 65  xpr, EP_IntValue
155f0 29 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  ) );.      asser
15600 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b  t( pExpr->u.zTok
15610 65 6e 5b 30 5d 3d 3d 27 78 27 20 7c 7c 20 70 45  en[0]=='x' || pE
15620 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d  xpr->u.zToken[0]
15630 3d 3d 27 58 27 20 29 3b 0a 20 20 20 20 20 20 61  =='X' );.      a
15640 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
15650 7a 54 6f 6b 65 6e 5b 31 5d 3d 3d 27 5c 27 27 20  zToken[1]=='\'' 
15660 29 3b 0a 20 20 20 20 20 20 7a 20 3d 20 26 70 45  );.      z = &pE
15670 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 32 5d  xpr->u.zToken[2]
15680 3b 0a 20 20 20 20 20 20 6e 20 3d 20 73 71 6c 69  ;.      n = sqli
15690 74 65 33 53 74 72 6c 65 6e 33 30 28 7a 29 20 2d  te3Strlen30(z) -
156a0 20 31 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   1;.      assert
156b0 28 20 7a 5b 6e 5d 3d 3d 27 5c 27 27 20 29 3b 0a  ( z[n]=='\'' );.
156c0 20 20 20 20 20 20 7a 42 6c 6f 62 20 3d 20 73 71        zBlob = sq
156d0 6c 69 74 65 33 48 65 78 54 6f 42 6c 6f 62 28 73  lite3HexToBlob(s
156e0 71 6c 69 74 65 33 56 64 62 65 44 62 28 76 29 2c  qlite3VdbeDb(v),
156f0 20 7a 2c 20 6e 29 3b 0a 20 20 20 20 20 20 73 71   z, n);.      sq
15700 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 34 28  lite3VdbeAddOp4(
15710 76 2c 20 4f 50 5f 42 6c 6f 62 2c 20 6e 2f 32 2c  v, OP_Blob, n/2,
15720 20 74 61 72 67 65 74 2c 20 30 2c 20 7a 42 6c 6f   target, 0, zBlo
15730 62 2c 20 50 34 5f 44 59 4e 41 4d 49 43 29 3b 0a  b, P4_DYNAMIC);.
15740 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
15750 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63 61   }.#endif.    ca
15760 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a 20  se TK_VARIABLE: 
15770 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  {.      assert( 
15780 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
15790 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
157a0 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 61 73  lue) );.      as
157b0 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e 7a  sert( pExpr->u.z
157c0 54 6f 6b 65 6e 21 3d 30 20 29 3b 0a 20 20 20 20  Token!=0 );.    
157d0 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
157e0 3e 75 2e 7a 54 6f 6b 65 6e 5b 30 5d 21 3d 30 20  >u.zToken[0]!=0 
157f0 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
15800 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15810 5f 56 61 72 69 61 62 6c 65 2c 20 70 45 78 70 72  _Variable, pExpr
15820 2d 3e 69 43 6f 6c 75 6d 6e 2c 20 74 61 72 67 65  ->iColumn, targe
15830 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70 45  t);.      if( pE
15840 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 5b 31 5d  xpr->u.zToken[1]
15850 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20 20 61  !=0 ){.        a
15860 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 75 2e  ssert( pExpr->u.
15870 7a 54 6f 6b 65 6e 5b 30 5d 3d 3d 27 3f 27 20 0a  zToken[0]=='?' .
15880 20 20 20 20 20 20 20 20 20 20 20 20 20 7c 7c 20               || 
15890 73 74 72 63 6d 70 28 70 45 78 70 72 2d 3e 75 2e  strcmp(pExpr->u.
158a0 7a 54 6f 6b 65 6e 2c 20 70 50 61 72 73 65 2d 3e  zToken, pParse->
158b0 61 7a 56 61 72 5b 70 45 78 70 72 2d 3e 69 43 6f  azVar[pExpr->iCo
158c0 6c 75 6d 6e 2d 31 5d 29 3d 3d 30 20 29 3b 0a 20  lumn-1])==0 );. 
158d0 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
158e0 62 65 43 68 61 6e 67 65 50 34 28 76 2c 20 2d 31  beChangeP4(v, -1
158f0 2c 20 70 50 61 72 73 65 2d 3e 61 7a 56 61 72 5b  , pParse->azVar[
15900 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 2d 31  pExpr->iColumn-1
15910 5d 2c 20 50 34 5f 53 54 41 54 49 43 29 3b 0a 20  ], P4_STATIC);. 
15920 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
15930 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
15940 73 65 20 54 4b 5f 52 45 47 49 53 54 45 52 3a 20  se TK_REGISTER: 
15950 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d 20  {.      inReg = 
15960 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20  pExpr->iTable;. 
15970 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
15980 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53  }.    case TK_AS
15990 3a 20 7b 0a 20 20 20 20 20 20 69 6e 52 65 67 20  : {.      inReg 
159a0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
159b0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
159c0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61  pExpr->pLeft, ta
159d0 72 67 65 74 29 3b 0a 20 20 20 20 20 20 62 72 65  rget);.      bre
159e0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
159f0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 43 41  f SQLITE_OMIT_CA
15a00 53 54 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43  ST.    case TK_C
15a10 41 53 54 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  AST: {.      /* 
15a20 45 78 70 72 65 73 73 69 6f 6e 73 20 6f 66 20 74  Expressions of t
15a30 68 65 20 66 6f 72 6d 3a 20 20 20 43 41 53 54 28  he form:   CAST(
15a40 70 4c 65 66 74 20 41 53 20 74 6f 6b 65 6e 29 20  pLeft AS token) 
15a50 2a 2f 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  */.      inReg =
15a60 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
15a70 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20 70  Target(pParse, p
15a80 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 74 61 72  Expr->pLeft, tar
15a90 67 65 74 29 3b 0a 20 20 20 20 20 20 69 66 28 20  get);.      if( 
15aa0 69 6e 52 65 67 21 3d 74 61 72 67 65 74 20 29 7b  inReg!=target ){
15ab0 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
15ac0 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
15ad0 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
15ae0 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20 20  arget);.        
15af0 69 6e 52 65 67 20 3d 20 74 61 72 67 65 74 3b 0a  inReg = target;.
15b00 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
15b10 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
15b20 76 2c 20 4f 50 5f 43 61 73 74 2c 20 74 61 72 67  v, OP_Cast, targ
15b30 65 74 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  et,.            
15b40 20 20 20 20 20 20 20 20 20 20 20 20 73 71 6c 69              sqli
15b50 74 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28  te3AffinityType(
15b60 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  pExpr->u.zToken,
15b70 20 30 29 29 3b 0a 20 20 20 20 20 20 74 65 73 74   0));.      test
15b80 63 61 73 65 28 20 75 73 65 64 41 73 43 6f 6c 75  case( usedAsColu
15b90 6d 6e 43 61 63 68 65 28 70 50 61 72 73 65 2c 20  mnCache(pParse, 
15ba0 69 6e 52 65 67 2c 20 69 6e 52 65 67 29 20 29 3b  inReg, inReg) );
15bb0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
15bc0 70 72 43 61 63 68 65 41 66 66 69 6e 69 74 79 43  prCacheAffinityC
15bd0 68 61 6e 67 65 28 70 50 61 72 73 65 2c 20 69 6e  hange(pParse, in
15be0 52 65 67 2c 20 31 29 3b 0a 20 20 20 20 20 20 62  Reg, 1);.      b
15bf0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
15c00 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 4f 4d 49  if /* SQLITE_OMI
15c10 54 5f 43 41 53 54 20 2a 2f 0a 20 20 20 20 63 61  T_CAST */.    ca
15c20 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63 61  se TK_LT:.    ca
15c30 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63 61  se TK_LE:.    ca
15c40 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63 61  se TK_GT:.    ca
15c50 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63 61  se TK_GE:.    ca
15c60 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63 61  se TK_NE:.    ca
15c70 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20 20  se TK_EQ: {.    
15c80 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78    r1 = sqlite3Ex
15c90 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73  prCodeTemp(pPars
15ca0 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c  e, pExpr->pLeft,
15cb0 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
15cc0 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45     r2 = sqlite3E
15cd0 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
15ce0 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
15cf0 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
15d00 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65       codeCompare
15d10 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e  (pParse, pExpr->
15d20 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52  pLeft, pExpr->pR
15d30 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20  ight, op,.      
15d40 20 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20              r1, 
15d50 72 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54  r2, inReg, SQLIT
15d60 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20 20 20  E_STOREP2);.    
15d70 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d    assert(TK_LT==
15d80 4f 50 5f 4c 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Lt); testcase
15d90 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62  (op==OP_Lt); Vdb
15da0 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
15db0 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20  ==OP_Lt);.      
15dc0 61 73 73 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50  assert(TK_LE==OP
15dd0 5f 4c 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Le); testcase(o
15de0 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43  p==OP_Le); VdbeC
15df0 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
15e00 4f 50 5f 4c 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Le);.      as
15e10 73 65 72 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47  sert(TK_GT==OP_G
15e20 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  t); testcase(op=
15e30 3d 4f 50 5f 47 74 29 3b 20 56 64 62 65 43 6f 76  =OP_Gt); VdbeCov
15e40 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
15e50 5f 47 74 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Gt);.      asse
15e60 72 74 28 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29  rt(TK_GE==OP_Ge)
15e70 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
15e80 50 5f 47 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ge); VdbeCover
15e90 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47  ageIf(v,op==OP_G
15ea0 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74  e);.      assert
15eb0 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20  (TK_EQ==OP_Eq); 
15ec0 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f  testcase(op==OP_
15ed0 45 71 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67  Eq); VdbeCoverag
15ee0 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29  eIf(v,op==OP_Eq)
15ef0 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54  ;.      assert(T
15f00 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65  K_NE==OP_Ne); te
15f10 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65  stcase(op==OP_Ne
15f20 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49  ); VdbeCoverageI
15f30 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a  f(v,op==OP_Ne);.
15f40 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
15f50 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20  regFree1==0 );. 
15f60 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
15f70 65 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20  egFree2==0 );.  
15f80 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
15f90 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 3a  .    case TK_IS:
15fa0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e  .    case TK_ISN
15fb0 4f 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  OT: {.      test
15fc0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20  case( op==TK_IS 
15fd0 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
15fe0 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20  e( op==TK_ISNOT 
15ff0 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71  );.      r1 = sq
16000 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d  lite3ExprCodeTem
16010 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  p(pParse, pExpr-
16020 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65  >pLeft, &regFree
16030 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
16040 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
16050 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
16060 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67 46 72  ->pRight, &regFr
16070 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d  ee2);.      op =
16080 20 28 6f 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54   (op==TK_IS) ? T
16090 4b 5f 45 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20  K_EQ : TK_NE;.  
160a0 20 20 20 20 63 6f 64 65 43 6f 6d 70 61 72 65 28      codeCompare(
160b0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
160c0 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e 70 52 69  Left, pExpr->pRi
160d0 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20  ght, op,.       
160e0 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
160f0 32 2c 20 69 6e 52 65 67 2c 20 53 51 4c 49 54 45  2, inReg, SQLITE
16100 5f 53 54 4f 52 45 50 32 20 7c 20 53 51 4c 49 54  _STOREP2 | SQLIT
16110 45 5f 4e 55 4c 4c 45 51 29 3b 0a 20 20 20 20 20  E_NULLEQ);.     
16120 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16130 76 2c 20 6f 70 3d 3d 54 4b 5f 45 51 29 3b 0a 20  v, op==TK_EQ);. 
16140 20 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67       VdbeCoverag
16150 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 4e 45  eIf(v, op==TK_NE
16160 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
16170 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
16180 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
16190 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
161a0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
161b0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
161c0 41 4e 44 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  AND:.    case TK
161d0 5f 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _OR:.    case TK
161e0 5f 50 4c 55 53 3a 0a 20 20 20 20 63 61 73 65 20  _PLUS:.    case 
161f0 54 4b 5f 53 54 41 52 3a 0a 20 20 20 20 63 61 73  TK_STAR:.    cas
16200 65 20 54 4b 5f 4d 49 4e 55 53 3a 0a 20 20 20 20  e TK_MINUS:.    
16210 63 61 73 65 20 54 4b 5f 52 45 4d 3a 0a 20 20 20  case TK_REM:.   
16220 20 63 61 73 65 20 54 4b 5f 42 49 54 41 4e 44 3a   case TK_BITAND:
16230 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
16240 4f 52 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  OR:.    case TK_
16250 53 4c 41 53 48 3a 0a 20 20 20 20 63 61 73 65 20  SLASH:.    case 
16260 54 4b 5f 4c 53 48 49 46 54 3a 0a 20 20 20 20 63  TK_LSHIFT:.    c
16270 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a 20 0a  ase TK_RSHIFT: .
16280 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4e 43      case TK_CONC
16290 41 54 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65  AT: {.      asse
162a0 72 74 28 20 54 4b 5f 41 4e 44 3d 3d 4f 50 5f 41  rt( TK_AND==OP_A
162b0 6e 64 20 29 3b 20 20 20 20 20 20 20 20 20 20 20  nd );           
162c0 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
162d0 4b 5f 41 4e 44 20 29 3b 0a 20 20 20 20 20 20 61  K_AND );.      a
162e0 73 73 65 72 74 28 20 54 4b 5f 4f 52 3d 3d 4f 50  ssert( TK_OR==OP
162f0 5f 4f 72 20 29 3b 20 20 20 20 20 20 20 20 20 20  _Or );          
16300 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6f 70      testcase( op
16310 3d 3d 54 4b 5f 4f 52 20 29 3b 0a 20 20 20 20 20  ==TK_OR );.     
16320 20 61 73 73 65 72 74 28 20 54 4b 5f 50 4c 55 53   assert( TK_PLUS
16330 3d 3d 4f 50 5f 41 64 64 20 29 3b 20 20 20 20 20  ==OP_Add );     
16340 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
16350 6f 70 3d 3d 54 4b 5f 50 4c 55 53 20 29 3b 0a 20  op==TK_PLUS );. 
16360 20 20 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f       assert( TK_
16370 4d 49 4e 55 53 3d 3d 4f 50 5f 53 75 62 74 72 61  MINUS==OP_Subtra
16380 63 74 20 29 3b 20 20 20 20 20 74 65 73 74 63 61  ct );     testca
16390 73 65 28 20 6f 70 3d 3d 54 4b 5f 4d 49 4e 55 53  se( op==TK_MINUS
163a0 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74   );.      assert
163b0 28 20 54 4b 5f 52 45 4d 3d 3d 4f 50 5f 52 65 6d  ( TK_REM==OP_Rem
163c0 61 69 6e 64 65 72 20 29 3b 20 20 20 20 20 20 74  ainder );      t
163d0 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
163e0 52 45 4d 20 29 3b 0a 20 20 20 20 20 20 61 73 73  REM );.      ass
163f0 65 72 74 28 20 54 4b 5f 42 49 54 41 4e 44 3d 3d  ert( TK_BITAND==
16400 4f 50 5f 42 69 74 41 6e 64 20 29 3b 20 20 20 20  OP_BitAnd );    
16410 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
16420 54 4b 5f 42 49 54 41 4e 44 20 29 3b 0a 20 20 20  TK_BITAND );.   
16430 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 42 49     assert( TK_BI
16440 54 4f 52 3d 3d 4f 50 5f 42 69 74 4f 72 20 29 3b  TOR==OP_BitOr );
16450 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65          testcase
16460 28 20 6f 70 3d 3d 54 4b 5f 42 49 54 4f 52 20 29  ( op==TK_BITOR )
16470 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20  ;.      assert( 
16480 54 4b 5f 53 4c 41 53 48 3d 3d 4f 50 5f 44 69 76  TK_SLASH==OP_Div
16490 69 64 65 20 29 3b 20 20 20 20 20 20 20 74 65 73  ide );       tes
164a0 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 53 4c  tcase( op==TK_SL
164b0 41 53 48 20 29 3b 0a 20 20 20 20 20 20 61 73 73  ASH );.      ass
164c0 65 72 74 28 20 54 4b 5f 4c 53 48 49 46 54 3d 3d  ert( TK_LSHIFT==
164d0 4f 50 5f 53 68 69 66 74 4c 65 66 74 20 29 3b 20  OP_ShiftLeft ); 
164e0 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
164f0 54 4b 5f 4c 53 48 49 46 54 20 29 3b 0a 20 20 20  TK_LSHIFT );.   
16500 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 52 53     assert( TK_RS
16510 48 49 46 54 3d 3d 4f 50 5f 53 68 69 66 74 52 69  HIFT==OP_ShiftRi
16520 67 68 74 20 29 3b 20 20 74 65 73 74 63 61 73 65  ght );  testcase
16530 28 20 6f 70 3d 3d 54 4b 5f 52 53 48 49 46 54 20  ( op==TK_RSHIFT 
16540 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
16550 20 54 4b 5f 43 4f 4e 43 41 54 3d 3d 4f 50 5f 43   TK_CONCAT==OP_C
16560 6f 6e 63 61 74 20 29 3b 20 20 20 20 20 20 74 65  oncat );      te
16570 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 43  stcase( op==TK_C
16580 4f 4e 43 41 54 20 29 3b 0a 20 20 20 20 20 20 72  ONCAT );.      r
16590 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43  1 = sqlite3ExprC
165a0 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20  odeTemp(pParse, 
165b0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72  pExpr->pLeft, &r
165c0 65 67 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20  egFree1);.      
165d0 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r2 = sqlite3Expr
165e0 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
165f0 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20   pExpr->pRight, 
16600 26 72 65 67 46 72 65 65 32 29 3b 0a 20 20 20 20  &regFree2);.    
16610 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16620 4f 70 33 28 76 2c 20 6f 70 2c 20 72 32 2c 20 72  Op3(v, op, r2, r
16630 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
16640 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
16650 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
16660 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72   testcase( regFr
16670 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20  ee2==0 );.      
16680 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16690 20 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a   case TK_UMINUS:
166a0 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70   {.      Expr *p
166b0 4c 65 66 74 20 3d 20 70 45 78 70 72 2d 3e 70 4c  Left = pExpr->pL
166c0 65 66 74 3b 0a 20 20 20 20 20 20 61 73 73 65 72  eft;.      asser
166d0 74 28 20 70 4c 65 66 74 20 29 3b 0a 20 20 20 20  t( pLeft );.    
166e0 20 20 69 66 28 20 70 4c 65 66 74 2d 3e 6f 70 3d    if( pLeft->op=
166f0 3d 54 4b 5f 49 4e 54 45 47 45 52 20 29 7b 0a 20  =TK_INTEGER ){. 
16700 20 20 20 20 20 20 20 63 6f 64 65 49 6e 74 65 67         codeInteg
16710 65 72 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  er(pParse, pLeft
16720 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a 23 69  , 1, target);.#i
16730 66 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49  fndef SQLITE_OMI
16740 54 5f 46 4c 4f 41 54 49 4e 47 5f 50 4f 49 4e 54  T_FLOATING_POINT
16750 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
16760 20 70 4c 65 66 74 2d 3e 6f 70 3d 3d 54 4b 5f 46   pLeft->op==TK_F
16770 4c 4f 41 54 20 29 7b 0a 20 20 20 20 20 20 20 20  LOAT ){.        
16780 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61 73  assert( !ExprHas
16790 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
167a0 45 50 5f 49 6e 74 56 61 6c 75 65 29 20 29 3b 0a  EP_IntValue) );.
167b0 20 20 20 20 20 20 20 20 63 6f 64 65 52 65 61 6c          codeReal
167c0 28 76 2c 20 70 4c 65 66 74 2d 3e 75 2e 7a 54 6f  (v, pLeft->u.zTo
167d0 6b 65 6e 2c 20 31 2c 20 74 61 72 67 65 74 29 3b  ken, 1, target);
167e0 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 7d 65  .#endif.      }e
167f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  lse{.        tem
16800 70 58 2e 6f 70 20 3d 20 54 4b 5f 49 4e 54 45 47  pX.op = TK_INTEG
16810 45 52 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ER;.        temp
16820 58 2e 66 6c 61 67 73 20 3d 20 45 50 5f 49 6e 74  X.flags = EP_Int
16830 56 61 6c 75 65 7c 45 50 5f 54 6f 6b 65 6e 4f 6e  Value|EP_TokenOn
16840 6c 79 3b 0a 20 20 20 20 20 20 20 20 74 65 6d 70  ly;.        temp
16850 58 2e 75 2e 69 56 61 6c 75 65 20 3d 20 30 3b 0a  X.u.iValue = 0;.
16860 20 20 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c          r1 = sql
16870 69 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70  ite3ExprCodeTemp
16880 28 70 50 61 72 73 65 2c 20 26 74 65 6d 70 58 2c  (pParse, &tempX,
16890 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20 20   &regFree1);.   
168a0 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
168b0 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
168c0 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
168d0 66 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a  ft, &regFree2);.
168e0 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56          sqlite3V
168f0 64 62 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f  dbeAddOp3(v, OP_
16900 53 75 62 74 72 61 63 74 2c 20 72 32 2c 20 72 31  Subtract, r2, r1
16910 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
16920 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
16930 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
16940 20 20 7d 0a 20 20 20 20 20 20 69 6e 52 65 67 20    }.      inReg 
16950 3d 20 74 61 72 67 65 74 3b 0a 20 20 20 20 20 20  = target;.      
16960 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20  break;.    }.   
16970 20 63 61 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a   case TK_BITNOT:
16980 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54  .    case TK_NOT
16990 3a 20 7b 0a 20 20 20 20 20 20 61 73 73 65 72 74  : {.      assert
169a0 28 20 54 4b 5f 42 49 54 4e 4f 54 3d 3d 4f 50 5f  ( TK_BITNOT==OP_
169b0 42 69 74 4e 6f 74 20 29 3b 20 20 20 74 65 73 74  BitNot );   test
169c0 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 42 49 54  case( op==TK_BIT
169d0 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 61 73 73  NOT );.      ass
169e0 65 72 74 28 20 54 4b 5f 4e 4f 54 3d 3d 4f 50 5f  ert( TK_NOT==OP_
169f0 4e 6f 74 20 29 3b 20 20 20 20 20 20 20 20 20 74  Not );         t
16a00 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f  estcase( op==TK_
16a10 4e 4f 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20  NOT );.      r1 
16a20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
16a30 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45  eTemp(pParse, pE
16a40 78 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67  xpr->pLeft, &reg
16a50 46 72 65 65 31 29 3b 0a 20 20 20 20 20 20 74 65  Free1);.      te
16a60 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31  stcase( regFree1
16a70 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 69 6e 52  ==0 );.      inR
16a80 65 67 20 3d 20 74 61 72 67 65 74 3b 0a 20 20 20  eg = target;.   
16a90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16aa0 64 4f 70 32 28 76 2c 20 6f 70 2c 20 72 31 2c 20  dOp2(v, op, r1, 
16ab0 69 6e 52 65 67 29 3b 0a 20 20 20 20 20 20 62 72  inReg);.      br
16ac0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
16ad0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
16ae0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
16af0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  LL: {.      int 
16b00 61 64 64 72 3b 0a 20 20 20 20 20 20 61 73 73 65  addr;.      asse
16b10 72 74 28 20 54 4b 5f 49 53 4e 55 4c 4c 3d 3d 4f  rt( TK_ISNULL==O
16b20 50 5f 49 73 4e 75 6c 6c 20 29 3b 20 20 20 74 65  P_IsNull );   te
16b30 73 74 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 49  stcase( op==TK_I
16b40 53 4e 55 4c 4c 20 29 3b 0a 20 20 20 20 20 20 61  SNULL );.      a
16b50 73 73 65 72 74 28 20 54 4b 5f 4e 4f 54 4e 55 4c  ssert( TK_NOTNUL
16b60 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c 6c 20 29 3b  L==OP_NotNull );
16b70 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d 54   testcase( op==T
16b80 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b 0a 20 20 20  K_NOTNULL );.   
16b90 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64     sqlite3VdbeAd
16ba0 64 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67  dOp2(v, OP_Integ
16bb0 65 72 2c 20 31 2c 20 74 61 72 67 65 74 29 3b 0a  er, 1, target);.
16bc0 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
16bd0 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
16be0 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
16bf0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
16c00 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
16c10 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a   regFree1==0 );.
16c20 20 20 20 20 20 20 61 64 64 72 20 3d 20 73 71 6c        addr = sql
16c30 69 74 65 33 56 64 62 65 41 64 64 4f 70 31 28 76  ite3VdbeAddOp1(v
16c40 2c 20 6f 70 2c 20 72 31 29 3b 0a 20 20 20 20 20  , op, r1);.     
16c50 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
16c60 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c  v, op==TK_ISNULL
16c70 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76  );.      VdbeCov
16c80 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
16c90 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
16ca0 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
16cb0 4f 70 32 28 76 2c 20 4f 50 5f 49 6e 74 65 67 65  Op2(v, OP_Intege
16cc0 72 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  r, 0, target);. 
16cd0 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
16ce0 4a 75 6d 70 48 65 72 65 28 76 2c 20 61 64 64 72  JumpHere(v, addr
16cf0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
16d00 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
16d10 4b 5f 41 47 47 5f 46 55 4e 43 54 49 4f 4e 3a 20  K_AGG_FUNCTION: 
16d20 7b 0a 20 20 20 20 20 20 41 67 67 49 6e 66 6f 20  {.      AggInfo 
16d30 2a 70 49 6e 66 6f 20 3d 20 70 45 78 70 72 2d 3e  *pInfo = pExpr->
16d40 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20 20 20  pAggInfo;.      
16d50 69 66 28 20 70 49 6e 66 6f 3d 3d 30 20 29 7b 0a  if( pInfo==0 ){.
16d60 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
16d70 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79  !ExprHasProperty
16d80 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61  (pExpr, EP_IntVa
16d90 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20 20  lue) );.        
16da0 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73 67 28  sqlite3ErrorMsg(
16db0 70 50 61 72 73 65 2c 20 22 6d 69 73 75 73 65 20  pParse, "misuse 
16dc0 6f 66 20 61 67 67 72 65 67 61 74 65 3a 20 25 73  of aggregate: %s
16dd0 28 29 22 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ()", pExpr->u.zT
16de0 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 7d 65 6c  oken);.      }el
16df0 73 65 7b 0a 20 20 20 20 20 20 20 20 69 6e 52 65  se{.        inRe
16e00 67 20 3d 20 70 49 6e 66 6f 2d 3e 61 46 75 6e 63  g = pInfo->aFunc
16e10 5b 70 45 78 70 72 2d 3e 69 41 67 67 5d 2e 69 4d  [pExpr->iAgg].iM
16e20 65 6d 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  em;.      }.    
16e30 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
16e40 20 20 20 63 61 73 65 20 54 4b 5f 46 55 4e 43 54     case TK_FUNCT
16e50 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 45 78 70  ION: {.      Exp
16e60 72 4c 69 73 74 20 2a 70 46 61 72 67 3b 20 20 20  rList *pFarg;   
16e70 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66      /* List of f
16e80 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
16e90 73 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 6e  s */.      int n
16ea0 46 61 72 67 3b 20 20 20 20 20 20 20 20 20 20 20  Farg;           
16eb0 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66 20 66    /* Number of f
16ec0 75 6e 63 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74  unction argument
16ed0 73 20 2a 2f 0a 20 20 20 20 20 20 46 75 6e 63 44  s */.      FuncD
16ee0 65 66 20 2a 70 44 65 66 3b 20 20 20 20 20 20 20  ef *pDef;       
16ef0 20 20 2f 2a 20 54 68 65 20 66 75 6e 63 74 69 6f    /* The functio
16f00 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20 6f 62 6a  n definition obj
16f10 65 63 74 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74  ect */.      int
16f20 20 6e 49 64 3b 20 20 20 20 20 20 20 20 20 20 20   nId;           
16f30 20 20 20 20 2f 2a 20 4c 65 6e 67 74 68 20 6f 66      /* Length of
16f40 20 74 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61   the function na
16f50 6d 65 20 69 6e 20 62 79 74 65 73 20 2a 2f 0a 20  me in bytes */. 
16f60 20 20 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20       const char 
16f70 2a 7a 49 64 3b 20 20 20 20 20 20 20 2f 2a 20 54  *zId;       /* T
16f80 68 65 20 66 75 6e 63 74 69 6f 6e 20 6e 61 6d 65  he function name
16f90 20 2a 2f 0a 20 20 20 20 20 20 75 33 32 20 63 6f   */.      u32 co
16fa0 6e 73 74 4d 61 73 6b 20 3d 20 30 3b 20 20 20 20  nstMask = 0;    
16fb0 20 2f 2a 20 4d 61 73 6b 20 6f 66 20 66 75 6e 63   /* Mask of func
16fc0 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 74  tion arguments t
16fd0 68 61 74 20 61 72 65 20 63 6f 6e 73 74 61 6e 74  hat are constant
16fe0 20 2a 2f 0a 20 20 20 20 20 20 69 6e 74 20 69 3b   */.      int i;
16ff0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17000 20 2f 2a 20 4c 6f 6f 70 20 63 6f 75 6e 74 65 72   /* Loop counter
17010 20 2a 2f 0a 20 20 20 20 20 20 75 38 20 65 6e 63   */.      u8 enc
17020 20 3d 20 45 4e 43 28 64 62 29 3b 20 20 20 20 20   = ENC(db);     
17030 20 2f 2a 20 54 68 65 20 74 65 78 74 20 65 6e 63   /* The text enc
17040 6f 64 69 6e 67 20 75 73 65 64 20 62 79 20 74 68  oding used by th
17050 69 73 20 64 61 74 61 62 61 73 65 20 2a 2f 0a 20  is database */. 
17060 20 20 20 20 20 43 6f 6c 6c 53 65 71 20 2a 70 43       CollSeq *pC
17070 6f 6c 6c 20 3d 20 30 3b 20 20 20 20 2f 2a 20 41  oll = 0;    /* A
17080 20 63 6f 6c 6c 61 74 69 6e 67 20 73 65 71 75 65   collating seque
17090 6e 63 65 20 2a 2f 0a 0a 20 20 20 20 20 20 61 73  nce */..      as
170a0 73 65 72 74 28 20 21 45 78 70 72 48 61 73 50 72  sert( !ExprHasPr
170b0 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20 45 50  operty(pExpr, EP
170c0 5f 78 49 73 53 65 6c 65 63 74 29 20 29 3b 0a 20  _xIsSelect) );. 
170d0 20 20 20 20 20 69 66 28 20 45 78 70 72 48 61 73       if( ExprHas
170e0 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c 20  Property(pExpr, 
170f0 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29 20 29 7b  EP_TokenOnly) ){
17100 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
17110 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b   0;.      }else{
17120 0a 20 20 20 20 20 20 20 20 70 46 61 72 67 20 3d  .        pFarg =
17130 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 3b   pExpr->x.pList;
17140 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 6e  .      }.      n
17150 46 61 72 67 20 3d 20 70 46 61 72 67 20 3f 20 70  Farg = pFarg ? p
17160 46 61 72 67 2d 3e 6e 45 78 70 72 20 3a 20 30 3b  Farg->nExpr : 0;
17170 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
17180 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
17190 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
171a0 75 65 29 20 29 3b 0a 20 20 20 20 20 20 7a 49 64  ue) );.      zId
171b0 20 3d 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b   = pExpr->u.zTok
171c0 65 6e 3b 0a 20 20 20 20 20 20 6e 49 64 20 3d 20  en;.      nId = 
171d0 73 71 6c 69 74 65 33 53 74 72 6c 65 6e 33 30 28  sqlite3Strlen30(
171e0 7a 49 64 29 3b 0a 20 20 20 20 20 20 70 44 65 66  zId);.      pDef
171f0 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46 75   = sqlite3FindFu
17200 6e 63 74 69 6f 6e 28 64 62 2c 20 7a 49 64 2c 20  nction(db, zId, 
17210 6e 49 64 2c 20 6e 46 61 72 67 2c 20 65 6e 63 2c  nId, nFarg, enc,
17220 20 30 29 3b 0a 20 20 20 20 20 20 69 66 28 20 70   0);.      if( p
17230 44 65 66 3d 3d 30 20 7c 7c 20 70 44 65 66 2d 3e  Def==0 || pDef->
17240 78 46 75 6e 63 3d 3d 30 20 29 7b 0a 20 20 20 20  xFunc==0 ){.    
17250 20 20 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72      sqlite3Error
17260 4d 73 67 28 70 50 61 72 73 65 2c 20 22 75 6e 6b  Msg(pParse, "unk
17270 6e 6f 77 6e 20 66 75 6e 63 74 69 6f 6e 3a 20 25  nown function: %
17280 2e 2a 73 28 29 22 2c 20 6e 49 64 2c 20 7a 49 64  .*s()", nId, zId
17290 29 3b 0a 20 20 20 20 20 20 20 20 62 72 65 61 6b  );.        break
172a0 3b 0a 20 20 20 20 20 20 7d 0a 0a 20 20 20 20 20  ;.      }..     
172b0 20 2f 2a 20 41 74 74 65 6d 70 74 20 61 20 64 69   /* Attempt a di
172c0 72 65 63 74 20 69 6d 70 6c 65 6d 65 6e 74 61 74  rect implementat
172d0 69 6f 6e 20 6f 66 20 74 68 65 20 62 75 69 6c 74  ion of the built
172e0 2d 69 6e 20 43 4f 41 4c 45 53 43 45 28 29 20 61  -in COALESCE() a
172f0 6e 64 0a 20 20 20 20 20 20 2a 2a 20 49 46 4e 55  nd.      ** IFNU
17300 4c 4c 28 29 20 66 75 6e 63 74 69 6f 6e 73 2e 20  LL() functions. 
17310 20 54 68 69 73 20 61 76 6f 69 64 73 20 75 6e 6e   This avoids unn
17320 65 63 65 73 73 61 72 79 20 65 76 61 6c 61 74 69  ecessary evalati
17330 6f 6e 20 6f 66 0a 20 20 20 20 20 20 2a 2a 20 61  on of.      ** a
17340 72 67 75 6d 65 6e 74 73 20 70 61 73 74 20 74 68  rguments past th
17350 65 20 66 69 72 73 74 20 6e 6f 6e 2d 4e 55 4c 4c  e first non-NULL
17360 20 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20   argument..     
17370 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44   */.      if( pD
17380 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
17390 53 51 4c 49 54 45 5f 46 55 4e 43 5f 43 4f 41 4c  SQLITE_FUNC_COAL
173a0 45 53 43 45 20 29 7b 0a 20 20 20 20 20 20 20 20  ESCE ){.        
173b0 69 6e 74 20 65 6e 64 43 6f 61 6c 65 73 63 65 20  int endCoalesce 
173c0 3d 20 73 71 6c 69 74 65 33 56 64 62 65 4d 61 6b  = sqlite3VdbeMak
173d0 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20 20 20 20  eLabel(v);.     
173e0 20 20 20 61 73 73 65 72 74 28 20 6e 46 61 72 67     assert( nFarg
173f0 3e 3d 32 20 29 3b 0a 20 20 20 20 20 20 20 20 73  >=2 );.        s
17400 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28 70  qlite3ExprCode(p
17410 50 61 72 73 65 2c 20 70 46 61 72 67 2d 3e 61 5b  Parse, pFarg->a[
17420 30 5d 2e 70 45 78 70 72 2c 20 74 61 72 67 65 74  0].pExpr, target
17430 29 3b 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69  );.        for(i
17440 3d 31 3b 20 69 3c 6e 46 61 72 67 3b 20 69 2b 2b  =1; i<nFarg; i++
17450 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 71 6c  ){.          sql
17460 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
17470 2c 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 2c 20 74 61  , OP_NotNull, ta
17480 72 67 65 74 2c 20 65 6e 64 43 6f 61 6c 65 73 63  rget, endCoalesc
17490 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 56 64  e);.          Vd
174a0 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b 0a 20  beCoverage(v);. 
174b0 20 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33           sqlite3
174c0 45 78 70 72 43 61 63 68 65 52 65 6d 6f 76 65 28  ExprCacheRemove(
174d0 70 50 61 72 73 65 2c 20 74 61 72 67 65 74 2c 20  pParse, target, 
174e0 31 29 3b 0a 20 20 20 20 20 20 20 20 20 20 73 71  1);.          sq
174f0 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
17500 73 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20  sh(pParse);.    
17510 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
17520 72 43 6f 64 65 28 70 50 61 72 73 65 2c 20 70 46  rCode(pParse, pF
17530 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72 2c  arg->a[i].pExpr,
17540 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20   target);.      
17550 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
17560 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b  achePop(pParse);
17570 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
17580 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65     sqlite3VdbeRe
17590 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e  solveLabel(v, en
175a0 64 43 6f 61 6c 65 73 63 65 29 3b 0a 20 20 20 20  dCoalesce);.    
175b0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
175c0 20 7d 0a 0a 20 20 20 20 20 20 2f 2a 20 54 68 65   }..      /* The
175d0 20 55 4e 4c 49 4b 45 4c 59 28 29 20 66 75 6e 63   UNLIKELY() func
175e0 74 69 6f 6e 20 69 73 20 61 20 6e 6f 2d 6f 70 2e  tion is a no-op.
175f0 20 20 54 68 65 20 72 65 73 75 6c 74 20 69 73 20    The result is 
17600 74 68 65 20 76 61 6c 75 65 0a 20 20 20 20 20 20  the value.      
17610 2a 2a 20 6f 66 20 74 68 65 20 66 69 72 73 74 20  ** of the first 
17620 61 72 67 75 6d 65 6e 74 2e 0a 20 20 20 20 20 20  argument..      
17630 2a 2f 0a 20 20 20 20 20 20 69 66 28 20 70 44 65  */.      if( pDe
17640 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20 53  f->funcFlags & S
17650 51 4c 49 54 45 5f 46 55 4e 43 5f 55 4e 4c 49 4b  QLITE_FUNC_UNLIK
17660 45 4c 59 20 29 7b 0a 20 20 20 20 20 20 20 20 61  ELY ){.        a
17670 73 73 65 72 74 28 20 6e 46 61 72 67 3e 3d 31 20  ssert( nFarg>=1 
17680 29 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  );.        sqlit
17690 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
176a0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e 70  e, pFarg->a[0].p
176b0 45 78 70 72 2c 20 74 61 72 67 65 74 29 3b 0a 20  Expr, target);. 
176c0 20 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20         break;.  
176d0 20 20 20 20 7d 0a 0a 20 20 20 20 20 20 66 6f 72      }..      for
176e0 28 69 3d 30 3b 20 69 3c 6e 46 61 72 67 3b 20 69  (i=0; i<nFarg; i
176f0 2b 2b 29 7b 0a 20 20 20 20 20 20 20 20 69 66 28  ++){.        if(
17700 20 69 3c 33 32 20 26 26 20 73 71 6c 69 74 65 33   i<32 && sqlite3
17710 45 78 70 72 49 73 43 6f 6e 73 74 61 6e 74 28 70  ExprIsConstant(p
17720 46 61 72 67 2d 3e 61 5b 69 5d 2e 70 45 78 70 72  Farg->a[i].pExpr
17730 29 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 74  ) ){.          t
17740 65 73 74 63 61 73 65 28 20 69 3d 3d 33 31 20 29  estcase( i==31 )
17750 3b 0a 20 20 20 20 20 20 20 20 20 20 63 6f 6e 73  ;.          cons
17760 74 4d 61 73 6b 20 7c 3d 20 4d 41 53 4b 42 49 54  tMask |= MASKBIT
17770 33 32 28 69 29 3b 0a 20 20 20 20 20 20 20 20 7d  32(i);.        }
17780 0a 20 20 20 20 20 20 20 20 69 66 28 20 28 70 44  .        if( (pD
17790 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73 20 26 20  ef->funcFlags & 
177a0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e 45 45 44  SQLITE_FUNC_NEED
177b0 43 4f 4c 4c 29 21 3d 30 20 26 26 20 21 70 43 6f  COLL)!=0 && !pCo
177c0 6c 6c 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20  ll ){.          
177d0 70 43 6f 6c 6c 20 3d 20 73 71 6c 69 74 65 33 45  pColl = sqlite3E
177e0 78 70 72 43 6f 6c 6c 53 65 71 28 70 50 61 72 73  xprCollSeq(pPars
177f0 65 2c 20 70 46 61 72 67 2d 3e 61 5b 69 5d 2e 70  e, pFarg->a[i].p
17800 45 78 70 72 29 3b 0a 20 20 20 20 20 20 20 20 7d  Expr);.        }
17810 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69  .      }.      i
17820 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20 20 20  f( pFarg ){.    
17830 20 20 20 20 69 66 28 20 63 6f 6e 73 74 4d 61 73      if( constMas
17840 6b 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 72  k ){.          r
17850 31 20 3d 20 70 50 61 72 73 65 2d 3e 6e 4d 65 6d  1 = pParse->nMem
17860 2b 31 3b 0a 20 20 20 20 20 20 20 20 20 20 70 50  +1;.          pP
17870 61 72 73 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 46  arse->nMem += nF
17880 61 72 67 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c  arg;.        }el
17890 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 72 31  se{.          r1
178a0 20 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d   = sqlite3GetTem
178b0 70 52 61 6e 67 65 28 70 50 61 72 73 65 2c 20 6e  pRange(pParse, n
178c0 46 61 72 67 29 3b 0a 20 20 20 20 20 20 20 20 7d  Farg);.        }
178d0 0a 0a 20 20 20 20 20 20 20 20 2f 2a 20 46 6f 72  ..        /* For
178e0 20 6c 65 6e 67 74 68 28 29 20 61 6e 64 20 74 79   length() and ty
178f0 70 65 6f 66 28 29 20 66 75 6e 63 74 69 6f 6e 73  peof() functions
17900 20 77 69 74 68 20 61 20 63 6f 6c 75 6d 6e 20 61   with a column a
17910 72 67 75 6d 65 6e 74 2c 0a 20 20 20 20 20 20 20  rgument,.       
17920 20 2a 2a 20 73 65 74 20 74 68 65 20 50 35 20 70   ** set the P5 p
17930 61 72 61 6d 65 74 65 72 20 74 6f 20 74 68 65 20  arameter to the 
17940 4f 50 5f 43 6f 6c 75 6d 6e 20 6f 70 63 6f 64 65  OP_Column opcode
17950 20 74 6f 20 4f 50 46 4c 41 47 5f 4c 45 4e 47 54   to OPFLAG_LENGT
17960 48 41 52 47 0a 20 20 20 20 20 20 20 20 2a 2a 20  HARG.        ** 
17970 6f 72 20 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46  or OPFLAG_TYPEOF
17980 41 52 47 20 72 65 73 70 65 63 74 69 76 65 6c 79  ARG respectively
17990 2c 20 74 6f 20 61 76 6f 69 64 20 75 6e 6e 65 63  , to avoid unnec
179a0 65 73 73 61 72 79 20 64 61 74 61 0a 20 20 20 20  essary data.    
179b0 20 20 20 20 2a 2a 20 6c 6f 61 64 69 6e 67 2e 0a      ** loading..
179c0 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20 20 20          */.     
179d0 20 20 20 69 66 28 20 28 70 44 65 66 2d 3e 66 75     if( (pDef->fu
179e0 6e 63 46 6c 61 67 73 20 26 20 28 53 51 4c 49 54  ncFlags & (SQLIT
179f0 45 5f 46 55 4e 43 5f 4c 45 4e 47 54 48 7c 53 51  E_FUNC_LENGTH|SQ
17a00 4c 49 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46  LITE_FUNC_TYPEOF
17a10 29 29 21 3d 30 20 29 7b 0a 20 20 20 20 20 20 20  ))!=0 ){.       
17a20 20 20 20 75 38 20 65 78 70 72 4f 70 3b 0a 20 20     u8 exprOp;.  
17a30 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17a40 6e 46 61 72 67 3d 3d 31 20 29 3b 0a 20 20 20 20  nFarg==1 );.    
17a50 20 20 20 20 20 20 61 73 73 65 72 74 28 20 70 46        assert( pF
17a60 61 72 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 21  arg->a[0].pExpr!
17a70 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20  =0 );.          
17a80 65 78 70 72 4f 70 20 3d 20 70 46 61 72 67 2d 3e  exprOp = pFarg->
17a90 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f 70 3b 0a  a[0].pExpr->op;.
17aa0 20 20 20 20 20 20 20 20 20 20 69 66 28 20 65 78            if( ex
17ab0 70 72 4f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  prOp==TK_COLUMN 
17ac0 7c 7c 20 65 78 70 72 4f 70 3d 3d 54 4b 5f 41 47  || exprOp==TK_AG
17ad0 47 5f 43 4f 4c 55 4d 4e 20 29 7b 0a 20 20 20 20  G_COLUMN ){.    
17ae0 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20          assert( 
17af0 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4c 45 4e 47  SQLITE_FUNC_LENG
17b00 54 48 3d 3d 4f 50 46 4c 41 47 5f 4c 45 4e 47 54  TH==OPFLAG_LENGT
17b10 48 41 52 47 20 29 3b 0a 20 20 20 20 20 20 20 20  HARG );.        
17b20 20 20 20 20 61 73 73 65 72 74 28 20 53 51 4c 49      assert( SQLI
17b30 54 45 5f 46 55 4e 43 5f 54 59 50 45 4f 46 3d 3d  TE_FUNC_TYPEOF==
17b40 4f 50 46 4c 41 47 5f 54 59 50 45 4f 46 41 52 47  OPFLAG_TYPEOFARG
17b50 20 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20   );.            
17b60 74 65 73 74 63 61 73 65 28 20 70 44 65 66 2d 3e  testcase( pDef->
17b70 66 75 6e 63 46 6c 61 67 73 20 26 20 4f 50 46 4c  funcFlags & OPFL
17b80 41 47 5f 4c 45 4e 47 54 48 41 52 47 20 29 3b 0a  AG_LENGTHARG );.
17b90 20 20 20 20 20 20 20 20 20 20 20 20 70 46 61 72              pFar
17ba0 67 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 2d 3e 6f  g->a[0].pExpr->o
17bb0 70 32 20 3d 20 0a 20 20 20 20 20 20 20 20 20 20  p2 = .          
17bc0 20 20 20 20 20 20 20 20 70 44 65 66 2d 3e 66 75          pDef->fu
17bd0 6e 63 46 6c 61 67 73 20 26 20 28 4f 50 46 4c 41  ncFlags & (OPFLA
17be0 47 5f 4c 45 4e 47 54 48 41 52 47 7c 4f 50 46 4c  G_LENGTHARG|OPFL
17bf0 41 47 5f 54 59 50 45 4f 46 41 52 47 29 3b 0a 20  AG_TYPEOFARG);. 
17c00 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
17c10 20 20 20 7d 0a 0a 20 20 20 20 20 20 20 20 73 71     }..        sq
17c20 6c 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75  lite3ExprCachePu
17c30 73 68 28 70 50 61 72 73 65 29 3b 20 20 20 20 20  sh(pParse);     
17c40 2f 2a 20 54 69 63 6b 65 74 20 32 65 61 32 34 32  /* Ticket 2ea242
17c50 35 64 33 34 62 65 20 2a 2f 0a 20 20 20 20 20 20  5d34be */.      
17c60 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
17c70 65 45 78 70 72 4c 69 73 74 28 70 50 61 72 73 65  eExprList(pParse
17c80 2c 20 70 46 61 72 67 2c 20 72 31 2c 0a 20 20 20  , pFarg, r1,.   
17c90 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
17ca0 20 20 20 20 20 20 20 20 20 20 20 20 20 53 51 4c               SQL
17cb0 49 54 45 5f 45 43 45 4c 5f 44 55 50 7c 53 51 4c  ITE_ECEL_DUP|SQL
17cc0 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52 29  ITE_ECEL_FACTOR)
17cd0 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
17ce0 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
17cf0 61 72 73 65 29 3b 20 20 20 20 20 20 2f 2a 20 54  arse);      /* T
17d00 69 63 6b 65 74 20 32 65 61 32 34 32 35 64 33 34  icket 2ea2425d34
17d10 62 65 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73  be */.      }els
17d20 65 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20  e{.        r1 = 
17d30 30 3b 0a 20 20 20 20 20 20 7d 0a 23 69 66 6e 64  0;.      }.#ifnd
17d40 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 56  ef SQLITE_OMIT_V
17d50 49 52 54 55 41 4c 54 41 42 4c 45 0a 20 20 20 20  IRTUALTABLE.    
17d60 20 20 2f 2a 20 50 6f 73 73 69 62 6c 79 20 6f 76    /* Possibly ov
17d70 65 72 6c 6f 61 64 20 74 68 65 20 66 75 6e 63 74  erload the funct
17d80 69 6f 6e 20 69 66 20 74 68 65 20 66 69 72 73 74  ion if the first
17d90 20 61 72 67 75 6d 65 6e 74 20 69 73 0a 20 20 20   argument is.   
17da0 20 20 20 2a 2a 20 61 20 76 69 72 74 75 61 6c 20     ** a virtual 
17db0 74 61 62 6c 65 20 63 6f 6c 75 6d 6e 2e 0a 20 20  table column..  
17dc0 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20      **.      ** 
17dd0 46 6f 72 20 69 6e 66 69 78 20 66 75 6e 63 74 69  For infix functi
17de0 6f 6e 73 20 28 4c 49 4b 45 2c 20 47 4c 4f 42 2c  ons (LIKE, GLOB,
17df0 20 52 45 47 45 58 50 2c 20 61 6e 64 20 4d 41 54   REGEXP, and MAT
17e00 43 48 29 20 75 73 65 20 74 68 65 0a 20 20 20 20  CH) use the.    
17e10 20 20 2a 2a 20 73 65 63 6f 6e 64 20 61 72 67 75    ** second argu
17e20 6d 65 6e 74 2c 20 6e 6f 74 20 74 68 65 20 66 69  ment, not the fi
17e30 72 73 74 2c 20 61 73 20 74 68 65 20 61 72 67 75  rst, as the argu
17e40 6d 65 6e 74 20 74 6f 20 74 65 73 74 20 74 6f 0a  ment to test to.
17e50 20 20 20 20 20 20 2a 2a 20 73 65 65 20 69 66 20        ** see if 
17e60 69 74 20 69 73 20 61 20 63 6f 6c 75 6d 6e 20 69  it is a column i
17e70 6e 20 61 20 76 69 72 74 75 61 6c 20 74 61 62 6c  n a virtual tabl
17e80 65 2e 20 20 54 68 69 73 20 69 73 20 64 6f 6e 65  e.  This is done
17e90 20 62 65 63 61 75 73 65 0a 20 20 20 20 20 20 2a   because.      *
17ea0 2a 20 74 68 65 20 6c 65 66 74 20 6f 70 65 72 61  * the left opera
17eb0 6e 64 20 6f 66 20 69 6e 66 69 78 20 66 75 6e 63  nd of infix func
17ec0 74 69 6f 6e 73 20 28 74 68 65 20 6f 70 65 72 61  tions (the opera
17ed0 6e 64 20 77 65 20 77 61 6e 74 20 74 6f 0a 20 20  nd we want to.  
17ee0 20 20 20 20 2a 2a 20 63 6f 6e 74 72 6f 6c 20 6f      ** control o
17ef0 76 65 72 6c 6f 61 64 69 6e 67 29 20 65 6e 64 73  verloading) ends
17f00 20 75 70 20 61 73 20 74 68 65 20 73 65 63 6f 6e   up as the secon
17f10 64 20 61 72 67 75 6d 65 6e 74 20 74 6f 20 74 68  d argument to th
17f20 65 0a 20 20 20 20 20 20 2a 2a 20 66 75 6e 63 74  e.      ** funct
17f30 69 6f 6e 2e 20 20 54 68 65 20 65 78 70 72 65 73  ion.  The expres
17f40 73 69 6f 6e 20 22 41 20 67 6c 6f 62 20 42 22 20  sion "A glob B" 
17f50 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20 74 6f  is equivalent to
17f60 20 0a 20 20 20 20 20 20 2a 2a 20 22 67 6c 6f 62   .      ** "glob
17f70 28 42 2c 41 29 2e 20 20 57 65 20 77 61 6e 74 20  (B,A).  We want 
17f80 74 6f 20 75 73 65 20 74 68 65 20 41 20 69 6e 20  to use the A in 
17f90 22 41 20 67 6c 6f 62 20 42 22 20 74 6f 20 74 65  "A glob B" to te
17fa0 73 74 0a 20 20 20 20 20 20 2a 2a 20 66 6f 72 20  st.      ** for 
17fb0 66 75 6e 63 74 69 6f 6e 20 6f 76 65 72 6c 6f 61  function overloa
17fc0 64 69 6e 67 2e 20 20 42 75 74 20 77 65 20 75 73  ding.  But we us
17fd0 65 20 74 68 65 20 42 20 74 65 72 6d 20 69 6e 20  e the B term in 
17fe0 22 67 6c 6f 62 28 42 2c 41 29 22 2e 0a 20 20 20  "glob(B,A)"..   
17ff0 20 20 20 2a 2f 0a 20 20 20 20 20 20 69 66 28 20     */.      if( 
18000 6e 46 61 72 67 3e 3d 32 20 26 26 20 28 70 45 78  nFarg>=2 && (pEx
18010 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
18020 6e 66 69 78 46 75 6e 63 29 20 29 7b 0a 20 20 20  nfixFunc) ){.   
18030 20 20 20 20 20 70 44 65 66 20 3d 20 73 71 6c 69       pDef = sqli
18040 74 65 33 56 74 61 62 4f 76 65 72 6c 6f 61 64 46  te3VtabOverloadF
18050 75 6e 63 74 69 6f 6e 28 64 62 2c 20 70 44 65 66  unction(db, pDef
18060 2c 20 6e 46 61 72 67 2c 20 70 46 61 72 67 2d 3e  , nFarg, pFarg->
18070 61 5b 31 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20  a[1].pExpr);.   
18080 20 20 20 7d 65 6c 73 65 20 69 66 28 20 6e 46 61     }else if( nFa
18090 72 67 3e 30 20 29 7b 0a 20 20 20 20 20 20 20 20  rg>0 ){.        
180a0 70 44 65 66 20 3d 20 73 71 6c 69 74 65 33 56 74  pDef = sqlite3Vt
180b0 61 62 4f 76 65 72 6c 6f 61 64 46 75 6e 63 74 69  abOverloadFuncti
180c0 6f 6e 28 64 62 2c 20 70 44 65 66 2c 20 6e 46 61  on(db, pDef, nFa
180d0 72 67 2c 20 70 46 61 72 67 2d 3e 61 5b 30 5d 2e  rg, pFarg->a[0].
180e0 70 45 78 70 72 29 3b 0a 20 20 20 20 20 20 7d 0a  pExpr);.      }.
180f0 23 65 6e 64 69 66 0a 20 20 20 20 20 20 69 66 28  #endif.      if(
18100 20 70 44 65 66 2d 3e 66 75 6e 63 46 6c 61 67 73   pDef->funcFlags
18110 20 26 20 53 51 4c 49 54 45 5f 46 55 4e 43 5f 4e   & SQLITE_FUNC_N
18120 45 45 44 43 4f 4c 4c 20 29 7b 0a 20 20 20 20 20  EEDCOLL ){.     
18130 20 20 20 69 66 28 20 21 70 43 6f 6c 6c 20 29 20     if( !pColl ) 
18140 70 43 6f 6c 6c 20 3d 20 64 62 2d 3e 70 44 66 6c  pColl = db->pDfl
18150 74 43 6f 6c 6c 3b 20 0a 20 20 20 20 20 20 20 20  tColl; .        
18160 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
18170 34 28 76 2c 20 4f 50 5f 43 6f 6c 6c 53 65 71 2c  4(v, OP_CollSeq,
18180 20 30 2c 20 30 2c 20 30 2c 20 28 63 68 61 72 20   0, 0, 0, (char 
18190 2a 29 70 43 6f 6c 6c 2c 20 50 34 5f 43 4f 4c 4c  *)pColl, P4_COLL
181a0 53 45 51 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20  SEQ);.      }.  
181b0 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
181c0 64 64 4f 70 34 28 76 2c 20 4f 50 5f 46 75 6e 63  ddOp4(v, OP_Func
181d0 74 69 6f 6e 2c 20 63 6f 6e 73 74 4d 61 73 6b 2c  tion, constMask,
181e0 20 72 31 2c 20 74 61 72 67 65 74 2c 0a 20 20 20   r1, target,.   
181f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
18200 20 20 20 20 20 28 63 68 61 72 2a 29 70 44 65 66       (char*)pDef
18210 2c 20 50 34 5f 46 55 4e 43 44 45 46 29 3b 0a 20  , P4_FUNCDEF);. 
18220 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
18230 43 68 61 6e 67 65 50 35 28 76 2c 20 28 75 38 29  ChangeP5(v, (u8)
18240 6e 46 61 72 67 29 3b 0a 20 20 20 20 20 20 69 66  nFarg);.      if
18250 28 20 6e 46 61 72 67 20 26 26 20 63 6f 6e 73 74  ( nFarg && const
18260 4d 61 73 6b 3d 3d 30 20 29 7b 0a 20 20 20 20 20  Mask==0 ){.     
18270 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73     sqlite3Releas
18280 65 54 65 6d 70 52 61 6e 67 65 28 70 50 61 72 73  eTempRange(pPars
18290 65 2c 20 72 31 2c 20 6e 46 61 72 67 29 3b 0a 20  e, r1, nFarg);. 
182a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65       }.      bre
182b0 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
182c0 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  f SQLITE_OMIT_SU
182d0 42 51 55 45 52 59 0a 20 20 20 20 63 61 73 65 20  BQUERY.    case 
182e0 54 4b 5f 45 58 49 53 54 53 3a 0a 20 20 20 20 63  TK_EXISTS:.    c
182f0 61 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b  ase TK_SELECT: {
18300 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
18310 20 6f 70 3d 3d 54 4b 5f 45 58 49 53 54 53 20 29   op==TK_EXISTS )
18320 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18330 28 20 6f 70 3d 3d 54 4b 5f 53 45 4c 45 43 54 20  ( op==TK_SELECT 
18340 29 3b 0a 20 20 20 20 20 20 69 6e 52 65 67 20 3d  );.      inReg =
18350 20 73 71 6c 69 74 65 33 43 6f 64 65 53 75 62 73   sqlite3CodeSubs
18360 65 6c 65 63 74 28 70 50 61 72 73 65 2c 20 70 45  elect(pParse, pE
18370 78 70 72 2c 20 30 2c 20 30 29 3b 0a 20 20 20 20  xpr, 0, 0);.    
18380 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
18390 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a 20 7b     case TK_IN: {
183a0 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49  .      int destI
183b0 66 46 61 6c 73 65 20 3d 20 73 71 6c 69 74 65 33  fFalse = sqlite3
183c0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
183d0 3b 0a 20 20 20 20 20 20 69 6e 74 20 64 65 73 74  ;.      int dest
183e0 49 66 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33  IfNull = sqlite3
183f0 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29  VdbeMakeLabel(v)
18400 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
18410 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f  dbeAddOp2(v, OP_
18420 4e 75 6c 6c 2c 20 30 2c 20 74 61 72 67 65 74 29  Null, 0, target)
18430 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
18440 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
18450 2c 20 70 45 78 70 72 2c 20 64 65 73 74 49 66 46  , pExpr, destIfF
18460 61 6c 73 65 2c 20 64 65 73 74 49 66 4e 75 6c 6c  alse, destIfNull
18470 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33  );.      sqlite3
18480 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
18490 5f 49 6e 74 65 67 65 72 2c 20 31 2c 20 74 61 72  _Integer, 1, tar
184a0 67 65 74 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  get);.      sqli
184b0 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
184c0 62 65 6c 28 76 2c 20 64 65 73 74 49 66 46 61 6c  bel(v, destIfFal
184d0 73 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  se);.      sqlit
184e0 65 33 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20  e3VdbeAddOp2(v, 
184f0 4f 50 5f 41 64 64 49 6d 6d 2c 20 74 61 72 67 65  OP_AddImm, targe
18500 74 2c 20 30 29 3b 0a 20 20 20 20 20 20 73 71 6c  t, 0);.      sql
18510 69 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c  ite3VdbeResolveL
18520 61 62 65 6c 28 76 2c 20 64 65 73 74 49 66 4e 75  abel(v, destIfNu
18530 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b  ll);.      break
18540 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 20 2f  ;.    }.#endif /
18550 2a 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 53 55  * SQLITE_OMIT_SU
18560 42 51 55 45 52 59 20 2a 2f 0a 0a 0a 20 20 20 20  BQUERY */...    
18570 2f 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 20 42  /*.    **    x B
18580 45 54 57 45 45 4e 20 79 20 41 4e 44 20 7a 0a 20  ETWEEN y AND z. 
18590 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54 68 69     **.    ** Thi
185a0 73 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74 20  s is equivalent 
185b0 74 6f 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a  to.    **.    **
185c0 20 20 20 20 78 3e 3d 79 20 41 4e 44 20 78 3c 3d      x>=y AND x<=
185d0 7a 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  z.    **.    ** 
185e0 58 20 69 73 20 73 74 6f 72 65 64 20 69 6e 20 70  X is stored in p
185f0 45 78 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20  Expr->pLeft..   
18600 20 2a 2a 20 59 20 69 73 20 73 74 6f 72 65 64 20   ** Y is stored 
18610 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
18620 3e 61 5b 30 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[0].pExpr..   
18630 20 2a 2a 20 5a 20 69 73 20 73 74 6f 72 65 64 20   ** Z is stored 
18640 69 6e 20 70 45 78 70 72 2d 3e 70 4c 69 73 74 2d  in pExpr->pList-
18650 3e 61 5b 31 5d 2e 70 45 78 70 72 2e 0a 20 20 20  >a[1].pExpr..   
18660 20 2a 2f 0a 20 20 20 20 63 61 73 65 20 54 4b 5f   */.    case TK_
18670 42 45 54 57 45 45 4e 3a 20 7b 0a 20 20 20 20 20  BETWEEN: {.     
18680 20 45 78 70 72 20 2a 70 4c 65 66 74 20 3d 20 70   Expr *pLeft = p
18690 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 20  Expr->pLeft;.   
186a0 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
186b0 73 74 5f 69 74 65 6d 20 2a 70 4c 49 74 65 6d 20  st_item *pLItem 
186c0 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  = pExpr->x.pList
186d0 2d 3e 61 3b 0a 20 20 20 20 20 20 45 78 70 72 20  ->a;.      Expr 
186e0 2a 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d  *pRight = pLItem
186f0 2d 3e 70 45 78 70 72 3b 0a 0a 20 20 20 20 20 20  ->pExpr;..      
18700 72 31 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72  r1 = sqlite3Expr
18710 43 6f 64 65 54 65 6d 70 28 70 50 61 72 73 65 2c  CodeTemp(pParse,
18720 20 70 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65   pLeft, &regFree
18730 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d 20 73  1);.      r2 = s
18740 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
18750 6d 70 28 70 50 61 72 73 65 2c 20 70 52 69 67 68  mp(pParse, pRigh
18760 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b 0a 20  t, &regFree2);. 
18770 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
18780 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
18790 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
187a0 67 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20  gFree2==0 );.   
187b0 20 20 20 72 33 20 3d 20 73 71 6c 69 74 65 33 47     r3 = sqlite3G
187c0 65 74 54 65 6d 70 52 65 67 28 70 50 61 72 73 65  etTempReg(pParse
187d0 29 3b 0a 20 20 20 20 20 20 72 34 20 3d 20 73 71  );.      r4 = sq
187e0 6c 69 74 65 33 47 65 74 54 65 6d 70 52 65 67 28  lite3GetTempReg(
187f0 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 63  pParse);.      c
18800 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73  odeCompare(pPars
18810 65 2c 20 70 4c 65 66 74 2c 20 70 52 69 67 68 74  e, pLeft, pRight
18820 2c 20 4f 50 5f 47 65 2c 0a 20 20 20 20 20 20 20  , OP_Ge,.       
18830 20 20 20 20 20 20 20 20 20 20 20 72 31 2c 20 72             r1, r
18840 32 2c 20 72 33 2c 20 53 51 4c 49 54 45 5f 53 54  2, r3, SQLITE_ST
18850 4f 52 45 50 32 29 3b 20 20 56 64 62 65 43 6f 76  OREP2);  VdbeCov
18860 65 72 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20  erage(v);.      
18870 70 4c 49 74 65 6d 2b 2b 3b 0a 20 20 20 20 20 20  pLItem++;.      
18880 70 52 69 67 68 74 20 3d 20 70 4c 49 74 65 6d 2d  pRight = pLItem-
18890 3e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 73 71  >pExpr;.      sq
188a0 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d 70  lite3ReleaseTemp
188b0 52 65 67 28 70 50 61 72 73 65 2c 20 72 65 67 46  Reg(pParse, regF
188c0 72 65 65 32 29 3b 0a 20 20 20 20 20 20 72 32 20  ree2);.      r2 
188d0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
188e0 65 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 52  eTemp(pParse, pR
188f0 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29  ight, &regFree2)
18900 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65  ;.      testcase
18910 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29 3b  ( regFree2==0 );
18920 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
18930 72 65 28 70 50 61 72 73 65 2c 20 70 4c 65 66 74  re(pParse, pLeft
18940 2c 20 70 52 69 67 68 74 2c 20 4f 50 5f 4c 65 2c  , pRight, OP_Le,
18950 20 72 31 2c 20 72 32 2c 20 72 34 2c 20 53 51 4c   r1, r2, r4, SQL
18960 49 54 45 5f 53 54 4f 52 45 50 32 29 3b 0a 20 20  ITE_STOREP2);.  
18970 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
18980 28 76 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  (v);.      sqlit
18990 65 33 56 64 62 65 41 64 64 4f 70 33 28 76 2c 20  e3VdbeAddOp3(v, 
189a0 4f 50 5f 41 6e 64 2c 20 72 33 2c 20 72 34 2c 20  OP_And, r3, r4, 
189b0 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 73  target);.      s
189c0 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65 6d  qlite3ReleaseTem
189d0 70 52 65 67 28 70 50 61 72 73 65 2c 20 72 33 29  pReg(pParse, r3)
189e0 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 52  ;.      sqlite3R
189f0 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28 70 50  eleaseTempReg(pP
18a00 61 72 73 65 2c 20 72 34 29 3b 0a 20 20 20 20 20  arse, r4);.     
18a10 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
18a20 20 20 63 61 73 65 20 54 4b 5f 43 4f 4c 4c 41 54    case TK_COLLAT
18a30 45 3a 20 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  E: .    case TK_
18a40 55 50 4c 55 53 3a 20 7b 0a 20 20 20 20 20 20 69  UPLUS: {.      i
18a50 6e 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78  nReg = sqlite3Ex
18a60 70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61  prCodeTarget(pPa
18a70 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
18a80 74 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  t, target);.    
18a90 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a    break;.    }..
18aa0 20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47      case TK_TRIG
18ab0 47 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20  GER: {.      /* 
18ac0 49 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73  If the opcode is
18ad0 20 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65   TK_TRIGGER, the
18ae0 6e 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  n the expression
18af0 20 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a   is a reference.
18b00 20 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f        ** to a co
18b10 6c 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e  lumn in the new.
18b20 2a 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64  * or old.* pseud
18b30 6f 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62  o-tables availab
18b40 6c 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74  le to.      ** t
18b50 72 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e  rigger programs.
18b60 20 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78   In this case Ex
18b70 70 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74  pr.iTable is set
18b80 20 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20   to 1 for the.  
18b90 20 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65      ** new.* pse
18ba0 75 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20  udo-table, or 0 
18bb0 66 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73  for the old.* ps
18bc0 65 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72  eudo-table. Expr
18bd0 2e 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a  .iColumn.      *
18be0 2a 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20  * is set to the 
18bf0 63 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73  column of the ps
18c00 65 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65  eudo-table to re
18c10 61 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a  ad, or to -1 to.
18c20 20 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68        ** read th
18c30 65 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20  e rowid field.. 
18c40 20 20 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a       **.      **
18c50 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   The expression 
18c60 69 73 20 69 6d 70 6c 65 6d 65 6e 74 65 64 20 75  is implemented u
18c70 73 69 6e 67 20 61 6e 20 4f 50 5f 50 61 72 61 6d  sing an OP_Param
18c80 20 6f 70 63 6f 64 65 2e 20 54 68 65 20 70 31 0a   opcode. The p1.
18c90 20 20 20 20 20 20 2a 2a 20 70 61 72 61 6d 65 74        ** paramet
18ca0 65 72 20 69 73 20 73 65 74 20 74 6f 20 30 20 66  er is set to 0 f
18cb0 6f 72 20 61 6e 20 6f 6c 64 2e 72 6f 77 69 64 20  or an old.rowid 
18cc0 72 65 66 65 72 65 6e 63 65 2c 20 6f 72 20 74 6f  reference, or to
18cd0 20 28 69 2b 31 29 0a 20 20 20 20 20 20 2a 2a 20   (i+1).      ** 
18ce0 74 6f 20 72 65 66 65 72 65 6e 63 65 20 61 6e 6f  to reference ano
18cf0 74 68 65 72 20 63 6f 6c 75 6d 6e 20 6f 66 20 74  ther column of t
18d00 68 65 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f 2d  he old.* pseudo-
18d10 74 61 62 6c 65 2c 20 77 68 65 72 65 20 0a 20 20  table, where .  
18d20 20 20 20 20 2a 2a 20 69 20 69 73 20 74 68 65 20      ** i is the 
18d30 69 6e 64 65 78 20 6f 66 20 74 68 65 20 63 6f 6c  index of the col
18d40 75 6d 6e 2e 20 46 6f 72 20 61 20 6e 65 77 2e 72  umn. For a new.r
18d50 6f 77 69 64 20 72 65 66 65 72 65 6e 63 65 2c 20  owid reference, 
18d60 70 31 20 69 73 0a 20 20 20 20 20 20 2a 2a 20 73  p1 is.      ** s
18d70 65 74 20 74 6f 20 28 6e 2b 31 29 2c 20 77 68 65  et to (n+1), whe
18d80 72 65 20 6e 20 69 73 20 74 68 65 20 6e 75 6d 62  re n is the numb
18d90 65 72 20 6f 66 20 63 6f 6c 75 6d 6e 73 20 69 6e  er of columns in
18da0 20 65 61 63 68 20 70 73 65 75 64 6f 2d 74 61 62   each pseudo-tab
18db0 6c 65 2e 0a 20 20 20 20 20 20 2a 2a 20 46 6f 72  le..      ** For
18dc0 20 61 20 72 65 66 65 72 65 6e 63 65 20 74 6f 20   a reference to 
18dd0 61 6e 79 20 6f 74 68 65 72 20 63 6f 6c 75 6d 6e  any other column
18de0 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a 20 70 73   in the new.* ps
18df0 65 75 64 6f 2d 74 61 62 6c 65 2c 20 70 31 0a 20  eudo-table, p1. 
18e00 20 20 20 20 20 2a 2a 20 69 73 20 73 65 74 20 74       ** is set t
18e10 6f 20 28 6e 2b 32 2b 69 29 2c 20 77 68 65 72 65  o (n+2+i), where
18e20 20 6e 20 61 6e 64 20 69 20 61 72 65 20 61 73 20   n and i are as 
18e30 64 65 66 69 6e 65 64 20 70 72 65 76 69 6f 75 73  defined previous
18e40 6c 79 2e 20 46 6f 72 0a 20 20 20 20 20 20 2a 2a  ly. For.      **
18e50 20 65 78 61 6d 70 6c 65 2c 20 69 66 20 74 68 65   example, if the
18e60 20 74 61 62 6c 65 20 6f 6e 20 77 68 69 63 68 20   table on which 
18e70 74 72 69 67 67 65 72 73 20 61 72 65 20 62 65 69  triggers are bei
18e80 6e 67 20 66 69 72 65 64 20 69 73 0a 20 20 20 20  ng fired is.    
18e90 20 20 2a 2a 20 64 65 63 6c 61 72 65 64 20 61 73    ** declared as
18ea0 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
18eb0 20 2a 2a 20 20 20 43 52 45 41 54 45 20 54 41 42   **   CREATE TAB
18ec0 4c 45 20 74 31 28 61 2c 20 62 29 3b 0a 20 20 20  LE t1(a, b);.   
18ed0 20 20 20 2a 2a 0a 20 20 20 20 20 20 2a 2a 20 54     **.      ** T
18ee0 68 65 6e 20 70 31 20 69 73 20 69 6e 74 65 72 70  hen p1 is interp
18ef0 72 65 74 65 64 20 61 73 20 66 6f 6c 6c 6f 77 73  reted as follows
18f00 3a 0a 20 20 20 20 20 20 2a 2a 0a 20 20 20 20 20  :.      **.     
18f10 20 2a 2a 20 20 20 70 31 3d 3d 30 20 20 20 2d 3e   **   p1==0   ->
18f20 20 20 20 20 6f 6c 64 2e 72 6f 77 69 64 20 20 20      old.rowid   
18f30 20 20 70 31 3d 3d 33 20 20 20 2d 3e 20 20 20 20    p1==3   ->    
18f40 6e 65 77 2e 72 6f 77 69 64 0a 20 20 20 20 20 20  new.rowid.      
18f50 2a 2a 20 20 20 70 31 3d 3d 31 20 20 20 2d 3e 20  **   p1==1   -> 
18f60 20 20 20 6f 6c 64 2e 61 20 20 20 20 20 20 20 20     old.a        
18f70 20 70 31 3d 3d 34 20 20 20 2d 3e 20 20 20 20 6e   p1==4   ->    n
18f80 65 77 2e 61 0a 20 20 20 20 20 20 2a 2a 20 20 20  ew.a.      **   
18f90 70 31 3d 3d 32 20 20 20 2d 3e 20 20 20 20 6f 6c  p1==2   ->    ol
18fa0 64 2e 62 20 20 20 20 20 20 20 20 20 70 31 3d 3d  d.b         p1==
18fb0 35 20 20 20 2d 3e 20 20 20 20 6e 65 77 2e 62 20  5   ->    new.b 
18fc0 20 20 20 20 20 20 0a 20 20 20 20 20 20 2a 2f 0a        .      */.
18fd0 20 20 20 20 20 20 54 61 62 6c 65 20 2a 70 54 61        Table *pTa
18fe0 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
18ff0 0a 20 20 20 20 20 20 69 6e 74 20 70 31 20 3d 20  .      int p1 = 
19000 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 2a 20  pExpr->iTable * 
19010 28 70 54 61 62 2d 3e 6e 43 6f 6c 2b 31 29 20 2b  (pTab->nCol+1) +
19020 20 31 20 2b 20 70 45 78 70 72 2d 3e 69 43 6f 6c   1 + pExpr->iCol
19030 75 6d 6e 3b 0a 0a 20 20 20 20 20 20 61 73 73 65  umn;..      asse
19040 72 74 28 20 70 45 78 70 72 2d 3e 69 54 61 62 6c  rt( pExpr->iTabl
19050 65 3d 3d 30 20 7c 7c 20 70 45 78 70 72 2d 3e 69  e==0 || pExpr->i
19060 54 61 62 6c 65 3d 3d 31 20 29 3b 0a 20 20 20 20  Table==1 );.    
19070 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d    assert( pExpr-
19080 3e 69 43 6f 6c 75 6d 6e 3e 3d 2d 31 20 26 26 20  >iColumn>=-1 && 
19090 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 3c 70  pExpr->iColumn<p
190a0 54 61 62 2d 3e 6e 43 6f 6c 20 29 3b 0a 20 20 20  Tab->nCol );.   
190b0 20 20 20 61 73 73 65 72 74 28 20 70 54 61 62 2d     assert( pTab-
190c0 3e 69 50 4b 65 79 3c 30 20 7c 7c 20 70 45 78 70  >iPKey<0 || pExp
190d0 72 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70 54 61 62  r->iColumn!=pTab
190e0 2d 3e 69 50 4b 65 79 20 29 3b 0a 20 20 20 20 20  ->iPKey );.     
190f0 20 61 73 73 65 72 74 28 20 70 31 3e 3d 30 20 26   assert( p1>=0 &
19100 26 20 70 31 3c 28 70 54 61 62 2d 3e 6e 43 6f 6c  & p1<(pTab->nCol
19110 2a 32 2b 32 29 20 29 3b 0a 0a 20 20 20 20 20 20  *2+2) );..      
19120 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70  sqlite3VdbeAddOp
19130 32 28 76 2c 20 4f 50 5f 50 61 72 61 6d 2c 20 70  2(v, OP_Param, p
19140 31 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20  1, target);.    
19150 20 20 56 64 62 65 43 6f 6d 6d 65 6e 74 28 28 76    VdbeComment((v
19160 2c 20 22 25 73 2e 25 73 20 2d 3e 20 24 25 64 22  , "%s.%s -> $%d"
19170 2c 0a 20 20 20 20 20 20 20 20 28 70 45 78 70 72  ,.        (pExpr
19180 2d 3e 69 54 61 62 6c 65 20 3f 20 22 6e 65 77 22  ->iTable ? "new"
19190 20 3a 20 22 6f 6c 64 22 29 2c 0a 20 20 20 20 20   : "old"),.     
191a0 20 20 20 28 70 45 78 70 72 2d 3e 69 43 6f 6c 75     (pExpr->iColu
191b0 6d 6e 3c 30 20 3f 20 22 72 6f 77 69 64 22 20 3a  mn<0 ? "rowid" :
191c0 20 70 45 78 70 72 2d 3e 70 54 61 62 2d 3e 61 43   pExpr->pTab->aC
191d0 6f 6c 5b 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d  ol[pExpr->iColum
191e0 6e 5d 2e 7a 4e 61 6d 65 29 2c 0a 20 20 20 20 20  n].zName),.     
191f0 20 20 20 74 61 72 67 65 74 0a 20 20 20 20 20 20     target.      
19200 29 29 3b 0a 0a 23 69 66 6e 64 65 66 20 53 51 4c  ));..#ifndef SQL
19210 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f 41 54 49 4e  ITE_OMIT_FLOATIN
19220 47 5f 50 4f 49 4e 54 0a 20 20 20 20 20 20 2f 2a  G_POINT.      /*
19230 20 49 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20 68   If the column h
19240 61 73 20 52 45 41 4c 20 61 66 66 69 6e 69 74 79  as REAL affinity
19250 2c 20 69 74 20 6d 61 79 20 63 75 72 72 65 6e 74  , it may current
19260 6c 79 20 62 65 20 73 74 6f 72 65 64 20 61 73 20  ly be stored as 
19270 61 6e 0a 20 20 20 20 20 20 2a 2a 20 69 6e 74 65  an.      ** inte
19280 67 65 72 2e 20 55 73 65 20 4f 50 5f 52 65 61 6c  ger. Use OP_Real
19290 41 66 66 69 6e 69 74 79 20 74 6f 20 6d 61 6b 65  Affinity to make
192a0 20 73 75 72 65 20 69 74 20 69 73 20 72 65 61 6c   sure it is real
192b0 6c 79 20 72 65 61 6c 2e 20 20 2a 2f 0a 20 20 20  ly real.  */.   
192c0 20 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 43     if( pExpr->iC
192d0 6f 6c 75 6d 6e 3e 3d 30 20 0a 20 20 20 20 20 20  olumn>=0 .      
192e0 20 26 26 20 70 54 61 62 2d 3e 61 43 6f 6c 5b 70   && pTab->aCol[p
192f0 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 5d 2e 61  Expr->iColumn].a
19300 66 66 69 6e 69 74 79 3d 3d 53 51 4c 49 54 45 5f  ffinity==SQLITE_
19310 41 46 46 5f 52 45 41 4c 0a 20 20 20 20 20 20 29  AFF_REAL.      )
19320 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19330 33 56 64 62 65 41 64 64 4f 70 31 28 76 2c 20 4f  3VdbeAddOp1(v, O
19340 50 5f 52 65 61 6c 41 66 66 69 6e 69 74 79 2c 20  P_RealAffinity, 
19350 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 7d  target);.      }
19360 0a 23 65 6e 64 69 66 0a 20 20 20 20 20 20 62 72  .#endif.      br
19370 65 61 6b 3b 0a 20 20 20 20 7d 0a 0a 0a 20 20 20  eak;.    }...   
19380 20 2f 2a 0a 20 20 20 20 2a 2a 20 46 6f 72 6d 20   /*.    ** Form 
19390 41 3a 0a 20 20 20 20 2a 2a 20 20 20 43 41 53 45  A:.    **   CASE
193a0 20 78 20 57 48 45 4e 20 65 31 20 54 48 45 4e 20   x WHEN e1 THEN 
193b0 72 31 20 57 48 45 4e 20 65 32 20 54 48 45 4e 20  r1 WHEN e2 THEN 
193c0 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65 4e 20 54  r2 ... WHEN eN T
193d0 48 45 4e 20 72 4e 20 45 4c 53 45 20 79 20 45 4e  HEN rN ELSE y EN
193e0 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20  D.    **.    ** 
193f0 46 6f 72 6d 20 42 3a 0a 20 20 20 20 2a 2a 20 20  Form B:.    **  
19400 20 43 41 53 45 20 57 48 45 4e 20 65 31 20 54 48   CASE WHEN e1 TH
19410 45 4e 20 72 31 20 57 48 45 4e 20 65 32 20 54 48  EN r1 WHEN e2 TH
19420 45 4e 20 72 32 20 2e 2e 2e 20 57 48 45 4e 20 65  EN r2 ... WHEN e
19430 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53 45 20 79  N THEN rN ELSE y
19440 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20 20 20 20   END.    **.    
19450 2a 2a 20 46 6f 72 6d 20 41 20 69 73 20 63 61 6e  ** Form A is can
19460 20 62 65 20 74 72 61 6e 73 66 6f 72 6d 65 64 20   be transformed 
19470 69 6e 74 6f 20 74 68 65 20 65 71 75 69 76 61 6c  into the equival
19480 65 6e 74 20 66 6f 72 6d 20 42 20 61 73 20 66 6f  ent form B as fo
19490 6c 6c 6f 77 73 3a 0a 20 20 20 20 2a 2a 20 20 20  llows:.    **   
194a0 43 41 53 45 20 57 48 45 4e 20 78 3d 65 31 20 54  CASE WHEN x=e1 T
194b0 48 45 4e 20 72 31 20 57 48 45 4e 20 78 3d 65 32  HEN r1 WHEN x=e2
194c0 20 54 48 45 4e 20 72 32 20 2e 2e 2e 0a 20 20 20   THEN r2 ....   
194d0 20 2a 2a 20 20 20 20 20 20 20 20 57 48 45 4e 20   **        WHEN 
194e0 78 3d 65 4e 20 54 48 45 4e 20 72 4e 20 45 4c 53  x=eN THEN rN ELS
194f0 45 20 79 20 45 4e 44 0a 20 20 20 20 2a 2a 0a 20  E y END.    **. 
19500 20 20 20 2a 2a 20 58 20 28 69 66 20 69 74 20 65     ** X (if it e
19510 78 69 73 74 73 29 20 69 73 20 69 6e 20 70 45 78  xists) is in pEx
19520 70 72 2d 3e 70 4c 65 66 74 2e 0a 20 20 20 20 2a  pr->pLeft..    *
19530 2a 20 59 20 69 73 20 69 6e 20 74 68 65 20 6c 61  * Y is in the la
19540 73 74 20 65 6c 65 6d 65 6e 74 20 6f 66 20 70 45  st element of pE
19550 78 70 72 2d 3e 78 2e 70 4c 69 73 74 20 69 66 20  xpr->x.pList if 
19560 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e  pExpr->x.pList->
19570 6e 45 78 70 72 20 69 73 0a 20 20 20 20 2a 2a 20  nExpr is.    ** 
19580 6f 64 64 2e 20 20 54 68 65 20 59 20 69 73 20 61  odd.  The Y is a
19590 6c 73 6f 20 6f 70 74 69 6f 6e 61 6c 2e 20 20 49  lso optional.  I
195a0 66 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66 20  f the number of 
195b0 65 6c 65 6d 65 6e 74 73 20 69 6e 20 78 2e 70 4c  elements in x.pL
195c0 69 73 74 0a 20 20 20 20 2a 2a 20 69 73 20 65 76  ist.    ** is ev
195d0 65 6e 2c 20 74 68 65 6e 20 59 20 69 73 20 6f 6d  en, then Y is om
195e0 69 74 74 65 64 20 61 6e 64 20 74 68 65 20 22 6f  itted and the "o
195f0 74 68 65 72 77 69 73 65 22 20 72 65 73 75 6c 74  therwise" result
19600 20 69 73 20 4e 55 4c 4c 2e 0a 20 20 20 20 2a 2a   is NULL..    **
19610 20 45 69 20 69 73 20 69 6e 20 70 45 78 70 72 2d   Ei is in pExpr-
19620 3e 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 5d 20 61  >pList->a[i*2] a
19630 6e 64 20 52 69 20 69 73 20 70 45 78 70 72 2d 3e  nd Ri is pExpr->
19640 70 4c 69 73 74 2d 3e 61 5b 69 2a 32 2b 31 5d 2e  pList->a[i*2+1].
19650 0a 20 20 20 20 2a 2a 0a 20 20 20 20 2a 2a 20 54  .    **.    ** T
19660 68 65 20 72 65 73 75 6c 74 20 6f 66 20 74 68 65  he result of the
19670 20 65 78 70 72 65 73 73 69 6f 6e 20 69 73 20 74   expression is t
19680 68 65 20 52 69 20 66 6f 72 20 74 68 65 20 66 69  he Ri for the fi
19690 72 73 74 20 6d 61 74 63 68 69 6e 67 20 45 69 2c  rst matching Ei,
196a0 0a 20 20 20 20 2a 2a 20 6f 72 20 69 66 20 74 68  .    ** or if th
196b0 65 72 65 20 69 73 20 6e 6f 20 6d 61 74 63 68 69  ere is no matchi
196c0 6e 67 20 45 69 2c 20 74 68 65 20 45 4c 53 45 20  ng Ei, the ELSE 
196d0 74 65 72 6d 20 59 2c 20 6f 72 20 69 66 20 74 68  term Y, or if th
196e0 65 72 65 20 69 73 0a 20 20 20 20 2a 2a 20 6e 6f  ere is.    ** no
196f0 20 45 4c 53 45 20 74 65 72 6d 2c 20 4e 55 4c 4c   ELSE term, NULL
19700 2e 0a 20 20 20 20 2a 2f 0a 20 20 20 20 64 65 66  ..    */.    def
19710 61 75 6c 74 3a 20 61 73 73 65 72 74 28 20 6f 70  ault: assert( op
19720 3d 3d 54 4b 5f 43 41 53 45 20 29 3b 20 7b 0a 20  ==TK_CASE ); {. 
19730 20 20 20 20 20 69 6e 74 20 65 6e 64 4c 61 62 65       int endLabe
19740 6c 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20  l;              
19750 20 20 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c         /* GOTO l
19760 61 62 65 6c 20 66 6f 72 20 65 6e 64 20 6f 66 20  abel for end of 
19770 43 41 53 45 20 73 74 6d 74 20 2a 2f 0a 20 20 20  CASE stmt */.   
19780 20 20 20 69 6e 74 20 6e 65 78 74 43 61 73 65 3b     int nextCase;
19790 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197a0 20 20 20 20 20 2f 2a 20 47 4f 54 4f 20 6c 61 62       /* GOTO lab
197b0 65 6c 20 66 6f 72 20 6e 65 78 74 20 57 48 45 4e  el for next WHEN
197c0 20 63 6c 61 75 73 65 20 2a 2f 0a 20 20 20 20 20   clause */.     
197d0 20 69 6e 74 20 6e 45 78 70 72 3b 20 20 20 20 20   int nExpr;     
197e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
197f0 20 20 20 2f 2a 20 32 78 20 6e 75 6d 62 65 72 20     /* 2x number 
19800 6f 66 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f  of WHEN terms */
19810 0a 20 20 20 20 20 20 69 6e 74 20 69 3b 20 20 20  .      int i;   
19820 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
19830 20 20 20 20 20 20 20 20 20 2f 2a 20 4c 6f 6f 70           /* Loop
19840 20 63 6f 75 6e 74 65 72 20 2a 2f 0a 20 20 20 20   counter */.    
19850 20 20 45 78 70 72 4c 69 73 74 20 2a 70 45 4c 69    ExprList *pELi
19860 73 74 3b 20 20 20 20 20 20 20 20 20 20 20 20 20  st;             
19870 20 20 20 20 2f 2a 20 4c 69 73 74 20 6f 66 20 57      /* List of W
19880 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20 20 20  HEN terms */.   
19890 20 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69     struct ExprLi
198a0 73 74 5f 69 74 65 6d 20 2a 61 4c 69 73 74 65 6c  st_item *aListel
198b0 65 6d 3b 20 20 2f 2a 20 41 72 72 61 79 20 6f 66  em;  /* Array of
198c0 20 57 48 45 4e 20 74 65 72 6d 73 20 2a 2f 0a 20   WHEN terms */. 
198d0 20 20 20 20 20 45 78 70 72 20 6f 70 43 6f 6d 70       Expr opComp
198e0 61 72 65 3b 20 20 20 20 20 20 20 20 20 20 20 20  are;            
198f0 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20 58 3d         /* The X=
19900 3d 45 69 20 65 78 70 72 65 73 73 69 6f 6e 20 2a  =Ei expression *
19910 2f 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 58  /.      Expr *pX
19920 3b 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ;               
19930 20 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65            /* The
19940 20 58 20 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f   X expression */
19950 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70 54 65  .      Expr *pTe
19960 73 74 20 3d 20 30 3b 20 20 20 20 20 20 20 20 20  st = 0;         
19970 20 20 20 20 20 20 20 20 20 2f 2a 20 58 3d 3d 45           /* X==E
19980 69 20 28 66 6f 72 6d 20 41 29 20 6f 72 20 6a 75  i (form A) or ju
19990 73 74 20 45 69 20 28 66 6f 72 6d 20 42 29 20 2a  st Ei (form B) *
199a0 2f 0a 20 20 20 20 20 20 56 56 41 5f 4f 4e 4c 59  /.      VVA_ONLY
199b0 28 20 69 6e 74 20 69 43 61 63 68 65 4c 65 76 65  ( int iCacheLeve
199c0 6c 20 3d 20 70 50 61 72 73 65 2d 3e 69 43 61 63  l = pParse->iCac
199d0 68 65 4c 65 76 65 6c 3b 20 29 0a 0a 20 20 20 20  heLevel; )..    
199e0 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48    assert( !ExprH
199f0 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72  asProperty(pExpr
19a00 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29 20  , EP_xIsSelect) 
19a10 26 26 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  && pExpr->x.pLis
19a20 74 20 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  t );.      asser
19a30 74 28 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74  t(pExpr->x.pList
19a40 2d 3e 6e 45 78 70 72 20 3e 20 30 29 3b 0a 20 20  ->nExpr > 0);.  
19a50 20 20 20 20 70 45 4c 69 73 74 20 3d 20 70 45 78      pEList = pEx
19a60 70 72 2d 3e 78 2e 70 4c 69 73 74 3b 0a 20 20 20  pr->x.pList;.   
19a70 20 20 20 61 4c 69 73 74 65 6c 65 6d 20 3d 20 70     aListelem = p
19a80 45 4c 69 73 74 2d 3e 61 3b 0a 20 20 20 20 20 20  EList->a;.      
19a90 6e 45 78 70 72 20 3d 20 70 45 4c 69 73 74 2d 3e  nExpr = pEList->
19aa0 6e 45 78 70 72 3b 0a 20 20 20 20 20 20 65 6e 64  nExpr;.      end
19ab0 4c 61 62 65 6c 20 3d 20 73 71 6c 69 74 65 33 56  Label = sqlite3V
19ac0 64 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b  dbeMakeLabel(v);
19ad0 0a 20 20 20 20 20 20 69 66 28 20 28 70 58 20 3d  .      if( (pX =
19ae0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 21 3d   pExpr->pLeft)!=
19af0 30 20 29 7b 0a 20 20 20 20 20 20 20 20 74 65 6d  0 ){.        tem
19b00 70 58 20 3d 20 2a 70 58 3b 0a 20 20 20 20 20 20  pX = *pX;.      
19b10 20 20 74 65 73 74 63 61 73 65 28 20 70 58 2d 3e    testcase( pX->
19b20 6f 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 29 3b  op==TK_COLUMN );
19b30 0a 20 20 20 20 20 20 20 20 65 78 70 72 54 6f 52  .        exprToR
19b40 65 67 69 73 74 65 72 28 26 74 65 6d 70 58 2c 20  egister(&tempX, 
19b50 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
19b60 65 6d 70 28 70 50 61 72 73 65 2c 20 70 58 2c 20  emp(pParse, pX, 
19b70 26 72 65 67 46 72 65 65 31 29 29 3b 0a 20 20 20  &regFree1));.   
19b80 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72       testcase( r
19b90 65 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20  egFree1==0 );.  
19ba0 20 20 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e        opCompare.
19bb0 6f 70 20 3d 20 54 4b 5f 45 51 3b 0a 20 20 20 20  op = TK_EQ;.    
19bc0 20 20 20 20 6f 70 43 6f 6d 70 61 72 65 2e 70 4c      opCompare.pL
19bd0 65 66 74 20 3d 20 26 74 65 6d 70 58 3b 0a 20 20  eft = &tempX;.  
19be0 20 20 20 20 20 20 70 54 65 73 74 20 3d 20 26 6f        pTest = &o
19bf0 70 43 6f 6d 70 61 72 65 3b 0a 20 20 20 20 20 20  pCompare;.      
19c00 20 20 2f 2a 20 54 69 63 6b 65 74 20 62 33 35 31    /* Ticket b351
19c10 64 39 35 66 39 63 64 35 65 66 31 37 65 39 64 39  d95f9cd5ef17e9d9
19c20 64 62 61 65 31 38 66 35 63 61 38 36 31 31 31 39  dbae18f5ca861119
19c30 30 30 30 31 3a 0a 20 20 20 20 20 20 20 20 2a 2a  0001:.        **
19c40 20 54 68 65 20 76 61 6c 75 65 20 69 6e 20 72 65   The value in re
19c50 67 46 72 65 65 31 20 6d 69 67 68 74 20 67 65 74  gFree1 might get
19c60 20 53 43 6f 70 79 2d 65 64 20 69 6e 74 6f 20 74   SCopy-ed into t
19c70 68 65 20 66 69 6c 65 20 72 65 73 75 6c 74 2e 0a  he file result..
19c80 20 20 20 20 20 20 20 20 2a 2a 20 53 6f 20 6d 61          ** So ma
19c90 6b 65 20 73 75 72 65 20 74 68 61 74 20 74 68 65  ke sure that the
19ca0 20 72 65 67 46 72 65 65 31 20 72 65 67 69 73 74   regFree1 regist
19cb0 65 72 20 69 73 20 6e 6f 74 20 72 65 75 73 65 64  er is not reused
19cc0 20 66 6f 72 20 6f 74 68 65 72 0a 20 20 20 20 20   for other.     
19cd0 20 20 20 2a 2a 20 70 75 72 70 6f 73 65 73 20 61     ** purposes a
19ce0 6e 64 20 70 6f 73 73 69 62 6c 79 20 6f 76 65 72  nd possibly over
19cf0 77 72 69 74 74 65 6e 2e 20 20 2a 2f 0a 20 20 20  written.  */.   
19d00 20 20 20 20 20 72 65 67 46 72 65 65 31 20 3d 20       regFree1 = 
19d10 30 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  0;.      }.     
19d20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 6e 45 78 70   for(i=0; i<nExp
19d30 72 2d 31 3b 20 69 3d 69 2b 32 29 7b 0a 20 20 20  r-1; i=i+2){.   
19d40 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19d50 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65  CachePush(pParse
19d60 29 3b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70  );.        if( p
19d70 58 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 61  X ){.          a
19d80 73 73 65 72 74 28 20 70 54 65 73 74 21 3d 30 20  ssert( pTest!=0 
19d90 29 3b 0a 20 20 20 20 20 20 20 20 20 20 6f 70 43  );.          opC
19da0 6f 6d 70 61 72 65 2e 70 52 69 67 68 74 20 3d 20  ompare.pRight = 
19db0 61 4c 69 73 74 65 6c 65 6d 5b 69 5d 2e 70 45 78  aListelem[i].pEx
19dc0 70 72 3b 0a 20 20 20 20 20 20 20 20 7d 65 6c 73  pr;.        }els
19dd0 65 7b 0a 20 20 20 20 20 20 20 20 20 20 70 54 65  e{.          pTe
19de0 73 74 20 3d 20 61 4c 69 73 74 65 6c 65 6d 5b 69  st = aListelem[i
19df0 5d 2e 70 45 78 70 72 3b 0a 20 20 20 20 20 20 20  ].pExpr;.       
19e00 20 7d 0a 20 20 20 20 20 20 20 20 6e 65 78 74 43   }.        nextC
19e10 61 73 65 20 3d 20 73 71 6c 69 74 65 33 56 64 62  ase = sqlite3Vdb
19e20 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20  eMakeLabel(v);. 
19e30 20 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28         testcase(
19e40 20 70 54 65 73 74 2d 3e 6f 70 3d 3d 54 4b 5f 43   pTest->op==TK_C
19e50 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20 20  OLUMN );.       
19e60 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
19e70 6c 73 65 28 70 50 61 72 73 65 2c 20 70 54 65 73  lse(pParse, pTes
19e80 74 2c 20 6e 65 78 74 43 61 73 65 2c 20 53 51 4c  t, nextCase, SQL
19e90 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b  ITE_JUMPIFNULL);
19ea0 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
19eb0 65 28 20 61 4c 69 73 74 65 6c 65 6d 5b 69 2b 31  e( aListelem[i+1
19ec0 5d 2e 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f  ].pExpr->op==TK_
19ed0 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20 20 20  COLUMN );.      
19ee0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
19ef0 65 28 70 50 61 72 73 65 2c 20 61 4c 69 73 74 65  e(pParse, aListe
19f00 6c 65 6d 5b 69 2b 31 5d 2e 70 45 78 70 72 2c 20  lem[i+1].pExpr, 
19f10 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20 20 20  target);.       
19f20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f   sqlite3VdbeAddO
19f30 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30  p2(v, OP_Goto, 0
19f40 2c 20 65 6e 64 4c 61 62 65 6c 29 3b 0a 20 20 20  , endLabel);.   
19f50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
19f60 43 61 63 68 65 50 6f 70 28 70 50 61 72 73 65 29  CachePop(pParse)
19f70 3b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  ;.        sqlite
19f80 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61 62 65  3VdbeResolveLabe
19f90 6c 28 76 2c 20 6e 65 78 74 43 61 73 65 29 3b 0a  l(v, nextCase);.
19fa0 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 69 66        }.      if
19fb0 28 20 28 6e 45 78 70 72 26 31 29 21 3d 30 20 29  ( (nExpr&1)!=0 )
19fc0 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65  {.        sqlite
19fd0 33 45 78 70 72 43 61 63 68 65 50 75 73 68 28 70  3ExprCachePush(p
19fe0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 20 20  Parse);.        
19ff0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 28  sqlite3ExprCode(
1a000 70 50 61 72 73 65 2c 20 70 45 4c 69 73 74 2d 3e  pParse, pEList->
1a010 61 5b 6e 45 78 70 72 2d 31 5d 2e 70 45 78 70 72  a[nExpr-1].pExpr
1a020 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 20 20 20  , target);.     
1a030 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61     sqlite3ExprCa
1a040 63 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a  chePop(pParse);.
1a050 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20        }else{.   
1a060 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65       sqlite3Vdbe
1a070 41 64 64 4f 70 32 28 76 2c 20 4f 50 5f 4e 75 6c  AddOp2(v, OP_Nul
1a080 6c 2c 20 30 2c 20 74 61 72 67 65 74 29 3b 0a 20  l, 0, target);. 
1a090 20 20 20 20 20 7d 0a 20 20 20 20 20 20 61 73 73       }.      ass
1a0a0 65 72 74 28 20 64 62 2d 3e 6d 61 6c 6c 6f 63 46  ert( db->mallocF
1a0b0 61 69 6c 65 64 20 7c 7c 20 70 50 61 72 73 65 2d  ailed || pParse-
1a0c0 3e 6e 45 72 72 3e 30 20 0a 20 20 20 20 20 20 20  >nErr>0 .       
1a0d0 20 20 20 20 7c 7c 20 70 50 61 72 73 65 2d 3e 69      || pParse->i
1a0e0 43 61 63 68 65 4c 65 76 65 6c 3d 3d 69 43 61 63  CacheLevel==iCac
1a0f0 68 65 4c 65 76 65 6c 20 29 3b 0a 20 20 20 20 20  heLevel );.     
1a100 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73 6f   sqlite3VdbeReso
1a110 6c 76 65 4c 61 62 65 6c 28 76 2c 20 65 6e 64 4c  lveLabel(v, endL
1a120 61 62 65 6c 29 3b 0a 20 20 20 20 20 20 62 72 65  abel);.      bre
1a130 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65  ak;.    }.#ifnde
1a140 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54 52  f SQLITE_OMIT_TR
1a150 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20 54  IGGER.    case T
1a160 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20 20  K_RAISE: {.     
1a170 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1a180 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 52 6f 6c  affinity==OE_Rol
1a190 6c 62 61 63 6b 20 0a 20 20 20 20 20 20 20 20 20  lback .         
1a1a0 20 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69    || pExpr->affi
1a1b0 6e 69 74 79 3d 3d 4f 45 5f 41 62 6f 72 74 0a 20  nity==OE_Abort. 
1a1c0 20 20 20 20 20 20 20 20 20 20 7c 7c 20 70 45 78            || pEx
1a1d0 70 72 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45  pr->affinity==OE
1a1e0 5f 46 61 69 6c 0a 20 20 20 20 20 20 20 20 20 20  _Fail.          
1a1f0 20 7c 7c 20 70 45 78 70 72 2d 3e 61 66 66 69 6e   || pExpr->affin
1a200 69 74 79 3d 3d 4f 45 5f 49 67 6e 6f 72 65 0a 20  ity==OE_Ignore. 
1a210 20 20 20 20 20 29 3b 0a 20 20 20 20 20 20 69 66       );.      if
1a220 28 20 21 70 50 61 72 73 65 2d 3e 70 54 72 69 67  ( !pParse->pTrig
1a230 67 65 72 54 61 62 20 29 7b 0a 20 20 20 20 20 20  gerTab ){.      
1a240 20 20 73 71 6c 69 74 65 33 45 72 72 6f 72 4d 73    sqlite3ErrorMs
1a250 67 28 70 50 61 72 73 65 2c 0a 20 20 20 20 20 20  g(pParse,.      
1a260 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a270 20 22 52 41 49 53 45 28 29 20 6d 61 79 20 6f 6e   "RAISE() may on
1a280 6c 79 20 62 65 20 75 73 65 64 20 77 69 74 68 69  ly be used withi
1a290 6e 20 61 20 74 72 69 67 67 65 72 2d 70 72 6f 67  n a trigger-prog
1a2a0 72 61 6d 22 29 3b 0a 20 20 20 20 20 20 20 20 72  ram");.        r
1a2b0 65 74 75 72 6e 20 30 3b 0a 20 20 20 20 20 20 7d  eturn 0;.      }
1a2c0 0a 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72  .      if( pExpr
1a2d0 2d 3e 61 66 66 69 6e 69 74 79 3d 3d 4f 45 5f 41  ->affinity==OE_A
1a2e0 62 6f 72 74 20 29 7b 0a 20 20 20 20 20 20 20 20  bort ){.        
1a2f0 73 71 6c 69 74 65 33 4d 61 79 41 62 6f 72 74 28  sqlite3MayAbort(
1a300 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 7d  pParse);.      }
1a310 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21  .      assert( !
1a320 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
1a330 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56 61 6c  pExpr, EP_IntVal
1a340 75 65 29 20 29 3b 0a 20 20 20 20 20 20 69 66 28  ue) );.      if(
1a350 20 70 45 78 70 72 2d 3e 61 66 66 69 6e 69 74 79   pExpr->affinity
1a360 3d 3d 4f 45 5f 49 67 6e 6f 72 65 20 29 7b 0a 20  ==OE_Ignore ){. 
1a370 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64         sqlite3Vd
1a380 62 65 41 64 64 4f 70 34 28 0a 20 20 20 20 20 20  beAddOp4(.      
1a390 20 20 20 20 20 20 76 2c 20 4f 50 5f 48 61 6c 74        v, OP_Halt
1a3a0 2c 20 53 51 4c 49 54 45 5f 4f 4b 2c 20 4f 45 5f  , SQLITE_OK, OE_
1a3b0 49 67 6e 6f 72 65 2c 20 30 2c 20 70 45 78 70 72  Ignore, 0, pExpr
1a3c0 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 30 29 3b 0a 20  ->u.zToken,0);. 
1a3d0 20 20 20 20 20 20 20 56 64 62 65 43 6f 76 65 72         VdbeCover
1a3e0 61 67 65 28 76 29 3b 0a 20 20 20 20 20 20 7d 65  age(v);.      }e
1a3f0 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c  lse{.        sql
1a400 69 74 65 33 48 61 6c 74 43 6f 6e 73 74 72 61 69  ite3HaltConstrai
1a410 6e 74 28 70 50 61 72 73 65 2c 20 53 51 4c 49 54  nt(pParse, SQLIT
1a420 45 5f 43 4f 4e 53 54 52 41 49 4e 54 5f 54 52 49  E_CONSTRAINT_TRI
1a430 47 47 45 52 2c 0a 20 20 20 20 20 20 20 20 20 20  GGER,.          
1a440 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1a450 20 20 20 20 70 45 78 70 72 2d 3e 61 66 66 69 6e      pExpr->affin
1a460 69 74 79 2c 20 70 45 78 70 72 2d 3e 75 2e 7a 54  ity, pExpr->u.zT
1a470 6f 6b 65 6e 2c 20 30 2c 20 30 29 3b 0a 20 20 20  oken, 0, 0);.   
1a480 20 20 20 7d 0a 0a 20 20 20 20 20 20 62 72 65 61     }..      brea
1a490 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a  k;.    }.#endif.
1a4a0 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
1a4b0 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
1a4c0 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
1a4d0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
1a4e0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
1a4f0 65 67 46 72 65 65 32 29 3b 0a 20 20 72 65 74 75  egFree2);.  retu
1a500 72 6e 20 69 6e 52 65 67 3b 0a 7d 0a 0a 2f 2a 0a  rn inReg;.}../*.
1a510 2a 2a 20 46 61 63 74 6f 72 20 6f 75 74 20 74 68  ** Factor out th
1a520 65 20 63 6f 64 65 20 6f 66 20 74 68 65 20 67 69  e code of the gi
1a530 76 65 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 74  ven expression t
1a540 6f 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f 6e  o initialization
1a550 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20 73   time..*/.void s
1a560 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1a570 49 6e 69 74 28 0a 20 20 50 61 72 73 65 20 2a 70  Init(.  Parse *p
1a580 50 61 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72  Parse,    /* Par
1a590 73 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a 2f 0a  sing context */.
1a5a0 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20 20    Expr *pExpr,  
1a5b0 20 20 20 20 2f 2a 20 54 68 65 20 65 78 70 72 65      /* The expre
1a5c0 73 73 69 6f 6e 20 74 6f 20 63 6f 64 65 20 77 68  ssion to code wh
1a5d0 65 6e 20 74 68 65 20 56 44 42 45 20 69 6e 69 74  en the VDBE init
1a5e0 69 61 6c 69 7a 65 73 20 2a 2f 0a 20 20 69 6e 74  ializes */.  int
1a5f0 20 72 65 67 44 65 73 74 2c 20 20 20 20 20 20 2f   regDest,      /
1a600 2a 20 53 74 6f 72 65 20 74 68 65 20 76 61 6c 75  * Store the valu
1a610 65 20 69 6e 20 74 68 69 73 20 72 65 67 69 73 74  e in this regist
1a620 65 72 20 2a 2f 0a 20 20 75 38 20 72 65 75 73 61  er */.  u8 reusa
1a630 62 6c 65 20 20 20 20 20 20 20 2f 2a 20 54 72 75  ble       /* Tru
1a640 65 20 69 66 20 74 68 69 73 20 65 78 70 72 65 73  e if this expres
1a650 73 69 6f 6e 20 69 73 20 72 65 75 73 61 62 6c 65  sion is reusable
1a660 20 2a 2f 0a 29 7b 0a 20 20 45 78 70 72 4c 69 73   */.){.  ExprLis
1a670 74 20 2a 70 3b 0a 20 20 61 73 73 65 72 74 28 20  t *p;.  assert( 
1a680 43 6f 6e 73 74 46 61 63 74 6f 72 4f 6b 28 70 50  ConstFactorOk(pP
1a690 61 72 73 65 29 20 29 3b 0a 20 20 70 20 3d 20 70  arse) );.  p = p
1a6a0 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70  Parse->pConstExp
1a6b0 72 3b 0a 20 20 70 45 78 70 72 20 3d 20 73 71 6c  r;.  pExpr = sql
1a6c0 69 74 65 33 45 78 70 72 44 75 70 28 70 50 61 72  ite3ExprDup(pPar
1a6d0 73 65 2d 3e 64 62 2c 20 70 45 78 70 72 2c 20 30  se->db, pExpr, 0
1a6e0 29 3b 0a 20 20 70 20 3d 20 73 71 6c 69 74 65 33  );.  p = sqlite3
1a6f0 45 78 70 72 4c 69 73 74 41 70 70 65 6e 64 28 70  ExprListAppend(p
1a700 50 61 72 73 65 2c 20 70 2c 20 70 45 78 70 72 29  Parse, p, pExpr)
1a710 3b 0a 20 20 69 66 28 20 70 20 29 7b 0a 20 20 20  ;.  if( p ){.   
1a720 20 20 73 74 72 75 63 74 20 45 78 70 72 4c 69 73    struct ExprLis
1a730 74 5f 69 74 65 6d 20 2a 70 49 74 65 6d 20 3d 20  t_item *pItem = 
1a740 26 70 2d 3e 61 5b 70 2d 3e 6e 45 78 70 72 2d 31  &p->a[p->nExpr-1
1a750 5d 3b 0a 20 20 20 20 20 70 49 74 65 6d 2d 3e 75  ];.     pItem->u
1a760 2e 69 43 6f 6e 73 74 45 78 70 72 52 65 67 20 3d  .iConstExprReg =
1a770 20 72 65 67 44 65 73 74 3b 0a 20 20 20 20 20 70   regDest;.     p
1a780 49 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 3d  Item->reusable =
1a790 20 72 65 75 73 61 62 6c 65 3b 0a 20 20 7d 0a 20   reusable;.  }. 
1a7a0 20 70 50 61 72 73 65 2d 3e 70 43 6f 6e 73 74 45   pParse->pConstE
1a7b0 78 70 72 20 3d 20 70 3b 0a 7d 0a 0a 2f 2a 0a 2a  xpr = p;.}../*.*
1a7c0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1a7d0 74 6f 20 65 76 61 6c 75 61 74 65 20 61 6e 20 65  to evaluate an e
1a7e0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 73 74  xpression and st
1a7f0 6f 72 65 20 74 68 65 20 72 65 73 75 6c 74 73 0a  ore the results.
1a800 2a 2a 20 69 6e 74 6f 20 61 20 72 65 67 69 73 74  ** into a regist
1a810 65 72 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20  er.  Return the 
1a820 72 65 67 69 73 74 65 72 20 6e 75 6d 62 65 72 20  register number 
1a830 77 68 65 72 65 20 74 68 65 20 72 65 73 75 6c 74  where the result
1a840 73 0a 2a 2a 20 61 72 65 20 73 74 6f 72 65 64 2e  s.** are stored.
1a850 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 72 65  .**.** If the re
1a860 67 69 73 74 65 72 20 69 73 20 61 20 74 65 6d 70  gister is a temp
1a870 6f 72 61 72 79 20 72 65 67 69 73 74 65 72 20 74  orary register t
1a880 68 61 74 20 63 61 6e 20 62 65 20 64 65 61 6c 6c  hat can be deall
1a890 6f 63 61 74 65 64 2c 0a 2a 2a 20 74 68 65 6e 20  ocated,.** then 
1a8a0 77 72 69 74 65 20 69 74 73 20 6e 75 6d 62 65 72  write its number
1a8b0 20 69 6e 74 6f 20 2a 70 52 65 67 2e 20 20 49 66   into *pReg.  If
1a8c0 20 74 68 65 20 72 65 73 75 6c 74 20 72 65 67 69   the result regi
1a8d0 73 74 65 72 20 69 73 20 6e 6f 74 0a 2a 2a 20 61  ster is not.** a
1a8e0 20 74 65 6d 70 6f 72 61 72 79 2c 20 74 68 65 6e   temporary, then
1a8f0 20 73 65 74 20 2a 70 52 65 67 20 74 6f 20 7a 65   set *pReg to ze
1a900 72 6f 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 70 45 78  ro..**.** If pEx
1a910 70 72 20 69 73 20 61 20 63 6f 6e 73 74 61 6e 74  pr is a constant
1a920 2c 20 74 68 65 6e 20 74 68 69 73 20 72 6f 75 74  , then this rout
1a930 69 6e 65 20 6d 69 67 68 74 20 67 65 6e 65 72 61  ine might genera
1a940 74 65 20 74 68 69 73 0a 2a 2a 20 63 6f 64 65 20  te this.** code 
1a950 74 6f 20 66 69 6c 6c 20 74 68 65 20 72 65 67 69  to fill the regi
1a960 73 74 65 72 20 69 6e 20 74 68 65 20 69 6e 69 74  ster in the init
1a970 69 61 6c 69 7a 61 74 69 6f 6e 20 73 65 63 74 69  ialization secti
1a980 6f 6e 20 6f 66 20 74 68 65 0a 2a 2a 20 56 44 42  on of the.** VDB
1a990 45 20 70 72 6f 67 72 61 6d 2c 20 69 6e 20 6f 72  E program, in or
1a9a0 64 65 72 20 74 6f 20 66 61 63 74 6f 72 20 69 74  der to factor it
1a9b0 20 6f 75 74 20 6f 66 20 74 68 65 20 65 76 61 6c   out of the eval
1a9c0 75 61 74 69 6f 6e 20 6c 6f 6f 70 2e 0a 2a 2f 0a  uation loop..*/.
1a9d0 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 43  int sqlite3ExprC
1a9e0 6f 64 65 54 65 6d 70 28 50 61 72 73 65 20 2a 70  odeTemp(Parse *p
1a9f0 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70 45 78  Parse, Expr *pEx
1aa00 70 72 2c 20 69 6e 74 20 2a 70 52 65 67 29 7b 0a  pr, int *pReg){.
1aa10 20 20 69 6e 74 20 72 32 3b 0a 20 20 70 45 78 70    int r2;.  pExp
1aa20 72 20 3d 20 73 71 6c 69 74 65 33 45 78 70 72 53  r = sqlite3ExprS
1aa30 6b 69 70 43 6f 6c 6c 61 74 65 28 70 45 78 70 72  kipCollate(pExpr
1aa40 29 3b 0a 20 20 69 66 28 20 43 6f 6e 73 74 46 61  );.  if( ConstFa
1aa50 63 74 6f 72 4f 6b 28 70 50 61 72 73 65 29 0a 20  ctorOk(pParse). 
1aa60 20 20 26 26 20 70 45 78 70 72 2d 3e 6f 70 21 3d    && pExpr->op!=
1aa70 54 4b 5f 52 45 47 49 53 54 45 52 0a 20 20 20 26  TK_REGISTER.   &
1aa80 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1aa90 6f 6e 73 74 61 6e 74 4e 6f 74 4a 6f 69 6e 28 70  onstantNotJoin(p
1aaa0 45 78 70 72 29 0a 20 20 29 7b 0a 20 20 20 20 45  Expr).  ){.    E
1aab0 78 70 72 4c 69 73 74 20 2a 70 20 3d 20 70 50 61  xprList *p = pPa
1aac0 72 73 65 2d 3e 70 43 6f 6e 73 74 45 78 70 72 3b  rse->pConstExpr;
1aad0 0a 20 20 20 20 69 6e 74 20 69 3b 0a 20 20 20 20  .    int i;.    
1aae0 2a 70 52 65 67 20 20 3d 20 30 3b 0a 20 20 20 20  *pReg  = 0;.    
1aaf0 69 66 28 20 70 20 29 7b 0a 20 20 20 20 20 20 73  if( p ){.      s
1ab00 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f 69  truct ExprList_i
1ab10 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 20 20  tem *pItem;.    
1ab20 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 2d 3e 61    for(pItem=p->a
1ab30 2c 20 69 3d 70 2d 3e 6e 45 78 70 72 3b 20 69 3e  , i=p->nExpr; i>
1ab40 30 3b 20 70 49 74 65 6d 2b 2b 2c 20 69 2d 2d 29  0; pItem++, i--)
1ab50 7b 0a 20 20 20 20 20 20 20 20 69 66 28 20 70 49  {.        if( pI
1ab60 74 65 6d 2d 3e 72 65 75 73 61 62 6c 65 20 26 26  tem->reusable &&
1ab70 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
1ab80 61 72 65 28 70 49 74 65 6d 2d 3e 70 45 78 70 72  are(pItem->pExpr
1ab90 2c 70 45 78 70 72 2c 2d 31 29 3d 3d 30 20 29 7b  ,pExpr,-1)==0 ){
1aba0 0a 20 20 20 20 20 20 20 20 20 20 72 65 74 75 72  .          retur
1abb0 6e 20 70 49 74 65 6d 2d 3e 75 2e 69 43 6f 6e 73  n pItem->u.iCons
1abc0 74 45 78 70 72 52 65 67 3b 0a 20 20 20 20 20 20  tExprReg;.      
1abd0 20 20 7d 0a 20 20 20 20 20 20 7d 0a 20 20 20 20    }.      }.    
1abe0 7d 0a 20 20 20 20 72 32 20 3d 20 2b 2b 70 50 61  }.    r2 = ++pPa
1abf0 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20 20 73  rse->nMem;.    s
1ac00 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 41 74  qlite3ExprCodeAt
1ac10 49 6e 69 74 28 70 50 61 72 73 65 2c 20 70 45 78  Init(pParse, pEx
1ac20 70 72 2c 20 72 32 2c 20 31 29 3b 0a 20 20 7d 65  pr, r2, 1);.  }e
1ac30 6c 73 65 7b 0a 20 20 20 20 69 6e 74 20 72 31 20  lse{.    int r1 
1ac40 3d 20 73 71 6c 69 74 65 33 47 65 74 54 65 6d 70  = sqlite3GetTemp
1ac50 52 65 67 28 70 50 61 72 73 65 29 3b 0a 20 20 20  Reg(pParse);.   
1ac60 20 72 32 20 3d 20 73 71 6c 69 74 65 33 45 78 70   r2 = sqlite3Exp
1ac70 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1ac80 73 65 2c 20 70 45 78 70 72 2c 20 72 31 29 3b 0a  se, pExpr, r1);.
1ac90 20 20 20 20 69 66 28 20 72 32 3d 3d 72 31 20 29      if( r2==r1 )
1aca0 7b 0a 20 20 20 20 20 20 2a 70 52 65 67 20 3d 20  {.      *pReg = 
1acb0 72 31 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a 20  r1;.    }else{. 
1acc0 20 20 20 20 20 73 71 6c 69 74 65 33 52 65 6c 65       sqlite3Rele
1acd0 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1ace0 65 2c 20 72 31 29 3b 0a 20 20 20 20 20 20 2a 70  e, r1);.      *p
1acf0 52 65 67 20 3d 20 30 3b 0a 20 20 20 20 7d 0a 20  Reg = 0;.    }. 
1ad00 20 7d 0a 20 20 72 65 74 75 72 6e 20 72 32 3b 0a   }.  return r2;.
1ad10 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1ad20 65 20 63 6f 64 65 20 74 68 61 74 20 77 69 6c 6c  e code that will
1ad30 20 65 76 61 6c 75 61 74 65 20 65 78 70 72 65 73   evaluate expres
1ad40 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64 20 73  sion pExpr and s
1ad50 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65 73 75  tore the.** resu
1ad60 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65 72 20  lts in register 
1ad70 74 61 72 67 65 74 2e 20 20 54 68 65 20 72 65 73  target.  The res
1ad80 75 6c 74 73 20 61 72 65 20 67 75 61 72 61 6e 74  ults are guarant
1ad90 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a 2a 2a  eed to appear.**
1ada0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1adb0 67 65 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c  get..*/.void sql
1adc0 69 74 65 33 45 78 70 72 43 6f 64 65 28 50 61 72  ite3ExprCode(Par
1add0 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70 72  se *pParse, Expr
1ade0 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61 72   *pExpr, int tar
1adf0 67 65 74 29 7b 0a 20 20 69 6e 74 20 69 6e 52 65  get){.  int inRe
1ae00 67 3b 0a 0a 20 20 61 73 73 65 72 74 28 20 74 61  g;..  assert( ta
1ae10 72 67 65 74 3e 30 20 26 26 20 74 61 72 67 65 74  rget>0 && target
1ae20 3c 3d 70 50 61 72 73 65 2d 3e 6e 4d 65 6d 20 29  <=pParse->nMem )
1ae30 3b 0a 20 20 69 66 28 20 70 45 78 70 72 20 26 26  ;.  if( pExpr &&
1ae40 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 52   pExpr->op==TK_R
1ae50 45 47 49 53 54 45 52 20 29 7b 0a 20 20 20 20 73  EGISTER ){.    s
1ae60 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1ae70 28 70 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20  (pParse->pVdbe, 
1ae80 4f 50 5f 43 6f 70 79 2c 20 70 45 78 70 72 2d 3e  OP_Copy, pExpr->
1ae90 69 54 61 62 6c 65 2c 20 74 61 72 67 65 74 29 3b  iTable, target);
1aea0 0a 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 69 6e  .  }else{.    in
1aeb0 52 65 67 20 3d 20 73 71 6c 69 74 65 33 45 78 70  Reg = sqlite3Exp
1aec0 72 43 6f 64 65 54 61 72 67 65 74 28 70 50 61 72  rCodeTarget(pPar
1aed0 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1aee0 74 29 3b 0a 20 20 20 20 61 73 73 65 72 74 28 20  t);.    assert( 
1aef0 70 50 61 72 73 65 2d 3e 70 56 64 62 65 20 7c 7c  pParse->pVdbe ||
1af00 20 70 50 61 72 73 65 2d 3e 64 62 2d 3e 6d 61 6c   pParse->db->mal
1af10 6c 6f 63 46 61 69 6c 65 64 20 29 3b 0a 20 20 20  locFailed );.   
1af20 20 69 66 28 20 69 6e 52 65 67 21 3d 74 61 72 67   if( inReg!=targ
1af30 65 74 20 26 26 20 70 50 61 72 73 65 2d 3e 70 56  et && pParse->pV
1af40 64 62 65 20 29 7b 0a 20 20 20 20 20 20 73 71 6c  dbe ){.      sql
1af50 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 70  ite3VdbeAddOp2(p
1af60 50 61 72 73 65 2d 3e 70 56 64 62 65 2c 20 4f 50  Parse->pVdbe, OP
1af70 5f 53 43 6f 70 79 2c 20 69 6e 52 65 67 2c 20 74  _SCopy, inReg, t
1af80 61 72 67 65 74 29 3b 0a 20 20 20 20 7d 0a 20 20  arget);.    }.  
1af90 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  }.}../*.** Gener
1afa0 61 74 65 20 63 6f 64 65 20 74 68 61 74 20 77 69  ate code that wi
1afb0 6c 6c 20 65 76 61 6c 75 61 74 65 20 65 78 70 72  ll evaluate expr
1afc0 65 73 73 69 6f 6e 20 70 45 78 70 72 20 61 6e 64  ession pExpr and
1afd0 20 73 74 6f 72 65 20 74 68 65 0a 2a 2a 20 72 65   store the.** re
1afe0 73 75 6c 74 73 20 69 6e 20 72 65 67 69 73 74 65  sults in registe
1aff0 72 20 74 61 72 67 65 74 2e 20 20 54 68 65 20 72  r target.  The r
1b000 65 73 75 6c 74 73 20 61 72 65 20 67 75 61 72 61  esults are guara
1b010 6e 74 65 65 64 20 74 6f 20 61 70 70 65 61 72 0a  nteed to appear.
1b020 2a 2a 20 69 6e 20 72 65 67 69 73 74 65 72 20 74  ** in register t
1b030 61 72 67 65 74 2e 20 20 49 66 20 74 68 65 20 65  arget.  If the e
1b040 78 70 72 65 73 73 69 6f 6e 20 69 73 20 63 6f 6e  xpression is con
1b050 73 74 61 6e 74 2c 20 74 68 65 6e 20 74 68 69 73  stant, then this
1b060 20 72 6f 75 74 69 6e 65 0a 2a 2a 20 6d 69 67 68   routine.** migh
1b070 74 20 63 68 6f 6f 73 65 20 74 6f 20 63 6f 64 65  t choose to code
1b080 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1b090 61 74 20 69 6e 69 74 69 61 6c 69 7a 61 74 69 6f  at initializatio
1b0a0 6e 20 74 69 6d 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n time..*/.void 
1b0b0 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 46  sqlite3ExprCodeF
1b0c0 61 63 74 6f 72 61 62 6c 65 28 50 61 72 73 65 20  actorable(Parse 
1b0d0 2a 70 50 61 72 73 65 2c 20 45 78 70 72 20 2a 70  *pParse, Expr *p
1b0e0 45 78 70 72 2c 20 69 6e 74 20 74 61 72 67 65 74  Expr, int target
1b0f0 29 7b 0a 20 20 69 66 28 20 70 50 61 72 73 65 2d  ){.  if( pParse-
1b100 3e 6f 6b 43 6f 6e 73 74 46 61 63 74 6f 72 20 26  >okConstFactor &
1b110 26 20 73 71 6c 69 74 65 33 45 78 70 72 49 73 43  & sqlite3ExprIsC
1b120 6f 6e 73 74 61 6e 74 28 70 45 78 70 72 29 20 29  onstant(pExpr) )
1b130 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70  {.    sqlite3Exp
1b140 72 43 6f 64 65 41 74 49 6e 69 74 28 70 50 61 72  rCodeAtInit(pPar
1b150 73 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65  se, pExpr, targe
1b160 74 2c 20 30 29 3b 0a 20 20 7d 65 6c 73 65 7b 0a  t, 0);.  }else{.
1b170 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1b180 6f 64 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  ode(pParse, pExp
1b190 72 2c 20 74 61 72 67 65 74 29 3b 0a 20 20 7d 0a  r, target);.  }.
1b1a0 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1b1b0 65 20 63 6f 64 65 20 74 68 61 74 20 65 76 61 6c  e code that eval
1b1c0 75 74 65 73 20 74 68 65 20 67 69 76 65 6e 20 65  utes the given e
1b1d0 78 70 72 65 73 73 69 6f 6e 20 61 6e 64 20 70 75  xpression and pu
1b1e0 74 73 20 74 68 65 20 72 65 73 75 6c 74 0a 2a 2a  ts the result.**
1b1f0 20 69 6e 20 72 65 67 69 73 74 65 72 20 74 61 72   in register tar
1b200 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 41 6c 73 6f 20  get..**.** Also 
1b210 6d 61 6b 65 20 61 20 63 6f 70 79 20 6f 66 20 74  make a copy of t
1b220 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20 72 65  he expression re
1b230 73 75 6c 74 73 20 69 6e 74 6f 20 61 6e 6f 74 68  sults into anoth
1b240 65 72 20 22 63 61 63 68 65 22 20 72 65 67 69 73  er "cache" regis
1b250 74 65 72 0a 2a 2a 20 61 6e 64 20 6d 6f 64 69 66  ter.** and modif
1b260 79 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e  y the expression
1b270 20 73 6f 20 74 68 61 74 20 74 68 65 20 6e 65 78   so that the nex
1b280 74 20 74 69 6d 65 20 69 74 20 69 73 20 65 76 61  t time it is eva
1b290 6c 75 61 74 65 64 2c 0a 2a 2a 20 74 68 65 20 72  luated,.** the r
1b2a0 65 73 75 6c 74 20 69 73 20 61 20 63 6f 70 79 20  esult is a copy 
1b2b0 6f 66 20 74 68 65 20 63 61 63 68 65 20 72 65 67  of the cache reg
1b2c0 69 73 74 65 72 2e 0a 2a 2a 0a 2a 2a 20 54 68 69  ister..**.** Thi
1b2d0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
1b2e0 64 20 66 6f 72 20 65 78 70 72 65 73 73 69 6f 6e  d for expression
1b2f0 73 20 74 68 61 74 20 61 72 65 20 75 73 65 64 20  s that are used 
1b300 6d 75 6c 74 69 70 6c 65 20 0a 2a 2a 20 74 69 6d  multiple .** tim
1b310 65 73 2e 20 20 54 68 65 79 20 61 72 65 20 65 76  es.  They are ev
1b320 61 6c 75 61 74 65 64 20 6f 6e 63 65 20 61 6e 64  aluated once and
1b330 20 74 68 65 20 72 65 73 75 6c 74 73 20 6f 66 20   the results of 
1b340 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 0a 2a  the expression.*
1b350 2a 20 61 72 65 20 72 65 75 73 65 64 2e 0a 2a 2f  * are reused..*/
1b360 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 45 78 70  .void sqlite3Exp
1b370 72 43 6f 64 65 41 6e 64 43 61 63 68 65 28 50 61  rCodeAndCache(Pa
1b380 72 73 65 20 2a 70 50 61 72 73 65 2c 20 45 78 70  rse *pParse, Exp
1b390 72 20 2a 70 45 78 70 72 2c 20 69 6e 74 20 74 61  r *pExpr, int ta
1b3a0 72 67 65 74 29 7b 0a 20 20 56 64 62 65 20 2a 76  rget){.  Vdbe *v
1b3b0 20 3d 20 70 50 61 72 73 65 2d 3e 70 56 64 62 65   = pParse->pVdbe
1b3c0 3b 0a 20 20 69 6e 74 20 69 4d 65 6d 3b 0a 0a 20  ;.  int iMem;.. 
1b3d0 20 61 73 73 65 72 74 28 20 74 61 72 67 65 74 3e   assert( target>
1b3e0 30 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  0 );.  assert( p
1b3f0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 52 45 47  Expr->op!=TK_REG
1b400 49 53 54 45 52 20 29 3b 0a 20 20 73 71 6c 69 74  ISTER );.  sqlit
1b410 65 33 45 78 70 72 43 6f 64 65 28 70 50 61 72 73  e3ExprCode(pPars
1b420 65 2c 20 70 45 78 70 72 2c 20 74 61 72 67 65 74  e, pExpr, target
1b430 29 3b 0a 20 20 69 4d 65 6d 20 3d 20 2b 2b 70 50  );.  iMem = ++pP
1b440 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 73 71  arse->nMem;.  sq
1b450 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28  lite3VdbeAddOp2(
1b460 76 2c 20 4f 50 5f 43 6f 70 79 2c 20 74 61 72 67  v, OP_Copy, targ
1b470 65 74 2c 20 69 4d 65 6d 29 3b 0a 20 20 65 78 70  et, iMem);.  exp
1b480 72 54 6f 52 65 67 69 73 74 65 72 28 70 45 78 70  rToRegister(pExp
1b490 72 2c 20 69 4d 65 6d 29 3b 0a 7d 0a 0a 23 69 66  r, iMem);.}..#if
1b4a0 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1b4b0 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1b4c0 41 49 4e 29 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72  AIN)./*.** Gener
1b4d0 61 74 65 20 61 20 68 75 6d 61 6e 2d 72 65 61 64  ate a human-read
1b4e0 61 62 6c 65 20 65 78 70 6c 61 6e 61 74 69 6f 6e  able explanation
1b4f0 20 6f 66 20 61 6e 20 65 78 70 72 65 73 73 69 6f   of an expressio
1b500 6e 20 74 72 65 65 2e 0a 2a 2f 0a 76 6f 69 64 20  n tree..*/.void 
1b510 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1b520 70 72 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45  pr(Vdbe *pOut, E
1b530 78 70 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69  xpr *pExpr){.  i
1b540 6e 74 20 6f 70 3b 20 20 20 20 20 20 20 20 20 20  nt op;          
1b550 20 20 20 20 20 20 20 20 20 2f 2a 20 54 68 65 20           /* The 
1b560 6f 70 63 6f 64 65 20 62 65 69 6e 67 20 63 6f 64  opcode being cod
1b570 65 64 20 2a 2f 0a 20 20 63 6f 6e 73 74 20 63 68  ed */.  const ch
1b580 61 72 20 2a 7a 42 69 6e 4f 70 20 3d 20 30 3b 20  ar *zBinOp = 0; 
1b590 20 20 2f 2a 20 42 69 6e 61 72 79 20 6f 70 65 72    /* Binary oper
1b5a0 61 74 6f 72 20 2a 2f 0a 20 20 63 6f 6e 73 74 20  ator */.  const 
1b5b0 63 68 61 72 20 2a 7a 55 6e 69 4f 70 20 3d 20 30  char *zUniOp = 0
1b5c0 3b 20 20 20 2f 2a 20 55 6e 61 72 79 20 6f 70 65  ;   /* Unary ope
1b5d0 72 61 74 6f 72 20 2a 2f 0a 20 20 69 66 28 20 70  rator */.  if( p
1b5e0 45 78 70 72 3d 3d 30 20 29 7b 0a 20 20 20 20 6f  Expr==0 ){.    o
1b5f0 70 20 3d 20 54 4b 5f 4e 55 4c 4c 3b 0a 20 20 7d  p = TK_NULL;.  }
1b600 65 6c 73 65 7b 0a 20 20 20 20 6f 70 20 3d 20 70  else{.    op = p
1b610 45 78 70 72 2d 3e 6f 70 3b 0a 20 20 7d 0a 20 20  Expr->op;.  }.  
1b620 73 77 69 74 63 68 28 20 6f 70 20 29 7b 0a 20 20  switch( op ){.  
1b630 20 20 63 61 73 65 20 54 4b 5f 41 47 47 5f 43 4f    case TK_AGG_CO
1b640 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71  LUMN: {.      sq
1b650 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b660 74 66 28 70 4f 75 74 2c 20 22 41 47 47 7b 25 64  tf(pOut, "AGG{%d
1b670 3a 25 64 7d 22 2c 0a 20 20 20 20 20 20 20 20 20  :%d}",.         
1b680 20 20 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65     pExpr->iTable
1b690 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1b6a0 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1b6b0 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1b6c0 4b 5f 43 4f 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20  K_COLUMN: {.    
1b6d0 20 20 69 66 28 20 70 45 78 70 72 2d 3e 69 54 61    if( pExpr->iTa
1b6e0 62 6c 65 3c 30 20 29 7b 0a 20 20 20 20 20 20 20  ble<0 ){.       
1b6f0 20 2f 2a 20 54 68 69 73 20 6f 6e 6c 79 20 68 61   /* This only ha
1b700 70 70 65 6e 73 20 77 68 65 6e 20 63 6f 64 69 6e  ppens when codin
1b710 67 20 63 68 65 63 6b 20 63 6f 6e 73 74 72 61 69  g check constrai
1b720 6e 74 73 20 2a 2f 0a 20 20 20 20 20 20 20 20 73  nts */.        s
1b730 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b740 6e 74 66 28 70 4f 75 74 2c 20 22 43 4f 4c 55 4d  ntf(pOut, "COLUM
1b750 4e 28 25 64 29 22 2c 20 70 45 78 70 72 2d 3e 69  N(%d)", pExpr->i
1b760 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20 20 20 20 7d  Column);.      }
1b770 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20 73 71  else{.        sq
1b780 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b790 74 66 28 70 4f 75 74 2c 20 22 7b 25 64 3a 25 64  tf(pOut, "{%d:%d
1b7a0 7d 22 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  }",.            
1b7b0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1b7c0 20 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 2c 20   pExpr->iTable, 
1b7d0 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b  pExpr->iColumn);
1b7e0 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 62  .      }.      b
1b7f0 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20  reak;.    }.    
1b800 63 61 73 65 20 54 4b 5f 49 4e 54 45 47 45 52 3a  case TK_INTEGER:
1b810 20 7b 0a 20 20 20 20 20 20 69 66 28 20 70 45 78   {.      if( pEx
1b820 70 72 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 49  pr->flags & EP_I
1b830 6e 74 56 61 6c 75 65 20 29 7b 0a 20 20 20 20 20  ntValue ){.     
1b840 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1b850 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 25  nPrintf(pOut, "%
1b860 64 22 2c 20 70 45 78 70 72 2d 3e 75 2e 69 56 61  d", pExpr->u.iVa
1b870 6c 75 65 29 3b 0a 20 20 20 20 20 20 7d 65 6c 73  lue);.      }els
1b880 65 7b 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74  e{.        sqlit
1b890 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1b8a0 70 4f 75 74 2c 20 22 25 73 22 2c 20 70 45 78 70  pOut, "%s", pExp
1b8b0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1b8c0 20 20 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61      }.      brea
1b8d0 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64 65 66  k;.    }.#ifndef
1b8e0 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 46 4c 4f   SQLITE_OMIT_FLO
1b8f0 41 54 49 4e 47 5f 50 4f 49 4e 54 0a 20 20 20 20  ATING_POINT.    
1b900 63 61 73 65 20 54 4b 5f 46 4c 4f 41 54 3a 20 7b  case TK_FLOAT: {
1b910 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1b920 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1b930 2c 22 25 73 22 2c 20 70 45 78 70 72 2d 3e 75 2e  ,"%s", pExpr->u.
1b940 7a 54 6f 6b 65 6e 29 3b 0a 20 20 20 20 20 20 62  zToken);.      b
1b950 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65 6e 64  reak;.    }.#end
1b960 69 66 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 53  if.    case TK_S
1b970 54 52 49 4e 47 3a 20 7b 0a 20 20 20 20 20 20 73  TRING: {.      s
1b980 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1b990 6e 74 66 28 70 4f 75 74 2c 22 25 51 22 2c 20 70  ntf(pOut,"%Q", p
1b9a0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1b9b0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1b9c0 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f    }.    case TK_
1b9d0 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 73 71  NULL: {.      sq
1b9e0 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1b9f0 74 66 28 70 4f 75 74 2c 22 4e 55 4c 4c 22 29 3b  tf(pOut,"NULL");
1ba00 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba10 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1ba20 54 45 5f 4f 4d 49 54 5f 42 4c 4f 42 5f 4c 49 54  TE_OMIT_BLOB_LIT
1ba30 45 52 41 4c 0a 20 20 20 20 63 61 73 65 20 54 4b  ERAL.    case TK
1ba40 5f 42 4c 4f 42 3a 20 7b 0a 20 20 20 20 20 20 73  _BLOB: {.      s
1ba50 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1ba60 6e 74 66 28 70 4f 75 74 2c 22 25 73 22 2c 20 70  ntf(pOut,"%s", p
1ba70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1ba80 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1ba90 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20 20 20 63    }.#endif.    c
1baa0 61 73 65 20 54 4b 5f 56 41 52 49 41 42 4c 45 3a  ase TK_VARIABLE:
1bab0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1bac0 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1bad0 75 74 2c 22 56 41 52 49 41 42 4c 45 28 25 73 2c  ut,"VARIABLE(%s,
1bae0 25 64 29 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %d)",.          
1baf0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1bb00 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1bb10 2c 20 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  , pExpr->iColumn
1bb20 29 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a  );.      break;.
1bb30 20 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54      }.    case T
1bb40 4b 5f 52 45 47 49 53 54 45 52 3a 20 7b 0a 20 20  K_REGISTER: {.  
1bb50 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1bb60 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 52  inPrintf(pOut,"R
1bb70 45 47 49 53 54 45 52 28 25 64 29 22 2c 20 70 45  EGISTER(%d)", pE
1bb80 78 70 72 2d 3e 69 54 61 62 6c 65 29 3b 0a 20 20  xpr->iTable);.  
1bb90 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1bba0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 53 3a  .    case TK_AS:
1bbb0 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   {.      sqlite3
1bbc0 45 78 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74  ExplainExpr(pOut
1bbd0 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b  , pExpr->pLeft);
1bbe0 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1bbf0 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
1bc00 54 45 5f 4f 4d 49 54 5f 43 41 53 54 0a 20 20 20  TE_OMIT_CAST.   
1bc10 20 63 61 73 65 20 54 4b 5f 43 41 53 54 3a 20 7b   case TK_CAST: {
1bc20 0a 20 20 20 20 20 20 2f 2a 20 45 78 70 72 65 73  .      /* Expres
1bc30 73 69 6f 6e 73 20 6f 66 20 74 68 65 20 66 6f 72  sions of the for
1bc40 6d 3a 20 20 20 43 41 53 54 28 70 4c 65 66 74 20  m:   CAST(pLeft 
1bc50 41 53 20 74 6f 6b 65 6e 29 20 2a 2f 0a 20 20 20  AS token) */.   
1bc60 20 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a     const char *z
1bc70 41 66 66 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  Aff = "unk";.   
1bc80 20 20 20 73 77 69 74 63 68 28 20 73 71 6c 69 74     switch( sqlit
1bc90 65 33 41 66 66 69 6e 69 74 79 54 79 70 65 28 70  e3AffinityType(p
1bca0 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c 20  Expr->u.zToken, 
1bcb0 30 29 20 29 7b 0a 20 20 20 20 20 20 20 20 63 61  0) ){.        ca
1bcc0 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 54 45  se SQLITE_AFF_TE
1bcd0 58 54 3a 20 20 20 20 7a 41 66 66 20 3d 20 22 54  XT:    zAff = "T
1bce0 45 58 54 22 3b 20 20 20 20 20 62 72 65 61 6b 3b  EXT";     break;
1bcf0 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53 51  .        case SQ
1bd00 4c 49 54 45 5f 41 46 46 5f 4e 4f 4e 45 3a 20 20  LITE_AFF_NONE:  
1bd10 20 20 7a 41 66 66 20 3d 20 22 4e 4f 4e 45 22 3b    zAff = "NONE";
1bd20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bd30 20 20 20 20 63 61 73 65 20 53 51 4c 49 54 45 5f      case SQLITE_
1bd40 41 46 46 5f 4e 55 4d 45 52 49 43 3a 20 7a 41 66  AFF_NUMERIC: zAf
1bd50 66 20 3d 20 22 4e 55 4d 45 52 49 43 22 3b 20 20  f = "NUMERIC";  
1bd60 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63  break;.        c
1bd70 61 73 65 20 53 51 4c 49 54 45 5f 41 46 46 5f 49  ase SQLITE_AFF_I
1bd80 4e 54 45 47 45 52 3a 20 7a 41 66 66 20 3d 20 22  NTEGER: zAff = "
1bd90 49 4e 54 45 47 45 52 22 3b 20 20 62 72 65 61 6b  INTEGER";  break
1bda0 3b 0a 20 20 20 20 20 20 20 20 63 61 73 65 20 53  ;.        case S
1bdb0 51 4c 49 54 45 5f 41 46 46 5f 52 45 41 4c 3a 20  QLITE_AFF_REAL: 
1bdc0 20 20 20 7a 41 66 66 20 3d 20 22 52 45 41 4c 22     zAff = "REAL"
1bdd0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1bde0 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74     }.      sqlit
1bdf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1be00 70 4f 75 74 2c 20 22 43 41 53 54 2d 25 73 28 22  pOut, "CAST-%s("
1be10 2c 20 7a 41 66 66 29 3b 0a 20 20 20 20 20 20 73  , zAff);.      s
1be20 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1be30 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 70  r(pOut, pExpr->p
1be40 4c 65 66 74 29 3b 0a 20 20 20 20 20 20 73 71 6c  Left);.      sql
1be50 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1be60 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20  f(pOut, ")");.  
1be70 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1be80 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54  .#endif /* SQLIT
1be90 45 5f 4f 4d 49 54 5f 43 41 53 54 20 2a 2f 0a 20  E_OMIT_CAST */. 
1bea0 20 20 20 63 61 73 65 20 54 4b 5f 4c 54 3a 20 20     case TK_LT:  
1beb0 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 54      zBinOp = "LT
1bec0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1bed0 20 20 63 61 73 65 20 54 4b 5f 4c 45 3a 20 20 20    case TK_LE:   
1bee0 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 45 22     zBinOp = "LE"
1bef0 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20  ;     break;.   
1bf00 20 63 61 73 65 20 54 4b 5f 47 54 3a 20 20 20 20   case TK_GT:    
1bf10 20 20 7a 42 69 6e 4f 70 20 3d 20 22 47 54 22 3b    zBinOp = "GT";
1bf20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1bf30 63 61 73 65 20 54 4b 5f 47 45 3a 20 20 20 20 20  case TK_GE:     
1bf40 20 7a 42 69 6e 4f 70 20 3d 20 22 47 45 22 3b 20   zBinOp = "GE"; 
1bf50 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63      break;.    c
1bf60 61 73 65 20 54 4b 5f 4e 45 3a 20 20 20 20 20 20  ase TK_NE:      
1bf70 7a 42 69 6e 4f 70 20 3d 20 22 4e 45 22 3b 20 20  zBinOp = "NE";  
1bf80 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61     break;.    ca
1bf90 73 65 20 54 4b 5f 45 51 3a 20 20 20 20 20 20 7a  se TK_EQ:      z
1bfa0 42 69 6e 4f 70 20 3d 20 22 45 51 22 3b 20 20 20  BinOp = "EQ";   
1bfb0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73    break;.    cas
1bfc0 65 20 54 4b 5f 49 53 3a 20 20 20 20 20 20 7a 42  e TK_IS:      zB
1bfd0 69 6e 4f 70 20 3d 20 22 49 53 22 3b 20 20 20 20  inOp = "IS";    
1bfe0 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1bff0 20 54 4b 5f 49 53 4e 4f 54 3a 20 20 20 7a 42 69   TK_ISNOT:   zBi
1c000 6e 4f 70 20 3d 20 22 49 53 4e 4f 54 22 3b 20 20  nOp = "ISNOT";  
1c010 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c020 54 4b 5f 41 4e 44 3a 20 20 20 20 20 7a 42 69 6e  TK_AND:     zBin
1c030 4f 70 20 3d 20 22 41 4e 44 22 3b 20 20 20 20 62  Op = "AND";    b
1c040 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54  reak;.    case T
1c050 4b 5f 4f 52 3a 20 20 20 20 20 20 7a 42 69 6e 4f  K_OR:      zBinO
1c060 70 20 3d 20 22 4f 52 22 3b 20 20 20 20 20 62 72  p = "OR";     br
1c070 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b  eak;.    case TK
1c080 5f 50 4c 55 53 3a 20 20 20 20 7a 42 69 6e 4f 70  _PLUS:    zBinOp
1c090 20 3d 20 22 41 44 44 22 3b 20 20 20 20 62 72 65   = "ADD";    bre
1c0a0 61 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f  ak;.    case TK_
1c0b0 53 54 41 52 3a 20 20 20 20 7a 42 69 6e 4f 70 20  STAR:    zBinOp 
1c0c0 3d 20 22 4d 55 4c 22 3b 20 20 20 20 62 72 65 61  = "MUL";    brea
1c0d0 6b 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4d  k;.    case TK_M
1c0e0 49 4e 55 53 3a 20 20 20 7a 42 69 6e 4f 70 20 3d  INUS:   zBinOp =
1c0f0 20 22 53 55 42 22 3b 20 20 20 20 62 72 65 61 6b   "SUB";    break
1c100 3b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 52 45  ;.    case TK_RE
1c110 4d 3a 20 20 20 20 20 7a 42 69 6e 4f 70 20 3d 20  M:     zBinOp = 
1c120 22 52 45 4d 22 3b 20 20 20 20 62 72 65 61 6b 3b  "REM";    break;
1c130 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54  .    case TK_BIT
1c140 41 4e 44 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22  AND:  zBinOp = "
1c150 42 49 54 41 4e 44 22 3b 20 62 72 65 61 6b 3b 0a  BITAND"; break;.
1c160 20 20 20 20 63 61 73 65 20 54 4b 5f 42 49 54 4f      case TK_BITO
1c170 52 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 42  R:   zBinOp = "B
1c180 49 54 4f 52 22 3b 20 20 62 72 65 61 6b 3b 0a 20  ITOR";  break;. 
1c190 20 20 20 63 61 73 65 20 54 4b 5f 53 4c 41 53 48     case TK_SLASH
1c1a0 3a 20 20 20 7a 42 69 6e 4f 70 20 3d 20 22 44 49  :   zBinOp = "DI
1c1b0 56 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  V";    break;.  
1c1c0 20 20 63 61 73 65 20 54 4b 5f 4c 53 48 49 46 54    case TK_LSHIFT
1c1d0 3a 20 20 7a 42 69 6e 4f 70 20 3d 20 22 4c 53 48  :  zBinOp = "LSH
1c1e0 49 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20  IFT"; break;.   
1c1f0 20 63 61 73 65 20 54 4b 5f 52 53 48 49 46 54 3a   case TK_RSHIFT:
1c200 20 20 7a 42 69 6e 4f 70 20 3d 20 22 52 53 48 49    zBinOp = "RSHI
1c210 46 54 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20  FT"; break;.    
1c220 63 61 73 65 20 54 4b 5f 43 4f 4e 43 41 54 3a 20  case TK_CONCAT: 
1c230 20 7a 42 69 6e 4f 70 20 3d 20 22 43 4f 4e 43 41   zBinOp = "CONCA
1c240 54 22 3b 20 62 72 65 61 6b 3b 0a 0a 20 20 20 20  T"; break;..    
1c250 63 61 73 65 20 54 4b 5f 55 4d 49 4e 55 53 3a 20  case TK_UMINUS: 
1c260 20 7a 55 6e 69 4f 70 20 3d 20 22 55 4d 49 4e 55   zUniOp = "UMINU
1c270 53 22 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63  S"; break;.    c
1c280 61 73 65 20 54 4b 5f 55 50 4c 55 53 3a 20 20 20  ase TK_UPLUS:   
1c290 7a 55 6e 69 4f 70 20 3d 20 22 55 50 4c 55 53 22  zUniOp = "UPLUS"
1c2a0 3b 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61  ;  break;.    ca
1c2b0 73 65 20 54 4b 5f 42 49 54 4e 4f 54 3a 20 20 7a  se TK_BITNOT:  z
1c2c0 55 6e 69 4f 70 20 3d 20 22 42 49 54 4e 4f 54 22  UniOp = "BITNOT"
1c2d0 3b 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73  ; break;.    cas
1c2e0 65 20 54 4b 5f 4e 4f 54 3a 20 20 20 20 20 7a 55  e TK_NOT:     zU
1c2f0 6e 69 4f 70 20 3d 20 22 4e 4f 54 22 3b 20 20 20  niOp = "NOT";   
1c300 20 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65   break;.    case
1c310 20 54 4b 5f 49 53 4e 55 4c 4c 3a 20 20 7a 55 6e   TK_ISNULL:  zUn
1c320 69 4f 70 20 3d 20 22 49 53 4e 55 4c 4c 22 3b 20  iOp = "ISNULL"; 
1c330 62 72 65 61 6b 3b 0a 20 20 20 20 63 61 73 65 20  break;.    case 
1c340 54 4b 5f 4e 4f 54 4e 55 4c 4c 3a 20 7a 55 6e 69  TK_NOTNULL: zUni
1c350 4f 70 20 3d 20 22 4e 4f 54 4e 55 4c 4c 22 3b 20  Op = "NOTNULL"; 
1c360 62 72 65 61 6b 3b 0a 0a 20 20 20 20 63 61 73 65  break;..    case
1c370 20 54 4b 5f 43 4f 4c 4c 41 54 45 3a 20 7b 0a 20   TK_COLLATE: {. 
1c380 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c390 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1c3a0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1c3b0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c3c0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 2e 43  nPrintf(pOut,".C
1c3d0 4f 4c 4c 41 54 45 28 25 73 29 22 2c 70 45 78 70  OLLATE(%s)",pExp
1c3e0 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a 20 20  r->u.zToken);.  
1c3f0 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d      break;.    }
1c400 0a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41 47  ..    case TK_AG
1c410 47 5f 46 55 4e 43 54 49 4f 4e 3a 0a 20 20 20 20  G_FUNCTION:.    
1c420 63 61 73 65 20 54 4b 5f 46 55 4e 43 54 49 4f 4e  case TK_FUNCTION
1c430 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 4c 69  : {.      ExprLi
1c440 73 74 20 2a 70 46 61 72 67 3b 20 20 20 20 20 20  st *pFarg;      
1c450 20 2f 2a 20 4c 69 73 74 20 6f 66 20 66 75 6e 63   /* List of func
1c460 74 69 6f 6e 20 61 72 67 75 6d 65 6e 74 73 20 2a  tion arguments *
1c470 2f 0a 20 20 20 20 20 20 69 66 28 20 45 78 70 72  /.      if( Expr
1c480 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1c490 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 29  r, EP_TokenOnly)
1c4a0 20 29 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72   ){.        pFar
1c4b0 67 20 3d 20 30 3b 0a 20 20 20 20 20 20 7d 65 6c  g = 0;.      }el
1c4c0 73 65 7b 0a 20 20 20 20 20 20 20 20 70 46 61 72  se{.        pFar
1c4d0 67 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  g = pExpr->x.pLi
1c4e0 73 74 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20  st;.      }.    
1c4f0 20 20 69 66 28 20 6f 70 3d 3d 54 4b 5f 41 47 47    if( op==TK_AGG
1c500 5f 46 55 4e 43 54 49 4f 4e 20 29 7b 0a 20 20 20  _FUNCTION ){.   
1c510 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1c520 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1c530 22 41 47 47 5f 46 55 4e 43 54 49 4f 4e 25 64 3a  "AGG_FUNCTION%d:
1c540 25 73 28 22 2c 0a 20 20 20 20 20 20 20 20 20 20  %s(",.          
1c550 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
1c560 20 20 20 70 45 78 70 72 2d 3e 6f 70 32 2c 20 70     pExpr->op2, p
1c570 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b  Expr->u.zToken);
1c580 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
1c590 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c5a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c5b0 20 22 46 55 4e 43 54 49 4f 4e 3a 25 73 28 22 2c   "FUNCTION:%s(",
1c5c0 20 70 45 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e   pExpr->u.zToken
1c5d0 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20 20 20  );.      }.     
1c5e0 20 69 66 28 20 70 46 61 72 67 20 29 7b 0a 20 20   if( pFarg ){.  
1c5f0 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c600 6c 61 69 6e 45 78 70 72 4c 69 73 74 28 70 4f 75  lainExprList(pOu
1c610 74 2c 20 70 46 61 72 67 29 3b 0a 20 20 20 20 20  t, pFarg);.     
1c620 20 7d 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33   }.      sqlite3
1c630 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f  ExplainPrintf(pO
1c640 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20 20 20  ut, ")");.      
1c650 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66  break;.    }.#if
1c660 6e 64 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54  ndef SQLITE_OMIT
1c670 5f 53 55 42 51 55 45 52 59 0a 20 20 20 20 63 61  _SUBQUERY.    ca
1c680 73 65 20 54 4b 5f 45 58 49 53 54 53 3a 20 7b 0a  se TK_EXISTS: {.
1c690 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c6a0 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c6b0 20 22 45 58 49 53 54 53 28 22 29 3b 0a 20 20 20   "EXISTS(");.   
1c6c0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1c6d0 6e 53 65 6c 65 63 74 28 70 4f 75 74 2c 20 70 45  nSelect(pOut, pE
1c6e0 78 70 72 2d 3e 78 2e 70 53 65 6c 65 63 74 29 3b  xpr->x.pSelect);
1c6f0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1c700 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1c710 2c 22 29 22 29 3b 0a 20 20 20 20 20 20 62 72 65  ,")");.      bre
1c720 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
1c730 73 65 20 54 4b 5f 53 45 4c 45 43 54 3a 20 7b 0a  se TK_SELECT: {.
1c740 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c750 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c  lainPrintf(pOut,
1c760 20 22 28 22 29 3b 0a 20 20 20 20 20 20 73 71 6c   "(");.      sql
1c770 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c 65 63  ite3ExplainSelec
1c780 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78  t(pOut, pExpr->x
1c790 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20 20 20  .pSelect);.     
1c7a0 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1c7b0 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 29 22 29  rintf(pOut, ")")
1c7c0 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1c7d0 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
1c7e0 5f 49 4e 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c  _IN: {.      sql
1c7f0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1c800 66 28 70 4f 75 74 2c 20 22 49 4e 28 22 29 3b 0a  f(pOut, "IN(");.
1c810 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1c820 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70  lainExpr(pOut, p
1c830 45 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20  Expr->pLeft);.  
1c840 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61      sqlite3Expla
1c850 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22  inPrintf(pOut, "
1c860 2c 22 29 3b 0a 20 20 20 20 20 20 69 66 28 20 45  ,");.      if( E
1c870 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28 70  xprHasProperty(p
1c880 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c 65  Expr, EP_xIsSele
1c890 63 74 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  ct) ){.        s
1c8a0 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 53 65 6c  qlite3ExplainSel
1c8b0 65 63 74 28 70 4f 75 74 2c 20 70 45 78 70 72 2d  ect(pOut, pExpr-
1c8c0 3e 78 2e 70 53 65 6c 65 63 74 29 3b 0a 20 20 20  >x.pSelect);.   
1c8d0 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20     }else{.      
1c8e0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1c8f0 45 78 70 72 4c 69 73 74 28 70 4f 75 74 2c 20 70  ExprList(pOut, p
1c900 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 29 3b 0a  Expr->x.pList);.
1c910 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71        }.      sq
1c920 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e  lite3ExplainPrin
1c930 74 66 28 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20  tf(pOut, ")");. 
1c940 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1c950 7d 0a 23 65 6e 64 69 66 20 2f 2a 20 53 51 4c 49  }.#endif /* SQLI
1c960 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
1c970 20 2a 2f 0a 0a 20 20 20 20 2f 2a 0a 20 20 20 20   */..    /*.    
1c980 2a 2a 20 20 20 20 78 20 42 45 54 57 45 45 4e 20  **    x BETWEEN 
1c990 79 20 41 4e 44 20 7a 0a 20 20 20 20 2a 2a 0a 20  y AND z.    **. 
1c9a0 20 20 20 2a 2a 20 54 68 69 73 20 69 73 20 65 71     ** This is eq
1c9b0 75 69 76 61 6c 65 6e 74 20 74 6f 0a 20 20 20 20  uivalent to.    
1c9c0 2a 2a 0a 20 20 20 20 2a 2a 20 20 20 20 78 3e 3d  **.    **    x>=
1c9d0 79 20 41 4e 44 20 78 3c 3d 7a 0a 20 20 20 20 2a  y AND x<=z.    *
1c9e0 2a 0a 20 20 20 20 2a 2a 20 58 20 69 73 20 73 74  *.    ** X is st
1c9f0 6f 72 65 64 20 69 6e 20 70 45 78 70 72 2d 3e 70  ored in pExpr->p
1ca00 4c 65 66 74 2e 0a 20 20 20 20 2a 2a 20 59 20 69  Left..    ** Y i
1ca10 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1ca20 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70  r->pList->a[0].p
1ca30 45 78 70 72 2e 0a 20 20 20 20 2a 2a 20 5a 20 69  Expr..    ** Z i
1ca40 73 20 73 74 6f 72 65 64 20 69 6e 20 70 45 78 70  s stored in pExp
1ca50 72 2d 3e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e 70  r->pList->a[1].p
1ca60 45 78 70 72 2e 0a 20 20 20 20 2a 2f 0a 20 20 20  Expr..    */.   
1ca70 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45 4e   case TK_BETWEEN
1ca80 3a 20 7b 0a 20 20 20 20 20 20 45 78 70 72 20 2a  : {.      Expr *
1ca90 70 58 20 3d 20 70 45 78 70 72 2d 3e 70 4c 65 66  pX = pExpr->pLef
1caa0 74 3b 0a 20 20 20 20 20 20 45 78 70 72 20 2a 70  t;.      Expr *p
1cab0 59 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69  Y = pExpr->x.pLi
1cac0 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72 3b 0a  st->a[0].pExpr;.
1cad0 20 20 20 20 20 20 45 78 70 72 20 2a 70 5a 20 3d        Expr *pZ =
1cae0 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d   pExpr->x.pList-
1caf0 3e 61 5b 31 5d 2e 70 45 78 70 72 3b 0a 20 20 20  >a[1].pExpr;.   
1cb00 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1cb10 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 42  nPrintf(pOut, "B
1cb20 45 54 57 45 45 4e 28 22 29 3b 0a 20 20 20 20 20  ETWEEN(");.     
1cb30 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45   sqlite3ExplainE
1cb40 78 70 72 28 70 4f 75 74 2c 20 70 58 29 3b 0a 20  xpr(pOut, pX);. 
1cb50 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1cb60 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20  ainPrintf(pOut, 
1cb70 22 2c 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ",");.      sqli
1cb80 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 28 70  te3ExplainExpr(p
1cb90 4f 75 74 2c 20 70 59 29 3b 0a 20 20 20 20 20 20  Out, pY);.      
1cba0 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72  sqlite3ExplainPr
1cbb0 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c 22 29 3b  intf(pOut, ",");
1cbc0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
1cbd0 70 6c 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20  plainExpr(pOut, 
1cbe0 70 5a 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  pZ);.      sqlit
1cbf0 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1cc00 70 4f 75 74 2c 20 22 29 22 29 3b 0a 20 20 20 20  pOut, ")");.    
1cc10 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1cc20 20 20 20 63 61 73 65 20 54 4b 5f 54 52 49 47 47     case TK_TRIGG
1cc30 45 52 3a 20 7b 0a 20 20 20 20 20 20 2f 2a 20 49  ER: {.      /* I
1cc40 66 20 74 68 65 20 6f 70 63 6f 64 65 20 69 73 20  f the opcode is 
1cc50 54 4b 5f 54 52 49 47 47 45 52 2c 20 74 68 65 6e  TK_TRIGGER, then
1cc60 20 74 68 65 20 65 78 70 72 65 73 73 69 6f 6e 20   the expression 
1cc70 69 73 20 61 20 72 65 66 65 72 65 6e 63 65 0a 20  is a reference. 
1cc80 20 20 20 20 20 2a 2a 20 74 6f 20 61 20 63 6f 6c       ** to a col
1cc90 75 6d 6e 20 69 6e 20 74 68 65 20 6e 65 77 2e 2a  umn in the new.*
1cca0 20 6f 72 20 6f 6c 64 2e 2a 20 70 73 65 75 64 6f   or old.* pseudo
1ccb0 2d 74 61 62 6c 65 73 20 61 76 61 69 6c 61 62 6c  -tables availabl
1ccc0 65 20 74 6f 0a 20 20 20 20 20 20 2a 2a 20 74 72  e to.      ** tr
1ccd0 69 67 67 65 72 20 70 72 6f 67 72 61 6d 73 2e 20  igger programs. 
1cce0 49 6e 20 74 68 69 73 20 63 61 73 65 20 45 78 70  In this case Exp
1ccf0 72 2e 69 54 61 62 6c 65 20 69 73 20 73 65 74 20  r.iTable is set 
1cd00 74 6f 20 31 20 66 6f 72 20 74 68 65 0a 20 20 20  to 1 for the.   
1cd10 20 20 20 2a 2a 20 6e 65 77 2e 2a 20 70 73 65 75     ** new.* pseu
1cd20 64 6f 2d 74 61 62 6c 65 2c 20 6f 72 20 30 20 66  do-table, or 0 f
1cd30 6f 72 20 74 68 65 20 6f 6c 64 2e 2a 20 70 73 65  or the old.* pse
1cd40 75 64 6f 2d 74 61 62 6c 65 2e 20 45 78 70 72 2e  udo-table. Expr.
1cd50 69 43 6f 6c 75 6d 6e 0a 20 20 20 20 20 20 2a 2a  iColumn.      **
1cd60 20 69 73 20 73 65 74 20 74 6f 20 74 68 65 20 63   is set to the c
1cd70 6f 6c 75 6d 6e 20 6f 66 20 74 68 65 20 70 73 65  olumn of the pse
1cd80 75 64 6f 2d 74 61 62 6c 65 20 74 6f 20 72 65 61  udo-table to rea
1cd90 64 2c 20 6f 72 20 74 6f 20 2d 31 20 74 6f 0a 20  d, or to -1 to. 
1cda0 20 20 20 20 20 2a 2a 20 72 65 61 64 20 74 68 65       ** read the
1cdb0 20 72 6f 77 69 64 20 66 69 65 6c 64 2e 0a 20 20   rowid field..  
1cdc0 20 20 20 20 2a 2f 0a 20 20 20 20 20 20 73 71 6c      */.      sql
1cdd0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1cde0 66 28 70 4f 75 74 2c 20 22 25 73 28 25 64 29 22  f(pOut, "%s(%d)"
1cdf0 2c 20 0a 20 20 20 20 20 20 20 20 20 20 70 45 78  , .          pEx
1ce00 70 72 2d 3e 69 54 61 62 6c 65 20 3f 20 22 4e 45  pr->iTable ? "NE
1ce10 57 22 20 3a 20 22 4f 4c 44 22 2c 20 70 45 78 70  W" : "OLD", pExp
1ce20 72 2d 3e 69 43 6f 6c 75 6d 6e 29 3b 0a 20 20 20  r->iColumn);.   
1ce30 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
1ce40 20 20 20 20 63 61 73 65 20 54 4b 5f 43 41 53 45      case TK_CASE
1ce50 3a 20 7b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  : {.      sqlite
1ce60 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28 70  3ExplainPrintf(p
1ce70 4f 75 74 2c 20 22 43 41 53 45 28 22 29 3b 0a 20  Out, "CASE(");. 
1ce80 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1ce90 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1cea0 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1ceb0 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1cec0 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 2c  nPrintf(pOut, ",
1ced0 22 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  ");.      sqlite
1cee0 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69 73 74  3ExplainExprList
1cef0 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e 78 2e  (pOut, pExpr->x.
1cf00 70 4c 69 73 74 29 3b 0a 20 20 20 20 20 20 62 72  pList);.      br
1cf10 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 69 66 6e 64  eak;.    }.#ifnd
1cf20 65 66 20 53 51 4c 49 54 45 5f 4f 4d 49 54 5f 54  ef SQLITE_OMIT_T
1cf30 52 49 47 47 45 52 0a 20 20 20 20 63 61 73 65 20  RIGGER.    case 
1cf40 54 4b 5f 52 41 49 53 45 3a 20 7b 0a 20 20 20 20  TK_RAISE: {.    
1cf50 20 20 63 6f 6e 73 74 20 63 68 61 72 20 2a 7a 54    const char *zT
1cf60 79 70 65 20 3d 20 22 75 6e 6b 22 3b 0a 20 20 20  ype = "unk";.   
1cf70 20 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72     switch( pExpr
1cf80 2d 3e 61 66 66 69 6e 69 74 79 20 29 7b 0a 20 20  ->affinity ){.  
1cf90 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 52 6f        case OE_Ro
1cfa0 6c 6c 62 61 63 6b 3a 20 20 20 7a 54 79 70 65 20  llback:   zType 
1cfb0 3d 20 22 72 6f 6c 6c 62 61 63 6b 22 3b 20 20 62  = "rollback";  b
1cfc0 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1cfd0 73 65 20 4f 45 5f 41 62 6f 72 74 3a 20 20 20 20  se OE_Abort:    
1cfe0 20 20 7a 54 79 70 65 20 3d 20 22 61 62 6f 72 74    zType = "abort
1cff0 22 3b 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  ";     break;.  
1d000 20 20 20 20 20 20 63 61 73 65 20 4f 45 5f 46 61        case OE_Fa
1d010 69 6c 3a 20 20 20 20 20 20 20 7a 54 79 70 65 20  il:       zType 
1d020 3d 20 22 66 61 69 6c 22 3b 20 20 20 20 20 20 62  = "fail";      b
1d030 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20 63 61  reak;.        ca
1d040 73 65 20 4f 45 5f 49 67 6e 6f 72 65 3a 20 20 20  se OE_Ignore:   
1d050 20 20 7a 54 79 70 65 20 3d 20 22 69 67 6e 6f 72    zType = "ignor
1d060 65 22 3b 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  e";    break;.  
1d070 20 20 20 20 7d 0a 20 20 20 20 20 20 73 71 6c 69      }.      sqli
1d080 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d090 28 70 4f 75 74 2c 20 22 52 41 49 53 45 2d 25 73  (pOut, "RAISE-%s
1d0a0 28 25 73 29 22 2c 20 7a 54 79 70 65 2c 20 70 45  (%s)", zType, pE
1d0b0 78 70 72 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 3b 0a  xpr->u.zToken);.
1d0c0 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20        break;.   
1d0d0 20 7d 0a 23 65 6e 64 69 66 0a 20 20 7d 0a 20 20   }.#endif.  }.  
1d0e0 69 66 28 20 7a 42 69 6e 4f 70 20 29 7b 0a 20 20  if( zBinOp ){.  
1d0f0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d100 50 72 69 6e 74 66 28 70 4f 75 74 2c 22 25 73 28  Printf(pOut,"%s(
1d110 22 2c 20 7a 42 69 6e 4f 70 29 3b 0a 20 20 20 20  ", zBinOp);.    
1d120 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1d130 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1d140 70 4c 65 66 74 29 3b 0a 20 20 20 20 73 71 6c 69  pLeft);.    sqli
1d150 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66  te3ExplainPrintf
1d160 28 70 4f 75 74 2c 22 2c 22 29 3b 0a 20 20 20 20  (pOut,",");.    
1d170 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78  sqlite3ExplainEx
1d180 70 72 28 70 4f 75 74 2c 20 70 45 78 70 72 2d 3e  pr(pOut, pExpr->
1d190 70 52 69 67 68 74 29 3b 0a 20 20 20 20 73 71 6c  pRight);.    sql
1d1a0 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74  ite3ExplainPrint
1d1b0 66 28 70 4f 75 74 2c 22 29 22 29 3b 0a 20 20 7d  f(pOut,")");.  }
1d1c0 65 6c 73 65 20 69 66 28 20 7a 55 6e 69 4f 70 20  else if( zUniOp 
1d1d0 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78  ){.    sqlite3Ex
1d1e0 70 6c 61 69 6e 50 72 69 6e 74 66 28 70 4f 75 74  plainPrintf(pOut
1d1f0 2c 22 25 73 28 22 2c 20 7a 55 6e 69 4f 70 29 3b  ,"%s(", zUniOp);
1d200 0a 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c  .    sqlite3Expl
1d210 61 69 6e 45 78 70 72 28 70 4f 75 74 2c 20 70 45  ainExpr(pOut, pE
1d220 78 70 72 2d 3e 70 4c 65 66 74 29 3b 0a 20 20 20  xpr->pLeft);.   
1d230 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50   sqlite3ExplainP
1d240 72 69 6e 74 66 28 70 4f 75 74 2c 22 29 22 29 3b  rintf(pOut,")");
1d250 0a 20 20 7d 0a 7d 0a 23 65 6e 64 69 66 20 2f 2a  .  }.}.#endif /*
1d260 20 64 65 66 69 6e 65 64 28 53 51 4c 49 54 45 5f   defined(SQLITE_
1d270 45 4e 41 42 4c 45 5f 54 52 45 45 5f 45 58 50 4c  ENABLE_TREE_EXPL
1d280 41 49 4e 29 20 2a 2f 0a 0a 23 69 66 20 64 65 66  AIN) */..#if def
1d290 69 6e 65 64 28 53 51 4c 49 54 45 5f 45 4e 41 42  ined(SQLITE_ENAB
1d2a0 4c 45 5f 54 52 45 45 5f 45 58 50 4c 41 49 4e 29  LE_TREE_EXPLAIN)
1d2b0 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74 65 20  ./*.** Generate 
1d2c0 61 20 68 75 6d 61 6e 2d 72 65 61 64 61 62 6c 65  a human-readable
1d2d0 20 65 78 70 6c 61 6e 61 74 69 6f 6e 20 6f 66 20   explanation of 
1d2e0 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69  an expression li
1d2f0 73 74 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71 6c 69  st..*/.void sqli
1d300 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72 4c 69  te3ExplainExprLi
1d310 73 74 28 56 64 62 65 20 2a 70 4f 75 74 2c 20 45  st(Vdbe *pOut, E
1d320 78 70 72 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b  xprList *pList){
1d330 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
1d340 70 4c 69 73 74 3d 3d 30 20 7c 7c 20 70 4c 69 73  pList==0 || pLis
1d350 74 2d 3e 6e 45 78 70 72 3d 3d 30 20 29 7b 0a 20  t->nExpr==0 ){. 
1d360 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69     sqlite3Explai
1d370 6e 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 28  nPrintf(pOut, "(
1d380 65 6d 70 74 79 2d 6c 69 73 74 29 22 29 3b 0a 20  empty-list)");. 
1d390 20 20 20 72 65 74 75 72 6e 3b 0a 20 20 7d 65 6c     return;.  }el
1d3a0 73 65 20 69 66 28 20 70 4c 69 73 74 2d 3e 6e 45  se if( pList->nE
1d3b0 78 70 72 3d 3d 31 20 29 7b 0a 20 20 20 20 73 71  xpr==1 ){.    sq
1d3c0 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70 72  lite3ExplainExpr
1d3d0 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61 5b  (pOut, pList->a[
1d3e0 30 5d 2e 70 45 78 70 72 29 3b 0a 20 20 7d 65 6c  0].pExpr);.  }el
1d3f0 73 65 7b 0a 20 20 20 20 73 71 6c 69 74 65 33 45  se{.    sqlite3E
1d400 78 70 6c 61 69 6e 50 75 73 68 28 70 4f 75 74 29  xplainPush(pOut)
1d410 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 3b 20 69  ;.    for(i=0; i
1d420 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72 3b 20 69  <pList->nExpr; i
1d430 2b 2b 29 7b 0a 20 20 20 20 20 20 73 71 6c 69 74  ++){.      sqlit
1d440 65 33 45 78 70 6c 61 69 6e 50 72 69 6e 74 66 28  e3ExplainPrintf(
1d450 70 4f 75 74 2c 20 22 69 74 65 6d 5b 25 64 5d 20  pOut, "item[%d] 
1d460 3d 20 22 2c 20 69 29 3b 0a 20 20 20 20 20 20 73  = ", i);.      s
1d470 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 75 73  qlite3ExplainPus
1d480 68 28 70 4f 75 74 29 3b 0a 20 20 20 20 20 20 73  h(pOut);.      s
1d490 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 45 78 70  qlite3ExplainExp
1d4a0 72 28 70 4f 75 74 2c 20 70 4c 69 73 74 2d 3e 61  r(pOut, pList->a
1d4b0 5b 69 5d 2e 70 45 78 70 72 29 3b 0a 20 20 20 20  [i].pExpr);.    
1d4c0 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d4d0 50 6f 70 28 70 4f 75 74 29 3b 0a 20 20 20 20 20  Pop(pOut);.     
1d4e0 20 69 66 28 20 70 4c 69 73 74 2d 3e 61 5b 69 5d   if( pList->a[i]
1d4f0 2e 7a 4e 61 6d 65 20 29 7b 0a 20 20 20 20 20 20  .zName ){.      
1d500 20 20 73 71 6c 69 74 65 33 45 78 70 6c 61 69 6e    sqlite3Explain
1d510 50 72 69 6e 74 66 28 70 4f 75 74 2c 20 22 20 41  Printf(pOut, " A
1d520 53 20 25 73 22 2c 20 70 4c 69 73 74 2d 3e 61 5b  S %s", pList->a[
1d530 69 5d 2e 7a 4e 61 6d 65 29 3b 0a 20 20 20 20 20  i].zName);.     
1d540 20 7d 0a 20 20 20 20 20 20 69 66 28 20 70 4c 69   }.      if( pLi
1d550 73 74 2d 3e 61 5b 69 5d 2e 62 53 70 61 6e 49 73  st->a[i].bSpanIs
1d560 54 61 62 20 29 7b 0a 20 20 20 20 20 20 20 20 73  Tab ){.        s
1d570 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 72 69  qlite3ExplainPri
1d580 6e 74 66 28 70 4f 75 74 2c 20 22 20 28 25 73 29  ntf(pOut, " (%s)
1d590 22 2c 20 70 4c 69 73 74 2d 3e 61 5b 69 5d 2e 7a  ", pList->a[i].z
1d5a0 53 70 61 6e 29 3b 0a 20 20 20 20 20 20 7d 0a 20  Span);.      }. 
1d5b0 20 20 20 20 20 69 66 28 20 69 3c 70 4c 69 73 74       if( i<pList
1d5c0 2d 3e 6e 45 78 70 72 2d 31 20 29 7b 0a 20 20 20  ->nExpr-1 ){.   
1d5d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 6c       sqlite3Expl
1d5e0 61 69 6e 4e 4c 28 70 4f 75 74 29 3b 0a 20 20 20  ainNL(pOut);.   
1d5f0 20 20 20 7d 0a 20 20 20 20 7d 0a 20 20 20 20 73     }.    }.    s
1d600 71 6c 69 74 65 33 45 78 70 6c 61 69 6e 50 6f 70  qlite3ExplainPop
1d610 28 70 4f 75 74 29 3b 0a 20 20 7d 0a 7d 0a 23 65  (pOut);.  }.}.#e
1d620 6e 64 69 66 20 2f 2a 20 53 51 4c 49 54 45 5f 44  ndif /* SQLITE_D
1d630 45 42 55 47 20 2a 2f 0a 0a 2f 2a 0a 2a 2a 20 47  EBUG */../*.** G
1d640 65 6e 65 72 61 74 65 20 63 6f 64 65 20 74 68 61  enerate code tha
1d650 74 20 70 75 73 68 65 73 20 74 68 65 20 76 61 6c  t pushes the val
1d660 75 65 20 6f 66 20 65 76 65 72 79 20 65 6c 65 6d  ue of every elem
1d670 65 6e 74 20 6f 66 20 74 68 65 20 67 69 76 65 6e  ent of the given
1d680 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c  .** expression l
1d690 69 73 74 20 69 6e 74 6f 20 61 20 73 65 71 75 65  ist into a seque
1d6a0 6e 63 65 20 6f 66 20 72 65 67 69 73 74 65 72 73  nce of registers
1d6b0 20 62 65 67 69 6e 6e 69 6e 67 20 61 74 20 74 61   beginning at ta
1d6c0 72 67 65 74 2e 0a 2a 2a 0a 2a 2a 20 52 65 74 75  rget..**.** Retu
1d6d0 72 6e 20 74 68 65 20 6e 75 6d 62 65 72 20 6f 66  rn the number of
1d6e0 20 65 6c 65 6d 65 6e 74 73 20 65 76 61 6c 75 61   elements evalua
1d6f0 74 65 64 2e 0a 2a 2a 0a 2a 2a 20 54 68 65 20 53  ted..**.** The S
1d700 51 4c 49 54 45 5f 45 43 45 4c 5f 44 55 50 20 66  QLITE_ECEL_DUP f
1d710 6c 61 67 20 70 72 65 76 65 6e 74 73 20 74 68 65  lag prevents the
1d720 20 61 72 67 75 6d 65 6e 74 73 20 66 72 6f 6d 20   arguments from 
1d730 62 65 69 6e 67 0a 2a 2a 20 66 69 6c 6c 65 64 20  being.** filled 
1d740 75 73 69 6e 67 20 4f 50 5f 53 43 6f 70 79 2e 20  using OP_SCopy. 
1d750 20 4f 50 5f 43 6f 70 79 20 6d 75 73 74 20 62 65   OP_Copy must be
1d760 20 75 73 65 64 20 69 6e 73 74 65 61 64 2e 0a 2a   used instead..*
1d770 2a 0a 2a 2a 20 54 68 65 20 53 51 4c 49 54 45 5f  *.** The SQLITE_
1d780 45 43 45 4c 5f 46 41 43 54 4f 52 20 61 72 67 75  ECEL_FACTOR argu
1d790 6d 65 6e 74 20 61 6c 6c 6f 77 73 20 63 6f 6e 73  ment allows cons
1d7a0 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 20 74  tant arguments t
1d7b0 6f 20 62 65 0a 2a 2a 20 66 61 63 74 6f 72 65 64  o be.** factored
1d7c0 20 6f 75 74 20 69 6e 74 6f 20 69 6e 69 74 69 61   out into initia
1d7d0 6c 69 7a 61 74 69 6f 6e 20 63 6f 64 65 2e 0a 2a  lization code..*
1d7e0 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
1d7f0 72 43 6f 64 65 45 78 70 72 4c 69 73 74 28 0a 20  rCodeExprList(. 
1d800 20 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20   Parse *pParse, 
1d810 20 20 20 20 2f 2a 20 50 61 72 73 69 6e 67 20 63      /* Parsing c
1d820 6f 6e 74 65 78 74 20 2a 2f 0a 20 20 45 78 70 72  ontext */.  Expr
1d830 4c 69 73 74 20 2a 70 4c 69 73 74 2c 20 20 20 2f  List *pList,   /
1d840 2a 20 54 68 65 20 65 78 70 72 65 73 73 69 6f 6e  * The expression
1d850 20 6c 69 73 74 20 74 6f 20 62 65 20 63 6f 64 65   list to be code
1d860 64 20 2a 2f 0a 20 20 69 6e 74 20 74 61 72 67 65  d */.  int targe
1d870 74 2c 20 20 20 20 20 20 20 20 2f 2a 20 57 68 65  t,        /* Whe
1d880 72 65 20 74 6f 20 77 72 69 74 65 20 72 65 73 75  re to write resu
1d890 6c 74 73 20 2a 2f 0a 20 20 75 38 20 66 6c 61 67  lts */.  u8 flag
1d8a0 73 20 20 20 20 20 20 20 20 20 20 20 2f 2a 20 53  s           /* S
1d8b0 51 4c 49 54 45 5f 45 43 45 4c 5f 2a 20 66 6c 61  QLITE_ECEL_* fla
1d8c0 67 73 20 2a 2f 0a 29 7b 0a 20 20 73 74 72 75 63  gs */.){.  struc
1d8d0 74 20 45 78 70 72 4c 69 73 74 5f 69 74 65 6d 20  t ExprList_item 
1d8e0 2a 70 49 74 65 6d 3b 0a 20 20 69 6e 74 20 69 2c  *pItem;.  int i,
1d8f0 20 6e 3b 0a 20 20 75 38 20 63 6f 70 79 4f 70 20   n;.  u8 copyOp 
1d900 3d 20 28 66 6c 61 67 73 20 26 20 53 51 4c 49 54  = (flags & SQLIT
1d910 45 5f 45 43 45 4c 5f 44 55 50 29 20 3f 20 4f 50  E_ECEL_DUP) ? OP
1d920 5f 43 6f 70 79 20 3a 20 4f 50 5f 53 43 6f 70 79  _Copy : OP_SCopy
1d930 3b 0a 20 20 61 73 73 65 72 74 28 20 70 4c 69 73  ;.  assert( pLis
1d940 74 21 3d 30 20 29 3b 0a 20 20 61 73 73 65 72 74  t!=0 );.  assert
1d950 28 20 74 61 72 67 65 74 3e 30 20 29 3b 0a 20 20  ( target>0 );.  
1d960 61 73 73 65 72 74 28 20 70 50 61 72 73 65 2d 3e  assert( pParse->
1d970 70 56 64 62 65 21 3d 30 20 29 3b 20 20 2f 2a 20  pVdbe!=0 );  /* 
1d980 4e 65 76 65 72 20 67 65 74 73 20 74 68 69 73 20  Never gets this 
1d990 66 61 72 20 6f 74 68 65 72 77 69 73 65 20 2a 2f  far otherwise */
1d9a0 0a 20 20 6e 20 3d 20 70 4c 69 73 74 2d 3e 6e 45  .  n = pList->nE
1d9b0 78 70 72 3b 0a 20 20 69 66 28 20 21 43 6f 6e 73  xpr;.  if( !Cons
1d9c0 74 46 61 63 74 6f 72 4f 6b 28 70 50 61 72 73 65  tFactorOk(pParse
1d9d0 29 20 29 20 66 6c 61 67 73 20 26 3d 20 7e 53 51  ) ) flags &= ~SQ
1d9e0 4c 49 54 45 5f 45 43 45 4c 5f 46 41 43 54 4f 52  LITE_ECEL_FACTOR
1d9f0 3b 0a 20 20 66 6f 72 28 70 49 74 65 6d 3d 70 4c  ;.  for(pItem=pL
1da00 69 73 74 2d 3e 61 2c 20 69 3d 30 3b 20 69 3c 6e  ist->a, i=0; i<n
1da10 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
1da20 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
1da30 20 3d 20 70 49 74 65 6d 2d 3e 70 45 78 70 72 3b   = pItem->pExpr;
1da40 0a 20 20 20 20 69 66 28 20 28 66 6c 61 67 73 20  .    if( (flags 
1da50 26 20 53 51 4c 49 54 45 5f 45 43 45 4c 5f 46 41  & SQLITE_ECEL_FA
1da60 43 54 4f 52 29 21 3d 30 20 26 26 20 73 71 6c 69  CTOR)!=0 && sqli
1da70 74 65 33 45 78 70 72 49 73 43 6f 6e 73 74 61 6e  te3ExprIsConstan
1da80 74 28 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20  t(pExpr) ){.    
1da90 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64    sqlite3ExprCod
1daa0 65 41 74 49 6e 69 74 28 70 50 61 72 73 65 2c 20  eAtInit(pParse, 
1dab0 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 2c  pExpr, target+i,
1dac0 20 30 29 3b 0a 20 20 20 20 7d 65 6c 73 65 7b 0a   0);.    }else{.
1dad0 20 20 20 20 20 20 69 6e 74 20 69 6e 52 65 67 20        int inReg 
1dae0 3d 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64  = sqlite3ExprCod
1daf0 65 54 61 72 67 65 74 28 70 50 61 72 73 65 2c 20  eTarget(pParse, 
1db00 70 45 78 70 72 2c 20 74 61 72 67 65 74 2b 69 29  pExpr, target+i)
1db10 3b 0a 20 20 20 20 20 20 69 66 28 20 69 6e 52 65  ;.      if( inRe
1db20 67 21 3d 74 61 72 67 65 74 2b 69 20 29 7b 0a 20  g!=target+i ){. 
1db30 20 20 20 20 20 20 20 56 64 62 65 4f 70 20 2a 70         VdbeOp *p
1db40 4f 70 3b 0a 20 20 20 20 20 20 20 20 56 64 62 65  Op;.        Vdbe
1db50 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70 56   *v = pParse->pV
1db60 64 62 65 3b 0a 20 20 20 20 20 20 20 20 69 66 28  dbe;.        if(
1db70 20 63 6f 70 79 4f 70 3d 3d 4f 50 5f 43 6f 70 79   copyOp==OP_Copy
1db80 0a 20 20 20 20 20 20 20 20 20 26 26 20 28 70 4f  .         && (pO
1db90 70 3d 73 71 6c 69 74 65 33 56 64 62 65 47 65 74  p=sqlite3VdbeGet
1dba0 4f 70 28 76 2c 20 2d 31 29 29 2d 3e 6f 70 63 6f  Op(v, -1))->opco
1dbb0 64 65 3d 3d 4f 50 5f 43 6f 70 79 0a 20 20 20 20  de==OP_Copy.    
1dbc0 20 20 20 20 20 26 26 20 70 4f 70 2d 3e 70 31 2b       && pOp->p1+
1dbd0 70 4f 70 2d 3e 70 33 2b 31 3d 3d 69 6e 52 65 67  pOp->p3+1==inReg
1dbe0 0a 20 20 20 20 20 20 20 20 20 26 26 20 70 4f 70  .         && pOp
1dbf0 2d 3e 70 32 2b 70 4f 70 2d 3e 70 33 2b 31 3d 3d  ->p2+pOp->p3+1==
1dc00 74 61 72 67 65 74 2b 69 0a 20 20 20 20 20 20 20  target+i.       
1dc10 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 70 4f   ){.          pO
1dc20 70 2d 3e 70 33 2b 2b 3b 0a 20 20 20 20 20 20 20  p->p3++;.       
1dc30 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20 20 20 20   }else{.        
1dc40 20 20 73 71 6c 69 74 65 33 56 64 62 65 41 64 64    sqlite3VdbeAdd
1dc50 4f 70 32 28 76 2c 20 63 6f 70 79 4f 70 2c 20 69  Op2(v, copyOp, i
1dc60 6e 52 65 67 2c 20 74 61 72 67 65 74 2b 69 29 3b  nReg, target+i);
1dc70 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20  .        }.     
1dc80 20 7d 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72   }.    }.  }.  r
1dc90 65 74 75 72 6e 20 6e 3b 0a 7d 0a 0a 2f 2a 0a 2a  eturn n;.}../*.*
1dca0 2a 20 47 65 6e 65 72 61 74 65 20 63 6f 64 65 20  * Generate code 
1dcb0 66 6f 72 20 61 20 42 45 54 57 45 45 4e 20 6f 70  for a BETWEEN op
1dcc0 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 20 20  erator..**.**   
1dcd0 20 78 20 42 45 54 57 45 45 4e 20 79 20 41 4e 44   x BETWEEN y AND
1dce0 20 7a 0a 2a 2a 0a 2a 2a 20 54 68 65 20 61 62 6f   z.**.** The abo
1dcf0 76 65 20 69 73 20 65 71 75 69 76 61 6c 65 6e 74  ve is equivalent
1dd00 20 74 6f 20 0a 2a 2a 0a 2a 2a 20 20 20 20 78 3e   to .**.**    x>
1dd10 3d 79 20 41 4e 44 20 78 3c 3d 7a 0a 2a 2a 0a 2a  =y AND x<=z.**.*
1dd20 2a 20 43 6f 64 65 20 69 74 20 61 73 20 73 75 63  * Code it as suc
1dd30 68 2c 20 74 61 6b 69 6e 67 20 63 61 72 65 20 74  h, taking care t
1dd40 6f 20 64 6f 20 74 68 65 20 63 6f 6d 6d 6f 6e 20  o do the common 
1dd50 73 75 62 65 78 70 72 65 73 73 69 6f 6e 0a 2a 2a  subexpression.**
1dd60 20 65 6c 65 6d 65 6e 74 61 74 69 6f 6e 20 6f 66   elementation of
1dd70 20 78 2e 0a 2a 2f 0a 73 74 61 74 69 63 20 76 6f   x..*/.static vo
1dd80 69 64 20 65 78 70 72 43 6f 64 65 42 65 74 77 65  id exprCodeBetwe
1dd90 65 6e 28 0a 20 20 50 61 72 73 65 20 2a 70 50 61  en(.  Parse *pPa
1dda0 72 73 65 2c 20 20 20 20 2f 2a 20 50 61 72 73 69  rse,    /* Parsi
1ddb0 6e 67 20 61 6e 64 20 63 6f 64 65 20 67 65 6e 65  ng and code gene
1ddc0 72 61 74 69 6e 67 20 63 6f 6e 74 65 78 74 20 2a  rating context *
1ddd0 2f 0a 20 20 45 78 70 72 20 2a 70 45 78 70 72 2c  /.  Expr *pExpr,
1dde0 20 20 20 20 20 20 2f 2a 20 54 68 65 20 42 45 54        /* The BET
1ddf0 57 45 45 4e 20 65 78 70 72 65 73 73 69 6f 6e 20  WEEN expression 
1de00 2a 2f 0a 20 20 69 6e 74 20 64 65 73 74 2c 20 20  */.  int dest,  
1de10 20 20 20 20 20 20 20 2f 2a 20 4a 75 6d 70 20 68         /* Jump h
1de20 65 72 65 20 69 66 20 74 68 65 20 6a 75 6d 70 20  ere if the jump 
1de30 69 73 20 74 61 6b 65 6e 20 2a 2f 0a 20 20 69 6e  is taken */.  in
1de40 74 20 6a 75 6d 70 49 66 54 72 75 65 2c 20 20 20  t jumpIfTrue,   
1de50 2f 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70  /* Take the jump
1de60 20 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20   if the BETWEEN 
1de70 69 73 20 74 72 75 65 20 2a 2f 0a 20 20 69 6e 74  is true */.  int
1de80 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 20 20 20 2f   jumpIfNull    /
1de90 2a 20 54 61 6b 65 20 74 68 65 20 6a 75 6d 70 20  * Take the jump 
1dea0 69 66 20 74 68 65 20 42 45 54 57 45 45 4e 20 69  if the BETWEEN i
1deb0 73 20 4e 55 4c 4c 20 2a 2f 0a 29 7b 0a 20 20 45  s NULL */.){.  E
1dec0 78 70 72 20 65 78 70 72 41 6e 64 3b 20 20 20 20  xpr exprAnd;    
1ded0 20 2f 2a 20 54 68 65 20 41 4e 44 20 6f 70 65 72   /* The AND oper
1dee0 61 74 6f 72 20 69 6e 20 20 78 3e 3d 79 20 41 4e  ator in  x>=y AN
1def0 44 20 78 3c 3d 7a 20 20 2a 2f 0a 20 20 45 78 70  D x<=z  */.  Exp
1df00 72 20 63 6f 6d 70 4c 65 66 74 3b 20 20 20 20 2f  r compLeft;    /
1df10 2a 20 54 68 65 20 20 78 3e 3d 79 20 20 74 65 72  * The  x>=y  ter
1df20 6d 20 2a 2f 0a 20 20 45 78 70 72 20 63 6f 6d 70  m */.  Expr comp
1df30 52 69 67 68 74 3b 20 20 20 2f 2a 20 54 68 65 20  Right;   /* The 
1df40 20 78 3c 3d 7a 20 20 74 65 72 6d 20 2a 2f 0a 20   x<=z  term */. 
1df50 20 45 78 70 72 20 65 78 70 72 58 3b 20 20 20 20   Expr exprX;    
1df60 20 20 20 2f 2a 20 54 68 65 20 20 78 20 20 73 75     /* The  x  su
1df70 62 65 78 70 72 65 73 73 69 6f 6e 20 2a 2f 0a 20  bexpression */. 
1df80 20 69 6e 74 20 72 65 67 46 72 65 65 31 20 3d 20   int regFree1 = 
1df90 30 3b 20 2f 2a 20 54 65 6d 70 6f 72 61 72 79 20  0; /* Temporary 
1dfa0 75 73 65 20 72 65 67 69 73 74 65 72 20 2a 2f 0a  use register */.
1dfb0 0a 20 20 61 73 73 65 72 74 28 20 21 45 78 70 72  .  assert( !Expr
1dfc0 48 61 73 50 72 6f 70 65 72 74 79 28 70 45 78 70  HasProperty(pExp
1dfd0 72 2c 20 45 50 5f 78 49 73 53 65 6c 65 63 74 29  r, EP_xIsSelect)
1dfe0 20 29 3b 0a 20 20 65 78 70 72 58 20 3d 20 2a 70   );.  exprX = *p
1dff0 45 78 70 72 2d 3e 70 4c 65 66 74 3b 0a 20 20 65  Expr->pLeft;.  e
1e000 78 70 72 41 6e 64 2e 6f 70 20 3d 20 54 4b 5f 41  xprAnd.op = TK_A
1e010 4e 44 3b 0a 20 20 65 78 70 72 41 6e 64 2e 70 4c  ND;.  exprAnd.pL
1e020 65 66 74 20 3d 20 26 63 6f 6d 70 4c 65 66 74 3b  eft = &compLeft;
1e030 0a 20 20 65 78 70 72 41 6e 64 2e 70 52 69 67 68  .  exprAnd.pRigh
1e040 74 20 3d 20 26 63 6f 6d 70 52 69 67 68 74 3b 0a  t = &compRight;.
1e050 20 20 63 6f 6d 70 4c 65 66 74 2e 6f 70 20 3d 20    compLeft.op = 
1e060 54 4b 5f 47 45 3b 0a 20 20 63 6f 6d 70 4c 65 66  TK_GE;.  compLef
1e070 74 2e 70 4c 65 66 74 20 3d 20 26 65 78 70 72 58  t.pLeft = &exprX
1e080 3b 0a 20 20 63 6f 6d 70 4c 65 66 74 2e 70 52 69  ;.  compLeft.pRi
1e090 67 68 74 20 3d 20 70 45 78 70 72 2d 3e 78 2e 70  ght = pExpr->x.p
1e0a0 4c 69 73 74 2d 3e 61 5b 30 5d 2e 70 45 78 70 72  List->a[0].pExpr
1e0b0 3b 0a 20 20 63 6f 6d 70 52 69 67 68 74 2e 6f 70  ;.  compRight.op
1e0c0 20 3d 20 54 4b 5f 4c 45 3b 0a 20 20 63 6f 6d 70   = TK_LE;.  comp
1e0d0 52 69 67 68 74 2e 70 4c 65 66 74 20 3d 20 26 65  Right.pLeft = &e
1e0e0 78 70 72 58 3b 0a 20 20 63 6f 6d 70 52 69 67 68  xprX;.  compRigh
1e0f0 74 2e 70 52 69 67 68 74 20 3d 20 70 45 78 70 72  t.pRight = pExpr
1e100 2d 3e 78 2e 70 4c 69 73 74 2d 3e 61 5b 31 5d 2e  ->x.pList->a[1].
1e110 70 45 78 70 72 3b 0a 20 20 65 78 70 72 54 6f 52  pExpr;.  exprToR
1e120 65 67 69 73 74 65 72 28 26 65 78 70 72 58 2c 20  egister(&exprX, 
1e130 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
1e140 65 6d 70 28 70 50 61 72 73 65 2c 20 26 65 78 70  emp(pParse, &exp
1e150 72 58 2c 20 26 72 65 67 46 72 65 65 31 29 29 3b  rX, &regFree1));
1e160 0a 20 20 69 66 28 20 6a 75 6d 70 49 66 54 72 75  .  if( jumpIfTru
1e170 65 20 29 7b 0a 20 20 20 20 73 71 6c 69 74 65 33  e ){.    sqlite3
1e180 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72 73  ExprIfTrue(pPars
1e190 65 2c 20 26 65 78 70 72 41 6e 64 2c 20 64 65 73  e, &exprAnd, des
1e1a0 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
1e1b0 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 73 71 6c    }else{.    sql
1e1c0 69 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28  ite3ExprIfFalse(
1e1d0 70 50 61 72 73 65 2c 20 26 65 78 70 72 41 6e 64  pParse, &exprAnd
1e1e0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1e1f0 6c 6c 29 3b 0a 20 20 7d 0a 20 20 73 71 6c 69 74  ll);.  }.  sqlit
1e200 65 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67  e3ReleaseTempReg
1e210 28 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65  (pParse, regFree
1e220 31 29 3b 0a 0a 20 20 2f 2a 20 45 6e 73 75 72 65  1);..  /* Ensure
1e230 20 61 64 65 71 75 61 74 65 20 74 65 73 74 20 63   adequate test c
1e240 6f 76 65 72 61 67 65 20 2a 2f 0a 20 20 74 65 73  overage */.  tes
1e250 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75  tcase( jumpIfTru
1e260 65 3d 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75  e==0 && jumpIfNu
1e270 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65 65  ll==0 && regFree
1e280 31 3d 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61  1==0 );.  testca
1e290 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d  se( jumpIfTrue==
1e2a0 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  0 && jumpIfNull=
1e2b0 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 21 3d  =0 && regFree1!=
1e2c0 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65 28  0 );.  testcase(
1e2d0 20 6a 75 6d 70 49 66 54 72 75 65 3d 3d 30 20 26   jumpIfTrue==0 &
1e2e0 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20  & jumpIfNull!=0 
1e2f0 26 26 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  && regFree1==0 )
1e300 3b 0a 20 20 74 65 73 74 63 61 73 65 28 20 6a 75  ;.  testcase( ju
1e310 6d 70 49 66 54 72 75 65 3d 3d 30 20 26 26 20 6a  mpIfTrue==0 && j
1e320 75 6d 70 49 66 4e 75 6c 6c 21 3d 30 20 26 26 20  umpIfNull!=0 && 
1e330 72 65 67 46 72 65 65 31 21 3d 30 20 29 3b 0a 20  regFree1!=0 );. 
1e340 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1e350 66 54 72 75 65 21 3d 30 20 26 26 20 6a 75 6d 70  fTrue!=0 && jump
1e360 49 66 4e 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67  IfNull==0 && reg
1e370 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 74 65  Free1==0 );.  te
1e380 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 54 72  stcase( jumpIfTr
1e390 75 65 21 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e  ue!=0 && jumpIfN
1e3a0 75 6c 6c 3d 3d 30 20 26 26 20 72 65 67 46 72 65  ull==0 && regFre
1e3b0 65 31 21 3d 30 20 29 3b 0a 20 20 74 65 73 74 63  e1!=0 );.  testc
1e3c0 61 73 65 28 20 6a 75 6d 70 49 66 54 72 75 65 21  ase( jumpIfTrue!
1e3d0 3d 30 20 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c  =0 && jumpIfNull
1e3e0 21 3d 30 20 26 26 20 72 65 67 46 72 65 65 31 3d  !=0 && regFree1=
1e3f0 3d 30 20 29 3b 0a 20 20 74 65 73 74 63 61 73 65  =0 );.  testcase
1e400 28 20 6a 75 6d 70 49 66 54 72 75 65 21 3d 30 20  ( jumpIfTrue!=0 
1e410 26 26 20 6a 75 6d 70 49 66 4e 75 6c 6c 21 3d 30  && jumpIfNull!=0
1e420 20 26 26 20 72 65 67 46 72 65 65 31 21 3d 30 20   && regFree1!=0 
1e430 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65  );.}../*.** Gene
1e440 72 61 74 65 20 63 6f 64 65 20 66 6f 72 20 61 20  rate code for a 
1e450 62 6f 6f 6c 65 61 6e 20 65 78 70 72 65 73 73 69  boolean expressi
1e460 6f 6e 20 73 75 63 68 20 74 68 61 74 20 61 20 6a  on such that a j
1e470 75 6d 70 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74  ump is made.** t
1e480 6f 20 74 68 65 20 6c 61 62 65 6c 20 22 64 65 73  o the label "des
1e490 74 22 20 69 66 20 74 68 65 20 65 78 70 72 65 73  t" if the expres
1e4a0 73 69 6f 6e 20 69 73 20 74 72 75 65 20 62 75 74  sion is true but
1e4b0 20 65 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f   execution.** co
1e4c0 6e 74 69 6e 75 65 73 20 73 74 72 61 69 67 68 74  ntinues straight
1e4d0 20 74 68 72 75 20 69 66 20 74 68 65 20 65 78 70   thru if the exp
1e4e0 72 65 73 73 69 6f 6e 20 69 73 20 66 61 6c 73 65  ression is false
1e4f0 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65  ..**.** If the e
1e500 78 70 72 65 73 73 69 6f 6e 20 65 76 61 6c 75 61  xpression evalua
1e510 74 65 73 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69  tes to NULL (nei
1e520 74 68 65 72 20 74 72 75 65 20 6e 6f 72 20 66 61  ther true nor fa
1e530 6c 73 65 29 2c 20 74 68 65 6e 0a 2a 2a 20 74 61  lse), then.** ta
1e540 6b 65 20 74 68 65 20 6a 75 6d 70 20 69 66 20 74  ke the jump if t
1e550 68 65 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 66 6c  he jumpIfNull fl
1e560 61 67 20 69 73 20 53 51 4c 49 54 45 5f 4a 55 4d  ag is SQLITE_JUM
1e570 50 49 46 4e 55 4c 4c 2e 0a 2a 2a 0a 2a 2a 20 54  PIFNULL..**.** T
1e580 68 69 73 20 63 6f 64 65 20 64 65 70 65 6e 64 73  his code depends
1e590 20 6f 6e 20 74 68 65 20 66 61 63 74 20 74 68 61   on the fact tha
1e5a0 74 20 63 65 72 74 61 69 6e 20 74 6f 6b 65 6e 20  t certain token 
1e5b0 76 61 6c 75 65 73 20 28 65 78 3a 20 54 4b 5f 45  values (ex: TK_E
1e5c0 51 29 0a 2a 2a 20 61 72 65 20 74 68 65 20 73 61  Q).** are the sa
1e5d0 6d 65 20 61 73 20 6f 70 63 6f 64 65 20 76 61 6c  me as opcode val
1e5e0 75 65 73 20 28 65 78 3a 20 4f 50 5f 45 71 29 20  ues (ex: OP_Eq) 
1e5f0 74 68 61 74 20 69 6d 70 6c 65 6d 65 6e 74 20 74  that implement t
1e600 68 65 20 63 6f 72 72 65 73 70 6f 6e 64 69 6e 67  he corresponding
1e610 0a 2a 2a 20 6f 70 65 72 61 74 69 6f 6e 2e 20 20  .** operation.  
1e620 53 70 65 63 69 61 6c 20 63 6f 6d 6d 65 6e 74 73  Special comments
1e630 20 69 6e 20 76 64 62 65 2e 63 20 61 6e 64 20 74   in vdbe.c and t
1e640 68 65 20 6d 6b 6f 70 63 6f 64 65 68 2e 61 77 6b  he mkopcodeh.awk
1e650 20 73 63 72 69 70 74 20 69 6e 0a 2a 2a 20 74 68   script in.** th
1e660 65 20 6d 61 6b 65 20 70 72 6f 63 65 73 73 20 63  e make process c
1e670 61 75 73 65 20 74 68 65 73 65 20 76 61 6c 75 65  ause these value
1e680 73 20 74 6f 20 61 6c 69 67 6e 2e 20 20 41 73 73  s to align.  Ass
1e690 65 72 74 28 29 73 20 69 6e 20 74 68 65 20 63 6f  ert()s in the co
1e6a0 64 65 0a 2a 2a 20 62 65 6c 6f 77 20 76 65 72 69  de.** below veri
1e6b0 66 79 20 74 68 61 74 20 74 68 65 20 6e 75 6d 62  fy that the numb
1e6c0 65 72 73 20 61 72 65 20 61 6c 69 67 6e 65 64 20  ers are aligned 
1e6d0 63 6f 72 72 65 63 74 6c 79 2e 0a 2a 2f 0a 76 6f  correctly..*/.vo
1e6e0 69 64 20 73 71 6c 69 74 65 33 45 78 70 72 49 66  id sqlite3ExprIf
1e6f0 54 72 75 65 28 50 61 72 73 65 20 2a 70 50 61 72  True(Parse *pPar
1e700 73 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c  se, Expr *pExpr,
1e710 20 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a   int dest, int j
1e720 75 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64  umpIfNull){.  Vd
1e730 62 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e  be *v = pParse->
1e740 70 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20  pVdbe;.  int op 
1e750 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72  = 0;.  int regFr
1e760 65 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72  ee1 = 0;.  int r
1e770 65 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69  egFree2 = 0;.  i
1e780 6e 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73  nt r1, r2;..  as
1e790 73 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  sert( jumpIfNull
1e7a0 3d 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e  ==SQLITE_JUMPIFN
1e7b0 55 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c  ULL || jumpIfNul
1e7c0 6c 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45  l==0 );.  if( NE
1e7d0 56 45 52 28 76 3d 3d 30 29 20 29 20 20 20 20 20  VER(v==0) )     
1e7e0 72 65 74 75 72 6e 3b 20 20 2f 2a 20 45 78 69 73  return;  /* Exis
1e7f0 74 65 6e 63 65 20 6f 66 20 56 44 42 45 20 63 68  tence of VDBE ch
1e800 65 63 6b 65 64 20 62 79 20 63 61 6c 6c 65 72 20  ecked by caller 
1e810 2a 2f 0a 20 20 69 66 28 20 4e 45 56 45 52 28 70  */.  if( NEVER(p
1e820 45 78 70 72 3d 3d 30 29 20 29 20 72 65 74 75 72  Expr==0) ) retur
1e830 6e 3b 20 20 2f 2a 20 4e 6f 20 77 61 79 20 74 68  n;  /* No way th
1e840 69 73 20 63 61 6e 20 68 61 70 70 65 6e 20 2a 2f  is can happen */
1e850 0a 20 20 6f 70 20 3d 20 70 45 78 70 72 2d 3e 6f  .  op = pExpr->o
1e860 70 3b 0a 20 20 73 77 69 74 63 68 28 20 6f 70 20  p;.  switch( op 
1e870 29 7b 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 41  ){.    case TK_A
1e880 4e 44 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20  ND: {.      int 
1e890 64 32 20 3d 20 73 71 6c 69 74 65 33 56 64 62 65  d2 = sqlite3Vdbe
1e8a0 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a 20 20  MakeLabel(v);.  
1e8b0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75      testcase( ju
1e8c0 6d 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20  mpIfNull==0 );. 
1e8d0 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72       sqlite3Expr
1e8e0 49 66 46 61 6c 73 65 28 70 50 61 72 73 65 2c 20  IfFalse(pParse, 
1e8f0 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 32  pExpr->pLeft, d2
1e900 2c 6a 75 6d 70 49 66 4e 75 6c 6c 5e 53 51 4c 49  ,jumpIfNull^SQLI
1e910 54 45 5f 4a 55 4d 50 49 46 4e 55 4c 4c 29 3b 0a  TE_JUMPIFNULL);.
1e920 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78 70        sqlite3Exp
1e930 72 43 61 63 68 65 50 75 73 68 28 70 50 61 72 73  rCachePush(pPars
1e940 65 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  e);.      sqlite
1e950 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61 72  3ExprIfTrue(pPar
1e960 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68  se, pExpr->pRigh
1e970 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1e980 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1e990 74 65 33 56 64 62 65 52 65 73 6f 6c 76 65 4c 61  te3VdbeResolveLa
1e9a0 62 65 6c 28 76 2c 20 64 32 29 3b 0a 20 20 20 20  bel(v, d2);.    
1e9b0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1e9c0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1e9d0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1e9e0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4f 52  }.    case TK_OR
1e9f0 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
1ea00 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
1ea10 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  0 );.      sqlit
1ea20 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50 61  e3ExprIfTrue(pPa
1ea30 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ea40 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e  t, dest, jumpIfN
1ea50 75 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  ull);.      sqli
1ea60 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73 68  te3ExprCachePush
1ea70 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20  (pParse);.      
1ea80 73 71 6c 69 74 65 33 45 78 70 72 49 66 54 72 75  sqlite3ExprIfTru
1ea90 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d  e(pParse, pExpr-
1eaa0 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c 20 6a  >pRight, dest, j
1eab0 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  umpIfNull);.    
1eac0 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 61 63    sqlite3ExprCac
1ead0 68 65 50 6f 70 28 70 50 61 72 73 65 29 3b 0a 20  hePop(pParse);. 
1eae0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
1eaf0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f  }.    case TK_NO
1eb00 54 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  T: {.      testc
1eb10 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1eb20 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1eb30 74 65 33 45 78 70 72 49 66 46 61 6c 73 65 28 70  te3ExprIfFalse(p
1eb40 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1eb50 65 66 74 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49  eft, dest, jumpI
1eb60 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 62 72  fNull);.      br
1eb70 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1eb80 61 73 65 20 54 4b 5f 4c 54 3a 0a 20 20 20 20 63  ase TK_LT:.    c
1eb90 61 73 65 20 54 4b 5f 4c 45 3a 0a 20 20 20 20 63  ase TK_LE:.    c
1eba0 61 73 65 20 54 4b 5f 47 54 3a 0a 20 20 20 20 63  ase TK_GT:.    c
1ebb0 61 73 65 20 54 4b 5f 47 45 3a 0a 20 20 20 20 63  ase TK_GE:.    c
1ebc0 61 73 65 20 54 4b 5f 4e 45 3a 0a 20 20 20 20 63  ase TK_NE:.    c
1ebd0 61 73 65 20 54 4b 5f 45 51 3a 20 7b 0a 20 20 20  ase TK_EQ: {.   
1ebe0 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
1ebf0 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
1ec00 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33      r1 = sqlite3
1ec10 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61  ExprCodeTemp(pPa
1ec20 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1ec30 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20  t, &regFree1);. 
1ec40 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69 74 65       r2 = sqlite
1ec50 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50  3ExprCodeTemp(pP
1ec60 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 52 69  arse, pExpr->pRi
1ec70 67 68 74 2c 20 26 72 65 67 46 72 65 65 32 29 3b  ght, &regFree2);
1ec80 0a 20 20 20 20 20 20 63 6f 64 65 43 6f 6d 70 61  .      codeCompa
1ec90 72 65 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  re(pParse, pExpr
1eca0 2d 3e 70 4c 65 66 74 2c 20 70 45 78 70 72 2d 3e  ->pLeft, pExpr->
1ecb0 70 52 69 67 68 74 2c 20 6f 70 2c 0a 20 20 20 20  pRight, op,.    
1ecc0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 72 31                r1
1ecd0 2c 20 72 32 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r2, dest, jump
1ece0 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20 20 20 61  IfNull);.      a
1ecf0 73 73 65 72 74 28 54 4b 5f 4c 54 3d 3d 4f 50 5f  ssert(TK_LT==OP_
1ed00 4c 74 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70  Lt); testcase(op
1ed10 3d 3d 4f 50 5f 4c 74 29 3b 20 56 64 62 65 43 6f  ==OP_Lt); VdbeCo
1ed20 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f  verageIf(v,op==O
1ed30 50 5f 4c 74 29 3b 0a 20 20 20 20 20 20 61 73 73  P_Lt);.      ass
1ed40 65 72 74 28 54 4b 5f 4c 45 3d 3d 4f 50 5f 4c 65  ert(TK_LE==OP_Le
1ed50 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d  ); testcase(op==
1ed60 4f 50 5f 4c 65 29 3b 20 56 64 62 65 43 6f 76 65  OP_Le); VdbeCove
1ed70 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f  rageIf(v,op==OP_
1ed80 4c 65 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72  Le);.      asser
1ed90 74 28 54 4b 5f 47 54 3d 3d 4f 50 5f 47 74 29 3b  t(TK_GT==OP_Gt);
1eda0 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50   testcase(op==OP
1edb0 5f 47 74 29 3b 20 56 64 62 65 43 6f 76 65 72 61  _Gt); VdbeCovera
1edc0 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 74  geIf(v,op==OP_Gt
1edd0 29 3b 0a 20 20 20 20 20 20 61 73 73 65 72 74 28  );.      assert(
1ede0 54 4b 5f 47 45 3d 3d 4f 50 5f 47 65 29 3b 20 74  TK_GE==OP_Ge); t
1edf0 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 47  estcase(op==OP_G
1ee00 65 29 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65  e); VdbeCoverage
1ee10 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 47 65 29 3b  If(v,op==OP_Ge);
1ee20 0a 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b  .      assert(TK
1ee30 5f 45 51 3d 3d 4f 50 5f 45 71 29 3b 20 74 65 73  _EQ==OP_Eq); tes
1ee40 74 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 45 71 29  tcase(op==OP_Eq)
1ee50 3b 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66  ; VdbeCoverageIf
1ee60 28 76 2c 6f 70 3d 3d 4f 50 5f 45 71 29 3b 0a 20  (v,op==OP_Eq);. 
1ee70 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4e       assert(TK_N
1ee80 45 3d 3d 4f 50 5f 4e 65 29 3b 20 74 65 73 74 63  E==OP_Ne); testc
1ee90 61 73 65 28 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 20  ase(op==OP_Ne); 
1eea0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1eeb0 2c 6f 70 3d 3d 4f 50 5f 4e 65 29 3b 0a 20 20 20  ,op==OP_Ne);.   
1eec0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1eed0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1eee0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
1eef0 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree2==0 );.     
1ef00 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
1ef10 20 20 63 61 73 65 20 54 4b 5f 49 53 3a 0a 20 20    case TK_IS:.  
1ef20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 4f 54 3a    case TK_ISNOT:
1ef30 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73   {.      testcas
1ef40 65 28 20 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a  e( op==TK_IS );.
1ef50 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28 20        testcase( 
1ef60 6f 70 3d 3d 54 4b 5f 49 53 4e 4f 54 20 29 3b 0a  op==TK_ISNOT );.
1ef70 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69 74        r1 = sqlit
1ef80 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28 70  e3ExprCodeTemp(p
1ef90 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c  Parse, pExpr->pL
1efa0 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29 3b  eft, &regFree1);
1efb0 0a 20 20 20 20 20 20 72 32 20 3d 20 73 71 6c 69  .      r2 = sqli
1efc0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1efd0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1efe0 52 69 67 68 74 2c 20 26 72 65 67 46 72 65 65 32  Right, &regFree2
1eff0 29 3b 0a 20 20 20 20 20 20 6f 70 20 3d 20 28 6f  );.      op = (o
1f000 70 3d 3d 54 4b 5f 49 53 29 20 3f 20 54 4b 5f 45  p==TK_IS) ? TK_E
1f010 51 20 3a 20 54 4b 5f 4e 45 3b 0a 20 20 20 20 20  Q : TK_NE;.     
1f020 20 63 6f 64 65 43 6f 6d 70 61 72 65 28 70 50 61   codeCompare(pPa
1f030 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66  rse, pExpr->pLef
1f040 74 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  t, pExpr->pRight
1f050 2c 20 6f 70 2c 0a 20 20 20 20 20 20 20 20 20 20  , op,.          
1f060 20 20 20 20 20 20 20 20 72 31 2c 20 72 32 2c 20          r1, r2, 
1f070 64 65 73 74 2c 20 53 51 4c 49 54 45 5f 4e 55 4c  dest, SQLITE_NUL
1f080 4c 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  LEQ);.      Vdbe
1f090 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
1f0a0 3d 3d 54 4b 5f 45 51 29 3b 0a 20 20 20 20 20 20  ==TK_EQ);.      
1f0b0 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76  VdbeCoverageIf(v
1f0c0 2c 20 6f 70 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20  , op==TK_NE);.  
1f0d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65      testcase( re
1f0e0 67 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20  gFree1==0 );.   
1f0f0 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f100 46 72 65 65 32 3d 3d 30 20 29 3b 0a 20 20 20 20  Free2==0 );.    
1f110 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f120 20 20 20 63 61 73 65 20 54 4b 5f 49 53 4e 55 4c     case TK_ISNUL
1f130 4c 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e  L:.    case TK_N
1f140 4f 54 4e 55 4c 4c 3a 20 7b 0a 20 20 20 20 20 20  OTNULL: {.      
1f150 61 73 73 65 72 74 28 20 54 4b 5f 49 53 4e 55 4c  assert( TK_ISNUL
1f160 4c 3d 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 20  L==OP_IsNull ); 
1f170 20 20 74 65 73 74 63 61 73 65 28 20 6f 70 3d 3d    testcase( op==
1f180 54 4b 5f 49 53 4e 55 4c 4c 20 29 3b 0a 20 20 20  TK_ISNULL );.   
1f190 20 20 20 61 73 73 65 72 74 28 20 54 4b 5f 4e 4f     assert( TK_NO
1f1a0 54 4e 55 4c 4c 3d 3d 4f 50 5f 4e 6f 74 4e 75 6c  TNULL==OP_NotNul
1f1b0 6c 20 29 3b 20 74 65 73 74 63 61 73 65 28 20 6f  l ); testcase( o
1f1c0 70 3d 3d 54 4b 5f 4e 4f 54 4e 55 4c 4c 20 29 3b  p==TK_NOTNULL );
1f1d0 0a 20 20 20 20 20 20 72 31 20 3d 20 73 71 6c 69  .      r1 = sqli
1f1e0 74 65 33 45 78 70 72 43 6f 64 65 54 65 6d 70 28  te3ExprCodeTemp(
1f1f0 70 50 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70  pParse, pExpr->p
1f200 4c 65 66 74 2c 20 26 72 65 67 46 72 65 65 31 29  Left, &regFree1)
1f210 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 56  ;.      sqlite3V
1f220 64 62 65 41 64 64 4f 70 32 28 76 2c 20 6f 70 2c  dbeAddOp2(v, op,
1f230 20 72 31 2c 20 64 65 73 74 29 3b 0a 20 20 20 20   r1, dest);.    
1f240 20 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66    VdbeCoverageIf
1f250 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c  (v, op==TK_ISNUL
1f260 4c 29 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f  L);.      VdbeCo
1f270 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d  verageIf(v, op==
1f280 54 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20  TK_NOTNULL);.   
1f290 20 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67     testcase( reg
1f2a0 46 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20  Free1==0 );.    
1f2b0 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20    break;.    }. 
1f2c0 20 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45     case TK_BETWE
1f2d0 45 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74  EN: {.      test
1f2e0 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c  case( jumpIfNull
1f2f0 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70  ==0 );.      exp
1f300 72 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61  rCodeBetween(pPa
1f310 72 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74  rse, pExpr, dest
1f320 2c 20 31 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29  , 1, jumpIfNull)
1f330 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
1f340 20 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c     }.#ifndef SQL
1f350 49 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52  ITE_OMIT_SUBQUER
1f360 59 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e  Y.    case TK_IN
1f370 3a 20 7b 0a 20 20 20 20 20 20 69 6e 74 20 64 65  : {.      int de
1f380 73 74 49 66 46 61 6c 73 65 20 3d 20 73 71 6c 69  stIfFalse = sqli
1f390 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1f3a0 28 76 29 3b 0a 20 20 20 20 20 20 69 6e 74 20 64  (v);.      int d
1f3b0 65 73 74 49 66 4e 75 6c 6c 20 3d 20 6a 75 6d 70  estIfNull = jump
1f3c0 49 66 4e 75 6c 6c 20 3f 20 64 65 73 74 20 3a 20  IfNull ? dest : 
1f3d0 64 65 73 74 49 66 46 61 6c 73 65 3b 0a 20 20 20  destIfFalse;.   
1f3e0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
1f3f0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
1f400 70 72 2c 20 64 65 73 74 49 66 46 61 6c 73 65 2c  pr, destIfFalse,
1f410 20 64 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20   destIfNull);.  
1f420 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 41      sqlite3VdbeA
1f430 64 64 4f 70 32 28 76 2c 20 4f 50 5f 47 6f 74 6f  ddOp2(v, OP_Goto
1f440 2c 20 30 2c 20 64 65 73 74 29 3b 0a 20 20 20 20  , 0, dest);.    
1f450 20 20 73 71 6c 69 74 65 33 56 64 62 65 52 65 73    sqlite3VdbeRes
1f460 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64 65 73  olveLabel(v, des
1f470 74 49 66 46 61 6c 73 65 29 3b 0a 20 20 20 20 20  tIfFalse);.     
1f480 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 23 65   break;.    }.#e
1f490 6e 64 69 66 0a 20 20 20 20 64 65 66 61 75 6c 74  ndif.    default
1f4a0 3a 20 7b 0a 20 20 20 20 20 20 69 66 28 20 65 78  : {.      if( ex
1f4b0 70 72 41 6c 77 61 79 73 54 72 75 65 28 70 45 78  prAlwaysTrue(pEx
1f4c0 70 72 29 20 29 7b 0a 20 20 20 20 20 20 20 20 73  pr) ){.        s
1f4d0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 32  qlite3VdbeAddOp2
1f4e0 28 76 2c 20 4f 50 5f 47 6f 74 6f 2c 20 30 2c 20  (v, OP_Goto, 0, 
1f4f0 64 65 73 74 29 3b 0a 20 20 20 20 20 20 7d 65 6c  dest);.      }el
1f500 73 65 20 69 66 28 20 65 78 70 72 41 6c 77 61 79  se if( exprAlway
1f510 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
1f520 0a 20 20 20 20 20 20 20 20 2f 2a 20 4e 6f 2d 6f  .        /* No-o
1f530 70 20 2a 2f 0a 20 20 20 20 20 20 7d 65 6c 73 65  p */.      }else
1f540 7b 0a 20 20 20 20 20 20 20 20 72 31 20 3d 20 73  {.        r1 = s
1f550 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54 65  qlite3ExprCodeTe
1f560 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70 72  mp(pParse, pExpr
1f570 2c 20 26 72 65 67 46 72 65 65 31 29 3b 0a 20 20  , &regFree1);.  
1f580 20 20 20 20 20 20 73 71 6c 69 74 65 33 56 64 62        sqlite3Vdb
1f590 65 41 64 64 4f 70 33 28 76 2c 20 4f 50 5f 49 66  eAddOp3(v, OP_If
1f5a0 2c 20 72 31 2c 20 64 65 73 74 2c 20 6a 75 6d 70  , r1, dest, jump
1f5b0 49 66 4e 75 6c 6c 21 3d 30 29 3b 0a 20 20 20 20  IfNull!=0);.    
1f5c0 20 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65      VdbeCoverage
1f5d0 28 76 29 3b 0a 20 20 20 20 20 20 20 20 74 65 73  (v);.        tes
1f5e0 74 63 61 73 65 28 20 72 65 67 46 72 65 65 31 3d  tcase( regFree1=
1f5f0 3d 30 20 29 3b 0a 20 20 20 20 20 20 20 20 74 65  =0 );.        te
1f600 73 74 63 61 73 65 28 20 6a 75 6d 70 49 66 4e 75  stcase( jumpIfNu
1f610 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 7d  ll==0 );.      }
1f620 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
1f630 20 20 7d 0a 20 20 7d 0a 20 20 73 71 6c 69 74 65    }.  }.  sqlite
1f640 33 52 65 6c 65 61 73 65 54 65 6d 70 52 65 67 28  3ReleaseTempReg(
1f650 70 50 61 72 73 65 2c 20 72 65 67 46 72 65 65 31  pParse, regFree1
1f660 29 3b 0a 20 20 73 71 6c 69 74 65 33 52 65 6c 65  );.  sqlite3Rele
1f670 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72 73  aseTempReg(pPars
1f680 65 2c 20 72 65 67 46 72 65 65 32 29 3b 20 20 0a  e, regFree2);  .
1f690 7d 0a 0a 2f 2a 0a 2a 2a 20 47 65 6e 65 72 61 74  }../*.** Generat
1f6a0 65 20 63 6f 64 65 20 66 6f 72 20 61 20 62 6f 6f  e code for a boo
1f6b0 6c 65 61 6e 20 65 78 70 72 65 73 73 69 6f 6e 20  lean expression 
1f6c0 73 75 63 68 20 74 68 61 74 20 61 20 6a 75 6d 70  such that a jump
1f6d0 20 69 73 20 6d 61 64 65 0a 2a 2a 20 74 6f 20 74   is made.** to t
1f6e0 68 65 20 6c 61 62 65 6c 20 22 64 65 73 74 22 20  he label "dest" 
1f6f0 69 66 20 74 68 65 20 65 78 70 72 65 73 73 69 6f  if the expressio
1f700 6e 20 69 73 20 66 61 6c 73 65 20 62 75 74 20 65  n is false but e
1f710 78 65 63 75 74 69 6f 6e 0a 2a 2a 20 63 6f 6e 74  xecution.** cont
1f720 69 6e 75 65 73 20 73 74 72 61 69 67 68 74 20 74  inues straight t
1f730 68 72 75 20 69 66 20 74 68 65 20 65 78 70 72 65  hru if the expre
1f740 73 73 69 6f 6e 20 69 73 20 74 72 75 65 2e 0a 2a  ssion is true..*
1f750 2a 0a 2a 2a 20 49 66 20 74 68 65 20 65 78 70 72  *.** If the expr
1f760 65 73 73 69 6f 6e 20 65 76 61 6c 75 61 74 65 73  ession evaluates
1f770 20 74 6f 20 4e 55 4c 4c 20 28 6e 65 69 74 68 65   to NULL (neithe
1f780 72 20 74 72 75 65 20 6e 6f 72 20 66 61 6c 73 65  r true nor false
1f790 29 20 74 68 65 6e 0a 2a 2a 20 6a 75 6d 70 20 69  ) then.** jump i
1f7a0 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 20 69 73 20  f jumpIfNull is 
1f7b0 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55 4c  SQLITE_JUMPIFNUL
1f7c0 4c 20 6f 72 20 66 61 6c 6c 20 74 68 72 6f 75 67  L or fall throug
1f7d0 68 20 69 66 20 6a 75 6d 70 49 66 4e 75 6c 6c 0a  h if jumpIfNull.
1f7e0 2a 2a 20 69 73 20 30 2e 0a 2a 2f 0a 76 6f 69 64  ** is 0..*/.void
1f7f0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1f800 6c 73 65 28 50 61 72 73 65 20 2a 70 50 61 72 73  lse(Parse *pPars
1f810 65 2c 20 45 78 70 72 20 2a 70 45 78 70 72 2c 20  e, Expr *pExpr, 
1f820 69 6e 74 20 64 65 73 74 2c 20 69 6e 74 20 6a 75  int dest, int ju
1f830 6d 70 49 66 4e 75 6c 6c 29 7b 0a 20 20 56 64 62  mpIfNull){.  Vdb
1f840 65 20 2a 76 20 3d 20 70 50 61 72 73 65 2d 3e 70  e *v = pParse->p
1f850 56 64 62 65 3b 0a 20 20 69 6e 74 20 6f 70 20 3d  Vdbe;.  int op =
1f860 20 30 3b 0a 20 20 69 6e 74 20 72 65 67 46 72 65   0;.  int regFre
1f870 65 31 20 3d 20 30 3b 0a 20 20 69 6e 74 20 72 65  e1 = 0;.  int re
1f880 67 46 72 65 65 32 20 3d 20 30 3b 0a 20 20 69 6e  gFree2 = 0;.  in
1f890 74 20 72 31 2c 20 72 32 3b 0a 0a 20 20 61 73 73  t r1, r2;..  ass
1f8a0 65 72 74 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ert( jumpIfNull=
1f8b0 3d 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46 4e 55  =SQLITE_JUMPIFNU
1f8c0 4c 4c 20 7c 7c 20 6a 75 6d 70 49 66 4e 75 6c 6c  LL || jumpIfNull
1f8d0 3d 3d 30 20 29 3b 0a 20 20 69 66 28 20 4e 45 56  ==0 );.  if( NEV
1f8e0 45 52 28 76 3d 3d 30 29 20 29 20 72 65 74 75 72  ER(v==0) ) retur
1f8f0 6e 3b 20 2f 2a 20 45 78 69 73 74 65 6e 63 65 20  n; /* Existence 
1f900 6f 66 20 56 44 42 45 20 63 68 65 63 6b 65 64 20  of VDBE checked 
1f910 62 79 20 63 61 6c 6c 65 72 20 2a 2f 0a 20 20 69  by caller */.  i
1f920 66 28 20 70 45 78 70 72 3d 3d 30 20 29 20 20 20  f( pExpr==0 )   
1f930 20 72 65 74 75 72 6e 3b 0a 0a 20 20 2f 2a 20 54   return;..  /* T
1f940 68 65 20 76 61 6c 75 65 20 6f 66 20 70 45 78 70  he value of pExp
1f950 72 2d 3e 6f 70 20 61 6e 64 20 6f 70 20 61 72 65  r->op and op are
1f960 20 72 65 6c 61 74 65 64 20 61 73 20 66 6f 6c 6c   related as foll
1f970 6f 77 73 3a 0a 20 20 2a 2a 0a 20 20 2a 2a 20 20  ows:.  **.  **  
1f980 20 20 20 20 20 70 45 78 70 72 2d 3e 6f 70 20 20       pExpr->op  
1f990 20 20 20 20 20 20 20 20 20 20 6f 70 0a 20 20 2a            op.  *
1f9a0 2a 20 20 20 20 20 20 20 2d 2d 2d 2d 2d 2d 2d 2d  *       --------
1f9b0 2d 20 20 20 20 20 20 20 20 20 20 2d 2d 2d 2d 2d  -          -----
1f9c0 2d 2d 2d 2d 2d 0a 20 20 2a 2a 20 20 20 20 20 20  -----.  **      
1f9d0 20 54 4b 5f 49 53 4e 55 4c 4c 20 20 20 20 20 20   TK_ISNULL      
1f9e0 20 20 20 20 4f 50 5f 4e 6f 74 4e 75 6c 6c 0a 20      OP_NotNull. 
1f9f0 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 4e 4f 54   **       TK_NOT
1fa00 4e 55 4c 4c 20 20 20 20 20 20 20 20 20 4f 50 5f  NULL         OP_
1fa10 49 73 4e 75 6c 6c 0a 20 20 2a 2a 20 20 20 20 20  IsNull.  **     
1fa20 20 20 54 4b 5f 4e 45 20 20 20 20 20 20 20 20 20    TK_NE         
1fa30 20 20 20 20 20 4f 50 5f 45 71 0a 20 20 2a 2a 20       OP_Eq.  ** 
1fa40 20 20 20 20 20 20 54 4b 5f 45 51 20 20 20 20 20        TK_EQ     
1fa50 20 20 20 20 20 20 20 20 20 4f 50 5f 4e 65 0a 20           OP_Ne. 
1fa60 20 2a 2a 20 20 20 20 20 20 20 54 4b 5f 47 54 20   **       TK_GT 
1fa70 20 20 20 20 20 20 20 20 20 20 20 20 20 4f 50 5f               OP_
1fa80 4c 65 0a 20 20 2a 2a 20 20 20 20 20 20 20 54 4b  Le.  **       TK
1fa90 5f 4c 45 20 20 20 20 20 20 20 20 20 20 20 20 20  _LE             
1faa0 20 4f 50 5f 47 74 0a 20 20 2a 2a 20 20 20 20 20   OP_Gt.  **     
1fab0 20 20 54 4b 5f 47 45 20 20 20 20 20 20 20 20 20    TK_GE         
1fac0 20 20 20 20 20 4f 50 5f 4c 74 0a 20 20 2a 2a 20       OP_Lt.  ** 
1fad0 20 20 20 20 20 20 54 4b 5f 4c 54 20 20 20 20 20        TK_LT     
1fae0 20 20 20 20 20 20 20 20 20 4f 50 5f 47 65 0a 20           OP_Ge. 
1faf0 20 2a 2a 0a 20 20 2a 2a 20 46 6f 72 20 6f 74 68   **.  ** For oth
1fb00 65 72 20 76 61 6c 75 65 73 20 6f 66 20 70 45 78  er values of pEx
1fb10 70 72 2d 3e 6f 70 2c 20 6f 70 20 69 73 20 75 6e  pr->op, op is un
1fb20 64 65 66 69 6e 65 64 20 61 6e 64 20 75 6e 75 73  defined and unus
1fb30 65 64 2e 0a 20 20 2a 2a 20 54 68 65 20 76 61 6c  ed..  ** The val
1fb40 75 65 20 6f 66 20 54 4b 5f 20 61 6e 64 20 4f 50  ue of TK_ and OP
1fb50 5f 20 63 6f 6e 73 74 61 6e 74 73 20 61 72 65 20  _ constants are 
1fb60 61 72 72 61 6e 67 65 64 20 73 75 63 68 20 74 68  arranged such th
1fb70 61 74 20 77 65 0a 20 20 2a 2a 20 63 61 6e 20 63  at we.  ** can c
1fb80 6f 6d 70 75 74 65 20 74 68 65 20 6d 61 70 70 69  ompute the mappi
1fb90 6e 67 20 61 62 6f 76 65 20 75 73 69 6e 67 20 74  ng above using t
1fba0 68 65 20 66 6f 6c 6c 6f 77 69 6e 67 20 65 78 70  he following exp
1fbb0 72 65 73 73 69 6f 6e 2e 0a 20 20 2a 2a 20 41 73  ression..  ** As
1fbc0 73 65 72 74 28 29 73 20 76 65 72 69 66 79 20 74  sert()s verify t
1fbd0 68 61 74 20 74 68 65 20 63 6f 6d 70 75 74 61 74  hat the computat
1fbe0 69 6f 6e 20 69 73 20 63 6f 72 72 65 63 74 2e 0a  ion is correct..
1fbf0 20 20 2a 2f 0a 20 20 6f 70 20 3d 20 28 28 70 45    */.  op = ((pE
1fc00 78 70 72 2d 3e 6f 70 2b 28 54 4b 5f 49 53 4e 55  xpr->op+(TK_ISNU
1fc10 4c 4c 26 31 29 29 5e 31 29 2d 28 54 4b 5f 49 53  LL&1))^1)-(TK_IS
1fc20 4e 55 4c 4c 26 31 29 3b 0a 0a 20 20 2f 2a 20 56  NULL&1);..  /* V
1fc30 65 72 69 66 79 20 63 6f 72 72 65 63 74 20 61 6c  erify correct al
1fc40 69 67 6e 6d 65 6e 74 20 6f 66 20 54 4b 5f 20 61  ignment of TK_ a
1fc50 6e 64 20 4f 50 5f 20 63 6f 6e 73 74 61 6e 74 73  nd OP_ constants
1fc60 0a 20 20 2a 2f 0a 20 20 61 73 73 65 72 74 28 20  .  */.  assert( 
1fc70 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 49 53  pExpr->op!=TK_IS
1fc80 4e 55 4c 4c 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e  NULL || op==OP_N
1fc90 6f 74 4e 75 6c 6c 20 29 3b 0a 20 20 61 73 73 65  otNull );.  asse
1fca0 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1fcb0 4b 5f 4e 4f 54 4e 55 4c 4c 20 7c 7c 20 6f 70 3d  K_NOTNULL || op=
1fcc0 3d 4f 50 5f 49 73 4e 75 6c 6c 20 29 3b 0a 20 20  =OP_IsNull );.  
1fcd0 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e 6f  assert( pExpr->o
1fce0 70 21 3d 54 4b 5f 4e 45 20 7c 7c 20 6f 70 3d 3d  p!=TK_NE || op==
1fcf0 4f 50 5f 45 71 20 29 3b 0a 20 20 61 73 73 65 72  OP_Eq );.  asser
1fd00 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54 4b  t( pExpr->op!=TK
1fd10 5f 45 51 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4e 65  _EQ || op==OP_Ne
1fd20 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70 45   );.  assert( pE
1fd30 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 4c 54 20 7c  xpr->op!=TK_LT |
1fd40 7c 20 6f 70 3d 3d 4f 50 5f 47 65 20 29 3b 0a 20  | op==OP_Ge );. 
1fd50 20 61 73 73 65 72 74 28 20 70 45 78 70 72 2d 3e   assert( pExpr->
1fd60 6f 70 21 3d 54 4b 5f 4c 45 20 7c 7c 20 6f 70 3d  op!=TK_LE || op=
1fd70 3d 4f 50 5f 47 74 20 29 3b 0a 20 20 61 73 73 65  =OP_Gt );.  asse
1fd80 72 74 28 20 70 45 78 70 72 2d 3e 6f 70 21 3d 54  rt( pExpr->op!=T
1fd90 4b 5f 47 54 20 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c  K_GT || op==OP_L
1fda0 65 20 29 3b 0a 20 20 61 73 73 65 72 74 28 20 70  e );.  assert( p
1fdb0 45 78 70 72 2d 3e 6f 70 21 3d 54 4b 5f 47 45 20  Expr->op!=TK_GE 
1fdc0 7c 7c 20 6f 70 3d 3d 4f 50 5f 4c 74 20 29 3b 0a  || op==OP_Lt );.
1fdd0 0a 20 20 73 77 69 74 63 68 28 20 70 45 78 70 72  .  switch( pExpr
1fde0 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61 73 65  ->op ){.    case
1fdf0 20 54 4b 5f 41 4e 44 3a 20 7b 0a 20 20 20 20 20   TK_AND: {.     
1fe00 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d 70 49   testcase( jumpI
1fe10 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20 20 20  fNull==0 );.    
1fe20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46    sqlite3ExprIfF
1fe30 61 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78  alse(pParse, pEx
1fe40 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74 2c  pr->pLeft, dest,
1fe50 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
1fe60 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43      sqlite3ExprC
1fe70 61 63 68 65 50 75 73 68 28 70 50 61 72 73 65 29  achePush(pParse)
1fe80 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45  ;.      sqlite3E
1fe90 78 70 72 49 66 46 61 6c 73 65 28 70 50 61 72 73  xprIfFalse(pPars
1fea0 65 2c 20 70 45 78 70 72 2d 3e 70 52 69 67 68 74  e, pExpr->pRight
1feb0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
1fec0 6c 6c 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74  ll);.      sqlit
1fed0 65 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70  e3ExprCachePop(p
1fee0 50 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72  Parse);.      br
1fef0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
1ff00 61 73 65 20 54 4b 5f 4f 52 3a 20 7b 0a 20 20 20  ase TK_OR: {.   
1ff10 20 20 20 69 6e 74 20 64 32 20 3d 20 73 71 6c 69     int d2 = sqli
1ff20 74 65 33 56 64 62 65 4d 61 6b 65 4c 61 62 65 6c  te3VdbeMakeLabel
1ff30 28 76 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63  (v);.      testc
1ff40 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
1ff50 3d 30 20 29 3b 0a 20 20 20 20 20 20 73 71 6c 69  =0 );.      sqli
1ff60 74 65 33 45 78 70 72 49 66 54 72 75 65 28 70 50  te3ExprIfTrue(pP
1ff70 61 72 73 65 2c 20 70 45 78 70 72 2d 3e 70 4c 65  arse, pExpr->pLe
1ff80 66 74 2c 20 64 32 2c 20 6a 75 6d 70 49 66 4e 75  ft, d2, jumpIfNu
1ff90 6c 6c 5e 53 51 4c 49 54 45 5f 4a 55 4d 50 49 46  ll^SQLITE_JUMPIF
1ffa0 4e 55 4c 4c 29 3b 0a 20 20 20 20 20 20 73 71 6c  NULL);.      sql
1ffb0 69 74 65 33 45 78 70 72 43 61 63 68 65 50 75 73  ite3ExprCachePus
1ffc0 68 28 70 50 61 72 73 65 29 3b 0a 20 20 20 20 20  h(pParse);.     
1ffd0 20 73 71 6c 69 74 65 33 45 78 70 72 49 66 46 61   sqlite3ExprIfFa
1ffe0 6c 73 65 28 70 50 61 72 73 65 2c 20 70 45 78 70  lse(pParse, pExp
1fff0 72 2d 3e 70 52 69 67 68 74 2c 20 64 65 73 74 2c  r->pRight, dest,
20000 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20 20   jumpIfNull);.  
20010 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20020 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
20030 32 29 3b 0a 20 20 20 20 20 20 73 71 6c 69 74 65  2);.      sqlite
20040 33 45 78 70 72 43 61 63 68 65 50 6f 70 28 70 50  3ExprCachePop(pP
20050 61 72 73 65 29 3b 0a 20 20 20 20 20 20 62 72 65  arse);.      bre
20060 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63 61  ak;.    }.    ca
20070 73 65 20 54 4b 5f 4e 4f 54 3a 20 7b 0a 20 20 20  se TK_NOT: {.   
20080 20 20 20 74 65 73 74 63 61 73 65 28 20 6a 75 6d     testcase( jum
20090 70 49 66 4e 75 6c 6c 3d 3d 30 20 29 3b 0a 20 20  pIfNull==0 );.  
200a0 20 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 49      sqlite3ExprI
200b0 66 54 72 75 65 28 70 50 61 72 73 65 2c 20 70 45  fTrue(pParse, pE
200c0 78 70 72 2d 3e 70 4c 65 66 74 2c 20 64 65 73 74  xpr->pLeft, dest
200d0 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a 20  , jumpIfNull);. 
200e0 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20       break;.    
200f0 7d 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 54  }.    case TK_LT
20100 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4c 45  :.    case TK_LE
20110 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 54  :.    case TK_GT
20120 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 47 45  :.    case TK_GE
20130 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 4e 45  :.    case TK_NE
20140 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 45 51  :.    case TK_EQ
20150 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63 61  : {.      testca
20160 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20170 30 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  0 );.      r1 = 
20180 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20190 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
201a0 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
201b0 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
201c0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
201d0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
201e0 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
201f0 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 63 6f  Free2);.      co
20200 64 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65  deCompare(pParse
20210 2c 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20  , pExpr->pLeft, 
20220 70 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f  pExpr->pRight, o
20230 70 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  p,.             
20240 20 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73       r1, r2, des
20250 74 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b 0a  t, jumpIfNull);.
20260 20 20 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f        assert(TK_
20270 4c 54 3d 3d 4f 50 5f 4c 74 29 3b 20 74 65 73 74  LT==OP_Lt); test
20280 63 61 73 65 28 6f 70 3d 3d 4f 50 5f 4c 74 29 3b  case(op==OP_Lt);
20290 20 56 64 62 65 43 6f 76 65 72 61 67 65 49 66 28   VdbeCoverageIf(
202a0 76 2c 6f 70 3d 3d 4f 50 5f 4c 74 29 3b 0a 20 20  v,op==OP_Lt);.  
202b0 20 20 20 20 61 73 73 65 72 74 28 54 4b 5f 4c 45      assert(TK_LE
202c0 3d 3d 4f 50 5f 4c 65 29 3b 20 74 65 73 74 63 61  ==OP_Le); testca
202d0 73 65 28 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 20 56  se(op==OP_Le); V
202e0 64 62 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c  dbeCoverageIf(v,
202f0 6f 70 3d 3d 4f 50 5f 4c 65 29 3b 0a 20 20 20 20  op==OP_Le);.    
20300 20 20 61 73 73 65 72 74 28 54 4b 5f 47 54 3d 3d    assert(TK_GT==
20310 4f 50 5f 47 74 29 3b 20 74 65 73 74 63 61 73 65  OP_Gt); testcase
20320 28 6f 70 3d 3d 4f 50 5f 47 74 29 3b 20 56 64 62  (op==OP_Gt); Vdb
20330 65 43 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70  eCoverageIf(v,op
20340 3d 3d 4f 50 5f 47 74 29 3b 0a 20 20 20 20 20 20  ==OP_Gt);.      
20350 61 73 73 65 72 74 28 54 4b 5f 47 45 3d 3d 4f 50  assert(TK_GE==OP
20360 5f 47 65 29 3b 20 74 65 73 74 63 61 73 65 28 6f  _Ge); testcase(o
20370 70 3d 3d 4f 50 5f 47 65 29 3b 20 56 64 62 65 43  p==OP_Ge); VdbeC
20380 6f 76 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d  overageIf(v,op==
20390 4f 50 5f 47 65 29 3b 0a 20 20 20 20 20 20 61 73  OP_Ge);.      as
203a0 73 65 72 74 28 54 4b 5f 45 51 3d 3d 4f 50 5f 45  sert(TK_EQ==OP_E
203b0 71 29 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d  q); testcase(op=
203c0 3d 4f 50 5f 45 71 29 3b 20 56 64 62 65 43 6f 76  =OP_Eq); VdbeCov
203d0 65 72 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50  erageIf(v,op==OP
203e0 5f 45 71 29 3b 0a 20 20 20 20 20 20 61 73 73 65  _Eq);.      asse
203f0 72 74 28 54 4b 5f 4e 45 3d 3d 4f 50 5f 4e 65 29  rt(TK_NE==OP_Ne)
20400 3b 20 74 65 73 74 63 61 73 65 28 6f 70 3d 3d 4f  ; testcase(op==O
20410 50 5f 4e 65 29 3b 20 56 64 62 65 43 6f 76 65 72  P_Ne); VdbeCover
20420 61 67 65 49 66 28 76 2c 6f 70 3d 3d 4f 50 5f 4e  ageIf(v,op==OP_N
20430 65 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61  e);.      testca
20440 73 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20  se( regFree1==0 
20450 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61 73  );.      testcas
20460 65 28 20 72 65 67 46 72 65 65 32 3d 3d 30 20 29  e( regFree2==0 )
20470 3b 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20  ;.      break;. 
20480 20 20 20 7d 0a 20 20 20 20 63 61 73 65 20 54 4b     }.    case TK
20490 5f 49 53 3a 0a 20 20 20 20 63 61 73 65 20 54 4b  _IS:.    case TK
204a0 5f 49 53 4e 4f 54 3a 20 7b 0a 20 20 20 20 20 20  _ISNOT: {.      
204b0 74 65 73 74 63 61 73 65 28 20 70 45 78 70 72 2d  testcase( pExpr-
204c0 3e 6f 70 3d 3d 54 4b 5f 49 53 20 29 3b 0a 20 20  >op==TK_IS );.  
204d0 20 20 20 20 74 65 73 74 63 61 73 65 28 20 70 45      testcase( pE
204e0 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 49 53 4e 4f  xpr->op==TK_ISNO
204f0 54 20 29 3b 0a 20 20 20 20 20 20 72 31 20 3d 20  T );.      r1 = 
20500 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65 54  sqlite3ExprCodeT
20510 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78 70  emp(pParse, pExp
20520 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46 72  r->pLeft, &regFr
20530 65 65 31 29 3b 0a 20 20 20 20 20 20 72 32 20 3d  ee1);.      r2 =
20540 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
20550 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20560 70 72 2d 3e 70 52 69 67 68 74 2c 20 26 72 65 67  pr->pRight, &reg
20570 46 72 65 65 32 29 3b 0a 20 20 20 20 20 20 6f 70  Free2);.      op
20580 20 3d 20 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54   = (pExpr->op==T
20590 4b 5f 49 53 29 20 3f 20 54 4b 5f 4e 45 20 3a 20  K_IS) ? TK_NE : 
205a0 54 4b 5f 45 51 3b 0a 20 20 20 20 20 20 63 6f 64  TK_EQ;.      cod
205b0 65 43 6f 6d 70 61 72 65 28 70 50 61 72 73 65 2c  eCompare(pParse,
205c0 20 70 45 78 70 72 2d 3e 70 4c 65 66 74 2c 20 70   pExpr->pLeft, p
205d0 45 78 70 72 2d 3e 70 52 69 67 68 74 2c 20 6f 70  Expr->pRight, op
205e0 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  ,.              
205f0 20 20 20 20 72 31 2c 20 72 32 2c 20 64 65 73 74      r1, r2, dest
20600 2c 20 53 51 4c 49 54 45 5f 4e 55 4c 4c 45 51 29  , SQLITE_NULLEQ)
20610 3b 0a 20 20 20 20 20 20 56 64 62 65 43 6f 76 65  ;.      VdbeCove
20620 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54 4b  rageIf(v, op==TK
20630 5f 45 51 29 3b 0a 20 20 20 20 20 20 56 64 62 65  _EQ);.      Vdbe
20640 43 6f 76 65 72 61 67 65 49 66 28 76 2c 20 6f 70  CoverageIf(v, op
20650 3d 3d 54 4b 5f 4e 45 29 3b 0a 20 20 20 20 20 20  ==TK_NE);.      
20660 74 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65  testcase( regFre
20670 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 74  e1==0 );.      t
20680 65 73 74 63 61 73 65 28 20 72 65 67 46 72 65 65  estcase( regFree
20690 32 3d 3d 30 20 29 3b 0a 20 20 20 20 20 20 62 72  2==0 );.      br
206a0 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  eak;.    }.    c
206b0 61 73 65 20 54 4b 5f 49 53 4e 55 4c 4c 3a 0a 20  ase TK_ISNULL:. 
206c0 20 20 20 63 61 73 65 20 54 4b 5f 4e 4f 54 4e 55     case TK_NOTNU
206d0 4c 4c 3a 20 7b 0a 20 20 20 20 20 20 72 31 20 3d  LL: {.      r1 =
206e0 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 64 65   sqlite3ExprCode
206f0 54 65 6d 70 28 70 50 61 72 73 65 2c 20 70 45 78  Temp(pParse, pEx
20700 70 72 2d 3e 70 4c 65 66 74 2c 20 26 72 65 67 46  pr->pLeft, &regF
20710 72 65 65 31 29 3b 0a 20 20 20 20 20 20 73 71 6c  ree1);.      sql
20720 69 74 65 33 56 64 62 65 41 64 64 4f 70 32 28 76  ite3VdbeAddOp2(v
20730 2c 20 6f 70 2c 20 72 31 2c 20 64 65 73 74 29 3b  , op, r1, dest);
20740 0a 20 20 20 20 20 20 74 65 73 74 63 61 73 65 28  .      testcase(
20750 20 6f 70 3d 3d 54 4b 5f 49 53 4e 55 4c 4c 20 29   op==TK_ISNULL )
20760 3b 20 20 20 56 64 62 65 43 6f 76 65 72 61 67 65  ;   VdbeCoverage
20770 49 66 28 76 2c 20 6f 70 3d 3d 54 4b 5f 49 53 4e  If(v, op==TK_ISN
20780 55 4c 4c 29 3b 0a 20 20 20 20 20 20 74 65 73 74  ULL);.      test
20790 63 61 73 65 28 20 6f 70 3d 3d 54 4b 5f 4e 4f 54  case( op==TK_NOT
207a0 4e 55 4c 4c 20 29 3b 20 20 56 64 62 65 43 6f 76  NULL );  VdbeCov
207b0 65 72 61 67 65 49 66 28 76 2c 20 6f 70 3d 3d 54  erageIf(v, op==T
207c0 4b 5f 4e 4f 54 4e 55 4c 4c 29 3b 0a 20 20 20 20  K_NOTNULL);.    
207d0 20 20 74 65 73 74 63 61 73 65 28 20 72 65 67 46    testcase( regF
207e0 72 65 65 31 3d 3d 30 20 29 3b 0a 20 20 20 20 20  ree1==0 );.     
207f0 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a 20 20   break;.    }.  
20800 20 20 63 61 73 65 20 54 4b 5f 42 45 54 57 45 45    case TK_BETWEE
20810 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65 73 74 63  N: {.      testc
20820 61 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d  ase( jumpIfNull=
20830 3d 30 20 29 3b 0a 20 20 20 20 20 20 65 78 70 72  =0 );.      expr
20840 43 6f 64 65 42 65 74 77 65 65 6e 28 70 50 61 72  CodeBetween(pPar
20850 73 65 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c  se, pExpr, dest,
20860 20 30 2c 20 6a 75 6d 70 49 66 4e 75 6c 6c 29 3b   0, jumpIfNull);
20870 0a 20 20 20 20 20 20 62 72 65 61 6b 3b 0a 20 20  .      break;.  
20880 20 20 7d 0a 23 69 66 6e 64 65 66 20 53 51 4c 49    }.#ifndef SQLI
20890 54 45 5f 4f 4d 49 54 5f 53 55 42 51 55 45 52 59  TE_OMIT_SUBQUERY
208a0 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 49 4e 3a  .    case TK_IN:
208b0 20 7b 0a 20 20 20 20 20 20 69 66 28 20 6a 75 6d   {.      if( jum
208c0 70 49 66 4e 75 6c 6c 20 29 7b 0a 20 20 20 20 20  pIfNull ){.     
208d0 20 20 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f     sqlite3ExprCo
208e0 64 65 49 4e 28 70 50 61 72 73 65 2c 20 70 45 78  deIN(pParse, pEx
208f0 70 72 2c 20 64 65 73 74 2c 20 64 65 73 74 29 3b  pr, dest, dest);
20900 0a 20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20  .      }else{.  
20910 20 20 20 20 20 20 69 6e 74 20 64 65 73 74 49 66        int destIf
20920 4e 75 6c 6c 20 3d 20 73 71 6c 69 74 65 33 56 64  Null = sqlite3Vd
20930 62 65 4d 61 6b 65 4c 61 62 65 6c 28 76 29 3b 0a  beMakeLabel(v);.
20940 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33 45          sqlite3E
20950 78 70 72 43 6f 64 65 49 4e 28 70 50 61 72 73 65  xprCodeIN(pParse
20960 2c 20 70 45 78 70 72 2c 20 64 65 73 74 2c 20 64  , pExpr, dest, d
20970 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
20980 20 20 20 20 73 71 6c 69 74 65 33 56 64 62 65 52      sqlite3VdbeR
20990 65 73 6f 6c 76 65 4c 61 62 65 6c 28 76 2c 20 64  esolveLabel(v, d
209a0 65 73 74 49 66 4e 75 6c 6c 29 3b 0a 20 20 20 20  estIfNull);.    
209b0 20 20 7d 0a 20 20 20 20 20 20 62 72 65 61 6b 3b    }.      break;
209c0 0a 20 20 20 20 7d 0a 23 65 6e 64 69 66 0a 20 20  .    }.#endif.  
209d0 20 20 64 65 66 61 75 6c 74 3a 20 7b 0a 20 20 20    default: {.   
209e0 20 20 20 69 66 28 20 65 78 70 72 41 6c 77 61 79     if( exprAlway
209f0 73 46 61 6c 73 65 28 70 45 78 70 72 29 20 29 7b  sFalse(pExpr) ){
20a00 0a 20 20 20 20 20 20 20 20 73 71 6c 69 74 65 33  .        sqlite3
20a10 56 64 62 65 41 64 64 4f 70 32 28 76 2c 20 4f 50  VdbeAddOp2(v, OP
20a20 5f 47 6f 74 6f 2c 20 30 2c 20 64 65 73 74 29 3b  _Goto, 0, dest);
20a30 0a 20 20 20 20 20 20 7d 65 6c 73 65 20 69 66 28  .      }else if(
20a40 20 65 78 70 72 41 6c 77 61 79 73 54 72 75 65 28   exprAlwaysTrue(
20a50 70 45 78 70 72 29 20 29 7b 0a 20 20 20 20 20 20  pExpr) ){.      
20a60 20 20 2f 2a 20 6e 6f 2d 6f 70 20 2a 2f 0a 20 20    /* no-op */.  
20a70 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20 20      }else{.     
20a80 20 20 20 72 31 20 3d 20 73 71 6c 69 74 65 33 45     r1 = sqlite3E
20a90 78 70 72 43 6f 64 65 54 65 6d 70 28 70 50 61 72  xprCodeTemp(pPar
20aa0 73 65 2c 20 70 45 78 70 72 2c 20 26 72 65 67 46  se, pExpr, &regF
20ab0 72 65 65 31 29 3b 0a 20 20 20 20 20 20 20 20 73  ree1);.        s
20ac0 71 6c 69 74 65 33 56 64 62 65 41 64 64 4f 70 33  qlite3VdbeAddOp3
20ad0 28 76 2c 20 4f 50 5f 49 66 4e 6f 74 2c 20 72 31  (v, OP_IfNot, r1
20ae0 2c 20 64 65 73 74 2c 20 6a 75 6d 70 49 66 4e 75  , dest, jumpIfNu
20af0 6c 6c 21 3d 30 29 3b 0a 20 20 20 20 20 20 20 20  ll!=0);.        
20b00 56 64 62 65 43 6f 76 65 72 61 67 65 28 76 29 3b  VdbeCoverage(v);
20b10 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61 73  .        testcas
20b20 65 28 20 72 65 67 46 72 65 65 31 3d 3d 30 20 29  e( regFree1==0 )
20b30 3b 0a 20 20 20 20 20 20 20 20 74 65 73 74 63 61  ;.        testca
20b40 73 65 28 20 6a 75 6d 70 49 66 4e 75 6c 6c 3d 3d  se( jumpIfNull==
20b50 30 20 29 3b 0a 20 20 20 20 20 20 7d 0a 20 20 20  0 );.      }.   
20b60 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d 0a     break;.    }.
20b70 20 20 7d 0a 20 20 73 71 6c 69 74 65 33 52 65 6c    }.  sqlite3Rel
20b80 65 61 73 65 54 65 6d 70 52 65 67 28 70 50 61 72  easeTempReg(pPar
20b90 73 65 2c 20 72 65 67 46 72 65 65 31 29 3b 0a 20  se, regFree1);. 
20ba0 20 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54   sqlite3ReleaseT
20bb0 65 6d 70 52 65 67 28 70 50 61 72 73 65 2c 20 72  empReg(pParse, r
20bc0 65 67 46 72 65 65 32 29 3b 0a 7d 0a 0a 2f 2a 0a  egFree2);.}../*.
20bd0 2a 2a 20 44 6f 20 61 20 64 65 65 70 20 63 6f 6d  ** Do a deep com
20be0 70 61 72 69 73 6f 6e 20 6f 66 20 74 77 6f 20 65  parison of two e
20bf0 78 70 72 65 73 73 69 6f 6e 20 74 72 65 65 73 2e  xpression trees.
20c00 20 20 52 65 74 75 72 6e 20 30 20 69 66 20 74 68    Return 0 if th
20c10 65 20 74 77 6f 0a 2a 2a 20 65 78 70 72 65 73 73  e two.** express
20c20 69 6f 6e 73 20 61 72 65 20 63 6f 6d 70 6c 65 74  ions are complet
20c30 65 6c 79 20 69 64 65 6e 74 69 63 61 6c 2e 20 20  ely identical.  
20c40 52 65 74 75 72 6e 20 31 20 69 66 20 74 68 65 79  Return 1 if they
20c50 20 64 69 66 66 65 72 20 6f 6e 6c 79 0a 2a 2a 20   differ only.** 
20c60 62 79 20 61 20 43 4f 4c 4c 41 54 45 20 6f 70 65  by a COLLATE ope
20c70 72 61 74 6f 72 20 61 74 20 74 68 65 20 74 6f 70  rator at the top
20c80 20 6c 65 76 65 6c 2e 20 20 52 65 74 75 72 6e 20   level.  Return 
20c90 32 20 69 66 20 74 68 65 72 65 20 61 72 65 20 64  2 if there are d
20ca0 69 66 66 65 72 65 6e 63 65 73 0a 2a 2a 20 6f 74  ifferences.** ot
20cb0 68 65 72 20 74 68 61 6e 20 74 68 65 20 74 6f 70  her than the top
20cc0 2d 6c 65 76 65 6c 20 43 4f 4c 4c 41 54 45 20 6f  -level COLLATE o
20cd0 70 65 72 61 74 6f 72 2e 0a 2a 2a 0a 2a 2a 20 49  perator..**.** I
20ce0 66 20 61 6e 79 20 73 75 62 65 6c 65 6d 65 6e 74  f any subelement
20cf0 20 6f 66 20 70 42 20 68 61 73 20 45 78 70 72 2e   of pB has Expr.
20d00 69 54 61 62 6c 65 3d 3d 28 2d 31 29 20 74 68 65  iTable==(-1) the
20d10 6e 20 69 74 20 69 73 20 61 6c 6c 6f 77 65 64 0a  n it is allowed.
20d20 2a 2a 20 74 6f 20 63 6f 6d 70 61 72 65 20 65 71  ** to compare eq
20d30 75 61 6c 20 74 6f 20 61 6e 20 65 71 75 69 76 61  ual to an equiva
20d40 6c 65 6e 74 20 65 6c 65 6d 65 6e 74 20 69 6e 20  lent element in 
20d50 70 41 20 77 69 74 68 20 45 78 70 72 2e 69 54 61  pA with Expr.iTa
20d60 62 6c 65 3d 3d 69 54 61 62 2e 0a 2a 2a 0a 2a 2a  ble==iTab..**.**
20d70 20 54 68 65 20 70 41 20 73 69 64 65 20 6d 69 67   The pA side mig
20d80 68 74 20 62 65 20 75 73 69 6e 67 20 54 4b 5f 52  ht be using TK_R
20d90 45 47 49 53 54 45 52 2e 20 20 49 66 20 74 68 61  EGISTER.  If tha
20da0 74 20 69 73 20 74 68 65 20 63 61 73 65 20 61 6e  t is the case an
20db0 64 20 70 42 20 69 73 0a 2a 2a 20 6e 6f 74 20 75  d pB is.** not u
20dc0 73 69 6e 67 20 54 4b 5f 52 45 47 49 53 54 45 52  sing TK_REGISTER
20dd0 20 62 75 74 20 69 73 20 6f 74 68 65 72 77 69 73   but is otherwis
20de0 65 20 65 71 75 69 76 61 6c 65 6e 74 2c 20 74 68  e equivalent, th
20df0 65 6e 20 73 74 69 6c 6c 20 72 65 74 75 72 6e 20  en still return 
20e00 30 2e 0a 2a 2a 0a 2a 2a 20 53 6f 6d 65 74 69 6d  0..**.** Sometim
20e10 65 73 20 74 68 69 73 20 72 6f 75 74 69 6e 65 20  es this routine 
20e20 77 69 6c 6c 20 72 65 74 75 72 6e 20 32 20 65 76  will return 2 ev
20e30 65 6e 20 69 66 20 74 68 65 20 74 77 6f 20 65 78  en if the two ex
20e40 70 72 65 73 73 69 6f 6e 73 0a 2a 2a 20 72 65 61  pressions.** rea
20e50 6c 6c 79 20 61 72 65 20 65 71 75 69 76 61 6c 65  lly are equivale
20e60 6e 74 2e 20 20 49 66 20 77 65 20 63 61 6e 6e 6f  nt.  If we canno
20e70 74 20 70 72 6f 76 65 20 74 68 61 74 20 74 68 65  t prove that the
20e80 20 65 78 70 72 65 73 73 69 6f 6e 73 20 61 72 65   expressions are
20e90 0a 2a 2a 20 69 64 65 6e 74 69 63 61 6c 2c 20 77  .** identical, w
20ea0 65 20 72 65 74 75 72 6e 20 32 20 6a 75 73 74 20  e return 2 just 
20eb0 74 6f 20 62 65 20 73 61 66 65 2e 20 20 53 6f 20  to be safe.  So 
20ec0 69 66 20 74 68 69 73 20 72 6f 75 74 69 6e 65 0a  if this routine.
20ed0 2a 2a 20 72 65 74 75 72 6e 73 20 32 2c 20 74 68  ** returns 2, th
20ee0 65 6e 20 79 6f 75 20 64 6f 20 6e 6f 74 20 72 65  en you do not re
20ef0 61 6c 6c 79 20 6b 6e 6f 77 20 66 6f 72 20 63 65  ally know for ce
20f00 72 74 61 69 6e 20 69 66 20 74 68 65 20 74 77 6f  rtain if the two
20f10 0a 2a 2a 20 65 78 70 72 65 73 73 69 6f 6e 73 20  .** expressions 
20f20 61 72 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42  are the same.  B
20f30 75 74 20 69 66 20 79 6f 75 20 67 65 74 20 61 20  ut if you get a 
20f40 30 20 6f 72 20 31 20 72 65 74 75 72 6e 2c 20 74  0 or 1 return, t
20f50 68 65 6e 20 79 6f 75 0a 2a 2a 20 63 61 6e 20 62  hen you.** can b
20f60 65 20 73 75 72 65 20 74 68 65 20 65 78 70 72 65  e sure the expre
20f70 73 73 69 6f 6e 73 20 61 72 65 20 74 68 65 20 73  ssions are the s
20f80 61 6d 65 2e 20 20 49 6e 20 74 68 65 20 70 6c 61  ame.  In the pla
20f90 63 65 73 20 77 68 65 72 65 0a 2a 2a 20 74 68 69  ces where.** thi
20fa0 73 20 72 6f 75 74 69 6e 65 20 69 73 20 75 73 65  s routine is use
20fb0 64 2c 20 69 74 20 64 6f 65 73 20 6e 6f 74 20 68  d, it does not h
20fc0 75 72 74 20 74 6f 20 67 65 74 20 61 6e 20 65 78  urt to get an ex
20fd0 74 72 61 20 32 20 2d 20 74 68 61 74 0a 2a 2a 20  tra 2 - that.** 
20fe0 6a 75 73 74 20 6d 69 67 68 74 20 72 65 73 75 6c  just might resul
20ff0 74 20 69 6e 20 73 6f 6d 65 20 73 6c 69 67 68 74  t in some slight
21000 6c 79 20 73 6c 6f 77 65 72 20 63 6f 64 65 2e 20  ly slower code. 
21010 20 42 75 74 20 72 65 74 75 72 6e 69 6e 67 0a 2a   But returning.*
21020 2a 20 61 6e 20 69 6e 63 6f 72 72 65 63 74 20 30  * an incorrect 0
21030 20 6f 72 20 31 20 63 6f 75 6c 64 20 6c 65 61 64   or 1 could lead
21040 20 74 6f 20 61 20 6d 61 6c 66 75 6e 63 74 69 6f   to a malfunctio
21050 6e 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65  n..*/.int sqlite
21060 33 45 78 70 72 43 6f 6d 70 61 72 65 28 45 78 70  3ExprCompare(Exp
21070 72 20 2a 70 41 2c 20 45 78 70 72 20 2a 70 42 2c  r *pA, Expr *pB,
21080 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20 75 33   int iTab){.  u3
21090 32 20 63 6f 6d 62 69 6e 65 64 46 6c 61 67 73 3b  2 combinedFlags;
210a0 0a 20 20 69 66 28 20 70 41 3d 3d 30 20 7c 7c 20  .  if( pA==0 || 
210b0 70 42 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65 74  pB==0 ){.    ret
210c0 75 72 6e 20 70 42 3d 3d 70 41 20 3f 20 30 20 3a  urn pB==pA ? 0 :
210d0 20 32 3b 0a 20 20 7d 0a 20 20 63 6f 6d 62 69 6e   2;.  }.  combin
210e0 65 64 46 6c 61 67 73 20 3d 20 70 41 2d 3e 66 6c  edFlags = pA->fl
210f0 61 67 73 20 7c 20 70 42 2d 3e 66 6c 61 67 73 3b  ags | pB->flags;
21100 0a 20 20 69 66 28 20 63 6f 6d 62 69 6e 65 64 46  .  if( combinedF
21110 6c 61 67 73 20 26 20 45 50 5f 49 6e 74 56 61 6c  lags & EP_IntVal
21120 75 65 20 29 7b 0a 20 20 20 20 69 66 28 20 28 70  ue ){.    if( (p
21130 41 2d 3e 66 6c 61 67 73 26 70 42 2d 3e 66 6c 61  A->flags&pB->fla
21140 67 73 26 45 50 5f 49 6e 74 56 61 6c 75 65 29 21  gs&EP_IntValue)!
21150 3d 30 20 26 26 20 70 41 2d 3e 75 2e 69 56 61 6c  =0 && pA->u.iVal
21160 75 65 3d 3d 70 42 2d 3e 75 2e 69 56 61 6c 75 65  ue==pB->u.iValue
21170 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21180 20 30 3b 0a 20 20 20 20 7d 0a 20 20 20 20 72 65   0;.    }.    re
21190 74 75 72 6e 20 32 3b 0a 20 20 7d 0a 20 20 69 66  turn 2;.  }.  if
211a0 28 20 70 41 2d 3e 6f 70 21 3d 70 42 2d 3e 6f 70  ( pA->op!=pB->op
211b0 20 29 7b 0a 20 20 20 20 69 66 28 20 70 41 2d 3e   ){.    if( pA->
211c0 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20 26  op==TK_COLLATE &
211d0 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d  & sqlite3ExprCom
211e0 70 61 72 65 28 70 41 2d 3e 70 4c 65 66 74 2c 20  pare(pA->pLeft, 
211f0 70 42 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a 20  pB, iTab)<2 ){. 
21200 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20       return 1;. 
21210 20 20 20 7d 0a 20 20 20 20 69 66 28 20 70 42 2d     }.    if( pB-
21220 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c 41 54 45 20  >op==TK_COLLATE 
21230 26 26 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f  && sqlite3ExprCo
21240 6d 70 61 72 65 28 70 41 2c 20 70 42 2d 3e 70 4c  mpare(pA, pB->pL
21250 65 66 74 2c 20 69 54 61 62 29 3c 32 20 29 7b 0a  eft, iTab)<2 ){.
21260 20 20 20 20 20 20 72 65 74 75 72 6e 20 31 3b 0a        return 1;.
21270 20 20 20 20 7d 0a 20 20 20 20 72 65 74 75 72 6e      }.    return
21280 20 32 3b 0a 20 20 7d 0a 20 20 69 66 28 20 70 41   2;.  }.  if( pA
21290 2d 3e 6f 70 21 3d 54 4b 5f 43 4f 4c 55 4d 4e 20  ->op!=TK_COLUMN 
212a0 26 26 20 41 4c 57 41 59 53 28 70 41 2d 3e 6f 70  && ALWAYS(pA->op
212b0 21 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e 29  !=TK_AGG_COLUMN)
212c0 20 26 26 20 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e   && pA->u.zToken
212d0 20 29 7b 0a 20 20 20 20 69 66 28 20 73 74 72 63   ){.    if( strc
212e0 6d 70 28 70 41 2d 3e 75 2e 7a 54 6f 6b 65 6e 2c  mp(pA->u.zToken,
212f0 70 42 2d 3e 75 2e 7a 54 6f 6b 65 6e 29 21 3d 30  pB->u.zToken)!=0
21300 20 29 7b 0a 20 20 20 20 20 20 72 65 74 75 72 6e   ){.      return
21310 20 70 41 2d 3e 6f 70 3d 3d 54 4b 5f 43 4f 4c 4c   pA->op==TK_COLL
21320 41 54 45 20 3f 20 31 20 3a 20 32 3b 0a 20 20 20  ATE ? 1 : 2;.   
21330 20 7d 0a 20 20 7d 0a 20 20 69 66 28 20 28 70 41   }.  }.  if( (pA
21340 2d 3e 66 6c 61 67 73 20 26 20 45 50 5f 44 69 73  ->flags & EP_Dis
21350 74 69 6e 63 74 29 21 3d 28 70 42 2d 3e 66 6c 61  tinct)!=(pB->fla
21360 67 73 20 26 20 45 50 5f 44 69 73 74 69 6e 63 74  gs & EP_Distinct
21370 29 20 29 20 72 65 74 75 72 6e 20 32 3b 0a 20 20  ) ) return 2;.  
21380 69 66 28 20 41 4c 57 41 59 53 28 28 63 6f 6d 62  if( ALWAYS((comb
21390 69 6e 65 64 46 6c 61 67 73 20 26 20 45 50 5f 54  inedFlags & EP_T
213a0 6f 6b 65 6e 4f 6e 6c 79 29 3d 3d 30 29 20 29 7b  okenOnly)==0) ){
213b0 0a 20 20 20 20 69 66 28 20 63 6f 6d 62 69 6e 65  .    if( combine
213c0 64 46 6c 61 67 73 20 26 20 45 50 5f 78 49 73 53  dFlags & EP_xIsS
213d0 65 6c 65 63 74 20 29 20 72 65 74 75 72 6e 20 32  elect ) return 2
213e0 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
213f0 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 41 2d  3ExprCompare(pA-
21400 3e 70 4c 65 66 74 2c 20 70 42 2d 3e 70 4c 65 66  >pLeft, pB->pLef
21410 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
21420 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 73 71 6c  n 2;.    if( sql
21430 69 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28  ite3ExprCompare(
21440 70 41 2d 3e 70 52 69 67 68 74 2c 20 70 42 2d 3e  pA->pRight, pB->
21450 70 52 69 67 68 74 2c 20 69 54 61 62 29 20 29 20  pRight, iTab) ) 
21460 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 69 66  return 2;.    if
21470 28 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69 73  ( sqlite3ExprLis
21480 74 43 6f 6d 70 61 72 65 28 70 41 2d 3e 78 2e 70  tCompare(pA->x.p
21490 4c 69 73 74 2c 20 70 42 2d 3e 78 2e 70 4c 69 73  List, pB->x.pLis
214a0 74 2c 20 69 54 61 62 29 20 29 20 72 65 74 75 72  t, iTab) ) retur
214b0 6e 20 32 3b 0a 20 20 20 20 69 66 28 20 41 4c 57  n 2;.    if( ALW
214c0 41 59 53 28 28 63 6f 6d 62 69 6e 65 64 46 6c 61  AYS((combinedFla
214d0 67 73 20 26 20 45 50 5f 52 65 64 75 63 65 64 29  gs & EP_Reduced)
214e0 3d 3d 30 29 20 29 7b 0a 20 20 20 20 20 20 69 66  ==0) ){.      if
214f0 28 20 70 41 2d 3e 69 43 6f 6c 75 6d 6e 21 3d 70  ( pA->iColumn!=p
21500 42 2d 3e 69 43 6f 6c 75 6d 6e 20 29 20 72 65 74  B->iColumn ) ret
21510 75 72 6e 20 32 3b 0a 20 20 20 20 20 20 69 66 28  urn 2;.      if(
21520 20 70 41 2d 3e 69 54 61 62 6c 65 21 3d 70 42 2d   pA->iTable!=pB-
21530 3e 69 54 61 62 6c 65 20 0a 20 20 20 20 20 20 20  >iTable .       
21540 26 26 20 28 70 41 2d 3e 69 54 61 62 6c 65 21 3d  && (pA->iTable!=
21550 69 54 61 62 20 7c 7c 20 4e 45 56 45 52 28 70 42  iTab || NEVER(pB
21560 2d 3e 69 54 61 62 6c 65 3e 3d 30 29 29 20 29 20  ->iTable>=0)) ) 
21570 72 65 74 75 72 6e 20 32 3b 0a 20 20 20 20 7d 0a  return 2;.    }.
21580 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a    }.  return 0;.
21590 7d 0a 0a 2f 2a 0a 2a 2a 20 43 6f 6d 70 61 72 65  }../*.** Compare
215a0 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
215b0 6a 65 63 74 73 2e 20 20 52 65 74 75 72 6e 20 30  jects.  Return 0
215c0 20 69 66 20 74 68 65 79 20 61 72 65 20 69 64 65   if they are ide
215d0 6e 74 69 63 61 6c 20 61 6e 64 20 0a 2a 2a 20 6e  ntical and .** n
215e0 6f 6e 2d 7a 65 72 6f 20 69 66 20 74 68 65 79 20  on-zero if they 
215f0 64 69 66 66 65 72 20 69 6e 20 61 6e 79 20 77 61  differ in any wa
21600 79 2e 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 79 20  y..**.** If any 
21610 73 75 62 65 6c 65 6d 65 6e 74 20 6f 66 20 70 42  subelement of pB
21620 20 68 61 73 20 45 78 70 72 2e 69 54 61 62 6c 65   has Expr.iTable
21630 3d 3d 28 2d 31 29 20 74 68 65 6e 20 69 74 20 69  ==(-1) then it i
21640 73 20 61 6c 6c 6f 77 65 64 0a 2a 2a 20 74 6f 20  s allowed.** to 
21650 63 6f 6d 70 61 72 65 20 65 71 75 61 6c 20 74 6f  compare equal to
21660 20 61 6e 20 65 71 75 69 76 61 6c 65 6e 74 20 65   an equivalent e
21670 6c 65 6d 65 6e 74 20 69 6e 20 70 41 20 77 69 74  lement in pA wit
21680 68 20 45 78 70 72 2e 69 54 61 62 6c 65 3d 3d 69  h Expr.iTable==i
21690 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  Tab..**.** This 
216a0 72 6f 75 74 69 6e 65 20 6d 69 67 68 74 20 72 65  routine might re
216b0 74 75 72 6e 20 6e 6f 6e 2d 7a 65 72 6f 20 66 6f  turn non-zero fo
216c0 72 20 65 71 75 69 76 61 6c 65 6e 74 20 45 78 70  r equivalent Exp
216d0 72 4c 69 73 74 73 2e 20 20 54 68 65 0a 2a 2a 20  rLists.  The.** 
216e0 6f 6e 6c 79 20 63 6f 6e 73 65 71 75 65 6e 63 65  only consequence
216f0 20 77 69 6c 6c 20 62 65 20 64 69 73 61 62 6c 65   will be disable
21700 64 20 6f 70 74 69 6d 69 7a 61 74 69 6f 6e 73 2e  d optimizations.
21710 20 20 42 75 74 20 74 68 69 73 20 72 6f 75 74 69    But this routi
21720 6e 65 0a 2a 2a 20 6d 75 73 74 20 6e 65 76 65 72  ne.** must never
21730 20 72 65 74 75 72 6e 20 30 20 69 66 20 74 68 65   return 0 if the
21740 20 74 77 6f 20 45 78 70 72 4c 69 73 74 20 6f 62   two ExprList ob
21750 6a 65 63 74 73 20 61 72 65 20 64 69 66 66 65 72  jects are differ
21760 65 6e 74 2c 20 6f 72 0a 2a 2a 20 61 20 6d 61 6c  ent, or.** a mal
21770 66 75 6e 63 74 69 6f 6e 20 77 69 6c 6c 20 72 65  function will re
21780 73 75 6c 74 2e 0a 2a 2a 0a 2a 2a 20 54 77 6f 20  sult..**.** Two 
21790 4e 55 4c 4c 20 70 6f 69 6e 74 65 72 73 20 61 72  NULL pointers ar
217a0 65 20 63 6f 6e 73 69 64 65 72 65 64 20 74 6f 20  e considered to 
217b0 62 65 20 74 68 65 20 73 61 6d 65 2e 20 20 42 75  be the same.  Bu
217c0 74 20 61 20 4e 55 4c 4c 20 70 6f 69 6e 74 65 72  t a NULL pointer
217d0 0a 2a 2a 20 61 6c 77 61 79 73 20 64 69 66 66 65  .** always diffe
217e0 72 73 20 66 72 6f 6d 20 61 20 6e 6f 6e 2d 4e 55  rs from a non-NU
217f0 4c 4c 20 70 6f 69 6e 74 65 72 2e 0a 2a 2f 0a 69  LL pointer..*/.i
21800 6e 74 20 73 71 6c 69 74 65 33 45 78 70 72 4c 69  nt sqlite3ExprLi
21810 73 74 43 6f 6d 70 61 72 65 28 45 78 70 72 4c 69  stCompare(ExprLi
21820 73 74 20 2a 70 41 2c 20 45 78 70 72 4c 69 73 74  st *pA, ExprList
21830 20 2a 70 42 2c 20 69 6e 74 20 69 54 61 62 29 7b   *pB, int iTab){
21840 0a 20 20 69 6e 74 20 69 3b 0a 20 20 69 66 28 20  .  int i;.  if( 
21850 70 41 3d 3d 30 20 26 26 20 70 42 3d 3d 30 20 29  pA==0 && pB==0 )
21860 20 72 65 74 75 72 6e 20 30 3b 0a 20 20 69 66 28   return 0;.  if(
21870 20 70 41 3d 3d 30 20 7c 7c 20 70 42 3d 3d 30 20   pA==0 || pB==0 
21880 29 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 69 66  ) return 1;.  if
21890 28 20 70 41 2d 3e 6e 45 78 70 72 21 3d 70 42 2d  ( pA->nExpr!=pB-
218a0 3e 6e 45 78 70 72 20 29 20 72 65 74 75 72 6e 20  >nExpr ) return 
218b0 31 3b 0a 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c  1;.  for(i=0; i<
218c0 70 41 2d 3e 6e 45 78 70 72 3b 20 69 2b 2b 29 7b  pA->nExpr; i++){
218d0 0a 20 20 20 20 45 78 70 72 20 2a 70 45 78 70 72  .    Expr *pExpr
218e0 41 20 3d 20 70 41 2d 3e 61 5b 69 5d 2e 70 45 78  A = pA->a[i].pEx
218f0 70 72 3b 0a 20 20 20 20 45 78 70 72 20 2a 70 45  pr;.    Expr *pE
21900 78 70 72 42 20 3d 20 70 42 2d 3e 61 5b 69 5d 2e  xprB = pB->a[i].
21910 70 45 78 70 72 3b 0a 20 20 20 20 69 66 28 20 70  pExpr;.    if( p
21920 41 2d 3e 61 5b 69 5d 2e 73 6f 72 74 4f 72 64 65  A->a[i].sortOrde
21930 72 21 3d 70 42 2d 3e 61 5b 69 5d 2e 73 6f 72 74  r!=pB->a[i].sort
21940 4f 72 64 65 72 20 29 20 72 65 74 75 72 6e 20 31  Order ) return 1
21950 3b 0a 20 20 20 20 69 66 28 20 73 71 6c 69 74 65  ;.    if( sqlite
21960 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70 45 78  3ExprCompare(pEx
21970 70 72 41 2c 20 70 45 78 70 72 42 2c 20 69 54 61  prA, pExprB, iTa
21980 62 29 20 29 20 72 65 74 75 72 6e 20 31 3b 0a 20  b) ) return 1;. 
21990 20 7d 0a 20 20 72 65 74 75 72 6e 20 30 3b 0a 7d   }.  return 0;.}
219a0 0a 0a 2f 2a 0a 2a 2a 20 52 65 74 75 72 6e 20 74  ../*.** Return t
219b0 72 75 65 20 69 66 20 77 65 20 63 61 6e 20 70 72  rue if we can pr
219c0 6f 76 65 20 74 68 65 20 70 45 32 20 77 69 6c 6c  ove the pE2 will
219d0 20 61 6c 77 61 79 73 20 62 65 20 74 72 75 65 20   always be true 
219e0 69 66 20 70 45 31 20 69 73 0a 2a 2a 20 74 72 75  if pE1 is.** tru
219f0 65 2e 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65  e.  Return false
21a00 20 69 66 20 77 65 20 63 61 6e 6e 6f 74 20 63 6f   if we cannot co
21a10 6d 70 6c 65 74 65 20 74 68 65 20 70 72 6f 6f 66  mplete the proof
21a20 20 6f 72 20 69 66 20 70 45 32 20 6d 69 67 68 74   or if pE2 might
21a30 0a 2a 2a 20 62 65 20 66 61 6c 73 65 2e 20 20 45  .** be false.  E
21a40 78 61 6d 70 6c 65 73 3a 0a 2a 2a 0a 2a 2a 20 20  xamples:.**.**  
21a50 20 20 20 70 45 31 3a 20 78 3d 3d 35 20 20 20 20     pE1: x==5    
21a60 20 20 20 70 45 32 3a 20 78 3d 3d 35 20 20 20 20     pE2: x==5    
21a70 20 20 20 20 20 20 20 20 20 52 65 73 75 6c 74 3a           Result:
21a80 20 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31   true.**     pE1
21a90 3a 20 78 3e 30 20 20 20 20 20 20 20 20 70 45 32  : x>0        pE2
21aa0 3a 20 78 3d 3d 35 20 20 20 20 20 20 20 20 20 20  : x==5          
21ab0 20 20 20 52 65 73 75 6c 74 3a 20 66 61 6c 73 65     Result: false
21ac0 0a 2a 2a 20 20 20 20 20 70 45 31 3a 20 78 3d 32  .**     pE1: x=2
21ad0 31 20 20 20 20 20 20 20 70 45 32 3a 20 78 3d 32  1       pE2: x=2
21ae0 31 20 4f 52 20 79 3d 34 33 20 20 20 20 20 52 65  1 OR y=43     Re
21af0 73 75 6c 74 3a 20 74 72 75 65 0a 2a 2a 20 20 20  sult: true.**   
21b00 20 20 70 45 31 3a 20 78 21 3d 31 32 33 20 20 20    pE1: x!=123   
21b10 20 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20    pE2: x IS NOT 
21b20 4e 55 4c 4c 20 20 20 20 52 65 73 75 6c 74 3a 20  NULL    Result: 
21b30 74 72 75 65 0a 2a 2a 20 20 20 20 20 70 45 31 3a  true.**     pE1:
21b40 20 78 21 3d 3f 31 20 20 20 20 20 20 70 45 32 3a   x!=?1      pE2:
21b50 20 78 20 49 53 20 4e 4f 54 20 4e 55 4c 4c 20 20   x IS NOT NULL  
21b60 20 20 52 65 73 75 6c 74 3a 20 74 72 75 65 0a 2a    Result: true.*
21b70 2a 20 20 20 20 20 70 45 31 3a 20 78 20 49 53 20  *     pE1: x IS 
21b80 4e 55 4c 4c 20 20 70 45 32 3a 20 78 20 49 53 20  NULL  pE2: x IS 
21b90 4e 4f 54 20 4e 55 4c 4c 20 20 20 20 52 65 73 75  NOT NULL    Resu
21ba0 6c 74 3a 20 66 61 6c 73 65 0a 2a 2a 20 20 20 20  lt: false.**    
21bb0 20 70 45 31 3a 20 78 20 49 53 20 3f 32 20 20 20   pE1: x IS ?2   
21bc0 20 70 45 32 3a 20 78 20 49 53 20 4e 4f 54 20 4e   pE2: x IS NOT N
21bd0 55 4c 4c 20 20 20 20 52 65 75 73 6c 74 3a 20 66  ULL    Reuslt: f
21be0 61 6c 73 65 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  alse.**.** When 
21bf0 63 6f 6d 70 61 72 69 6e 67 20 54 4b 5f 43 4f 4c  comparing TK_COL
21c00 55 4d 4e 20 6e 6f 64 65 73 20 62 65 74 77 65 65  UMN nodes betwee
21c10 6e 20 70 45 31 20 61 6e 64 20 70 45 32 2c 20 69  n pE1 and pE2, i
21c20 66 20 70 45 32 20 68 61 73 0a 2a 2a 20 45 78 70  f pE2 has.** Exp
21c30 72 2e 69 54 61 62 6c 65 3c 30 20 74 68 65 6e 20  r.iTable<0 then 
21c40 61 73 73 75 6d 65 20 61 20 74 61 62 6c 65 20 6e  assume a table n
21c50 75 6d 62 65 72 20 67 69 76 65 6e 20 62 79 20 69  umber given by i
21c60 54 61 62 2e 0a 2a 2a 0a 2a 2a 20 57 68 65 6e 20  Tab..**.** When 
21c70 69 6e 20 64 6f 75 62 74 2c 20 72 65 74 75 72 6e  in doubt, return
21c80 20 66 61 6c 73 65 2e 20 20 52 65 74 75 72 6e 69   false.  Returni
21c90 6e 67 20 74 72 75 65 20 6d 69 67 68 74 20 67 69  ng true might gi
21ca0 76 65 20 61 20 70 65 72 66 6f 72 6d 61 6e 63 65  ve a performance
21cb0 0a 2a 2a 20 69 6d 70 72 6f 76 65 6d 65 6e 74 2e  .** improvement.
21cc0 20 20 52 65 74 75 72 6e 69 6e 67 20 66 61 6c 73    Returning fals
21cd0 65 20 6d 69 67 68 74 20 63 61 75 73 65 20 61 20  e might cause a 
21ce0 70 65 72 66 6f 72 6d 61 6e 63 65 20 72 65 64 75  performance redu
21cf0 63 74 69 6f 6e 2c 20 62 75 74 0a 2a 2a 20 69 74  ction, but.** it
21d00 20 77 69 6c 6c 20 61 6c 77 61 79 73 20 67 69 76   will always giv
21d10 65 20 74 68 65 20 63 6f 72 72 65 63 74 20 61 6e  e the correct an
21d20 73 77 65 72 20 61 6e 64 20 69 73 20 68 65 6e 63  swer and is henc
21d30 65 20 61 6c 77 61 79 73 20 73 61 66 65 2e 0a 2a  e always safe..*
21d40 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 45 78 70  /.int sqlite3Exp
21d50 72 49 6d 70 6c 69 65 73 45 78 70 72 28 45 78 70  rImpliesExpr(Exp
21d60 72 20 2a 70 45 31 2c 20 45 78 70 72 20 2a 70 45  r *pE1, Expr *pE
21d70 32 2c 20 69 6e 74 20 69 54 61 62 29 7b 0a 20 20  2, int iTab){.  
21d80 69 66 28 20 73 71 6c 69 74 65 33 45 78 70 72 43  if( sqlite3ExprC
21d90 6f 6d 70 61 72 65 28 70 45 31 2c 20 70 45 32 2c  ompare(pE1, pE2,
21da0 20 69 54 61 62 29 3d 3d 30 20 29 7b 0a 20 20 20   iTab)==0 ){.   
21db0 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d 0a 20   return 1;.  }. 
21dc0 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d 54 4b   if( pE2->op==TK
21dd0 5f 4f 52 0a 20 20 20 26 26 20 28 73 71 6c 69 74  _OR.   && (sqlit
21de0 65 33 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70  e3ExprImpliesExp
21df0 72 28 70 45 31 2c 20 70 45 32 2d 3e 70 4c 65 66  r(pE1, pE2->pLef
21e00 74 2c 20 69 54 61 62 29 0a 20 20 20 20 20 20 20  t, iTab).       
21e10 20 20 20 20 20 20 7c 7c 20 73 71 6c 69 74 65 33        || sqlite3
21e20 45 78 70 72 49 6d 70 6c 69 65 73 45 78 70 72 28  ExprImpliesExpr(
21e30 70 45 31 2c 20 70 45 32 2d 3e 70 52 69 67 68 74  pE1, pE2->pRight
21e40 2c 20 69 54 61 62 29 20 29 0a 20 20 29 7b 0a 20  , iTab) ).  ){. 
21e50 20 20 20 72 65 74 75 72 6e 20 31 3b 0a 20 20 7d     return 1;.  }
21e60 0a 20 20 69 66 28 20 70 45 32 2d 3e 6f 70 3d 3d  .  if( pE2->op==
21e70 54 4b 5f 4e 4f 54 4e 55 4c 4c 0a 20 20 20 26 26  TK_NOTNULL.   &&
21e80 20 73 71 6c 69 74 65 33 45 78 70 72 43 6f 6d 70   sqlite3ExprComp
21e90 61 72 65 28 70 45 31 2d 3e 70 4c 65 66 74 2c 20  are(pE1->pLeft, 
21ea0 70 45 32 2d 3e 70 4c 65 66 74 2c 20 69 54 61 62  pE2->pLeft, iTab
21eb0 29 3d 3d 30 0a 20 20 20 26 26 20 28 70 45 31 2d  )==0.   && (pE1-
21ec0 3e 6f 70 21 3d 54 4b 5f 49 53 4e 55 4c 4c 20 26  >op!=TK_ISNULL &
21ed0 26 20 70 45 31 2d 3e 6f 70 21 3d 54 4b 5f 49 53  & pE1->op!=TK_IS
21ee0 29 0a 20 20 29 7b 0a 20 20 20 20 72 65 74 75 72  ).  ){.    retur
21ef0 6e 20 31 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  n 1;.  }.  retur
21f00 6e 20 30 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6e  n 0;.}../*.** An
21f10 20 69 6e 73 74 61 6e 63 65 20 6f 66 20 74 68 65   instance of the
21f20 20 66 6f 6c 6c 6f 77 69 6e 67 20 73 74 72 75 63   following struc
21f30 74 75 72 65 20 69 73 20 75 73 65 64 20 62 79 20  ture is used by 
21f40 74 68 65 20 74 72 65 65 20 77 61 6c 6b 65 72 0a  the tree walker.
21f50 2a 2a 20 74 6f 20 63 6f 75 6e 74 20 72 65 66 65  ** to count refe
21f60 72 65 6e 63 65 73 20 74 6f 20 74 61 62 6c 65 20  rences to table 
21f70 63 6f 6c 75 6d 6e 73 20 69 6e 20 74 68 65 20 61  columns in the a
21f80 72 67 75 6d 65 6e 74 73 20 6f 66 20 61 6e 20 0a  rguments of an .
21f90 2a 2a 20 61 67 67 72 65 67 61 74 65 20 66 75 6e  ** aggregate fun
21fa0 63 74 69 6f 6e 2c 20 69 6e 20 6f 72 64 65 72 20  ction, in order 
21fb0 74 6f 20 69 6d 70 6c 65 6d 65 6e 74 20 74 68 65  to implement the
21fc0 0a 2a 2a 20 73 71 6c 69 74 65 33 46 75 6e 63 74  .** sqlite3Funct
21fd0 69 6f 6e 54 68 69 73 53 72 63 28 29 20 72 6f 75  ionThisSrc() rou
21fe0 74 69 6e 65 2e 0a 2a 2f 0a 73 74 72 75 63 74 20  tine..*/.struct 
21ff0 53 72 63 43 6f 75 6e 74 20 7b 0a 20 20 53 72 63  SrcCount {.  Src
22000 4c 69 73 74 20 2a 70 53 72 63 3b 20 20 20 2f 2a  List *pSrc;   /*
22010 20 4f 6e 65 20 70 61 72 74 69 63 75 6c 61 72 20   One particular 
22020 46 52 4f 4d 20 63 6c 61 75 73 65 20 69 6e 20 61  FROM clause in a
22030 20 6e 65 73 74 65 64 20 71 75 65 72 79 20 2a 2f   nested query */
22040 0a 20 20 69 6e 74 20 6e 54 68 69 73 3b 20 20 20  .  int nThis;   
22050 20 20 20 20 2f 2a 20 4e 75 6d 62 65 72 20 6f 66      /* Number of
22060 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f 20 63   references to c
22070 6f 6c 75 6d 6e 73 20 69 6e 20 70 53 72 63 4c 69  olumns in pSrcLi
22080 73 74 20 2a 2f 0a 20 20 69 6e 74 20 6e 4f 74 68  st */.  int nOth
22090 65 72 3b 20 20 20 20 20 20 2f 2a 20 4e 75 6d 62  er;      /* Numb
220a0 65 72 20 6f 66 20 72 65 66 65 72 65 6e 63 65 73  er of references
220b0 20 74 6f 20 63 6f 6c 75 6d 6e 73 20 69 6e 20 6f   to columns in o
220c0 74 68 65 72 20 46 52 4f 4d 20 63 6c 61 75 73 65  ther FROM clause
220d0 73 20 2a 2f 0a 7d 3b 0a 0a 2f 2a 0a 2a 2a 20 43  s */.};../*.** C
220e0 6f 75 6e 74 20 74 68 65 20 6e 75 6d 62 65 72 20  ount the number 
220f0 6f 66 20 72 65 66 65 72 65 6e 63 65 73 20 74 6f  of references to
22100 20 63 6f 6c 75 6d 6e 73 2e 0a 2a 2f 0a 73 74 61   columns..*/.sta
22110 74 69 63 20 69 6e 74 20 65 78 70 72 53 72 63 43  tic int exprSrcC
22120 6f 75 6e 74 28 57 61 6c 6b 65 72 20 2a 70 57 61  ount(Walker *pWa
22130 6c 6b 65 72 2c 20 45 78 70 72 20 2a 70 45 78 70  lker, Expr *pExp
22140 72 29 7b 0a 20 20 2f 2a 20 54 68 65 20 4e 45 56  r){.  /* The NEV
22150 45 52 28 29 20 6f 6e 20 74 68 65 20 73 65 63 6f  ER() on the seco
22160 6e 64 20 74 65 72 6d 20 69 73 20 62 65 63 61 75  nd term is becau
22170 73 65 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69  se sqlite3Functi
22180 6f 6e 55 73 65 73 54 68 69 73 53 72 63 28 29 0a  onUsesThisSrc().
22190 20 20 2a 2a 20 69 73 20 61 6c 77 61 79 73 20 63    ** is always c
221a0 61 6c 6c 65 64 20 62 65 66 6f 72 65 20 73 71 6c  alled before sql
221b0 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41  ite3ExprAnalyzeA
221c0 67 67 72 65 67 61 74 65 73 28 29 20 61 6e 64 20  ggregates() and 
221d0 73 6f 20 74 68 65 0a 20 20 2a 2a 20 54 4b 5f 43  so the.  ** TK_C
221e0 4f 4c 55 4d 4e 73 20 68 61 76 65 20 6e 6f 74 20  OLUMNs have not 
221f0 79 65 74 20 62 65 65 6e 20 63 6f 6e 76 65 72 74  yet been convert
22200 65 64 20 69 6e 74 6f 20 54 4b 5f 41 47 47 5f 43  ed into TK_AGG_C
22210 4f 4c 55 4d 4e 2e 20 20 49 66 0a 20 20 2a 2a 20  OLUMN.  If.  ** 
22220 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f 6e 55  sqlite3FunctionU
22230 73 65 73 54 68 69 73 53 72 63 28 29 20 69 73 20  sesThisSrc() is 
22240 75 73 65 64 20 64 69 66 66 65 72 65 6e 74 6c 79  used differently
22250 20 69 6e 20 74 68 65 20 66 75 74 75 72 65 2c 20   in the future, 
22260 74 68 65 0a 20 20 2a 2a 20 4e 45 56 45 52 28 29  the.  ** NEVER()
22270 20 77 69 6c 6c 20 6e 65 65 64 20 74 6f 20 62 65   will need to be
22280 20 72 65 6d 6f 76 65 64 2e 20 2a 2f 0a 20 20 69   removed. */.  i
22290 66 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b  f( pExpr->op==TK
222a0 5f 43 4f 4c 55 4d 4e 20 7c 7c 20 4e 45 56 45 52  _COLUMN || NEVER
222b0 28 70 45 78 70 72 2d 3e 6f 70 3d 3d 54 4b 5f 41  (pExpr->op==TK_A
222c0 47 47 5f 43 4f 4c 55 4d 4e 29 20 29 7b 0a 20 20  GG_COLUMN) ){.  
222d0 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
222e0 75 63 74 20 53 72 63 43 6f 75 6e 74 20 2a 70 20  uct SrcCount *p 
222f0 3d 20 70 57 61 6c 6b 65 72 2d 3e 75 2e 70 53 72  = pWalker->u.pSr
22300 63 43 6f 75 6e 74 3b 0a 20 20 20 20 53 72 63 4c  cCount;.    SrcL
22310 69 73 74 20 2a 70 53 72 63 20 3d 20 70 2d 3e 70  ist *pSrc = p->p
22320 53 72 63 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30  Src;.    for(i=0
22330 3b 20 69 3c 70 53 72 63 2d 3e 6e 53 72 63 3b 20  ; i<pSrc->nSrc; 
22340 69 2b 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20  i++){.      if( 
22350 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70  pExpr->iTable==p
22360 53 72 63 2d 3e 61 5b 69 5d 2e 69 43 75 72 73 6f  Src->a[i].iCurso
22370 72 20 29 20 62 72 65 61 6b 3b 0a 20 20 20 20 7d  r ) break;.    }
22380 0a 20 20 20 20 69 66 28 20 69 3c 70 53 72 63 2d  .    if( i<pSrc-
22390 3e 6e 53 72 63 20 29 7b 0a 20 20 20 20 20 20 70  >nSrc ){.      p
223a0 2d 3e 6e 54 68 69 73 2b 2b 3b 0a 20 20 20 20 7d  ->nThis++;.    }
223b0 65 6c 73 65 7b 0a 20 20 20 20 20 20 70 2d 3e 6e  else{.      p->n
223c0 4f 74 68 65 72 2b 2b 3b 0a 20 20 20 20 7d 0a 20  Other++;.    }. 
223d0 20 7d 0a 20 20 72 65 74 75 72 6e 20 57 52 43 5f   }.  return WRC_
223e0 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a 2f 2a 0a  Continue;.}../*.
223f0 2a 2a 20 44 65 74 65 72 6d 69 6e 65 20 69 66 20  ** Determine if 
22400 61 6e 79 20 6f 66 20 74 68 65 20 61 72 67 75 6d  any of the argum
22410 65 6e 74 73 20 74 6f 20 74 68 65 20 70 45 78 70  ents to the pExp
22420 72 20 46 75 6e 63 74 69 6f 6e 20 72 65 66 65 72  r Function refer
22430 65 6e 63 65 0a 2a 2a 20 70 53 72 63 4c 69 73 74  ence.** pSrcList
22440 2e 20 20 52 65 74 75 72 6e 20 74 72 75 65 20 69  .  Return true i
22450 66 20 74 68 65 79 20 64 6f 2e 20 20 41 6c 73 6f  f they do.  Also
22460 20 72 65 74 75 72 6e 20 74 72 75 65 20 69 66 20   return true if 
22470 74 68 65 20 66 75 6e 63 74 69 6f 6e 0a 2a 2a 20  the function.** 
22480 68 61 73 20 6e 6f 20 61 72 67 75 6d 65 6e 74 73  has no arguments
22490 20 6f 72 20 68 61 73 20 6f 6e 6c 79 20 63 6f 6e   or has only con
224a0 73 74 61 6e 74 20 61 72 67 75 6d 65 6e 74 73 2e  stant arguments.
224b0 20 20 52 65 74 75 72 6e 20 66 61 6c 73 65 20 69    Return false i
224c0 66 20 70 45 78 70 72 0a 2a 2a 20 72 65 66 65 72  f pExpr.** refer
224d0 65 6e 63 65 73 20 63 6f 6c 75 6d 6e 73 20 62 75  ences columns bu
224e0 74 20 6e 6f 74 20 63 6f 6c 75 6d 6e 73 20 6f 66  t not columns of
224f0 20 74 61 62 6c 65 73 20 66 6f 75 6e 64 20 69 6e   tables found in
22500 20 70 53 72 63 4c 69 73 74 2e 0a 2a 2f 0a 69 6e   pSrcList..*/.in
22510 74 20 73 71 6c 69 74 65 33 46 75 6e 63 74 69 6f  t sqlite3Functio
22520 6e 55 73 65 73 54 68 69 73 53 72 63 28 45 78 70  nUsesThisSrc(Exp
22530 72 20 2a 70 45 78 70 72 2c 20 53 72 63 4c 69 73  r *pExpr, SrcLis
22540 74 20 2a 70 53 72 63 4c 69 73 74 29 7b 0a 20 20  t *pSrcList){.  
22550 57 61 6c 6b 65 72 20 77 3b 0a 20 20 73 74 72 75  Walker w;.  stru
22560 63 74 20 53 72 63 43 6f 75 6e 74 20 63 6e 74 3b  ct SrcCount cnt;
22570 0a 20 20 61 73 73 65 72 74 28 20 70 45 78 70 72  .  assert( pExpr
22580 2d 3e 6f 70 3d 3d 54 4b 5f 41 47 47 5f 46 55 4e  ->op==TK_AGG_FUN
22590 43 54 49 4f 4e 20 29 3b 0a 20 20 6d 65 6d 73 65  CTION );.  memse
225a0 74 28 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28  t(&w, 0, sizeof(
225b0 77 29 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61  w));.  w.xExprCa
225c0 6c 6c 62 61 63 6b 20 3d 20 65 78 70 72 53 72 63  llback = exprSrc
225d0 43 6f 75 6e 74 3b 0a 20 20 77 2e 75 2e 70 53 72  Count;.  w.u.pSr
225e0 63 43 6f 75 6e 74 20 3d 20 26 63 6e 74 3b 0a 20  cCount = &cnt;. 
225f0 20 63 6e 74 2e 70 53 72 63 20 3d 20 70 53 72 63   cnt.pSrc = pSrc
22600 4c 69 73 74 3b 0a 20 20 63 6e 74 2e 6e 54 68 69  List;.  cnt.nThi
22610 73 20 3d 20 30 3b 0a 20 20 63 6e 74 2e 6e 4f 74  s = 0;.  cnt.nOt
22620 68 65 72 20 3d 20 30 3b 0a 20 20 73 71 6c 69 74  her = 0;.  sqlit
22630 65 33 57 61 6c 6b 45 78 70 72 4c 69 73 74 28 26  e3WalkExprList(&
22640 77 2c 20 70 45 78 70 72 2d 3e 78 2e 70 4c 69 73  w, pExpr->x.pLis
22650 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 63 6e 74  t);.  return cnt
22660 2e 6e 54 68 69 73 3e 30 20 7c 7c 20 63 6e 74 2e  .nThis>0 || cnt.
22670 6e 4f 74 68 65 72 3d 3d 30 3b 0a 7d 0a 0a 2f 2a  nOther==0;.}../*
22680 0a 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c  .** Add a new el
22690 65 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67  ement to the pAg
226a0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 61 72  gInfo->aCol[] ar
226b0 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
226c0 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
226d0 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
226e0 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
226f0 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
22700 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
22710 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
22720 6f 43 6f 6c 75 6d 6e 28 73 71 6c 69 74 65 33 20  oColumn(sqlite3 
22730 2a 64 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49  *db, AggInfo *pI
22740 6e 66 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20  nfo){.  int i;. 
22750 20 70 49 6e 66 6f 2d 3e 61 43 6f 6c 20 3d 20 73   pInfo->aCol = s
22760 71 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63  qlite3ArrayAlloc
22770 61 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 0a  ate(.       db,.
22780 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 43         pInfo->aC
22790 6f 6c 2c 0a 20 20 20 20 20 20 20 73 69 7a 65 6f  ol,.       sizeo
227a0 66 28 70 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 30 5d  f(pInfo->aCol[0]
227b0 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e 66 6f  ),.       &pInfo
227c0 2d 3e 6e 43 6f 6c 75 6d 6e 2c 0a 20 20 20 20 20  ->nColumn,.     
227d0 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
227e0 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
227f0 2a 2a 20 41 64 64 20 61 20 6e 65 77 20 65 6c 65  ** Add a new ele
22800 6d 65 6e 74 20 74 6f 20 74 68 65 20 70 41 67 67  ment to the pAgg
22810 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 61 72  Info->aFunc[] ar
22820 72 61 79 2e 20 20 52 65 74 75 72 6e 20 74 68 65  ray.  Return the
22830 20 69 6e 64 65 78 20 6f 66 0a 2a 2a 20 74 68 65   index of.** the
22840 20 6e 65 77 20 65 6c 65 6d 65 6e 74 2e 20 20 52   new element.  R
22850 65 74 75 72 6e 20 61 20 6e 65 67 61 74 69 76 65  eturn a negative
22860 20 6e 75 6d 62 65 72 20 69 66 20 6d 61 6c 6c 6f   number if mallo
22870 63 20 66 61 69 6c 73 2e 0a 2a 2f 0a 73 74 61 74  c fails..*/.stat
22880 69 63 20 69 6e 74 20 61 64 64 41 67 67 49 6e 66  ic int addAggInf
22890 6f 46 75 6e 63 28 73 71 6c 69 74 65 33 20 2a 64  oFunc(sqlite3 *d
228a0 62 2c 20 41 67 67 49 6e 66 6f 20 2a 70 49 6e 66  b, AggInfo *pInf
228b0 6f 29 7b 0a 20 20 69 6e 74 20 69 3b 0a 20 20 70  o){.  int i;.  p
228c0 49 6e 66 6f 2d 3e 61 46 75 6e 63 20 3d 20 73 71  Info->aFunc = sq
228d0 6c 69 74 65 33 41 72 72 61 79 41 6c 6c 6f 63 61  lite3ArrayAlloca
228e0 74 65 28 0a 20 20 20 20 20 20 20 64 62 2c 20 0a  te(.       db, .
228f0 20 20 20 20 20 20 20 70 49 6e 66 6f 2d 3e 61 46         pInfo->aF
22900 75 6e 63 2c 0a 20 20 20 20 20 20 20 73 69 7a 65  unc,.       size
22910 6f 66 28 70 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b  of(pInfo->aFunc[
22920 30 5d 29 2c 0a 20 20 20 20 20 20 20 26 70 49 6e  0]),.       &pIn
22930 66 6f 2d 3e 6e 46 75 6e 63 2c 0a 20 20 20 20 20  fo->nFunc,.     
22940 20 20 26 69 0a 20 20 29 3b 0a 20 20 72 65 74 75    &i.  );.  retu
22950 72 6e 20 69 3b 0a 7d 20 20 20 20 0a 0a 2f 2a 0a  rn i;.}    ../*.
22960 2a 2a 20 54 68 69 73 20 69 73 20 74 68 65 20 78  ** This is the x
22970 45 78 70 72 43 61 6c 6c 62 61 63 6b 20 66 6f 72  ExprCallback for
22980 20 61 20 74 72 65 65 20 77 61 6c 6b 65 72 2e 20   a tree walker. 
22990 20 49 74 20 69 73 20 75 73 65 64 20 74 6f 0a 2a   It is used to.*
229a0 2a 20 69 6d 70 6c 65 6d 65 6e 74 20 73 71 6c 69  * implement sqli
229b0 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65 41 67  te3ExprAnalyzeAg
229c0 67 72 65 67 61 74 65 73 28 29 2e 20 20 53 65 65  gregates().  See
229d0 20 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c   sqlite3ExprAnal
229e0 79 7a 65 41 67 67 72 65 67 61 74 65 73 0a 2a 2a  yzeAggregates.**
229f0 20 66 6f 72 20 61 64 64 69 74 69 6f 6e 61 6c 20   for additional 
22a00 69 6e 66 6f 72 6d 61 74 69 6f 6e 2e 0a 2a 2f 0a  information..*/.
22a10 73 74 61 74 69 63 20 69 6e 74 20 61 6e 61 6c 79  static int analy
22a20 7a 65 41 67 67 72 65 67 61 74 65 28 57 61 6c 6b  zeAggregate(Walk
22a30 65 72 20 2a 70 57 61 6c 6b 65 72 2c 20 45 78 70  er *pWalker, Exp
22a40 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 69 6e 74  r *pExpr){.  int
22a50 20 69 3b 0a 20 20 4e 61 6d 65 43 6f 6e 74 65 78   i;.  NameContex
22a60 74 20 2a 70 4e 43 20 3d 20 70 57 61 6c 6b 65 72  t *pNC = pWalker
22a70 2d 3e 75 2e 70 4e 43 3b 0a 20 20 50 61 72 73 65  ->u.pNC;.  Parse
22a80 20 2a 70 50 61 72 73 65 20 3d 20 70 4e 43 2d 3e   *pParse = pNC->
22a90 70 50 61 72 73 65 3b 0a 20 20 53 72 63 4c 69 73  pParse;.  SrcLis
22aa0 74 20 2a 70 53 72 63 4c 69 73 74 20 3d 20 70 4e  t *pSrcList = pN
22ab0 43 2d 3e 70 53 72 63 4c 69 73 74 3b 0a 20 20 41  C->pSrcList;.  A
22ac0 67 67 49 6e 66 6f 20 2a 70 41 67 67 49 6e 66 6f  ggInfo *pAggInfo
22ad0 20 3d 20 70 4e 43 2d 3e 70 41 67 67 49 6e 66 6f   = pNC->pAggInfo
22ae0 3b 0a 0a 20 20 73 77 69 74 63 68 28 20 70 45 78  ;..  switch( pEx
22af0 70 72 2d 3e 6f 70 20 29 7b 0a 20 20 20 20 63 61  pr->op ){.    ca
22b00 73 65 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  se TK_AGG_COLUMN
22b10 3a 0a 20 20 20 20 63 61 73 65 20 54 4b 5f 43 4f  :.    case TK_CO
22b20 4c 55 4d 4e 3a 20 7b 0a 20 20 20 20 20 20 74 65  LUMN: {.      te
22b30 73 74 63 61 73 65 28 20 70 45 78 70 72 2d 3e 6f  stcase( pExpr->o
22b40 70 3d 3d 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d 4e  p==TK_AGG_COLUMN
22b50 20 29 3b 0a 20 20 20 20 20 20 74 65 73 74 63 61   );.      testca
22b60 73 65 28 20 70 45 78 70 72 2d 3e 6f 70 3d 3d 54  se( pExpr->op==T
22b70 4b 5f 43 4f 4c 55 4d 4e 20 29 3b 0a 20 20 20 20  K_COLUMN );.    
22b80 20 20 2f 2a 20 43 68 65 63 6b 20 74 6f 20 73 65    /* Check to se
22b90 65 20 69 66 20 74 68 65 20 63 6f 6c 75 6d 6e 20  e if the column 
22ba0 69 73 20 69 6e 20 6f 6e 65 20 6f 66 20 74 68 65  is in one of the
22bb0 20 74 61 62 6c 65 73 20 69 6e 20 74 68 65 20 46   tables in the F
22bc0 52 4f 4d 0a 20 20 20 20 20 20 2a 2a 20 63 6c 61  ROM.      ** cla
22bd0 75 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65  use of the aggre
22be0 67 61 74 65 20 71 75 65 72 79 20 2a 2f 0a 20 20  gate query */.  
22bf0 20 20 20 20 69 66 28 20 41 4c 57 41 59 53 28 70      if( ALWAYS(p
22c00 53 72 63 4c 69 73 74 21 3d 30 29 20 29 7b 0a 20  SrcList!=0) ){. 
22c10 20 20 20 20 20 20 20 73 74 72 75 63 74 20 53 72         struct Sr
22c20 63 4c 69 73 74 5f 69 74 65 6d 20 2a 70 49 74 65  cList_item *pIte
22c30 6d 20 3d 20 70 53 72 63 4c 69 73 74 2d 3e 61 3b  m = pSrcList->a;
22c40 0a 20 20 20 20 20 20 20 20 66 6f 72 28 69 3d 30  .        for(i=0
22c50 3b 20 69 3c 70 53 72 63 4c 69 73 74 2d 3e 6e 53  ; i<pSrcList->nS
22c60 72 63 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b  rc; i++, pItem++
22c70 29 7b 0a 20 20 20 20 20 20 20 20 20 20 73 74 72  ){.          str
22c80 75 63 74 20 41 67 67 49 6e 66 6f 5f 63 6f 6c 20  uct AggInfo_col 
22c90 2a 70 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20 20  *pCol;.         
22ca0 20 61 73 73 65 72 74 28 20 21 45 78 70 72 48 61   assert( !ExprHa
22cb0 73 50 72 6f 70 65 72 74 79 28 70 45 78 70 72 2c  sProperty(pExpr,
22cc0 20 45 50 5f 54 6f 6b 65 6e 4f 6e 6c 79 7c 45 50   EP_TokenOnly|EP
22cd0 5f 52 65 64 75 63 65 64 29 20 29 3b 0a 20 20 20  _Reduced) );.   
22ce0 20 20 20 20 20 20 20 69 66 28 20 70 45 78 70 72         if( pExpr
22cf0 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65 6d 2d  ->iTable==pItem-
22d00 3e 69 43 75 72 73 6f 72 20 29 7b 0a 20 20 20 20  >iCursor ){.    
22d10 20 20 20 20 20 20 20 20 2f 2a 20 49 66 20 77 65          /* If we
22d20 20 72 65 61 63 68 20 74 68 69 73 20 70 6f 69 6e   reach this poin
22d30 74 2c 20 69 74 20 6d 65 61 6e 73 20 74 68 61 74  t, it means that
22d40 20 70 45 78 70 72 20 72 65 66 65 72 73 20 74 6f   pExpr refers to
22d50 20 61 20 74 61 62 6c 65 0a 20 20 20 20 20 20 20   a table.       
22d60 20 20 20 20 20 2a 2a 20 74 68 61 74 20 69 73 20       ** that is 
22d70 69 6e 20 74 68 65 20 46 52 4f 4d 20 63 6c 61 75  in the FROM clau
22d80 73 65 20 6f 66 20 74 68 65 20 61 67 67 72 65 67  se of the aggreg
22d90 61 74 65 20 71 75 65 72 79 2e 20 20 0a 20 20 20  ate query.  .   
22da0 20 20 20 20 20 20 20 20 20 2a 2a 0a 20 20 20 20           **.    
22db0 20 20 20 20 20 20 20 20 2a 2a 20 4d 61 6b 65 20          ** Make 
22dc0 61 6e 20 65 6e 74 72 79 20 66 6f 72 20 74 68 65  an entry for the
22dd0 20 63 6f 6c 75 6d 6e 20 69 6e 20 70 41 67 67 49   column in pAggI
22de0 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 69 66 20 74  nfo->aCol[] if t
22df0 68 65 72 65 0a 20 20 20 20 20 20 20 20 20 20 20  here.           
22e00 20 2a 2a 20 69 73 20 6e 6f 74 20 61 6e 20 65 6e   ** is not an en
22e10 74 72 79 20 74 68 65 72 65 20 61 6c 72 65 61 64  try there alread
22e20 79 2e 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a  y..            *
22e30 2f 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 6e  /.            in
22e40 74 20 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  t k;.           
22e50 20 70 43 6f 6c 20 3d 20 70 41 67 67 49 6e 66 6f   pCol = pAggInfo
22e60 2d 3e 61 43 6f 6c 3b 0a 20 20 20 20 20 20 20 20  ->aCol;.        
22e70 20 20 20 20 66 6f 72 28 6b 3d 30 3b 20 6b 3c 70      for(k=0; k<p
22e80 41 67 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e  AggInfo->nColumn
22e90 3b 20 6b 2b 2b 2c 20 70 43 6f 6c 2b 2b 29 7b 0a  ; k++, pCol++){.
22ea0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
22eb0 28 20 70 43 6f 6c 2d 3e 69 54 61 62 6c 65 3d 3d  ( pCol->iTable==
22ec0 70 45 78 70 72 2d 3e 69 54 61 62 6c 65 20 26 26  pExpr->iTable &&
22ed0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20  .               
22ee0 20 20 20 70 43 6f 6c 2d 3e 69 43 6f 6c 75 6d 6e     pCol->iColumn
22ef0 3d 3d 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e  ==pExpr->iColumn
22f00 20 29 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20   ){.            
22f10 20 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20      break;.     
22f20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
22f30 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20         }.       
22f40 20 20 20 20 20 69 66 28 20 28 6b 3e 3d 70 41 67       if( (k>=pAg
22f50 67 49 6e 66 6f 2d 3e 6e 43 6f 6c 75 6d 6e 29 0a  gInfo->nColumn).
22f60 20 20 20 20 20 20 20 20 20 20 20 20 20 26 26 20               && 
22f70 28 6b 20 3d 20 61 64 64 41 67 67 49 6e 66 6f 43  (k = addAggInfoC
22f80 6f 6c 75 6d 6e 28 70 50 61 72 73 65 2d 3e 64 62  olumn(pParse->db
22f90 2c 20 70 41 67 67 49 6e 66 6f 29 29 3e 3d 30 20  , pAggInfo))>=0 
22fa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 29 7b 0a  .            ){.
22fb0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 43                pC
22fc0 6f 6c 20 3d 20 26 70 41 67 67 49 6e 66 6f 2d 3e  ol = &pAggInfo->
22fd0 61 43 6f 6c 5b 6b 5d 3b 0a 20 20 20 20 20 20 20  aCol[k];.       
22fe0 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 70 54 61         pCol->pTa
22ff0 62 20 3d 20 70 45 78 70 72 2d 3e 70 54 61 62 3b  b = pExpr->pTab;
23000 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70  .              p
23010 43 6f 6c 2d 3e 69 54 61 62 6c 65 20 3d 20 70 45  Col->iTable = pE
23020 78 70 72 2d 3e 69 54 61 62 6c 65 3b 0a 20 20 20  xpr->iTable;.   
23030 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23040 3e 69 43 6f 6c 75 6d 6e 20 3d 20 70 45 78 70 72  >iColumn = pExpr
23050 2d 3e 69 43 6f 6c 75 6d 6e 3b 0a 20 20 20 20 20  ->iColumn;.     
23060 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69           pCol->i
23070 4d 65 6d 20 3d 20 2b 2b 70 50 61 72 73 65 2d 3e  Mem = ++pParse->
23080 6e 4d 65 6d 3b 0a 20 20 20 20 20 20 20 20 20 20  nMem;.          
23090 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65      pCol->iSorte
230a0 72 43 6f 6c 75 6d 6e 20 3d 20 2d 31 3b 0a 20 20  rColumn = -1;.  
230b0 20 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c              pCol
230c0 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70 72 3b  ->pExpr = pExpr;
230d0 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69  .              i
230e0 66 28 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72  f( pAggInfo->pGr
230f0 6f 75 70 42 79 20 29 7b 0a 20 20 20 20 20 20 20  oupBy ){.       
23100 20 20 20 20 20 20 20 20 20 69 6e 74 20 6a 2c 20           int j, 
23110 6e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20  n;.             
23120 20 20 20 45 78 70 72 4c 69 73 74 20 2a 70 47 42     ExprList *pGB
23130 20 3d 20 70 41 67 67 49 6e 66 6f 2d 3e 70 47 72   = pAggInfo->pGr
23140 6f 75 70 42 79 3b 0a 20 20 20 20 20 20 20 20 20  oupBy;.         
23150 20 20 20 20 20 20 20 73 74 72 75 63 74 20 45 78         struct Ex
23160 70 72 4c 69 73 74 5f 69 74 65 6d 20 2a 70 54 65  prList_item *pTe
23170 72 6d 20 3d 20 70 47 42 2d 3e 61 3b 0a 20 20 20  rm = pGB->a;.   
23180 20 20 20 20 20 20 20 20 20 20 20 20 20 6e 20 3d               n =
23190 20 70 47 42 2d 3e 6e 45 78 70 72 3b 0a 20 20 20   pGB->nExpr;.   
231a0 20 20 20 20 20 20 20 20 20 20 20 20 20 66 6f 72               for
231b0 28 6a 3d 30 3b 20 6a 3c 6e 3b 20 6a 2b 2b 2c 20  (j=0; j<n; j++, 
231c0 70 54 65 72 6d 2b 2b 29 7b 0a 20 20 20 20 20 20  pTerm++){.      
231d0 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
231e0 20 2a 70 45 20 3d 20 70 54 65 72 6d 2d 3e 70 45   *pE = pTerm->pE
231f0 78 70 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20  xpr;.           
23200 20 20 20 20 20 20 20 69 66 28 20 70 45 2d 3e 6f         if( pE->o
23210 70 3d 3d 54 4b 5f 43 4f 4c 55 4d 4e 20 26 26 20  p==TK_COLUMN && 
23220 70 45 2d 3e 69 54 61 62 6c 65 3d 3d 70 45 78 70  pE->iTable==pExp
23230 72 2d 3e 69 54 61 62 6c 65 20 26 26 0a 20 20 20  r->iTable &&.   
23240 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
23250 20 20 20 70 45 2d 3e 69 43 6f 6c 75 6d 6e 3d 3d     pE->iColumn==
23260 70 45 78 70 72 2d 3e 69 43 6f 6c 75 6d 6e 20 29  pExpr->iColumn )
23270 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20 20 20  {.              
23280 20 20 20 20 20 20 70 43 6f 6c 2d 3e 69 53 6f 72        pCol->iSor
23290 74 65 72 43 6f 6c 75 6d 6e 20 3d 20 6a 3b 0a 20  terColumn = j;. 
232a0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20                  
232b0 20 20 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20     break;.      
232c0 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20              }.  
232d0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
232e0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 7d 0a                }.
232f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 69 66                if
23300 28 20 70 43 6f 6c 2d 3e 69 53 6f 72 74 65 72 43  ( pCol->iSorterC
23310 6f 6c 75 6d 6e 3c 30 20 29 7b 0a 20 20 20 20 20  olumn<0 ){.     
23320 20 20 20 20 20 20 20 20 20 20 20 70 43 6f 6c 2d             pCol-
23330 3e 69 53 6f 72 74 65 72 43 6f 6c 75 6d 6e 20 3d  >iSorterColumn =
23340 20 70 41 67 67 49 6e 66 6f 2d 3e 6e 53 6f 72 74   pAggInfo->nSort
23350 69 6e 67 43 6f 6c 75 6d 6e 2b 2b 3b 0a 20 20 20  ingColumn++;.   
23360 20 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20             }.   
23370 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20 20 20           }.     
23380 20 20 20 20 20 20 20 2f 2a 20 54 68 65 72 65 20         /* There 
23390 69 73 20 6e 6f 77 20 61 6e 20 65 6e 74 72 79 20  is now an entry 
233a0 66 6f 72 20 70 45 78 70 72 20 69 6e 20 70 41 67  for pExpr in pAg
233b0 67 49 6e 66 6f 2d 3e 61 43 6f 6c 5b 5d 20 28 65  gInfo->aCol[] (e
233c0 69 74 68 65 72 0a 20 20 20 20 20 20 20 20 20 20  ither.          
233d0 20 20 2a 2a 20 62 65 63 61 75 73 65 20 69 74 20    ** because it 
233e0 77 61 73 20 74 68 65 72 65 20 62 65 66 6f 72 65  was there before
233f0 20 6f 72 20 62 65 63 61 75 73 65 20 77 65 20 6a   or because we j
23400 75 73 74 20 63 72 65 61 74 65 64 20 69 74 29 2e  ust created it).
23410 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2a 20  .            ** 
23420 43 6f 6e 76 65 72 74 20 74 68 65 20 70 45 78 70  Convert the pExp
23430 72 20 74 6f 20 62 65 20 61 20 54 4b 5f 41 47 47  r to be a TK_AGG
23440 5f 43 4f 4c 55 4d 4e 20 72 65 66 65 72 72 69 6e  _COLUMN referrin
23450 67 20 74 6f 20 74 68 61 74 0a 20 20 20 20 20 20  g to that.      
23460 20 20 20 20 20 20 2a 2a 20 70 41 67 67 49 6e 66        ** pAggInf
23470 6f 2d 3e 61 43 6f 6c 5b 5d 20 65 6e 74 72 79 2e  o->aCol[] entry.
23480 0a 20 20 20 20 20 20 20 20 20 20 20 20 2a 2f 0a  .            */.
23490 20 20 20 20 20 20 20 20 20 20 20 20 45 78 70 72              Expr
234a0 53 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70  SetVVAProperty(p
234b0 45 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63  Expr, EP_NoReduc
234c0 65 29 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20  e);.            
234d0 70 45 78 70 72 2d 3e 70 41 67 67 49 6e 66 6f 20  pExpr->pAggInfo 
234e0 3d 20 70 41 67 67 49 6e 66 6f 3b 0a 20 20 20 20  = pAggInfo;.    
234f0 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 6f          pExpr->o
23500 70 20 3d 20 54 4b 5f 41 47 47 5f 43 4f 4c 55 4d  p = TK_AGG_COLUM
23510 4e 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  N;.            p
23520 45 78 70 72 2d 3e 69 41 67 67 20 3d 20 28 69 31  Expr->iAgg = (i1
23530 36 29 6b 3b 0a 20 20 20 20 20 20 20 20 20 20 20  6)k;.           
23540 20 62 72 65 61 6b 3b 0a 20 20 20 20 20 20 20 20   break;.        
23550 20 20 7d 20 2f 2a 20 65 6e 64 69 66 20 70 45 78    } /* endif pEx
23560 70 72 2d 3e 69 54 61 62 6c 65 3d 3d 70 49 74 65  pr->iTable==pIte
23570 6d 2d 3e 69 43 75 72 73 6f 72 20 2a 2f 0a 20 20  m->iCursor */.  
23580 20 20 20 20 20 20 7d 20 2f 2a 20 65 6e 64 20 6c        } /* end l
23590 6f 6f 70 20 6f 76 65 72 20 70 53 72 63 4c 69 73  oop over pSrcLis
235a0 74 20 2a 2f 0a 20 20 20 20 20 20 7d 0a 20 20 20  t */.      }.   
235b0 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 50 72     return WRC_Pr
235c0 75 6e 65 3b 0a 20 20 20 20 7d 0a 20 20 20 20 63  une;.    }.    c
235d0 61 73 65 20 54 4b 5f 41 47 47 5f 46 55 4e 43 54  ase TK_AGG_FUNCT
235e0 49 4f 4e 3a 20 7b 0a 20 20 20 20 20 20 69 66 28  ION: {.      if(
235f0 20 28 70 4e 43 2d 3e 6e 63 46 6c 61 67 73 20 26   (pNC->ncFlags &
23600 20 4e 43 5f 49 6e 41 67 67 46 75 6e 63 29 3d 3d   NC_InAggFunc)==
23610 30 0a 20 20 20 20 20 20 20 26 26 20 70 57 61 6c  0.       && pWal
23620 6b 65 72 2d 3e 77 61 6c 6b 65 72 44 65 70 74 68  ker->walkerDepth
23630 3d 3d 70 45 78 70 72 2d 3e 6f 70 32 0a 20 20 20  ==pExpr->op2.   
23640 20 20 20 29 7b 0a 20 20 20 20 20 20 20 20 2f 2a     ){.        /*
23650 20 43 68 65 63 6b 20 74 6f 20 73 65 65 20 69 66   Check to see if
23660 20 70 45 78 70 72 20 69 73 20 61 20 64 75 70 6c   pExpr is a dupl
23670 69 63 61 74 65 20 6f 66 20 61 6e 6f 74 68 65 72  icate of another
23680 20 61 67 67 72 65 67 61 74 65 20 0a 20 20 20 20   aggregate .    
23690 20 20 20 20 2a 2a 20 66 75 6e 63 74 69 6f 6e 20      ** function 
236a0 74 68 61 74 20 69 73 20 61 6c 72 65 61 64 79 20  that is already 
236b0 69 6e 20 74 68 65 20 70 41 67 67 49 6e 66 6f 20  in the pAggInfo 
236c0 73 74 72 75 63 74 75 72 65 0a 20 20 20 20 20 20  structure.      
236d0 20 20 2a 2f 0a 20 20 20 20 20 20 20 20 73 74 72    */.        str
236e0 75 63 74 20 41 67 67 49 6e 66 6f 5f 66 75 6e 63  uct AggInfo_func
236f0 20 2a 70 49 74 65 6d 20 3d 20 70 41 67 67 49 6e   *pItem = pAggIn
23700 66 6f 2d 3e 61 46 75 6e 63 3b 0a 20 20 20 20 20  fo->aFunc;.     
23710 20 20 20 66 6f 72 28 69 3d 30 3b 20 69 3c 70 41     for(i=0; i<pA
23720 67 67 49 6e 66 6f 2d 3e 6e 46 75 6e 63 3b 20 69  ggInfo->nFunc; i
23730 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b 0a 20 20  ++, pItem++){.  
23740 20 20 20 20 20 20 20 20 69 66 28 20 73 71 6c 69          if( sqli
23750 74 65 33 45 78 70 72 43 6f 6d 70 61 72 65 28 70  te3ExprCompare(p
23760 49 74 65 6d 2d 3e 70 45 78 70 72 2c 20 70 45 78  Item->pExpr, pEx
23770 70 72 2c 20 2d 31 29 3d 3d 30 20 29 7b 0a 20 20  pr, -1)==0 ){.  
23780 20 20 20 20 20 20 20 20 20 20 62 72 65 61 6b 3b            break;
23790 0a 20 20 20 20 20 20 20 20 20 20 7d 0a 20 20 20  .          }.   
237a0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 69       }.        i
237b0 66 28 20 69 3e 3d 70 41 67 67 49 6e 66 6f 2d 3e  f( i>=pAggInfo->
237c0 6e 46 75 6e 63 20 29 7b 0a 20 20 20 20 20 20 20  nFunc ){.       
237d0 20 20 20 2f 2a 20 70 45 78 70 72 20 69 73 20 6f     /* pExpr is o
237e0 72 69 67 69 6e 61 6c 2e 20 20 4d 61 6b 65 20 61  riginal.  Make a
237f0 20 6e 65 77 20 65 6e 74 72 79 20 69 6e 20 70 41   new entry in pA
23800 67 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 0a  ggInfo->aFunc[].
23810 20 20 20 20 20 20 20 20 20 20 2a 2f 0a 20 20 20            */.   
23820 20 20 20 20 20 20 20 75 38 20 65 6e 63 20 3d 20         u8 enc = 
23830 45 4e 43 28 70 50 61 72 73 65 2d 3e 64 62 29 3b  ENC(pParse->db);
23840 0a 20 20 20 20 20 20 20 20 20 20 69 20 3d 20 61  .          i = a
23850 64 64 41 67 67 49 6e 66 6f 46 75 6e 63 28 70 50  ddAggInfoFunc(pP
23860 61 72 73 65 2d 3e 64 62 2c 20 70 41 67 67 49 6e  arse->db, pAggIn
23870 66 6f 29 3b 0a 20 20 20 20 20 20 20 20 20 20 69  fo);.          i
23880 66 28 20 69 3e 3d 30 20 29 7b 0a 20 20 20 20 20  f( i>=0 ){.     
23890 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
238a0 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
238b0 70 45 78 70 72 2c 20 45 50 5f 78 49 73 53 65 6c  pExpr, EP_xIsSel
238c0 65 63 74 29 20 29 3b 0a 20 20 20 20 20 20 20 20  ect) );.        
238d0 20 20 20 20 70 49 74 65 6d 20 3d 20 26 70 41 67      pItem = &pAg
238e0 67 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 69 5d 3b  gInfo->aFunc[i];
238f0 0a 20 20 20 20 20 20 20 20 20 20 20 20 70 49 74  .            pIt
23900 65 6d 2d 3e 70 45 78 70 72 20 3d 20 70 45 78 70  em->pExpr = pExp
23910 72 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 70  r;.            p
23920 49 74 65 6d 2d 3e 69 4d 65 6d 20 3d 20 2b 2b 70  Item->iMem = ++p
23930 50 61 72 73 65 2d 3e 6e 4d 65 6d 3b 0a 20 20 20  Parse->nMem;.   
23940 20 20 20 20 20 20 20 20 20 61 73 73 65 72 74 28           assert(
23950 20 21 45 78 70 72 48 61 73 50 72 6f 70 65 72 74   !ExprHasPropert
23960 79 28 70 45 78 70 72 2c 20 45 50 5f 49 6e 74 56  y(pExpr, EP_IntV
23970 61 6c 75 65 29 20 29 3b 0a 20 20 20 20 20 20 20  alue) );.       
23980 20 20 20 20 20 70 49 74 65 6d 2d 3e 70 46 75 6e       pItem->pFun
23990 63 20 3d 20 73 71 6c 69 74 65 33 46 69 6e 64 46  c = sqlite3FindF
239a0 75 6e 63 74 69 6f 6e 28 70 50 61 72 73 65 2d 3e  unction(pParse->
239b0 64 62 2c 0a 20 20 20 20 20 20 20 20 20 20 20 20  db,.            
239c0 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e 75 2e         pExpr->u.
239d0 7a 54 6f 6b 65 6e 2c 20 73 71 6c 69 74 65 33 53  zToken, sqlite3S
239e0 74 72 6c 65 6e 33 30 28 70 45 78 70 72 2d 3e 75  trlen30(pExpr->u
239f0 2e 7a 54 6f 6b 65 6e 29 2c 0a 20 20 20 20 20 20  .zToken),.      
23a00 20 20 20 20 20 20 20 20 20 20 20 20 20 70 45 78               pEx
23a10 70 72 2d 3e 78 2e 70 4c 69 73 74 20 3f 20 70 45  pr->x.pList ? pE
23a20 78 70 72 2d 3e 78 2e 70 4c 69 73 74 2d 3e 6e 45  xpr->x.pList->nE
23a30 78 70 72 20 3a 20 30 2c 20 65 6e 63 2c 20 30 29  xpr : 0, enc, 0)
23a40 3b 0a 20 20 20 20 20 20 20 20 20 20 20 20 69 66  ;.            if
23a50 28 20 70 45 78 70 72 2d 3e 66 6c 61 67 73 20 26  ( pExpr->flags &
23a60 20 45 50 5f 44 69 73 74 69 6e 63 74 20 29 7b 0a   EP_Distinct ){.
23a70 20 20 20 20 20 20 20 20 20 20 20 20 20 20 70 49                pI
23a80 74 65 6d 2d 3e 69 44 69 73 74 69 6e 63 74 20 3d  tem->iDistinct =
23a90 20 70 50 61 72 73 65 2d 3e 6e 54 61 62 2b 2b 3b   pParse->nTab++;
23aa0 0a 20 20 20 20 20 20 20 20 20 20 20 20 7d 65 6c  .            }el
23ab0 73 65 7b 0a 20 20 20 20 20 20 20 20 20 20 20 20  se{.            
23ac0 20 20 70 49 74 65 6d 2d 3e 69 44 69 73 74 69 6e    pItem->iDistin
23ad0 63 74 20 3d 20 2d 31 3b 0a 20 20 20 20 20 20 20  ct = -1;.       
23ae0 20 20 20 20 20 7d 0a 20 20 20 20 20 20 20 20 20       }.         
23af0 20 7d 0a 20 20 20 20 20 20 20 20 7d 0a 20 20 20   }.        }.   
23b00 20 20 20 20 20 2f 2a 20 4d 61 6b 65 20 70 45 78       /* Make pEx
23b10 70 72 20 70 6f 69 6e 74 20 74 6f 20 74 68 65 20  pr point to the 
23b20 61 70 70 72 6f 70 72 69 61 74 65 20 70 41 67 67  appropriate pAgg
23b30 49 6e 66 6f 2d 3e 61 46 75 6e 63 5b 5d 20 65 6e  Info->aFunc[] en
23b40 74 72 79 0a 20 20 20 20 20 20 20 20 2a 2f 0a 20  try.        */. 
23b50 20 20 20 20 20 20 20 61 73 73 65 72 74 28 20 21         assert( !
23b60 45 78 70 72 48 61 73 50 72 6f 70 65 72 74 79 28  ExprHasProperty(
23b70 70 45 78 70 72 2c 20 45 50 5f 54 6f 6b 65 6e 4f  pExpr, EP_TokenO
23b80 6e 6c 79 7c 45 50 5f 52 65 64 75 63 65 64 29 20  nly|EP_Reduced) 
23b90 29 3b 0a 20 20 20 20 20 20 20 20 45 78 70 72 53  );.        ExprS
23ba0 65 74 56 56 41 50 72 6f 70 65 72 74 79 28 70 45  etVVAProperty(pE
23bb0 78 70 72 2c 20 45 50 5f 4e 6f 52 65 64 75 63 65  xpr, EP_NoReduce
23bc0 29 3b 0a 20 20 20 20 20 20 20 20 70 45 78 70 72  );.        pExpr
23bd0 2d 3e 69 41 67 67 20 3d 20 28 69 31 36 29 69 3b  ->iAgg = (i16)i;
23be0 0a 20 20 20 20 20 20 20 20 70 45 78 70 72 2d 3e  .        pExpr->
23bf0 70 41 67 67 49 6e 66 6f 20 3d 20 70 41 67 67 49  pAggInfo = pAggI
23c00 6e 66 6f 3b 0a 20 20 20 20 20 20 20 20 72 65 74  nfo;.        ret
23c10 75 72 6e 20 57 52 43 5f 50 72 75 6e 65 3b 0a 20  urn WRC_Prune;. 
23c20 20 20 20 20 20 7d 65 6c 73 65 7b 0a 20 20 20 20       }else{.    
23c30 20 20 20 20 72 65 74 75 72 6e 20 57 52 43 5f 43      return WRC_C
23c40 6f 6e 74 69 6e 75 65 3b 0a 20 20 20 20 20 20 7d  ontinue;.      }
23c50 0a 20 20 20 20 7d 0a 20 20 7d 0a 20 20 72 65 74  .    }.  }.  ret
23c60 75 72 6e 20 57 52 43 5f 43 6f 6e 74 69 6e 75 65  urn WRC_Continue
23c70 3b 0a 7d 0a 73 74 61 74 69 63 20 69 6e 74 20 61  ;.}.static int a
23c80 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23c90 49 6e 53 65 6c 65 63 74 28 57 61 6c 6b 65 72 20  InSelect(Walker 
23ca0 2a 70 57 61 6c 6b 65 72 2c 20 53 65 6c 65 63 74  *pWalker, Select
23cb0 20 2a 70 53 65 6c 65 63 74 29 7b 0a 20 20 55 4e   *pSelect){.  UN
23cc0 55 53 45 44 5f 50 41 52 41 4d 45 54 45 52 28 70  USED_PARAMETER(p
23cd0 57 61 6c 6b 65 72 29 3b 0a 20 20 55 4e 55 53 45  Walker);.  UNUSE
23ce0 44 5f 50 41 52 41 4d 45 54 45 52 28 70 53 65 6c  D_PARAMETER(pSel
23cf0 65 63 74 29 3b 0a 20 20 72 65 74 75 72 6e 20 57  ect);.  return W
23d00 52 43 5f 43 6f 6e 74 69 6e 75 65 3b 0a 7d 0a 0a  RC_Continue;.}..
23d10 2f 2a 0a 2a 2a 20 41 6e 61 6c 79 7a 65 20 74 68  /*.** Analyze th
23d20 65 20 70 45 78 70 72 20 65 78 70 72 65 73 73 69  e pExpr expressi
23d30 6f 6e 20 6c 6f 6f 6b 69 6e 67 20 66 6f 72 20 61  on looking for a
23d40 67 67 72 65 67 61 74 65 20 66 75 6e 63 74 69 6f  ggregate functio
23d50 6e 73 20 61 6e 64 0a 2a 2a 20 66 6f 72 20 76 61  ns and.** for va
23d60 72 69 61 62 6c 65 73 20 74 68 61 74 20 6e 65 65  riables that nee
23d70 64 20 74 6f 20 62 65 20 61 64 64 65 64 20 74 6f  d to be added to
23d80 20 41 67 67 49 6e 66 6f 20 6f 62 6a 65 63 74 20   AggInfo object 
23d90 74 68 61 74 20 70 4e 43 2d 3e 70 41 67 67 49 6e  that pNC->pAggIn
23da0 66 6f 0a 2a 2a 20 70 6f 69 6e 74 73 20 74 6f 2e  fo.** points to.
23db0 20 20 41 64 64 69 74 69 6f 6e 61 6c 20 65 6e 74    Additional ent
23dc0 72 69 65 73 20 61 72 65 20 6d 61 64 65 20 6f 6e  ries are made on
23dd0 20 74 68 65 20 41 67 67 49 6e 66 6f 20 6f 62 6a   the AggInfo obj
23de0 65 63 74 20 61 73 0a 2a 2a 20 6e 65 63 65 73 73  ect as.** necess
23df0 61 72 79 2e 0a 2a 2a 0a 2a 2a 20 54 68 69 73 20  ary..**.** This 
23e00 72 6f 75 74 69 6e 65 20 73 68 6f 75 6c 64 20 6f  routine should o
23e10 6e 6c 79 20 62 65 20 63 61 6c 6c 65 64 20 61 66  nly be called af
23e20 74 65 72 20 74 68 65 20 65 78 70 72 65 73 73 69  ter the expressi
23e30 6f 6e 20 68 61 73 20 62 65 65 6e 0a 2a 2a 20 61  on has been.** a
23e40 6e 61 6c 79 7a 65 64 20 62 79 20 73 71 6c 69 74  nalyzed by sqlit
23e50 65 33 52 65 73 6f 6c 76 65 45 78 70 72 4e 61 6d  e3ResolveExprNam
23e60 65 73 28 29 2e 0a 2a 2f 0a 76 6f 69 64 20 73 71  es()..*/.void sq
23e70 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79 7a 65  lite3ExprAnalyze
23e80 41 67 67 72 65 67 61 74 65 73 28 4e 61 6d 65 43  Aggregates(NameC
23e90 6f 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70  ontext *pNC, Exp
23ea0 72 20 2a 70 45 78 70 72 29 7b 0a 20 20 57 61 6c  r *pExpr){.  Wal
23eb0 6b 65 72 20 77 3b 0a 20 20 6d 65 6d 73 65 74 28  ker w;.  memset(
23ec0 26 77 2c 20 30 2c 20 73 69 7a 65 6f 66 28 77 29  &w, 0, sizeof(w)
23ed0 29 3b 0a 20 20 77 2e 78 45 78 70 72 43 61 6c 6c  );.  w.xExprCall
23ee0 62 61 63 6b 20 3d 20 61 6e 61 6c 79 7a 65 41 67  back = analyzeAg
23ef0 67 72 65 67 61 74 65 3b 0a 20 20 77 2e 78 53 65  gregate;.  w.xSe
23f00 6c 65 63 74 43 61 6c 6c 62 61 63 6b 20 3d 20 61  lectCallback = a
23f10 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65 73  nalyzeAggregates
23f20 49 6e 53 65 6c 65 63 74 3b 0a 20 20 77 2e 75 2e  InSelect;.  w.u.
23f30 70 4e 43 20 3d 20 70 4e 43 3b 0a 20 20 61 73 73  pNC = pNC;.  ass
23f40 65 72 74 28 20 70 4e 43 2d 3e 70 53 72 63 4c 69  ert( pNC->pSrcLi
23f50 73 74 21 3d 30 20 29 3b 0a 20 20 73 71 6c 69 74  st!=0 );.  sqlit
23f60 65 33 57 61 6c 6b 45 78 70 72 28 26 77 2c 20 70  e3WalkExpr(&w, p
23f70 45 78 70 72 29 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a 20  Expr);.}../*.** 
23f80 43 61 6c 6c 20 73 71 6c 69 74 65 33 45 78 70 72  Call sqlite3Expr
23f90 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61 74 65  AnalyzeAggregate
23fa0 73 28 29 20 66 6f 72 20 65 76 65 72 79 20 65 78  s() for every ex
23fb0 70 72 65 73 73 69 6f 6e 20 69 6e 20 61 6e 0a 2a  pression in an.*
23fc0 2a 20 65 78 70 72 65 73 73 69 6f 6e 20 6c 69 73  * expression lis
23fd0 74 2e 20 20 52 65 74 75 72 6e 20 74 68 65 20 6e  t.  Return the n
23fe0 75 6d 62 65 72 20 6f 66 20 65 72 72 6f 72 73 2e  umber of errors.
23ff0 0a 2a 2a 0a 2a 2a 20 49 66 20 61 6e 20 65 72 72  .**.** If an err
24000 6f 72 20 69 73 20 66 6f 75 6e 64 2c 20 74 68 65  or is found, the
24010 20 61 6e 61 6c 79 73 69 73 20 69 73 20 63 75 74   analysis is cut
24020 20 73 68 6f 72 74 2e 0a 2a 2f 0a 76 6f 69 64 20   short..*/.void 
24030 73 71 6c 69 74 65 33 45 78 70 72 41 6e 61 6c 79  sqlite3ExprAnaly
24040 7a 65 41 67 67 4c 69 73 74 28 4e 61 6d 65 43 6f  zeAggList(NameCo
24050 6e 74 65 78 74 20 2a 70 4e 43 2c 20 45 78 70 72  ntext *pNC, Expr
24060 4c 69 73 74 20 2a 70 4c 69 73 74 29 7b 0a 20 20  List *pList){.  
24070 73 74 72 75 63 74 20 45 78 70 72 4c 69 73 74 5f  struct ExprList_
24080 69 74 65 6d 20 2a 70 49 74 65 6d 3b 0a 20 20 69  item *pItem;.  i
24090 6e 74 20 69 3b 0a 20 20 69 66 28 20 70 4c 69 73  nt i;.  if( pLis
240a0 74 20 29 7b 0a 20 20 20 20 66 6f 72 28 70 49 74  t ){.    for(pIt
240b0 65 6d 3d 70 4c 69 73 74 2d 3e 61 2c 20 69 3d 30  em=pList->a, i=0
240c0 3b 20 69 3c 70 4c 69 73 74 2d 3e 6e 45 78 70 72  ; i<pList->nExpr
240d0 3b 20 69 2b 2b 2c 20 70 49 74 65 6d 2b 2b 29 7b  ; i++, pItem++){
240e0 0a 20 20 20 20 20 20 73 71 6c 69 74 65 33 45 78  .      sqlite3Ex
240f0 70 72 41 6e 61 6c 79 7a 65 41 67 67 72 65 67 61  prAnalyzeAggrega
24100 74 65 73 28 70 4e 43 2c 20 70 49 74 65 6d 2d 3e  tes(pNC, pItem->
24110 70 45 78 70 72 29 3b 0a 20 20 20 20 7d 0a 20 20  pExpr);.    }.  
24120 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 41 6c 6c 6f 63  }.}../*.** Alloc
24130 61 74 65 20 61 20 73 69 6e 67 6c 65 20 6e 65 77  ate a single new
24140 20 72 65 67 69 73 74 65 72 20 66 6f 72 20 75 73   register for us
24150 65 20 74 6f 20 68 6f 6c 64 20 73 6f 6d 65 20 69  e to hold some i
24160 6e 74 65 72 6d 65 64 69 61 74 65 20 72 65 73 75  ntermediate resu
24170 6c 74 2e 0a 2a 2f 0a 69 6e 74 20 73 71 6c 69 74  lt..*/.int sqlit
24180 65 33 47 65 74 54 65 6d 70 52 65 67 28 50 61 72  e3GetTempReg(Par
24190 73 65 20 2a 70 50 61 72 73 65 29 7b 0a 20 20 69  se *pParse){.  i
241a0 66 28 20 70 50 61 72 73 65 2d 3e 6e 54 65 6d 70  f( pParse->nTemp
241b0 52 65 67 3d 3d 30 20 29 7b 0a 20 20 20 20 72 65  Reg==0 ){.    re
241c0 74 75 72 6e 20 2b 2b 70 50 61 72 73 65 2d 3e 6e  turn ++pParse->n
241d0 4d 65 6d 3b 0a 20 20 7d 0a 20 20 72 65 74 75 72  Mem;.  }.  retur
241e0 6e 20 70 50 61 72 73 65 2d 3e 61 54 65 6d 70 52  n pParse->aTempR
241f0 65 67 5b 2d 2d 70 50 61 72 73 65 2d 3e 6e 54 65  eg[--pParse->nTe
24200 6d 70 52 65 67 5d 3b 0a 7d 0a 0a 2f 2a 0a 2a 2a  mpReg];.}../*.**
24210 20 44 65 61 6c 6c 6f 63 61 74 65 20 61 20 72 65   Deallocate a re
24220 67 69 73 74 65 72 2c 20 6d 61 6b 69 6e 67 20 61  gister, making a
24230 76 61 69 6c 61 62 6c 65 20 66 6f 72 20 72 65 75  vailable for reu
24240 73 65 20 66 6f 72 20 73 6f 6d 65 20 6f 74 68 65  se for some othe
24250 72 0a 2a 2a 20 70 75 72 70 6f 73 65 2e 0a 2a 2a  r.** purpose..**
24260 0a 2a 2a 20 49 66 20 61 20 72 65 67 69 73 74 65  .** If a registe
24270 72 20 69 73 20 63 75 72 72 65 6e 74 6c 79 20 62  r is currently b
24280 65 69 6e 67 20 75 73 65 64 20 62 79 20 74 68 65  eing used by the
24290 20 63 6f 6c 75 6d 6e 20 63 61 63 68 65 2c 20 74   column cache, t
242a0 68 65 6e 0a 2a 2a 20 74 68 65 20 64 61 6c 6c 6f  hen.** the dallo
242b0 63 61 74 69 6f 6e 20 69 73 20 64 65 66 65 72 72  cation is deferr
242c0 65 64 20 75 6e 74 69 6c 20 74 68 65 20 63 6f 6c  ed until the col
242d0 75 6d 6e 20 63 61 63 68 65 20 6c 69 6e 65 20 74  umn cache line t
242e0 68 61 74 20 75 73 65 73 0a 2a 2a 20 74 68 65 20  hat uses.** the 
242f0 72 65 67 69 73 74 65 72 20 62 65 63 6f 6d 65 73  register becomes
24300 20 73 74 61 6c 65 2e 0a 2a 2f 0a 76 6f 69 64 20   stale..*/.void 
24310 73 71 6c 69 74 65 33 52 65 6c 65 61 73 65 54 65  sqlite3ReleaseTe
24320 6d 70 52 65 67 28 50 61 72 73 65 20 2a 70 50 61  mpReg(Parse *pPa
24330 72 73 65 2c 20 69 6e 74 20 69 52 65 67 29 7b 0a  rse, int iReg){.
24340 20 20 69 66 28 20 69 52 65 67 20 26 26 20 70 50    if( iReg && pP
24350 61 72 73 65 2d 3e 6e 54 65 6d 70 52 65 67 3c 41  arse->nTempReg<A
24360 72 72 61 79 53 69 7a 65 28 70 50 61 72 73 65 2d  rraySize(pParse-
24370 3e 61 54 65 6d 70 52 65 67 29 20 29 7b 0a 20 20  >aTempReg) ){.  
24380 20 20 69 6e 74 20 69 3b 0a 20 20 20 20 73 74 72    int i;.    str
24390 75 63 74 20 79 43 6f 6c 43 61 63 68 65 20 2a 70  uct yColCache *p
243a0 3b 0a 20 20 20 20 66 6f 72 28 69 3d 30 2c 20 70  ;.    for(i=0, p
243b0 3d 70 50 61 72 73 65 2d 3e 61 43 6f 6c 43 61 63  =pParse->aColCac
243c0 68 65 3b 20 69 3c 53 51 4c 49 54 45 5f 4e 5f 43  he; i<SQLITE_N_C
243d0 4f 4c 43 41 43 48 45 3b 20 69 2b 2b 2c 20 70 2b  OLCACHE; i++, p+
243e0 2b 29 7b 0a 20 20 20 20 20 20 69 66 28 20 70 2d  +){.      if( p-
243f0 3e 69 52 65 67 3d 3d 69 52 65 67 20 29 7b 0a 20  >iReg==iReg ){. 
24400 20 20 20 20 20 20 20 70 2d 3e 74 65 6d 70 52 65         p->tempRe
24410 67 20 3d 20 31 3b 0a 20 20 20 20 20 20 20 20 72  g = 1;.        r
24420 65 74 75 72 6e 3b 0a 20 20 20 20 20 20 7d 0a 20  eturn;.      }. 
24430 20 20 20 7d 0a 20 20 20 20 70 50 61 72 73 65 2d     }.    pParse-
24440 3e 61 54 65 6d 70 52 65 67 5b 70 50 61 72 73 65  >aTempReg[pParse
24450 2d 3e 6e 54 65 6d 70 52 65 67 2b 2b 5d 20 3d 20  ->nTempReg++] = 
24460 69 52 65 67 3b 0a 20 20 7d 0a 7d 0a 0a 2f 2a 0a  iReg;.  }.}../*.
24470 2a 2a 20 41 6c 6c 6f 63 61 74 65 20 6f 72 20 64  ** Allocate or d
24480 65 61 6c 6c 6f 63 61 74 65 20 61 20 62 6c 6f 63  eallocate a bloc
24490 6b 20 6f 66 20 6e 52 65 67 20 63 6f 6e 73 65 63  k of nReg consec
244a0 75 74 69 76 65 20 72 65 67 69 73 74 65 72 73 0a  utive registers.
244b0 2a 2f 0a 69 6e 74 20 73 71 6c 69 74 65 33 47 65  */.int sqlite3Ge
244c0 74 54 65 6d 70 52 61 6e 67 65 28 50 61 72 73 65  tTempRange(Parse
244d0 20 2a 70 50 61 72 73 65 2c 20 69 6e 74 20 6e 52   *pParse, int nR
244e0 65 67 29 7b 0a 20 20 69 6e 74 20 69 2c 20 6e 3b  eg){.  int i, n;
244f0 0a 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 69  .  i = pParse->i
24500 52 61 6e 67 65 52 65 67 3b 0a 20 20 6e 20 3d 20  RangeReg;.  n = 
24510 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65  pParse->nRangeRe
24520 67 3b 0a 20 20 69 66 28 20 6e 52 65 67 3c 3d 6e  g;.  if( nReg<=n
24530 20 29 7b 0a 20 20 20 20 61 73 73 65 72 74 28 20   ){.    assert( 
24540 21 75 73 65 64 41 73 43 6f 6c 75 6d 6e 43 61 63  !usedAsColumnCac
24550 68 65 28 70 50 61 72 73 65 2c 20 69 2c 20 69 2b  he(pParse, i, i+
24560 6e 2d 31 29 20 29 3b 0a 20 20 20 20 70 50 61 72  n-1) );.    pPar
24570 73 65 2d 3e 69 52 61 6e 67 65 52 65 67 20 2b 3d  se->iRangeReg +=
24580 20 6e 52 65 67 3b 0a 20 20 20 20 70 50 61 72 73   nReg;.    pPars
24590 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 2d 3d 20  e->nRangeReg -= 
245a0 6e 52 65 67 3b 0a 20 20 7d 65 6c 73 65 7b 0a 20  nReg;.  }else{. 
245b0 20 20 20 69 20 3d 20 70 50 61 72 73 65 2d 3e 6e     i = pParse->n
245c0 4d 65 6d 2b 31 3b 0a 20 20 20 20 70 50 61 72 73  Mem+1;.    pPars
245d0 65 2d 3e 6e 4d 65 6d 20 2b 3d 20 6e 52 65 67 3b  e->nMem += nReg;
245e0 0a 20 20 7d 0a 20 20 72 65 74 75 72 6e 20 69 3b  .  }.  return i;
245f0 0a 7d 0a 76 6f 69 64 20 73 71 6c 69 74 65 33 52  .}.void sqlite3R
24600 65 6c 65 61 73 65 54 65 6d 70 52 61 6e 67 65 28  eleaseTempRange(
24610 50 61 72 73 65 20 2a 70 50 61 72 73 65 2c 20 69  Parse *pParse, i
24620 6e 74 20 69 52 65 67 2c 20 69 6e 74 20 6e 52 65  nt iReg, int nRe
24630 67 29 7b 0a 20 20 73 71 6c 69 74 65 33 45 78 70  g){.  sqlite3Exp
24640 72 43 61 63 68 65 52 65 6d 6f 76 65 28 70 50 61  rCacheRemove(pPa
24650 72 73 65 2c 20 69 52 65 67 2c 20 6e 52 65 67 29  rse, iReg, nReg)
24660 3b 0a 20 20 69 66 28 20 6e 52 65 67 3e 70 50 61  ;.  if( nReg>pPa
24670 72 73 65 2d 3e 6e 52 61 6e 67 65 52 65 67 20 29  rse->nRangeReg )
24680 7b 0a 20 20 20 20 70 50 61 72 73 65 2d 3e 6e 52  {.    pParse->nR
24690 61 6e 67 65 52 65 67 20 3d 20 6e 52 65 67 3b 0a  angeReg = nReg;.
246a0 20 20 20 20 70 50 61 72 73 65 2d 3e 69 52 61 6e      pParse->iRan
246b0 67 65 52 65 67 20 3d 20 69 52 65 67 3b 0a 20 20  geReg = iReg;.  
246c0 7d 0a 7d 0a 0a 2f 2a 0a 2a 2a 20 4d 61 72 6b 20  }.}../*.** Mark 
246d0 61 6c 6c 20 74 65 6d 70 6f 72 61 72 79 20 72 65  all temporary re
246e0 67 69 73 74 65 72 73 20 61 73 20 62 65 69 6e 67  gisters as being
246f0 20 75 6e 61 76 61 69 6c 61 62 6c 65 20 66 6f 72   unavailable for
24700 20 72 65 75 73 65 2e 0a 2a 2f 0a 76 6f 69 64 20   reuse..*/.void 
24710 73 71 6c 69 74 65 33 43 6c 65 61 72 54 65 6d 70  sqlite3ClearTemp
24720 52 65 67 43 61 63 68 65 28 50 61 72 73 65 20 2a  RegCache(Parse *
24730 70 50 61 72 73 65 29 7b 0a 20 20 70 50 61 72 73  pParse){.  pPars
24740 65 2d 3e 6e 54 65 6d 70 52 65 67 20 3d 20 30 3b  e->nTempReg = 0;
24750 0a 20 20 70 50 61 72 73 65 2d 3e 6e 52 61 6e 67  .  pParse->nRang
24760 65 52 65 67 20 3d 20 30 3b 0a 7d 0a              eReg = 0;.}.